Quando eu era garoto, as crianças passeavam pelas lojas de computadores e brincavam de Hunt the Wumpus até a equipe nos expulsar. Era um jogo simples, programável nos computadores domésticos de meados da década de 1970, máquinas tão rudimentares que, em vez de microprocessadores do tamanho de filhotes, acho que alguns deles provavelmente tinham filhotes de verdade lá.
Vamos evocar essa época passada, reproduzindo o jogo em hardware moderno.
O jogador começa em uma sala aleatória em um mapa icosaédrico (portanto, há 20 salas no total, conectadas umas às outras como as faces de um icosaedro, e cada sala tem exatamente três saídas).
O wumpus começa em uma sala diferente selecionada aleatoriamente. O wumpus fede e seu odor pode ser detectado em qualquer uma das três salas adjacentes à sua localização, embora a direção do odor seja impossível para o jogador determinar. O jogo relata apenas "você cheira um wumpus".
O jogador carrega um arco e um número infinito de flechas, as quais ele pode atirar a qualquer momento na sala à sua frente. Se o wumpus estiver naquela sala, ele morre e o jogador vence. Se o wumpus não estava naquela sala, ele se assusta e se move aleatoriamente para qualquer uma das três salas conectadas à sua localização atual.
Uma sala selecionada aleatoriamente (garantida que não é a sala em que o jogador inicia) contém um poço sem fundo. Se o jogador estiver em qualquer sala adjacente ao poço, ele sentirá uma brisa, mas não terá idéia de qual porta veio da brisa. Se ele entrar na sala com o poço, ele morre e Wumpus vence. O wumpus não é afetado pelo poço.
Se o jogador entrar na sala do wumpus, ou se o wumpus entrar na sala do jogador, o wumpus vence.
O jogador especifica a direção que ele está enfrentando com um número (1 = direita, 2 = esquerda, 3 = atrás) e, em seguida, uma ação (4 = disparar uma flecha, 5 = caminhar na direção especificada).
Para fins de pontuação, cada corda do jogo ("Você sente uma brisa", "Você sente um cheiro de wumpus", "Sua flecha não atingiu nada" etc.) pode ser considerada um byte. Não é permitido abusar disso para ocultar o código do jogo no texto; isso é apenas para interagir com o jogador.
Deduza 10% da sua contagem de bytes para implementar megabats, que começam em uma sala aleatória diferente do jogador (embora eles possam compartilhar uma sala com o wumpus e / ou o poço). Se o jogador entrar na sala com os morcegos, eles levarão o jogador para outra sala selecionada aleatoriamente (garantido que não é a sala com a cova ou o wumpus nela), antes de voar para o seu próprio local aleatório. Nas três salas adjacentes aos morcegos, eles podem ser ouvidos rangendo, mas o jogador não recebe informações sobre de qual sala o som vem.
Deduzir 35% da sua contagem de bytes para implementar uma interface gráfica que mostra o mapa icosaédrico e algum tipo de indicação das informações que o jogador tem até agora sobre a localização do poço, do wumpus e dos morcegos (se aplicável), em relação a o jogador. Obviamente, se o wumpus se mover ou o jogador se mover pelos morcegos, o mapa precisará ser redefinido de acordo.
A contagem de bytes mais baixa, conforme ajustado, vence.
O código-fonte BÁSICO de uma versão do jogo (não necessariamente em conformidade com as regras acima e, em todo o caso, totalmente não destruído) pode ser encontrado neste site e provavelmente em outros.
fonte
Respostas:
GolfScript, 163
A pontuação é obtida pela contagem de bytes (290), adicionando o número de cadeias usadas para interação com o usuário (6) e subtraindo o comprimento combinado dessas cadeias (133). Os feeds de linha fazem parte das cadeias e contribuem para a contagem de bytes.
Milestones
Portado resposta de professorfish do Bash para GolfScript. Pontuação: 269
Atuei nas sugestões de Peter Taylor nos comentários. Pontuação: 250
Peter Taylor refatorou meu código inteiro e me ajudou a compactar a tabela de pesquisa. Pontuação: 202
Substituiu a tabela de pesquisa de salas adjacentes por uma abordagem matemática. Pontuação: 182
Entrada, saída e função refatoradas que suportam a abordagem matemática. Pontuação: 163
Um grande "obrigado!" Vai para Peter Taylor por toda a sua ajuda.
Como funciona
As 20 salas são representadas como os vértices de um dodecaedro, aos quais foram atribuídos números de 0 a 19 da seguinte maneira:
Para encontrar as salas adjacentes à sala N e ordená-las no sentido horário, temos que considerar quatro casos:
Se N ≡ 0 mod 4 (vértices azuis), a sala adjacente é 19 - N , N + 2 mod 20 e N - 2 mod 20 .
Se N ≡ 1 mod 4 (vértices verdes), a sala adjacente é 19 - N , N - 4 mod 20 e N + 4 mod 20 .
Se N ≡ 2 mod 4 (vértices amarelos), a sala adjacente é 19 - N , N - 2 mod 20 e N + 2 mod 20 .
Se N ≡ 3 mod 4 (vértices vermelhos), a sala adjacente é 19 - N , N + 4 mod 20 e N - 4 mod 20 .
fonte
Q
com19rand 97+
; 2 em@
com97%3*&>
..., mais 1 por inliningQ
como{19rand 97+}2*:,\:H
, alguns, substituindo|
com*
, que é muitas vezes a melhor maneira de fazer umif
.B
não serve para nada, e acho que mais algumas variáveis poderiam ser eliminadas usando a pilha.256base 20base
(e provavelmente também eliminar alguns +/- 97). A única desvantagem é que serão necessários caracteres não imprimíveis.You were killed by the wumpus
sem mencionar a falta da flecha. É por isso que eu estava anexando a versão não bonita.2*2+
=>)2*
REV0 C ++ (Visual Studio no Windows) 405Abaixo está uma demonstração, demonstrando que (desde que você não comece ao lado de um perigo) com a jogada correta, você sempre poderá vencer. O jogador sente uma brisa, se vira e faz um loop completo no sentido anti-horário. Como ele leva exatamente 5 movimentos para sentir uma brisa novamente, ele conhece o buraco à direita e fica o mais longe possível. Da mesma forma, quando ele cheira o wumpus, sem saber se é direito ou esquerdo, ele se vira e faz um loop no sentido horário. São necessários 5 movimentos para cheirar o wumpus novamente, então ele sabe que está à esquerda e atira com certeza.
Se ele tivesse dado uma volta para o outro lado, teria encontrado o wumpus mais cedo e saberia que estava na mesma direção em que estava virando.
REV1 C (GCC em Cygwin), bônus de 431-35% = 280,15Novas linhas adicionadas para maior clareza. As alterações do Rev 0 são as seguintes:
Um grande agradecimento ao @Dennis por recomendar o compilador GCC no emulador Cygwin Linux para Windows. Este compilador não requer os
include
s no programa rev 0 e permite oint
tipo padrão para variáveis.main.
Esta é uma dica de golfe para mudar a vida!Além disso, a execução no Linux significa que
\f
o cursor é movido para baixo sem fazer um retorno de carro (diferente do Windows, onde apenas produz um símbolo imprimível.) Isso permitiu um encurtamento considerável da instrução printf que imprime a placaVárias dicas adicionais de Dennis nos comentários, e uma das minhas: mudança de condição ao verificar se a flecha atingiu o wumpus:
if(q==w)
>if(q-w)
(..else .. está invertido)Adição de exibição gráfica mostrando as informações que o jogador sabe sobre onde um wumpus é fundido / uma brisa é sentida para reivindicar o bônus de 35%. (Excluí a versão antiga de depuração, que mostrava a posição exata do wumpus e do buraco. Ela pode ser vista no histórico de edições.)
REV2 C (GCC em Cygwin), bônus de 389-35% = 252,85
Agradeço novamente a Dennis por refatorar meu código:
Constante de char
m[]
substituída por literais (eu não sabia que era possível indexar um literal.)Semeadura de números aleatórios com variável de pilha (dependente do sistema, alguns sistemas randomizam a alocação de memória como uma medida de segurança.)
Macro
puts
substituída por uma macroprintf
e código adicional que deve ser executado quando a mensagem exibida é colocada dentro deprintf
argumentos (vantagem da face que printf não imprime os últimos argumentos se não houver especfificadores de formato suficientes na cadeia de formato).if
substituído por||
Cálculo da nova posição do player / wumpus colocada dentro da nova macro.
Ganhar / perder mensagens colocadas fora do
while
loop.if
substituído pelo operador condicional.Uso do operador condicional em linha para disparar flecha. Se o jogador errar, isso requer a impressão de uma mensagem e o ajuste da posição do wumpus. Dennis ofereceu algumas maneiras de combinar
printf
e o cálculo da posição do wumpus em uma única expressão, mas eu optei por uma das minhas.printf
retorna o número de caracteres impressos, que paraYour arrow didn't hit anything\n
é 31 (11111 binário.) Portanto31&Q(w)==Q(w)
,.Minha outra contribuição para esta edição foi a eliminação de alguns colchetes desnecessários.
Saída
Aqui, o jogador já descobriu onde está o Wumpus, mas escolhe fazer uma exploração completa para descobrir exatamente onde está o poço. Ao contrário da minha versão antiga de depuração, que mostrava onde estavam os wumpus e os boxes durante todo o jogo, isso mostra apenas as salas onde o jogador visitou e sentiu uma brisa (1) cheirando os wumpus (2) ou ambos (3). (Se o jogador disparar uma flecha e errar, a variável que
a
contém as informações da posição do wumpus será redefinida.)REPRESENTAÇÃO DE ICOSAHEDRON
Nota: esta seção é baseada na rev 1
Meu recurso de estrela! Não há gráfico no meu código. Para explicar como funciona, veja o mapa do mundo abaixo. Qualquer ponto no icosaedro pode ser representado por uma latitude 0-3 e uma longitude 0-4 (ou um único número
long*4+lat
.) A linha de longitude marcada no mapa passa apenas por aquelas faces com longitude zero e a linha de latitude passa por o centro das faces com latitude zero.O jogador pode ser orientado em 3 eixos possíveis, representados pelos símbolos da seguinte forma: norte-sul
-
nordeste-sudoeste\
noroeste-sudeste/
. Em qualquer sala, ele tem exatamente uma saída em cada um desses eixos à sua disposição. No visor mostrado, o aparelho faz um loop completo no sentido horário. Geralmente é fácil identificar a partir da marcação do jogador de onde ele veio e, portanto, para onde ele pode ir.O único caso um pouco difícil para os olhos não iniciados é o quarto. Quando você vê uma inclinação em uma dessas linhas polares, o jogador veio da célula polar mais próxima da extremidade externa da inclinação e está geralmente voltado para o equador. Portanto, o jogador está voltado para o sudeste e suas opções são: 15 (SUL, a célula à direita) 25 (nordeste, a célula acima) ou 35 (noroeste, a célula abaixo).
Então, basicamente mapeio o icosaedro em uma grade 5x4, com células numeradas de 19 a 0 na ordem em que são impressas. A mudança é feita adicionando ou subtraindo da posição atual, dependendo da latitude e direção do jogador, conforme a tabela abaixo.
Se o jogador sai do fundo (oeste) do tabuleiro, ele volta ao lado superior (leste) e vice-versa, então sua posição é tomada no módulo 20. Geralmente, os movimentos são codificados em m [] adicionando ascii 80 (
P
) ao valor bruto, fornecendo os caracteres mostrados abaixo, mas o princípio de qualquer múltiplo de 20 pode ser adicionado sem afetar a operação.A entrada do jogador (dividida por 10 para remover o segundo dígito) é adicionada à sua direção atual e tomada no módulo 3 para obter sua nova direção. Isso funciona bem na maioria dos casos. No entanto, há um problema quando ele está em uma sala polar e se move em direção ao polo. Ficará claro ao dobrar o mapa abaixo que, se ele sair da sala voltada para "nordeste", ele entrará no novo quadrado voltado para "sudeste", para que uma correção seja feita. Isso é feito na linha
e=(d+i/10)*m[p%4]%3;
pela multiplicação porm[p%4]
. Os quatro primeiros valores de m [] são selecionados de modo que, além de sua função acima, eles também tenham a característicam[1]%3==m[2]%3==1
em[0]%3==m[3]%3==2
. Isso deixa a direção sozinha para as salas equatoriais e aplica a correção necessária para as salas polares.O tempo lógico para fazer a correção seria após a mudança. No entanto, para salvar os caracteres, isso é feito antes da mudança. Portanto, certos valores em m [] devem ser transpostos. Portanto, os dois últimos caracteres são
LT
substituídosTL
pela tabela acima, por exemplo.CÓDIGO NÃO GOLFE
este é o código da rev 1, que é menos ofuscado que a rev 2.
Isso será executado no GCC / Linux. Incluí nos comentários o código extra necessário para executá-lo no Visual studio / Windows. É uma grande diferença!
QUESTÕES E CURIOSIDADES
Eu aproveitei o ponto mencionado por @professorfish, se o wumpus e o pit começarem em lugares aleatórios, não será necessário que o jogador comece em um lugar aleatório. O jogador sempre começa na sala 19, voltada para o norte.
Entendo que, como o wumpus "não é afetado pelo poço", o wumpus pode começar ou entrar na sala onde está o poço. Em geral, isso simplifica as coisas, exceto um ponto. Não tenho uma variável específica para indicar que o jogo acabou; acaba quando o jogador coincide com o wumpus ou poço. Então, quando o jogador vence, eu mostro a mensagem vencedora, mas movo o poço para o jogador para sair do circuito! Não posso colocar o jogador no poço, pois os wumpus podem estar lá e receberia uma mensagem sobre os wumpus que não quero.
O programa rev0 funcionou perfeitamente no visual studio, mas o IDE dizia "pilha corrompida em torno da variável i" na saída. Isso ocorre porque o scanf está tentando
int
inserir umchar.
comportamento incorreto relatado por Dennis em sua máquina Linux por causa disso. De qualquer forma, é corrigido pelo uso do tipo correto na rev 1.A linha para exibir o quadro na rev 0 é desajeitada e parece um pouco diferente em outras plataformas. No
printf(" %c%c%c")
meio,% c é o caractere imprimível exibido. O último% c é ASCII 0 ou ASCII 10 (\ n, nova linha com retorno de carro no Windows.) Parece não haver nenhum caractere no Windows que funcione no console, que irá descer uma linha sem dar um retorno de carro. Se houvesse, não precisaria do primeiro c% (guia ASCII 0 ou ASCII 9 antes do caractere de latitude 1. As guias são notoriamente indefinidas em seu comportamento.) .) Rev 1 tem uma revisão dessa linha que usa um caractere de alimentação de formulário \ f e, portanto, não precisa de caractere de formato no início do printf. Isso o torna mais curto, mas o \ f não funciona no Windows.fonte
scanf_s
porscanf
e incluastdio.h
se eu compilar como avaliador C ++ que C), mas não funciona muito bem para mim. Por exemplo, se eu for para a esquerda e depois para a direita no início (15 35
), estou em uma sala diferente daquela em que iniciei.i
é realmente o problema. A página do manual diz: " d Corresponde a um número inteiro decimal opcionalmente assinado; o próximo ponteiro deve ser um ponteiro para int ." Alterar o tipo faz com que funcione bem.NULL
por0
escanf_s
comscanf
, você não precisaint
antesmain
e pode moveri
-se parad
fora do main (elas são padronizadasint
e inicializadas0
). Além disso, você pode definirp=19,h=rand()%p,w=rand()%p
, substituirm[]
por*m
e deve ser possível definir uma macro para todas as instâncias deif(...==...)puts(...);
.GolfScript, 269 caracteres
Observe que 163 foi subtraído da contagem de caracteres para as seqüências codificadas. Se você deseja uma saída de depuração indicando os números dos quartos, adicione a seguinte linha logo após a primeira ocorrência de
^
:Uma sessão de exemplo (com saída de depuração adicional):
fonte
{puts}:|;
, 5 caracteres substituindoR
eW
com-
e>
(permite eliminar espaços ao redor) e 9 caracteres soltando'> 'print
(não parece ser exigido pela pergunta).JavaScript (ECMAScript 6) -
21971759 -45% = 967,45 caracteresQuase terminando o golfe ...
Inclui uma GUI com um mapa de Icosahedral e mega-morcegos para os bônus completos.
X
(o Pit);B
(o Mega-Morcego);W
(os Wumpus); eP
(você).W
eP
podem ser clicados apenas nas salas adjacentes à sua localização atual.Código:
fonte
Bash, 365 (primeira versão de trabalho 726!)
TRABALHANDO COM GOLFSCRIPT?
@Dennis basicamente fez todo o golfe por mim. Obrigado!
O programa assume entrada válida. A entrada válida é a direção que você escolhe (1 para a direita, 2 para a esquerda, 3 para as costas), seguida pela sua ação (4 para disparar, 5 para caminhar).
Alguma explicação
Normalmente faço grandes explicações detalhadas, mas isso provavelmente é um pouco complicado demais para eu ser incomodada.
Cada vértice no gráfico do dodecaedro é codificado como uma letra (a = 1, b = 2, ... t = 20).
A posição inicial do jogador é sempre 20 (e eles estão de costas para 18), uma vez que isso não importa por si só, apenas as posições relativas do jogador, poço e wumpus são importantes.
A variável
$p
armazena a localização do jogador.$r
armazena a localização anterior do jogador.$w
é o wumpus e$h
(H para buraco) é o poço.Código
Histórico de Versões
grep -oE
uma variável. Guardado 5 caracteres.[a-z]{3}
uma variável. Guardado 3 caracteres.echo
uma variável. Guardado 5 caracteres.$m
.grep
e sendo um pouco mais sensível.C
como uma função de pesquisa regexp a ser usada nas instruções if eE
como uma função imprimindo "Você matou o wumpus" e saindo.d
e removeu suportes desnecessários.Amostra de execução
"In:" é entrada, "Out: é saída".
O jogador vagueia um pouco, cheira o wumpus e atira. Eles sentem falta, e o wumpus entra em seu quarto e os come.
fonte
exit
possui apenas um byte a maisg=1
e elimina a necessidade de testarg
algumaselif
instruções diferentes de zero e algumas . 2. Você pode usar em((i==35))
vez de[ $i = 35 ]
e em...&&...
vez deif ... then ... fi
. 3.q(){ L=({a..s});$j ${L[RANDOM%19]};}
en=`$k $w$m<<<$d`;w=${n:RANDOM%2+1:1}
ambos economizam alguns bytes.while :;do
...done
porfor((;;);{
...}
para economizar 3 caracteresd(){ x=npoemfgnshtoksblbtckpdpljqniorelgfhkbqraicadjaghimsmjtqecrdf;s=${x:3*30#$1-30:3};}
permitirá substituir as definições des
en
comd $p
ed $w
. Se, além disso, definiru=${s#*$r}$s
(e ajustar as definições del
ef
conformidade), você não vai precisar$k
e$m
mais. Economiza 83 bytes, eu acho. Além disso, o espaço de entradaq ()
não é necessário.c(){ [[ $1 =~ $2 ]];}
e substituindo, por exemplo, a penúltima linha comc $r $b||{ $j You missed;d $w;w=${s:RANDOM%2+1:1};}
.b=$p
comd $p;u=u${s#*$r}$s
as linhas depoisread i
comy=${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};}
e se livrarE()
.GolfScript (
206198)Finalmente pego a versão da tabela de pesquisa de Dennis, da qual ela empresta bastante. O interessante desta versão é que ela não possui uma tabela de pesquisa para o layout da sala.
As 60 simetrias rotacionais de um icosaedro são isomórficas ao grupo alternado de 5 letras A_5. Depois de tentar todos os tipos de abordagens para representar o grupo de maneira compacta, voltei à mais simples: cada elemento é uma permutação de paridade uniforme. O grupo pode ser gerado a partir de dois geradores de mais de uma maneira: a abordagem que estou adotando usa os geradores
3
e3 1
. Estes permitem-nos gerar1 = 3 3 1
,2 = 3 3 1 3 1
e3 = 3
.Observe que a direção
3
corresponde a um elemento da ordem 2, porque depois de passar pela porta atrás de você, essa porta está atrás de você novamente. A direção1
corresponde a um elemento da ordem 5, andando em torno de um vértice do icosaedro. (Elemento da mesma forma2
). E a combinação3 1
é da ordem 3, pois percorre as salas adjacentes àquela que começa atrás de você.Então, nós estamos procurando uma permutação de ordem 2 para representar direção
3
e uma permutação de ordem 5 para representar direção1
tal que3 1
é de ordem 3.Existem 15 permutações da ordem 2 em A_5 e para cada uma existem 8 permutações candidatas para
1
(e, portanto, para3 1
). Há uma atração óbvia[4 3 2 1 0]
para3
: inverter uma matriz é justa-1%
. Das suas possíveis permutações complementares3 1
que eu escolhi[0 1 3 4 2]
, que admite uma implementação bastante curta como[~@]
.Ungolfed
fonte
10/@3%=
tenta acessar o quarto elemento de uma matriz de comprimento 3 se a entrada for35
.9/3%@3%=
.9/
vez de10/
ainda funciona, então obrigado.Wumpus , 384 - 129 (cadeias) = 255 bytes
Experimente online! (É claro que o TIO não faz muito sentido, porque você não pode usar o programa de maneira interativa e, assim que o programa ficar sem instruções no STDIN, ele lerá
0 0
, o que equivale a3 4
, então você acabará atire flechas até que o Wumpus se mova para lá ou o mate.)Ao executar isso localmente, verifique se o avanço de linha após o segundo número de cada entrada é liberado (porque o Wumpus precisa dele para determinar que o número acabou). No Powershell, de alguma forma, preciso inserir mais um caractere após o avanço de linha para fazê-lo funcionar (não importa qual caractere, mas usei apenas o avanço de linha duplo para teste).
Há muito espaço para jogar golfe ainda mais, mas experimentar layouts completamente novos leva um tempo. A pontuação final também depende muito das strings reais que eu uso, porque em uma linguagem 2D, uma string de N bytes tende a custar mais do que N bytes de código fonte, porque impõe restrições significativas ao layout do código, e você frequentemente precisa dividi-lo em várias seções (com aspas duplas adicionais). No extremo, se eu reduzisse cada string a uma única letra (e os -129 a -12), provavelmente estaria economizando uma tonelada de bytes.
Explicação
Primeiro um aviso: apesar do nome do idioma, ele não foi projetado para facilitar a implementação do Hunt the Wumpus . Em vez disso, primeiro projetei a linguagem em torno do tema dos triângulos, acabei com uma estrutura de dados icosaédrica e decidi chamá-la de Wumpus por causa disso.
Então, sim, enquanto o Wumpus é principalmente baseado em pilha, ele também possui 20 registros, dispostos em torno das faces de um icosaedro. Isso significa que obtemos uma estrutura de dados para representar o mapa gratuitamente. A única coisa que não podemos fazer com facilidade é encontrar rostos específicos no icosaedro; portanto, para procurá-los, precisamos "rolar o d20" até terminar no rosto que procuramos. (É possível fazer isso de uma maneira determinística, mas isso levaria muito mais bytes.) A busca por rostos como esse termina quase com certeza (ou seja, com probabilidade 1); portanto, a pesquisa em andamento para sempre não é uma preocupação na prática).
O código acima é uma versão em golf desta primeira implementação com um layout mais limpo:
Como o golfe envolvia principalmente a compactação do layout, explicarei esta versão por enquanto (até adicionar quaisquer truques que vão além da reestruturação do código).
Vamos começar com o código de instalação:
Inicialmente, todas as faces são definidas como 0 . Codificaremos o wumpus configurando o bit 1 da face correspondente e o poço configurando o bit 2. Dessa forma, os dois podem estar na mesma sala. A posição do jogador não será registrada no icosaedro, mas sempre estará ativa (apenas um dos 20 registros está ativo por vez).
Agora precisamos encontrar um rosto vazio aleatório para colocar o jogador.
Esta próxima seção verifica o ambiente do jogador e imprime os avisos apropriados:
Este é um loop que percorremos três vezes. Cada vez que olhamos para o vizinho certo, imprima a (s) corda (s) apropriada (s) se houver risco e gire o icosaedro em 120 °.
A próxima seção lê dois números do jogador e, em seguida, move o jogador ou dispara uma flecha. O primeiro é trivial, o segundo menos. O principal problema para disparar a flecha é o caso em que ela falha. Nesse caso, a) precisamos procurar o wumpus para movê-lo e, em seguida, b) retornar à sala do jogador e a orientação correta do icosaedro (para que "voltar" permaneça "voltar"). Essa é a parte mais cara de todo o programa.
O ponto de entrada para esta seção é o
I
à esquerda.Ufa, essa foi a parte mais difícil. Agora só precisamos verificar se o jogador morre e, caso contrário, começa novamente no loop principal:
A estrutura desta seção é essencialmente idêntica à estrutura que usamos ao verificar o ambiente do jogador: verificamos o bit 1 da face atual (a sala do jogador) e, se estiver configurada, imprimimos
The wumpus ate you.
e encerramos o programa. Caso contrário, verificamos os 2 bits e está definido que imprimimosYou fell into the pit.
e encerramos o programa. Caso contrário, alcançamos o2.
que retorna ao início do loop principal (nas coordenadas(0, 2)
).fonte
awk - grande
Isso não saiu tão curto quanto eu esperava, mas adotei uma abordagem um pouco diferente para lidar com o gráfico, por isso estou postando a versão não-destruída de qualquer maneira.
Aproveitei o fato de que um icosaedro (poliedro de 20 lados) sob rotações preservando a orientação é isomórfico ao grupo alternado de grau 5 (5 permutações de elementos com um número par de ciclos de comprimento par). Em seguida, escolho duas permutações com comprimento de ciclo 5 como "esquerda" e "direita" e escolho uma permutação com comprimento de ciclo 2 como "voltar". Usando isso, construo o gráfico de uma sala percorrendo o caminho hamiltoniano (2xRRRLLLRLRL, usando 3xRB em cada sala para capturar as três direções possíveis).
fonte