day10

package
v0.0.0-...-cc576ef Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 2, 2023 License: MIT Imports: 4 Imported by: 0

README

--- Dia 10: Tubo de Raios Catódicos ---

Você evita as cordas, mergulha no rio e nada até a margem.

Os Elfos gritam algo sobre se reencontrarem rio acima, mas o rio está muito alto para dizer exatamente o que eles estão falando. Eles terminam de cruzar a ponte e desaparecem de vista.

Situações como esta devem ser o motivo pelo qual os Elfos priorizaram o funcionamento do sistema de comunicações em seu dispositivo portátil. Você o puxa para fora da mochila, mas a quantidade de água que sai lentamente de uma grande rachadura em sua tela indica que provavelmente não será de muita utilidade imediata.

Quer dizer, a menos que você possa projetar um substituto para o sistema de vídeo do dispositivo! Parece ser algum tipo de tela de tubo de raios catódicos e CPU simples que são acionados por um circuito de relógio preciso. O circuito do relógio marca a um ritmo constante; cada tique é chamado de ciclo.

Comece por descobrir o sinal que está sendo enviado pela CPU. A CPU possui um único registo, X, que começa com o valor 1. Ele suporta apenas duas instruções:

  • addx V leva dois ciclos para ser concluído. Após dois ciclos, o registo X é incrementado pelo valor V. (V pode ser negativo.)

  • noop leva um ciclo para ser concluído. Não tem nenhum outro efeito.

A CPU usa essas instruções em um programa (sua entrada do puzzle) para, de alguma forma, dizer à tela o que desenhar.

Considere o seguinte pequeno programa:

noop
addx 3
addx -5

A execução deste programa procede da seguinte forma:

  • No início do primeiro ciclo, a instrução noop inicia a execução. Durante o primeiro ciclo, X é 1. Após o primeiro ciclo, a instrução noop termina a execução, sem fazer nada.

  • No início do segundo ciclo, a instrução addx 3 inicia a execução. Durante o segundo ciclo, X ainda é 1.

  • Durante o terceiro ciclo, X ainda é 1. Após o terceiro ciclo, a instrução addx 3 finaliza a execução, configurando X para 4.

  • No início do quarto ciclo, a instrução addx -5 inicia a execução. Durante o quarto ciclo, X ainda é 4.

  • Durante o quinto ciclo, X ainda é 4. Após o quinto ciclo, a instrução addx -5 finaliza a execução, configurando X para -1.

Talvez você possa aprender algo observando o valor do registo X durante a execução. Por enquanto, considere a intensidade do sinal (o número do ciclo multiplicado pelo valor do registro X) durante o 20º ciclo e a cada 40 ciclos depois disso (ou seja, durante o 20º, 60º, 100º, 140º, 180º e 220º ciclos).

Por exemplo, considere este programa maior:

addx 15
addx -11
addx 6
addx -3
addx 5
addx -1
addx -8
addx 13
addx 4
noop
addx -1
addx 5
addx -1
addx 5
addx -1
addx 5
addx -1
addx 5
addx -1
addx -35
addx 1
addx 24
addx -19
addx 1
addx 16
addx -11
noop
noop
addx 21
addx -15
noop
noop
addx -3
addx 9
addx 1
addx -3
addx 8
addx 1
addx 5
noop
noop
noop
noop
noop
addx -36
noop
addx 1
addx 7
noop
noop
noop
addx 2
addx 6
noop
noop
noop
noop
noop
addx 1
noop
noop
addx 7
addx 1
noop
addx -13
addx 13
addx 7
noop
addx 1
addx -33
noop
noop
noop
addx 2
noop
noop
noop
addx 8
noop
addx -1
addx 2
addx 1
noop
addx 17
addx -9
addx 1
addx 1
addx -3
addx 11
noop
noop
addx 1
noop
addx 1
noop
noop
addx -13
addx -19
addx 1
addx 3
addx 26
addx -30
addx 12
addx -1
addx 3
addx 1
noop
noop
noop
addx -9
addx 18
addx 1
addx 2
noop
noop
addx 9
noop
noop
noop
addx -1
addx 2
addx -37
addx 1
addx 3
noop
addx 15
addx -21
addx 22
addx -6
addx 1
noop
addx 2
addx 1
noop
addx -10
noop
noop
addx 20
addx 1
addx 2
addx 2
addx -6
addx -11
noop
noop
noop

As intensidades de sinal interessantes podem ser determinadas da seguinte forma:

  • Durante o 20º ciclo, o registo X tem o valor 21, então a força do sinal é 20 * 21 = 420. (O 20º ciclo ocorre no meio do segundo addx -1, então o valor do registo X é o valor inicial, 1, mais todos os outros valores addx até aquele ponto: 1 + 15 - 11 + 6 - 3 + 5 - 1 - 8 + 13 + 4 = 21.)

  • Durante o 60º ciclo, o registro X tem o valor 19, então a intensidade do sinal é 60 * 19 = 1140.

  • Durante o 100º ciclo, o registro X tem o valor 18, então a força do sinal é 100 * 18 = 1800.

  • Durante o 140º ciclo, o registro X tem o valor 21, então a força do sinal é 140 * 21 = 2940.

  • Durante o 180º ciclo, o registro X tem o valor 16, então a força do sinal é 180 * 16 = 2880.

  • Durante o 220º ciclo, o registro X tem o valor 18, então a força do sinal é 220 * 18 = 3960.

A soma dessas intensidades de sinal é 13140.

Encontre a força do sinal durante o 20º, 60º, 100º, 140º, 180º e 220º ciclos. Qual é a soma dessas seis intensidades de sinal?

--- Parte Dois ---

Parece que o registo X controla a posição horizontal de um sprite. Especificamente, o sprite tem 3 pixels de largura e o registro X define a posição horizontal do meio desse sprite. (Neste sistema, não existe "posição vertical": se a posição horizontal do sprite colocar seus pixels onde o CRT está desenhando no momento, esses pixels serão desenhados.)

Você conta os pixels no CRT: 40 de largura e 6 de altura. Essa tela CRT desenha a linha superior de pixels da esquerda para a direita, depois a linha abaixo dela e assim por diante. O pixel mais à esquerda em cada linha está na posição 0, e o pixel mais à direita em cada linha está na posição 39.

Tal como a CPU, o CRT está intimamente ligado ao circuito do relógio: o CRT desenha um único pixel durante cada ciclo. Representando cada pixel da tela como um #, aqui estão os ciclos durante os quais o primeiro e o último pixel de cada linha são desenhados:

Ciclo   1 -> ######################################## <- Ciclo  40
Ciclo  41 -> ######################################## <- Ciclo  80
Ciclo  81 -> ######################################## <- Ciclo 120
Ciclo 121 -> ######################################## <- Ciclo 160
Ciclo 161 -> ######################################## <- Ciclo 200
Ciclo 201 -> ######################################## <- Ciclo 240

Então, cronometrando cuidadosamente as instruções da CPU e as operações de desenho do CRT, você deve ser capaz de determinar se o sprite é visível no instante em que cada pixel é desenhado. Se o sprite estiver posicionado de forma que um de seus três pixels seja o pixel que está sendo desenhado no momento, a tela produzirá um pixel aceso (#); caso contrário, a tela deixa o pixel escuro (.). Os primeiros píxeis do exemplo maior acima são desenhados da seguinte forma:

Posição do Sprite: ###.....................................

Início ciclo    1: começa por executar addx 15
Durante ciclo   1: o CRT desenha o pixel na posição 0
Linha atual CRT  : #

Durante ciclo   2: o CRT desenha o pixel na posição 1
Linha atual CRT  : ##
Final do ciclo  2: termina executando addx 15 (Registo X passa a 16)
Posição do Sprite: ...............###......................

Início ciclo    3: começa por executar addx -11
Durante ciclo   3: o CRT desenha o pixel na posição 2
Linha atual CRT  : ##.

Durante ciclo   4: o CRT desenha o pixel na posição 3
Linha atual CRT  : ##..
Final do ciclo  4: termina executando addx -11 (Registo X passa a 5)
Posição do Sprite: ....###.................................

Início ciclo    5: começa por executar addx 6
Durante ciclo   5: o CRT desenha o pixel na posição 4
Linha atual CRT  : ##..#

Durante ciclo   6: o CRT desenha o pixel na posição 5
Linha atual CRT  : ##..##
Final do ciclo  6: termina executando addx 6 (Registo X passa a 11)
Posição do Sprite: ..........###...........................

Início ciclo    7: começa por executar addx -3
Durante ciclo   7: o CRT desenha o pixel na posição 6
Linha atual CRT  : ##..##.

Durante ciclo   8: o CRT desenha o pixel na posição 7
Linha atual CRT  : ##..##..
Final do ciclo  8: termina executando addx -3 (Registo X passa a 8)
Posição do Sprite: .......###..............................

Início ciclo    9: começa por executar addx 5
Durante ciclo   9: o CRT desenha o pixel na posição 8
Linha atual CRT  : ##..##..#

Durante ciclo  10: o CRT desenha o pixel na posição 9
Linha atual CRT  : ##..##..##
Final do ciclo 10: termina executando addx 5 (Registo X passa a 13)
Posição do Sprite: ............###.........................

Início ciclo   11: começa por executar addx -1
Durante ciclo  11: o CRT desenha o pixel na posição 10
Linha atual CRT  : ##..##..##.

Durante ciclo  12: o CRT desenha o pixel na posição 11
Linha atual CRT  : ##..##..##..
Final do ciclo 12: termina executando addx -1 (Registo X passa a 12)
Posição do Sprite: ...........###..........................

Início ciclo   13: começa por executar addx -8
Durante ciclo  13: o CRT desenha o pixel na posição 12
Linha atual CRT  : ##..##..##..#

Durante ciclo  14: o CRT desenha o pixel na posição 13
Linha atual CRT  : ##..##..##..##
Final do ciclo 14: termina executando addx -8 (Registo X passa a 4)
Posição do Sprite: ...###..................................

Início ciclo   15: começa por executar addx 13
Durante ciclo  15: o CRT desenha o pixel na posição 14
Linha atual CRT  : ##..##..##..##.

Durante ciclo  16: o CRT desenha o pixel na posição 15
Linha atual CRT  : ##..##..##..##..
Final do ciclo 16: termina executando addx 13 (Registo X passa a 17)
Posição do Sprite: ................###.....................

Início ciclo   17: começa por executar addx 4
Durante ciclo  17: o CRT desenha o pixel na posição 16
Linha atual CRT  : ##..##..##..##..#

Durante ciclo  18: o CRT desenha o pixel na posição 17
Linha atual CRT  : ##..##..##..##..##
Final do ciclo 18: termina executando addx 4 (Registo X passa a 21)
Posição do Sprite: ....................###.................

Início ciclo   19: começa por executar noop
Durante ciclo  19: o CRT desenha o pixel na posição 18
Linha atual CRT  : ##..##..##..##..##.
Final do ciclo 19: termina executando noop

Início ciclo   20: começa por executar addx -1
Durante ciclo  20: o CRT desenha o pixel na posição 19
Linha atual CRT  : ##..##..##..##..##..

Durante ciclo  21: o CRT desenha o pixel na posição 20
Linha atual CRT  : ##..##..##..##..##..#
Final do ciclo 21: termina executando addx -1 (Registo X passa a 20)
Posição do Sprite: ...................###..................

Permitir que o programa seja executado até ao final faz com que o CRT produza a seguinte imagem:

##..##..##..##..##..##..##..##..##..##..
###...###...###...###...###...###...###.
####....####....####....####....####....
#####.....#####.....#####.....#####.....
######......######......######......####
#######.......#######.......#######.....

Renderize a imagem fornecida pelo seu programa. Quais são as oito letras maiúsculas que aparecem no seu CRT?

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Instruction

type Instruction struct {
	// contains filtered or unexported fields
}

type Puzzle

type Puzzle struct{}

func (*Puzzle) Notes

func (*Puzzle) Notes() string

func (*Puzzle) Part1

func (*Puzzle) Part1(input string) string

func (*Puzzle) Part2

func (*Puzzle) Part2(input string) string

type State

type State struct {
	RegisterX    int
	ClockCycle   int
	Instructions []Instruction
	Screen       []string
	// contains filtered or unexported fields
}

func (*State) DrawScreen

func (s *State) DrawScreen()

func (*State) PrintScreen

func (s *State) PrintScreen()

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL