View Single Post
AoC dag 10 i Golang: (dette er kun part2, men det er små endringer fra part1)

SPOILER ALERT! Vis spoiler

Kode

package main

import "fmt"

const N int = 256

var input []byte = append([]byte("70,66,255,2,48,0,54,48,80,141,244,254,160,108,1,41"), 17, 31, 73, 47, 23)

type Circ []byte

func NewCirc() Circ {
	c := make(Circ, N)
	for i := 0; i < N; i++ {
		c[i] = byte(i)
	}
	return c
}

func (c Circ) Get(i int) byte {
	return c[(i+N)%N]
}

func (c Circ) Put(i int, val byte) {
	c[(i+N)%N] = val
}

func (c Circ) Reverse(start, length int) {
	for i, j := start, start+length-1; i < j; i, j = i+1, j-1 {
		tmp := c.Get(i)
		c.Put(i, c.Get(j))
		c.Put(j, tmp)
	}
}

func ToDense(s []byte) []byte {
	dense := make([]byte, 16)
	for i, _ := range dense {
		x := s[i*16+0]
		for j := 1; j < 16; j++ {
			x ^= s[i*16+j]
		}
		dense[i] = x
	}
	return dense
}

func main() {
	c := NewCirc()
	curr := 0
	i := 0
	for round := 0; round < 64; round++ {
		for _, length := range input {
			c.Reverse(curr, int(length))
			curr += int(length) + i
			i++
		}
	}
	dense := ToDense([]byte(c))
	for _, d := range dense {
		fmt.Printf("%02x", d)
	}
	fmt.Println()
}
Sist endret av Ozma; 10. desember 2017 kl. 17:59.