Cuando era chico, los niños entraban a las tiendas de informática y jugaban a Hunt the Wumpus hasta que el personal nos echó. Era un juego simple, programable en las computadoras domésticas de mediados de la década de 1970, máquinas tan rudimentarias que en lugar de microprocesadores del tamaño de un chicklet, creo que algunos de ellos probablemente tenían chicklets reales allí.
Evocamos esa época pasada reproduciendo el juego en hardware moderno.
El jugador comienza en una habitación aleatoria en un mapa icosaédrico (por lo tanto, hay 20 habitaciones en total, conectadas entre sí como las caras de un icosaedro, y cada habitación tiene exactamente tres salidas).
El wumpus comienza en una habitación diferente seleccionada al azar. El wumpus apesta, y su olor se puede detectar en cualquiera de las tres habitaciones adyacentes a su ubicación, aunque la dirección del olor es imposible de determinar para el jugador. El juego informa solo "hueles un wumpus".
El jugador lleva un arco y un número infinito de flechas, que puede disparar en cualquier momento en la habitación frente a él. Si el wumpus está en esa habitación, muere y el jugador gana. Si el wumpus no estaba en esa habitación, se sobresalta y se mueve aleatoriamente a cualquiera de las tres habitaciones conectadas a su ubicación actual.
Una habitación seleccionada al azar (garantizada para no ser la habitación en la que comienza el jugador) contiene un pozo sin fondo. Si el jugador está en cualquier habitación adyacente al hoyo, siente una brisa, pero no tiene idea de qué puerta proviene la brisa. Si entra en la habitación con el pozo, muere y gana Wumpus. El wumpus no se ve afectado por el pozo.
Si el jugador entra en la habitación del wumpus, o si el wumpus entra en la habitación del jugador, el wumpus gana.
El jugador especifica la dirección que está mirando con un número (1 = derecha, 2 = izquierda, 3 = atrás), y luego una acción (4 = disparar una flecha, 5 = caminar en la dirección especificada).
En aras de la puntuación, cada cadena de juego ("Sientes una brisa", "Hueles un wumpus", "Tu flecha no golpeó nada", etc.) puede considerarse un byte. No abusar de esto para ocultar el código del juego en el texto; Esto es solo para interactuar con el jugador.
Deduzca el 10% de su recuento de bytes para implementar megabates, que comienzan en una habitación aleatoria diferente del jugador (aunque pueden compartir una habitación con el wumpus y / o el hoyo). Si el jugador entra en la habitación con los murciélagos, los murciélagos lo llevarán a otra habitación seleccionada al azar (garantizado que no sea la habitación con el hoyo o el wumpus dentro), antes de volar a su propia ubicación aleatoria. En las tres habitaciones adyacentes a los murciélagos, se puede escuchar un chirrido, pero el jugador no recibe información sobre de qué habitación proviene el sonido.
Deduzca el 35% de su conteo de bytes para implementar una interfaz gráfica que muestre el mapa icosaédrico y algún tipo de indicación de la información que el jugador tiene hasta ahora sobre la ubicación del hoyo, el wumpus y los murciélagos (si corresponde), en relación con el jugador. Obviamente, si el wumpus se mueve o el jugador es movido por los murciélagos, el mapa debe reiniciarse en consecuencia.
El conteo de bytes más bajo, según el ajuste, gana.
El código fuente BÁSICO para una versión del juego (que no se ajusta necesariamente a las reglas anteriores y, en cualquier caso, no tiene nada de golf) se puede encontrar en este sitio web y probablemente en otros.
fuente
Respuestas:
GolfScript, 163
La puntuación se obtiene tomando el recuento de bytes (290), sumando el número de cadenas utilizadas para la interacción con el usuario (6) y restando la longitud combinada de esas cadenas (133). Los avances de línea son parte de las cadenas y contribuyen al recuento de bytes.
Hitos
Portado respuesta de professorfish de Bash a GolfScript. Puntuación: 269
Actuó sobre las sugerencias de Peter Taylor en los comentarios. Puntuación: 250
Peter Taylor refactorizó todo mi código y me ayudó a comprimir la tabla de búsqueda. Puntuación: 202
Se reemplazó la tabla de búsqueda de habitaciones adyacentes con un enfoque matemático. Puntuación: 182
Entrada, salida y función refactorizadas que apoyan el enfoque matemático. Puntuación: 163
Un gran "¡Gracias!" Va a Peter Taylor por toda su ayuda.
Cómo funciona
Las 20 habitaciones se representan como los vértices de un dodecaedro, a los que se les ha asignado números del 0 al 19 de la siguiente manera:
Para encontrar las habitaciones adyacentes a la habitación N y ordenarlas en el sentido de las agujas del reloj, tenemos que considerar cuatro casos:
Si N ≡ 0 mod 4 (vértices azules), la habitación adyacente es 19 - N , N + 2 mod 20 y N - 2 mod 20 .
Si N ≡ 1 mod 4 (vértices verdes), la habitación adyacente es 19 - N , N - 4 mod 20 y N + 4 mod 20 .
Si N ≡ 2 mod 4 (vértices amarillos), la habitación adyacente es 19 - N , N - 2 mod 20 y N + 2 mod 20 .
Si N ≡ 3 mod 4 (vértices rojos), la habitación adyacente es 19 - N , N + 4 mod 20 y N - 4 mod 20 .
fuente
Q
con19rand 97+
; 2@
con97%3*&>
..., otro 1 al alinearQ
como{19rand 97+}2*:,\:H
, algunos al reemplazar|
con*
, que a menudo es la mejor manera de hacer unif
.B
no sirve para nada, y creo que algunas variables más podrían eliminarse mediante el uso de la pila.256base 20base
(y probablemente también eliminar algunos +/- 97). El único inconveniente es que requerirá caracteres no imprimibles.You were killed by the wumpus
sin mencionar la flecha que falta. Es por eso que estaba agregando en la versión no bonita.2*2+
=>)2*
REV0 C ++ (Visual Studio en Windows) 405A continuación se muestra un juego, que demuestra que (siempre que no comience justo al lado de un obstáculo) con el juego correcto, siempre puede ganar. El jugador siente una brisa, retrocede y realiza un bucle completo en sentido antihorario. Como le toma exactamente 5 movimientos para sentir una brisa nuevamente, conoce el agujero a su derecha y se aleja lo más posible. Del mismo modo, cuando huele el wumpus, sin saber si es correcto o izquierdo, se vuelve y hace un bucle en el sentido de las agujas del reloj. Le toma 5 movimientos para oler el wumpus nuevamente, por lo que sabe que está a la izquierda y dispara con certeza.
Si hubiera pasado por el otro lado, habría encontrado el wumpus antes y habría sabido que estaba en la misma dirección en la que giraba.
REV1 C (CCG en Cygwin), 431-35% de bonificación = 280.15Nuevas líneas agregadas para mayor claridad. Los cambios de Rev 0 son los siguientes:
Muchas gracias a @Dennis por recomendar el compilador GCC en el emulador Cygwin Linux para Windows. Este compilador no requiere la
include
s en el programa rev 0, y permite elint
tipo predeterminado para las variables y ¡main.
Este es un consejo de golf que cambia la vida!Además, ejecutarse en Linux significa que
\f
hace que el cursor se mueva hacia abajo sin hacer un retorno de carro (a diferencia de Windows, donde solo produce un símbolo imprimible). Esto ha permitido un acortamiento considerable de la declaración printf que imprime el tableroVarios consejos adicionales de Dennis en los comentarios, y uno de los míos: cambio de condición al verificar si la flecha golpeó el wumpus:
if(q==w)
>if(q-w)
(..else .. se invierte)Adición de una pantalla gráfica que muestra la información que el jugador sabe sobre dónde se huele un wumpus / se siente una brisa para reclamar el 35% de bonificación. (Eliminé la versión anterior de depuración de esto que mostraba la posición exacta del wumpus y el agujero. Se puede ver en el historial de edición).
REV2 C (CCG en Cygwin), 389-35% de bonificación = 252.85
Gracias nuevamente a Dennis por refactorizar mi código:
Constante de caracteres
m[]
reemplazada por literales (no sabía que podía indexar un literal).Siembra de números aleatorios con variable de pila (depende del sistema, algunos sistemas aleatorizan la asignación de memoria como medida de seguridad).
Macro con
puts
reemplazado por una macro conprintf
un código adicional que debe ejecutarse cuando el mensaje que se muestra se coloca dentro de losprintf
argumentos (se aprovecha la cara de que printf no imprime los últimos argumentos si no hay suficientes especificadores de formato en la cadena de formato).if
reemplazado por||
Cálculo de la nueva posición del jugador / wumpus colocado dentro de la nueva macro.
Ganar / perder mensajes colocados fuera del
while
bucle.if
reemplazado por operador condicional.Uso del operador condicional en línea para disparar flechas. Si el jugador falla, esto requiere tanto imprimir un mensaje como ajustar la posición de wumpus. Dennis ofreció un par de formas de combinar
printf
y calcular la posición de wumpus en una sola expresión, pero me he ido con una propia.printf
devuelve el número de caracteres impresos, que paraYour arrow didn't hit anything\n
el 31 (11111 binario.) Por lo tanto,31&Q(w)==Q(w)
.Mi otra contribución a esta edición ha sido la eliminación de algunos corchetes innecesarios.
Salida
Aquí el jugador ya ha encontrado dónde está el Wumpus, pero elige hacer una exploración exhaustiva para descubrir exactamente dónde está el pozo también. A diferencia de mi versión anterior de depuración que mostraba dónde estaban el wumpus y el hoyo durante todo el juego, esto muestra solo las salas donde el jugador ha visitado y sintió una brisa (1) olía el wumpus (2) o ambos (3). (Si el jugador dispara una flecha y falla, la variable que
a
contiene la información de posición wumpus se restablece).REPRESENTACIÓN DE ICOSAEDRO
Nota: esta sección se basa en la rev 1
Mi característica estrella! No hay gráfico en mi código. Para explicar cómo funciona, vea el mapa mundial a continuación. Cualquier punto en el icosaedro se puede representar con una latitud 0-3 y una longitud 0-4 (o un solo número
long*4+lat
,.) La línea de longitud marcada en el mapa pasa solo a través de esas caras con longitud cero, y la línea de latitud pasa El centro de las caras con latitud cero.El jugador puede orientarse en 3 ejes posibles, representados por los símbolos de la siguiente manera: norte-sur
-
noreste-suroeste\
noroeste-sureste/
. En cualquier habitación tiene exactamente una salida en cada uno de estos ejes disponibles para él. En la pantalla que se muestra, el jugador realiza un bucle completo en sentido horario. En general, es fácil de identificar desde el jugador que marca de dónde vino y, por lo tanto, a dónde se le permite ir.El único caso que es un poco difícil para el ojo no iniciado es el cuarto. Cuando vea una inclinación en una de estas filas polares, el jugador ha venido de la celda polar más cercana al extremo exterior de la inclinación y se enfrenta generalmente al ecuador. Por lo tanto, el jugador está orientado al sureste y sus opciones son: 15 (SUR, la celda a la derecha) 25 (noreste, la celda superior) o 35 (noroeste, la celda inferior).
Entonces, básicamente mapeo el icosaedro a una cuadrícula de 5x4, con celdas numeradas del 19 al 0 en el orden en que se imprimen. El movimiento se realiza sumando o restando de la posición actual, según la latitud y dirección del jugador, según la tabla a continuación.
Si el jugador sale del fondo (oeste) del tablero, regresa al lado superior (este) y viceversa, por lo que su posición se toma en el módulo 20. Generalmente, los movimientos se codifican en m [] agregando ascii 80 (
P
) al valor bruto que proporciona los caracteres que se muestran a continuación, pero en principio se puede agregar cualquier múltiplo de 20 sin afectar la operación.La entrada del jugador (dividida por 10 para eliminar el segundo dígito) se agrega a su dirección actual y se toma el módulo 3 para obtener su nueva dirección. Esto funciona bien en la mayoría de los casos. Sin embargo, hay un problema cuando está en una habitación polar y se mueve hacia el poste. Al doblar el mapa a continuación, será claro que si sale de la habitación mirando hacia el "noreste", ingresará al nuevo cuadrado que mira hacia el "sureste", por lo que se debe hacer una corrección. Esto se hace en línea
e=(d+i/10)*m[p%4]%3;
por la multiplicación porm[p%4]
. Los primeros cuatro valores de m [] se seleccionan de modo que, además de su función anterior, también tengan la característicam[1]%3==m[2]%3==1
ym[0]%3==m[3]%3==2
. Esto deja la dirección sola para las habitaciones ecuatoriales y aplica la corrección necesaria para las habitaciones polares.El momento lógico para hacer la corrección sería después del movimiento. Sin embargo, para guardar personajes se hace antes del movimiento. Por lo tanto, ciertos valores en m [] deben transponerse. Entonces, los últimos 2 caracteres son en
LT
lugar deTL
por la tabla anterior, por ejemplo.CÓDIGO SIN GOLF
este es el código rev 1, que está menos ofuscado que rev 2.
Esto se ejecutará en GCC / Linux. He incluido en los comentarios el código adicional necesario para que se ejecute en Visual Studio / Windows. ¡Es una gran diferencia!
CUESTIONES Y CURIOISIDADES
He aprovechado el punto mencionado por @professorfish, si el wumpus y el hoyo comienzan en lugares aleatorios, no hay necesidad de que el jugador comience en un lugar aleatorio. El jugador siempre comienza en la sala 19 mirando hacia el norte.
Entiendo que como el wumpus "no se ve afectado por el hoyo", el wumpus puede comenzar o entrar a la habitación donde está el hoyo. En general, esto simplifica las cosas excepto por un punto. No tengo una variable específica que indique que el juego ha terminado; termina cuando el jugador coincide con el wumpus o el hoyo. Entonces, cuando el jugador gana, muestro el mensaje ganador, ¡pero muevo el pozo hacia el jugador para salir del círculo! No puedo poner al jugador en el pozo ya que el wumpus podría estar allí y recibiría un mensaje sobre el wumpus que no quiero.
El programa rev0 funcionó perfectamente en Visual Studio, pero el IDE dijo que "la pila se corrompió alrededor de la variable i" al salir. Esto se debe a que scanf está tratando de poner un Dennis
int
en unchar.
comportamiento incorrecto en su máquina Linux debido a esto. De todos modos, se soluciona mediante el uso del tipo correcto en rev 1.La línea para mostrar el tablero en rev 0 es torpe y parece ligeramente diferente en otras plataformas. En
printf(" %c%c%c")
el medio% c se muestra el carácter imprimible. El último% c es ASCII 0 o ASCII 10 (\ n, nueva línea con retorno de carro en Windows). Parece que no hay ningún carácter en Windows que funcione en la consola, que bajará una línea sin dar un retorno de carro. Si lo hubiera, no necesitaría el primer c% (ASCII 0 o ASCII 9 antes del carácter de latitud 1. Las pestañas están notoriamente indefinidas en su comportamiento). El espacio inicial mejora el formato (coloca los caracteres de latitud 3 y 2 más cerca del carácter de latitud 1). .) Rev 1 tiene una revisión de esta línea que utiliza un carácter de avance de formulario \ f y, por lo tanto, no necesita caracteres de formato al comienzo de printf. Esto lo hace más corto, pero el \ f no funciona en Windows.fuente
scanf_s
conscanf
e incluirstdio.h
si compilo como calificador C ++ que C), pero no funciona del todo para yo. Por ejemplo, si voy a la izquierda, luego vuelvo a la derecha al principio (15 35
), estoy en una habitación diferente a la que comencé.i
hecho es el problema. La página de manual dice: " d Coincide con un entero decimal opcionalmente firmado; el siguiente puntero debe ser un puntero a int ". Cambiar el tipo hace que funcione bien.NULL
con0
yscanf_s
conscanf
, no necesitaint
antesmain
y puede moversei
yd
fuera de main (se configuran por defectoint
y se inicializan0
). Además, puede definirp=19,h=rand()%p,w=rand()%p
, reemplazarm[]
con*m
y debería ser posible definir una macro para todas las instancias deif(...==...)puts(...);
.GolfScript, 269 caracteres
Tenga en cuenta que 163 se sustrajo del recuento de caracteres para las cadenas codificadas. Si desea una salida de depuración que indique los números de sala, agregue la siguiente línea justo después de la primera aparición de
^
:Una sesión de ejemplo (con salida de depuración adicional):
fuente
{puts}:|;
, 5 caracteres reemplazandoR
yW
con-
y>
(permite eliminar espacios circundantes) y 9 caracteres soltando'> 'print
(no parece ser requerido por la pregunta).JavaScript (ECMAScript 6) -
21971759 -45% = 967.45 caracteresCasi terminado de jugar al golf ...
Incluye una GUI con un mapa icosaédrico y megabates para las bonificaciones completas.
X
(el hoyo);B
(el Mega-Murciélago);W
(el Wumpus); yP
(usted)W
yP
los botones se puede hacer clic sólo en las habitaciones adyacentes a la ubicación actual.Código:
fuente
Bash, 365 (¡primera versión de trabajo 726!)
¿Ponerse al día con GOLFSCRIPT?
@Dennis básicamente ha hecho todo el golf por mí. ¡Gracias!
El programa asume una entrada válida. La entrada válida es la dirección que elija (1 para la derecha, 2 para la izquierda, 3 para la espalda) seguida de su acción (4 para disparar, 5 para caminar).
Alguna explicación
Normalmente hago grandes explicaciones detalladas, pero esto es probablemente demasiado complicado para que me moleste.
Cada vértice en el gráfico del dodecaedro se codifica como una letra (a = 1, b = 2, ... t = 20).
La posición inicial del jugador es siempre 20 (y están de espaldas a 18), ya que eso no importa en sí mismo, solo importan las posiciones relativas del jugador, hoyo y wumpus.
La variable
$p
almacena la ubicación del jugador.$r
almacena la ubicación anterior del jugador.$w
es el wumpus y$h
(H para el hoyo) es el hoyo.Código
Historial de versiones
grep -oE
una variable. Guardado 5 caracteres.[a-z]{3}
una variable. Guardado 3 caracteres.echo
una variable. Guardado 5 caracteres.$m
.grep
y siendo un poco más sensible.C
como una función de búsqueda regexp para usar en declaraciones if, yE
como una función que imprime "Has matado al wumpus" y sale.d
y eliminó los corchetes innecesarios.Ejecución de la muestra
"In:" es entrada, "Out: es salida".
El jugador deambula un poco, huele el wumpus y dispara. Echan de menos, y el wumpus entra en su habitación y se los come.
fuente
exit
es solo un byte más largo queg=1
y elimina la necesidad de realizar pruebas de no-cerog
y algunaselif
declaraciones. 2. Puede usar en((i==35))
lugar de[ $i = 35 ]
y en...&&...
lugar deif ... then ... fi
. 3.q(){ L=({a..s});$j ${L[RANDOM%19]};}
yn=`$k $w$m<<<$d`;w=${n:RANDOM%2+1:1}
ambos guardan unos pocos bytes.while :;do
...done
confor((;;);{
...}
para un ahorro de 3 caracteresd(){ x=npoemfgnshtoksblbtckpdpljqniorelgfhkbqraicadjaghimsmjtqecrdf;s=${x:3*30#$1-30:3};}
le permitirá reemplazar las definiciones des
yn
cond $p
yd $w
. Si además defineu=${s#*$r}$s
(y ajusta las definiciones del
y enf
consecuencia), no necesitará$k
y$m
más. Ahorra 83 bytes, creo. Además, el espacioq ()
no es obligatorio.c(){ [[ $1 =~ $2 ]];}
y reemplazando, por ejemplo, la penúltima línea conc $r $b||{ $j You missed;d $w;w=${s:RANDOM%2+1:1};}
.b=$p
cond $p;u=u${s#*$r}$s
, las líneas despuésread i
cony=${u:i/10:1};C $i 5&&{ p=$y;r=$b;}||{ d $w;C $y $w&&$j You killed the wumpus&&exit;$j You missed;w=${s:RANDOM%2:1};}
y deshaciéndose de ellasE()
.GolfScript (
206198)Finalmente se puso al día con la versión de la tabla de búsqueda de Dennis, de la que toma un poco prestado. Lo interesante de esta versión es que no tiene una tabla de búsqueda para el diseño de la sala.
Las 60 simetrías rotacionales de un icosaedro son isomorfas al grupo alterno en 5 letras, A_5. Después de intentar todo tipo de enfoques para representar al grupo de manera compacta, he vuelto al más simple: cada elemento es una permutación de paridad pareja. El grupo puede generarse a partir de dos generadores en más de una forma: el enfoque que estoy tomando utiliza los generadores
3
y3 1
. Estos nos permiten generar1 = 3 3 1
,2 = 3 3 1 3 1
y3 = 3
.Observe que la dirección
3
corresponde a un elemento de orden 2, porque después de pasar por la puerta detrás de usted, esa puerta está detrás de usted nuevamente. La dirección1
corresponde a un elemento de orden 5, caminando alrededor de un vértice del icosaedro. (Del mismo modo elemento2
). Y la combinación3 1
es de orden 3, ya que recorre las habitaciones adyacentes a la que comienza detrás de usted.Por lo tanto, estamos buscando una permutación de orden 2 para representar la dirección
3
y una permutación de orden 5 para representar una dirección1
tal que3 1
sea de orden 3.Hay 15 permutaciones de orden 2 en A_5, y para cada una hay 8 permutaciones candidatas para
1
(y por lo tanto para3 1
). Hay una atracción obvia[4 3 2 1 0]
para3
: revertir una matriz es justo-1%
. De sus posibles permutaciones complementarias3 1
que he elegido[0 1 3 4 2]
, que admite una implementación bastante corta como[~@]
.Sin golf
fuente
10/@3%=
intenta acceder al cuarto elemento de una matriz de longitud 3 si la entrada es35
.9/3%@3%=
.9/
lugar de10/
todavía funciona, así que gracias.Wumpus , 384-129 (cadenas) = 255 bytes
Pruébalo en línea! (Por supuesto, TIO no tiene mucho sentido, porque no puede usar el programa de forma interactiva allí, y una vez que el programa se quede sin instrucciones en STDIN, leerá
0 0
, lo que es equivalente a3 4
, por lo que terminará disparando flechas hasta que el Wumpus se mueva allí o te mate).Cuando ejecute esto localmente, asegúrese de que el salto de línea después del segundo número de cada entrada se vacíe (porque Wumpus lo necesita para determinar que el número ha terminado). En Powershell, de alguna manera necesito ingresar un carácter más después del salto de línea para que funcione (no importa qué carácter, pero solo usé saltos de línea dobles para las pruebas).
Hay mucho espacio para jugar al golf aún más, pero probar diseños completamente nuevos lleva un tiempo. La puntuación final también depende mucho de las cadenas reales que uso, porque en un lenguaje 2D, una cadena de N bytes tiende a costarle más de N bytes de código fuente, ya que impone restricciones significativas en el diseño del código, y a menudo necesita dividirlo en varias secciones (incurriendo en comillas dobles adicionales). En el extremo, si redujera cada cadena a una sola letra (y -129 a -12), probablemente estaría ahorrando una tonelada de bytes.
Explicación
Primero un descargo de responsabilidad: A pesar del nombre de la lengua, se no se diseña para hacer la implementación de la caza del Wumpus particularmente fácil. En cambio, primero diseñé el lenguaje en torno al tema de los triángulos, terminé con una estructura de datos icosaédricas y decidí llamarlo Wumpus por eso.
Entonces, sí, aunque Wumpus se basa principalmente en la pila, también tiene 20 registros que están dispuestos alrededor de las caras de un icosaedro. Eso significa que obtenemos una estructura de datos para representar el mapa de forma gratuita. Lo único que no podemos hacer fácilmente es encontrar caras específicas en el icosaedro, por lo que para buscarlas, necesitamos "rodar el d20" hasta que terminemos en la cara que estamos buscando. (Es posible hacer esto de una manera determinista, pero eso requeriría muchos más bytes). La búsqueda de caras como esta termina casi seguramente (es decir, con probabilidad 1), por lo que la búsqueda que se ejecuta para siempre no es una preocupación en la práctica).
El código anterior es una versión de golf de esta primera implementación con un diseño más sano:
Dado que el golf consistió principalmente en comprimir el diseño, explicaré esta versión por ahora (hasta que agregue cualquier truco de golf que vaya más allá de la reestructuración del código).
Comencemos con el código de configuración:
Inicialmente, todas las caras se establecen en 0 . Codificaremos el wumpus configurando el 1 bit de la cara correspondiente, y el pozo configurando el 2 bits. De esta manera, ambos pueden estar en la misma habitación. La posición del jugador no se registrará en el icosaedro, sino que siempre estará activa (solo uno de los 20 registros está activo a la vez).
Ahora necesitamos encontrar una cara vacía al azar para colocar al jugador.
La siguiente sección verifica los alrededores del jugador e imprime las advertencias apropiadas:
Este es un ciclo que ejecutamos 3 veces. Cada vez, miramos al vecino correcto, imprimimos la (s) cadena (s) apropiada (s) si hay un peligro y luego giramos el icosaedro 120 °.
La siguiente sección lee dos números del jugador y luego mueve al jugador o dispara una flecha. El primero es trivial, el último menos. El problema principal para disparar la flecha es el caso en que falla. En ese caso, a) necesitamos ir a buscar el wumpus para moverlo, y luego b) regresar a la habitación del jugador y la orientación correcta del icosaedro (para que "atrás" permanezca "atrás"). Esta es la parte más cara de todo el programa.
El punto de entrada a esta sección es el
I
de la izquierda.Uf, esa fue la parte difícil. Ahora solo tenemos que comprobar si el jugador muere y, de lo contrario, comenzar de nuevo desde el bucle principal:
La estructura de esta sección es esencialmente idéntica a la estructura que utilizamos al verificar los alrededores del jugador: verificamos el 1 bit de la cara actual (la sala del jugador) y si está configurado imprimimos
The wumpus ate you.
y terminamos el programa. De lo contrario, verificamos los 2 bits y está configurado, imprimimosYou fell into the pit.
y terminamos el programa. De lo contrario, llegamos al2.
que salta al principio del bucle principal (en las coordenadas(0, 2)
).fuente
awk - grande
Esto no resultó tan corto como esperaba, pero tomé un enfoque ligeramente diferente para lidiar con el gráfico, así que estoy publicando la versión sin golf.
Aproveché el hecho de que un icosaedro (poliedro de 20 lados) bajo rotaciones que preserva la orientación es isomorfo al grupo alterno de grado 5 (permutaciones de 5 elementos que tienen un número par de ciclos de longitud par). Luego elijo dos permutaciones con la longitud del ciclo 5 como "izquierda" y "derecha", y elijo una permutación con la longitud del ciclo 2 como "atrás". Con estos, construyo el gráfico de una habitación caminando por el camino de Hamilton (2xRRRLLLRLRL, usando 3xRB en cada habitación para capturar las 3 direcciones posibles).
fuente