Autor Tema: Advent of Code 2021 Problema 11.

0 Usuarios y 1 Visitante están viendo este tema.

11 Diciembre, 2021, 06:58 am
Leído 536 veces

C. Enrique B.

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 575
  • País: es
  • Karma: +0/-0
    • Mi página en WikiPedia.
.
El dibujo que se va conformando en la pantalla general (con símbolos ASCII), y que va apareciendo al pasar de los días, ¿es una especie de mapa o pista para el futuro? https://adventofcode.com/2021
____________________


Día 11: Pulpo Dumbo

https://adventofcode.com/2021/day/11

¡Entras en una gran caverna llena de raros pulpos dumbo bioluminiscentes! Parece que no les gustan las luces navideñas de tu submarino, así que las apagas por ahora.

--- --- Hay 100 pulpos ordenados en una cuadrícula de 10 por 10. Cada pulpo gana energía lentamente con el tiempo y destella intensamente por un momento cuando su energía está llena. Aunque tus luces están apagadas, tal vez podría navegar a través de la cueva sin molestar a los pulpos si pudiera predecir cuándo ocurrirán los destellos de luz.

Cada pulpo tiene un nivel de energía: su submarino puede medir de forma remota el nivel de energía de cada pulpo (su puzzle input). Por ejemplo:

5483143223
2745854711
5264556173
6141336146
6357385478
4167524645
2176841721
6882881134
4846848554
5283751526

El nivel de energía de cada pulpo es un valor entre 0 y 9. Aquí, el pulpo de arriba a la izquierda tiene un nivel de energía de 5, el de abajo a la derecha tiene un nivel de energía de 6, y así sucesivamente.

--- --- Puede modelar los niveles de energía y los destellos de luz en pasos. Durante un solo paso, ocurre lo siguiente:

    Primero, el nivel de energía de cada pulpo aumenta en 1.
    Entonces, cualquier pulpo con un nivel de energía superior a 9 parpadea. Esto aumenta el nivel de energía de todos los pulpos adyacentes en 1, incluidos los pulpos que están diagonalmente adyacentes. Si esto hace que un pulpo tenga un nivel de energía superior a 9, también parpadea. Este proceso continúa mientras los nuevos pulpos sigan aumentando su nivel de energía por encima de 9. (Un pulpo solo puede parpadear como máximo una vez por paso).
    Finalmente, cualquier pulpo que brilló durante este paso tiene su nivel de energía establecido en 0, ya que usó toda su energía para parpadear.

--- --- Los destellos adyacentes pueden hacer que un pulpo destelle en un paso incluso si comienza ese paso con muy poca energía. Considere el pulpo medio con 1 energía en esta situación:

Antes de cualquier paso:
11111
19991
19191
19991
11111

Después del paso 1:
34543
40004
50005
40004
34543

Después del paso 2:
45654
51115
61116
51115
45654

Un pulpo se resalta en negrita cuando parpadea durante el paso dado (o sea, se resaltan en negrita los Ceros).

--- --- Así es como avanza el ejemplo grande de antes:

Antes de cualquier paso:
5483143223
2745854711
5264556173
6141336146
6357385478
4167524645
2176841721
6882881134
4846848554
5283751526

Después del paso 1:
6594254334
3856965822
6375667284
7252447257
7468496589
5278635756
3287952832
7993992245
5957959665
6394862637

Después del paso 2:
8807476555
5089087054
8597889608
8485769600
8700908800
6600088989
6800005943
0000007456
9000000876
8700006848

Después del paso 3:
0050900866
8500800575
9900000039
9700000041
9935080063
7712300000
7911250009
2211130000
0421125000
0021119000

Después del paso 4:
2263031977
0923031697
0032221150
0041111163
0076191174
0053411122
0042361120
5532241122
1532247211
1132230211

Después del paso 5:
4484144000
2044144000
2253333493
1152333274
1187303285
1164633233
1153472231
6643352233
2643358322
2243341322

Después del paso 6:
5595255111
3155255222
3364444605
2263444496
2298414396
2275744344
2264583342
7754463344
3754469433
3354452433

Después del paso 7:
6707366222
4377366333
4475555827
3496655709
3500625609
3509955566
3486694453
8865585555
4865580644
4465574644

Después del paso 8:
7818477333
5488477444
5697666949
4608766830
4734946730
4740097688
6900007564
0000009666
8000004755
6800007755

Después del paso 9:
9060000644
7800000976
6900000080
5840000082
5858000093
6962400000
8021250009
2221130009
9111128097
7911119976

Después del paso 10:
0481112976
0031112009
0041112504
0081111406
0099111306
0093511233
0442361130
5532252350
0532250600
0032240000

--- --- Después del paso 10, ha habido un total de 204 flashes. Avance rápido: aquí está la misma configuración cada 10 pasos:

Después del paso 20:
3936556452
5686556806
4496555690
4448655580
4456865570
5680086577
7000009896
0000000344
6000000364
4600009543

Después del paso 30:
0643334118
4253334611
3374333458
2225333337
2229333338
2276733333
2754574565
5544458511
9444447111
7944446119

Después del paso 40:
6211111981
0421111119
0042111115
0003111115
0003111116
0065611111
0532351111
3322234597
2222222976
2222222762

Después del paso 50:
9655556447
4865556805
4486555690
4458655580
4574865570
5700086566
6000009887
8000000533
6800000633
5680000538

Después del paso 60:
2533334200
2743334640
2264333458
2225333337
2225333338
2287833333
3854573455
1854458611
1175447111
1115446111

Después del paso 70:
8211111164
0421111166
0042111114
0004211115
0000211116
0065611111
0532351111
7322235117
5722223475
4572222754

Después del paso 80:
1755555697
5965555609
4486555680
4458655580
4570865570
5700086566
7000008666
0000000990
0000000800
0000000000

Después del paso 90:
7433333522
2643333522
2264333458
2226433337
2222433338
2287833333
2854573333
4854458333
3387779333
3333333333

Después del paso 100:
0397666866
0749766918
0053976933
0004297822
0004229892
0053222877
0532222966
9322228966
7922286866
6789998766

Después de 100 pasos, ha habido un total de 1656 destellos.

--- --- Dados los niveles de energía iniciales de los pulpos dumbo en su caverna, simule 100 pasos. ¿Cuántos destellos totales hay después de 100 pasos?

--- --- Para jugar, identifíquese a través de uno de estos servicios:

[GitHub] [Google] [Twitter] [Reddit]
.

---------------------
Moderación. Se han movido aquí los mensajes relativos al problema 8 del advent of code 2021. Aquí el hilo original.
-- FALTAN LAS MUJERES en muchos ámbitos sociales. Yo no me siento perteneciente al bando masculino; soy del bando de las personas. Chicas, manifestáos; no concibo charlar sobre un tema si no estáis vosotras: es impropio, casi absurdo.

11 Diciembre, 2021, 07:00 pm
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,473
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Oh Oh!!! me contestó... y ahora qué le digo...


Con el mismo formulario que en mi post anterior  o el del  Re: Advent of Code 2021 Problema 9.
pero uso este código

Código: [Seleccionar]
Public x As IntegerPublic y As Integer
Public stack As Integer

Public D(1 To 100, 1 To 100) As Integer
Public res(1 To 10000, 1 To 3) As Integer

Private Sub Command1_Click()
n = fila.Text * columna.Text
x = 1
y = 1
Do Until x = fila.Text + 1
Do Until y = columna.Text + 1
leyenda.Caption = " intoduzca dato de fila " & x & " y columna " & y
y = y + 1
Loop
x = x + 1
Loop
x = 1
y = 1
c = 0
paso = 1
destellos = 0
stack = 0

Do Until paso = 101
Do Until x = fila.Text + 1
Do Until y = columna.Text + 1
If D(x, y) > 9 Then
destellos = destellos + 1
Call destella(x, y)
End If
x = x + 1
Loop
y = y + 1
Loop
x = 1
y = 1
Do Until x = fila.Text + 1
Do Until y = columna.Text + 1
D(x, y) = D(x, y) + 1
x = x + 1
Loop
y = y + 1
Loop
stack = 0
paso = paso + 1
Loop

resultado.Caption = "El resultado es " & destellos

End Sub

Private Sub Command2_Click()
D(x, y) = Dato.Text + 1
Dato.Text = ""
End Sub


Public Sub destella(ByVal xi As Integer, ByVal yi As Integer)


xu = xi - 1
xd = xi + 1
yl = yi - 1
yr = yi + 1
If D(xi, yi) >= 10 Then
D(xi, yi) = 0
' codi
If xu > 0 And yl > 0 And D(xu, yl) <> 0 Then
    D(xu, yl) = D(xu, yl) + 1
    If D(xu, yl) > 9 Then
        stack = stack + 1
        res(stack, 1) = xu
        res(stack, 2) = yl
    End If
End If
If xu > 0 And yi > 0 And D(xu, yi) <> 0 Then
    D(xu, yi) = D(xu, yi) + 1
    If D(xu, yi) > 9 Then
        stack = stack + 1
        res(stack, 1) = xu
        res(stack, 2) = yi
    End If
End If
If xu > 0 And yr < columna.Text + 1 And D(xu, yr) <> 0 Then
    D(xu, yr) = D(xu, yr) + 1
    If D(xu, yr) > 9 Then
        stack = stack + 1
        res(stack, 1) = xu
        res(stack, 2) = yr
    End If
End If

If xi > 0 And yl > 0 And D(xi, yl) <> 0 Then
    D(xi, yl) = D(xi, yl) + 1
    If D(xi, yl) > 9 Then
        stack = stack + 1
        res(stack, 1) = xi
        res(stack, 2) = yl
    End If
End If

If xi > 0 And yr < columna.Text + 1 And D(xi, yr) <> 0 Then
    D(xi, yr) = D(xi, yr) + 1
    If D(xi, yr) > 9 Then
        stack = stack + 1
        res(stack, 1) = xi
        res(stack, 2) = yr
    End If
End If
If xd < fila.Text + 1 And yl > 0 And D(xd, yl) <> 0 Then
    D(xd, yl) = D(xd, yl) + 1
    If D(xd, yl) > 9 Then
        stack = stack + 1
        res(stack, 1) = xd
        res(stack, 2) = yl
    End If
End If
If xd < fila.Text + 1 And yi > 0 And D(xd, yi) <> 0 Then
    D(xd, yi) = D(xd, yi) + 1
    If D(xd, yi) > 9 Then
        stack = stack + 1
        res(stack, 1) = xd
        res(stack, 2) = yi
    End If
End If
If xd < fila.Text + 1 And yr < columna.Text + 1 And D(xd, yr) <> 0 Then
    D(xd, yr) = D(xd, yr) + 1
    If D(xd, yr) > 9 Then
        stack = stack + 1
        res(stack, 1) = xd
        res(stack, 2) = yr
    End If
End If
If stack <> 0 Then
xn = res(stack, 1)
yn = res(stack, 2)
res(stack, 1) = 0
res(stack, 2) = 0
stack = stack - 1
destellos = destellos + 1
Call destella(xn, yn)
End If
End Sub

Resumo,Cargo la lista de 10x10 ya le sumo 1 a cada valor
Inicio contador de pasos

Busco destellos \( x>9 \)
Si hay destellos propago a los vecinos

Los vecinos que destellan los guardo en un stack "para eso lo pidieron programar antes"

Luego de propagar el destello, cargo el siguiente destello del stack.
Reitero los dos pasos anteriores sabiendo que la propagación no afecta a las casillas con 0 de energía
Cuando el stack vuelve a cero continua buscando en la tabla hasta el final
Llevando contadores se cuentan el total de destellos.
No he puesto sentencias de control de errores
Saludos
Saludos  \(\mathbb {R}^3\)

11 Diciembre, 2021, 10:10 pm
Respuesta #2

geómetracat

  • Moderador Global
  • Mensajes: 3,323
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Enunciado de la segunda parte:
--- Part Two ---

It seems like the individual flashes aren't bright enough to navigate. However, you might have a better option: the flashes seem to be synchronizing!

In the example above, the first time all octopuses flash simultaneously is step 195:

After step 193:
5877777777
8877777777
7777777777
7777777777
7777777777
7777777777
7777777777
7777777777
7777777777
7777777777

After step 194:
6988888888
9988888888
8888888888
8888888888
8888888888
8888888888
8888888888
8888888888
8888888888
8888888888

After step 195:
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000

If you can calculate the exact moments when the octopuses will all flash simultaneously, you should be able to navigate through the cavern. What is the first step during which all octopuses flash?



Mi solución (misma idea que Richard):
Código: [Seleccionar]
with open("input11.txt") as f:
    inp = [x[:-1] for x in f.readlines()]

# Part 1

import numpy as np
data = np.array([[int(x) for x in y] for y in inp])

def one_step(matrix):
    matrix = np.pad(matrix, ((1,),(1,)), constant_values=np.NINF)
    to_flash = []
    flashed = []
    for i in range(1, len(matrix)-1):
        for j in range(1,len(matrix[0])-1):
            matrix[i,j] += 1
            if matrix[i,j] > 9:
                matrix[i,j] = 0
                to_flash.append((i,j))
   
    while to_flash != []:
        pos = to_flash.pop()
        flashed.append(pos)
        for i in range(-1,2):
            for j in range(-1,2):
                if 0 < matrix[pos[0] + i, pos[1] + j] < 9:
                    matrix[pos[0] + i,pos[1] + j] += 1
                elif matrix[pos[0] + i, pos[1] + j] == 9:
                    matrix[pos[0] + i,pos[1] + j] = 0
                    to_flash.append((pos[0] + i, pos[1] + j))   
    return matrix[1:len(matrix)-1, 1:len(matrix)-1], len(flashed)

def simulate(matrix, nsteps):
    count = 0
    for _ in range(nsteps):
        matrix, flashes = one_step(matrix)
        count += flashes
    return count

print(simulate(data, 100))

# Part 2

def first_synchro(matrix):
    count = 0
    while count < 1000:
        matrix, flashes = one_step(matrix)
        count += 1
        if flashes == len(matrix)**2:
            return count

print(first_synchro(data))       
La ecuación más bonita de las matemáticas: \( d^2=0 \)