Ayuda a Pac-Man a contar los Pac-Dots

29

Siguiendo el consejo de la Sra. Pac-Man, que está preocupada por el sobrepeso, Pac-Man ha decidido realizar un seguimiento de su consumo diario de Pac-Dot. ¡Ayúdalo a contar el número de Pac-Dots en un camino dado en el laberinto!

El laberinto

laberinto

Para ayudarlo a construir su propia codificación del laberinto, puede obtener algunos datos sin procesar aquí .

El viaje de Pac-Man

En el contexto de este desafío, se aplican las siguientes reglas:

  • Primero, las buenas noticias: los fantasmas no están allí.
  • Pac-Man siempre comienza su carrera en la posición indicada en la imagen de arriba, en dirección a Oriente. No hay Pac-Dot en la posición inicial.
  • Mientras siga un camino recto, seguirá avanzando a los siguientes cuadrados.
  • Cuando se encuentra con un giro de 90 ° sin ningún otro camino disponible (cuadrados naranjas en el mapa), toma el turno automática y sistemáticamente.
  • Cuando se encuentra con un cruce donde hay varios caminos disponibles (cuadrados verdes en el mapa), puede continuar en la misma dirección, si corresponde, o elegir otra dirección (incluido un giro en U).
  • Cuando Pac-Man pasa por una de las salidas en el lado medio izquierdo o medio derecho del laberinto, reaparece inmediatamente en el lado opuesto.
  • Pac-Man se come todos los Pac-Dots en el camino que está siguiendo. Una vez que se ha comido un Pac-Dot, se retira del laberinto.

El reto

Entrada

Se le dará una cadena que describe el comportamiento de Pac-Man en los cruces que va a llegar. Esta cadena estará compuesta por los siguientes caracteres:

  • L: gire 90 ° a la izquierda
  • R: gire 90 ° a la derecha
  • F: ir hacia adelante (sin cambio de dirección)
  • B: ir hacia atrás (hacer un cambio de sentido)

Cuando todos los personajes han sido procesados, Pac-Man se detiene en el siguiente cruce que encuentra.

Salida

Debe imprimir o imprimir el número de Pac-Dots consumidos a lo largo de la ruta de entrada.

Reglas

  • Puede escribir un programa completo o una función.
  • Puede tomar la entrada en mayúsculas o minúsculas, ya sea como una cadena o una matriz de caracteres. También puede usar otros caracteres (pero solo un carácter por dirección) o números enteros [0 .. 9]. Si lo hace, especifíquelo claramente en su respuesta.
  • Puede suponer que la entrada siempre es válida. (El jsFiddle a continuación detectará errores, pero se supone que no debes hacerlo).
  • Este es el código de golf, por lo que gana el código más corto en bytes.
  • Las lagunas estándar están prohibidas.

Insinuación

Es posible que no sea necesario ni óptimo almacenar la forma exacta del laberinto.

Casos de prueba y demostración

Los siguientes casos de prueba, o cualquier otra entrada, se pueden probar en este jsFiddle .

1. Input  : ""
   Output : 1
   Comment: Pac-Man just advances to the first junction, eats the Pac-Dot on it and stops.

2. Input  : "L"
   Output : 7

3. Input  : "FFR"
   Output : 13

4. Input  : "LFLR"
   Output : 17
   Comment: Pac-Man will exit on the middle right side and re-appear on the left side.

5. Input  : "BBBB"
   Output : 2

6. Input  : "BRRFFFL"
   Output : 15

7. Input  : "LFFRLFFFFRF"
   Output : 50

8. Input  : "BRFRLRFRLFR"
   Output : 54
   Comment: Pac-Man will exit on the middle left side and re-appear on the right side.

9. Input  : "FFLRLFFLLLLFFBFLFLRRRLRRFRFLRLFFFLFLLLLFRRFBRLLLFBLFFLBFRLLR"
   Output : 244
   Comment: All cleared!
Arnauld
fuente
1
Aquí hay más datos para ayudar: pastebin.com/G4MnbVww . Es una lista de cada cruce y la cantidad de puntos de pac en el camino hacia el siguiente cruce, dependiendo de la dirección en la que vaya (0 = arriba, 1 = izquierda, 2 = abajo, 3 = derecha). Puede haber algunos errores, y tenga en cuenta que las uniones 12, 13, 15, 16, 18 y 19 no tienen punto en el medio, mientras que todos los demás sí.
Esolanging Fruit
@ Challenger5 Esto se ve bien. Sin embargo, debido a que los movimientos son relativos, es probable que también desee realizar un seguimiento de la nueva orientación de Pac-Man cuando se llega al siguiente cruce.
Arnauld
Por cierto en el juego pac man no puede hacer un cambio de sentido
Matthew Roh
44
@SIGSEGV Por "cambio de sentido", me refiero a cambiar a la dirección opuesta, lo cual es posible en cualquier momento en el juego arcade original y todos los clones que conozco. ¿Debo usar otro término?
Arnauld
Estoy bastante seguro de que Pac-Man comenzó a dirigirse a la izquierda en el juego de arcade, no a la derecha.
mbomb007

Respuestas:

10

Pyth, 356 345 + 1 = 346 bytes

El código contiene algunos no imprimibles, así que aquí está el xxdhexdump reversible .

0000000: 4a4b 304c 2c3d 2b4b 4062 4a58 624a 3041  JK0L,=+K@bJXbJ0A
0000010: 2c63 6a43 2201 e120 49b4 efbc e267 27f4  ,cjC".. I....g'.
0000020: a11b f5d5 7f79 d1a0 ab8a 7689 449f 0c50  .....y....v.D..P
0000030: b2d4 7c30 99c3 368e aa67 4213 ab9b d276  ..|0..6..gB....v
0000040: d75f 6e99 5757 04a6 08cc 99d0 7141 3d2f  ._n.WW......qA=/
0000050: d854 7cf7 4a70 954e 6e35 f9b9 e0c5 1d53  .T|.Jp.Nn5.....S
0000060: 36d5 63f9 cf13 0f66 c113 4dec 956e 5225  6.c....f..M..nR%
0000070: b14a 1659 dcb5 6822 3534 2034 6a43 2203  .J.Y..h"54 4jC".
0000080: ffe3 8fff 2232 3d59 636a 4322 0b8a 4624  ...."2=YcjC"..F$
0000090: 7815 4a94 192c 79f6 d6e5 e098 5e97 76bc  x.J..,y.....^.v.
00000a0: 23cf 027c 35c5 5098 2a83 68f1 823a 83f6  #..|5.P.*.h..:..
00000b0: dfa4 7e12 443f 0257 7adb ab2d 8e6f 1199  ..~.D?.Wz..-.o..
00000c0: 9a3e 3f9d a524 d331 c5ff 94ae e5a2 3507  .>?..$.1......5.
00000d0: bd22 3334 2032 3d6b 2b30 6a43 2202 25f2  ."34 2=k+0jC".%.
00000e0: f55c 2252 c250 0002 c250 0000 065c 225c  .\"R.P...P...\"\
00000f0: 2247 5289 3698 4227 5350 8822 3136 3d64  "GR.6.B'SP."16=d
0000100: 636a 4322 8223 a80e 5c22 981d d272 729d  cjC".#..\"...rr.
0000110: d88d 981d 5c22 5c22 2bd7 91dd 9428 73d7  ....\"\"+....(s.
0000120: 1dd7 2234 2032 5651 2079 483d 547e 4a40  .."4 2VQ yH=T~J@
0000130: 4047 4a2b 5a78 2246 5242 4c22 4e20 796b  @GJ+Zx"FRBL"N yk
0000140: 3d5a 4040 647e 4a40 4059 4a3d 5421 7840  =Z@@d~J@@YJ=T!x@
0000150: 594a 5454 2968 7948 0a                   YJTT)hyH.

Requiere la -Mbandera para deshabilitar la memorización. Desafortunadamente, esto no se puede hacer en ningún ejecutor en línea que yo sepa.

Aquí hay una versión ASCII legible e imprimible:

JK0L,=+K@bJXbJ0A,cj746957013238413906925468440008893181365431681519974815772691846219267045007717553452313017550830370829477591340658010575885616582299429376501117428763541235628345630376341520044712982918668584832091126800263024965443560007480163218792 54 4j17178005503 2=Ycj664551201217474826979459068682259492333017695780569003557724234375880492114440213266014621594427584622393511454741615093293082181365458295035985321888753898774398909 34 2=k+0j883734055588186287049718559289059922762611092840989558085734536 16=dcj53536195844172273707047543644202986760006840011986146398708374999 4 2VQ yH=T~J@@GJ+Zx"FRBL"N yk=Z@@d~J@@YJ=T!x@YJTT)hyH

Explicación

Esto es mucho trabajo en progreso, por lo que aún no publicaré una explicación completa.

Básicamente, el programa representa el tablero como un gráfico (algo extraño) que utiliza cinco tablas de búsqueda: 2 para conectividad, 1 para direcciones de unión y 2 para recuento de puntos. Esto fue construido por un script de Python de 200 líneas en el que pasé demasiadas horas. Luego, el programa simplemente recorre la entrada y cuenta los puntos, actualizando las tablas de puntos a cero a medida que se recopilan los puntos.

QUE HACER:

  • Escriba la rutina de Python para reordenar los nodos hasta que la tabla de búsqueda contenga la menor cantidad posible de caracteres que requieran escape
  • Intente eliminar el manejo de la sección por completo (debería eliminar una tabla de búsqueda)
    • ACTUALIZACIÓN: intentado esto, parece no eliminar la tabla y alargar el código
  • Reescribe la lógica del lado de Pyth (la actual no es muy práctica)
    • ACTUALIZACIÓN: algo hecho, el código sigue siendo imperfecto
PurkkaKoodari
fuente
¿Por qué no solo genera la URL para que pueda ejecutar el código real en TIO? Quizás Dennis debería agregar una manera más fácil de hacerlo.
mbomb007
@ mbomb007 TIO no es compatible con suites de prueba (para Pyth, de todos modos), por lo que me gusta usar el propio host de Pyth. Además, no estoy muy seguro de que los navegadores manejen bytes nulos correctamente.
PurkkaKoodari
Para la suite que no es de prueba, podrías. Y aún puede codificar con valores nulos, simplemente no puede copiarlos / pegarlos, por lo que debe generar la URL.
mbomb007
¿La respuesta más larga de Pyth todavía?
Luis Mendo
@LuisMendo Al menos para mí, basado en una búsqueda rápida. : ~)
PurkkaKoodari
2

k, 264 bytes

b:,/16 16\'108_a:-135#0+1:"p.k"
(#(?27,r 1)^(12+!8)^14 17)+/b@?*|r:+1 27 0{i:a?64/(4!2+y+*x;x 1);(4 64\a i+1-2*2!i),_i%2}\0:""
\
...binary data...

Volcado hexadecimal:

$ xxd p.k
00000000: 623a 2c2f 3136 2031 365c 2731 3038 5f61  b:,/16 16\'108_a
00000010: 3a2d 3133 3523 302b 313a 2270 2e6b 220a  :-135#0+1:"p.k".
00000020: 2823 283f 3237 2c72 2031 295e 2831 322b  (#(?27,r 1)^(12+
00000030: 2138 295e 3134 2031 3729 2b2f 6240 3f2a  !8)^14 17)+/b@?*
00000040: 7c72 3a2b 3120 3237 2030 7b69 3a61 3f36  |r:+1 27 0{i:a?6
00000050: 342f 2834 2132 2b79 2b2a 783b 7820 3129  4/(4!2+y+*x;x 1)
00000060: 3b28 3420 3634 5c61 2069 2b31 2d32 2a32  ;(4 64\a i+1-2*2
00000070: 2169 292c 5f69 2532 7d5c 303a 2222 0a5c  !i),_i%2}\0:"".\
00000080: 0a02 4005 c006 4109 c103 8008 8143 c244  [email protected]
00000090: c345 c446 c547 c648 c749 c84a 820a 830c  .E.F.G.H.I.J....
000000a0: 840d 870b 8889 cb0e 8a11 8b0f 4c4d cc10  ............LM..
000000b0: cd4e d14f ce51 d014 8e12 8f13 9017 9153  .N.O.Q.........S
000000c0: d215 9216 931e 5455 d41a d51b 5657 d61f  ......TU....VW..
000000d0: d718 941d 9759 d85a d95b da5c db5d dc98  .....Y.Z.[.\.]..
000000e0: de20 9921 9c5f 9d5e 60df e161 e089 9833  . .!._.^`..a...3
000000f0: 4222 2247 2662 7550 0000 0500 5000 c255  B""G&buP....P..U
00000100: 2c22 2202 2588 5ff2                      ,"".%._.

Los datos binarios al final codifican dos matrices:

  • a consiste en pares de bytes, cada uno representando (64 * dirección) + junctionId

  • b es el número de puntos Pacman entre cada par de cruces en a

El programa lee su propio archivo fuente ( p.k) y decodifica los datos.

La entrada proviene de stdin y usa 0x00,0x01,0x02,0x03 (también conocido como NUL, SOH, STX, ETX, los primeros cuatro códigos ASCII) en lugar de FLBR.

Uso mi propia implementación de k, que es limitada, hinchada, accidentada y lenta en comparación con la realidad . Pruebo con el siguiente programa:

t:{e:($y),"\n"; a:`sys[("/path/to/k";"./p.k");`c$"FLBR"?x]
   1@$[a~e;"ok\n";"failed ",x,"\n expected: ",e," actual: ",a,"\n"];}
t["";1]
t[,"L";7]
t["FFR";13]
t["LFLR";17]
t["BBBB";2]
t["BRRFFFL";15]
t["LFFRLFFFFRF";50]
t["BRFRLRFRLFR";54]
t["FFLRLFFLLLLFFBFLFLRRRLRRFRFLRLFFFLFLLLLFRRFBRLLLFBLFFLBFRLLR";244]
\
ngn
fuente
Compilé un intérprete para Linux (lo siento, no Windows) y puse los archivos necesarios para ejecutar las pruebas aquí: github.com/ngn/tmp Para ejecutarlos, simplemente escriba: ./k tk Si aún necesita un enlace de descarga para pk: github.com/ngn/tmp/blob/master/pk?raw=true
ngn