Ajude o Pac-Man a contar os Pac-Dots

29

Seguindo o conselho da Sra. Pac-Man, que está preocupada com o excesso de peso, o Pac-Man decidiu acompanhar sua ingestão diária de Pac-Dot. Ajude-o a contar o número de Pac-Dots em um determinado caminho no labirinto!

O labirinto

Labirinto

Para ajudá-lo a criar sua própria codificação do labirinto, você pode obter alguns dados brutos aqui .

A jornada de Pac-Man

No contexto desse desafio, as seguintes regras se aplicam:

  • Primeiro, as boas notícias: os fantasmas não estão lá.
  • Pac-Man sempre começa sua corrida na posição indicada na foto acima, indo para o leste. Não há Pac-Dot na posição inicial.
  • Enquanto ele segue um caminho reto, ele continua avançando para os próximos quadrados.
  • Quando ele encontra um giro de 90 ° sem nenhum outro caminho disponível (quadrados laranja no mapa), ele automaticamente e sistematicamente faz o giro.
  • Quando ele encontra uma junção onde vários caminhos estão disponíveis (quadrados verdes no mapa), ele pode continuar na mesma direção - se aplicável - ou escolher outra direção (incluindo fazer uma inversão de marcha).
  • Quando Pac-Man passa por uma das saídas no meio esquerdo ou no meio direito do labirinto, ele imediatamente reaparece no lado oposto.
  • Pac-Man come todos os Pac-Dots no caminho que está seguindo. Depois que um Pac-Dot é comido, ele é removido do labirinto.

O desafio

Entrada

Você receberá uma sequência descrevendo o comportamento do Pac-Man nos cruzamentos que ele alcançará. Essa sequência será composta pelos seguintes caracteres:

  • L: faça uma volta de 90 ° para a esquerda
  • R: faça uma volta de 90 ° para a direita
  • F: avançar (sem mudança de direção)
  • B: retroceda (faça uma inversão de marcha)

Quando todos os personagens foram processados, Pac-Man para no próximo cruzamento que ele encontra.

Saída

Você precisa imprimir ou imprimir o número de pontos-Pac consumidos ao longo do caminho de entrada.

Regras

  • Você pode escrever um programa completo ou uma função.
  • Você pode receber entradas em maiúsculas ou minúsculas, como uma sequência de caracteres ou uma matriz de caracteres. Você também pode usar outros caracteres (mas apenas um caractere por direção) ou números inteiros [0 .. 9]. Se você fizer isso, especifique-o claramente na sua resposta.
  • Você pode assumir que a entrada é sempre válida. (O jsFiddle abaixo detectará erros, mas você não deveria.)
  • Isso é código-golfe, então o código mais curto em bytes vence.
  • As brechas padrão são proibidas.

Sugestão

Pode não ser necessário nem ideal armazenar a forma exata do labirinto.

Casos de teste e demonstração

Os seguintes casos de teste - ou qualquer outra entrada - podem ser testados neste 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
fonte
11
Aqui estão mais alguns dados para ajudar: pastebin.com/G4MnbVww . É uma lista de todos os cruzamentos e o número de pontos de pac na estrada para o próximo cruzamento, dependendo de qual direção você seguir (0 = para cima, 1 = para a esquerda, 2 = para baixo, 3 = para a direita). Pode haver alguns erros, e lembre-se de que as junções 12, 13, 15, 16, 18 e 19 não têm ponto no meio, enquanto todas as outras.
Esolanging Fruit 04/04
@ Challenger5 Isso parece bom. Como os movimentos são relativos, é provável que você também queira acompanhar a nova orientação do Pac-Man quando o próximo cruzamento for alcançado.
Arnauld
BTW No homem jogo pac não pode fazer uma inversão de marcha
Matthew Roh
4
@SIGSEGV Por 'inversão de marcha', quero dizer apenas mudar para a direção oposta, o que é possível a qualquer momento no jogo arcade original e em todos os clones que eu conheço. Devo usar outro termo?
Arnauld #
Tenho certeza que Pac-Man começou a ir para a esquerda no jogo de arcade, não para a direita.
mbomb007

Respostas:

10

Pitão, 356 345 + 1 = 346 bytes

O código contém alguns imprimíveis, então aqui está o xxdhexdump reversível .

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.

Requer o -Msinalizador para desativar a memorização. Infelizmente, isso não pode ser feito em nenhum executor online que eu conheça.

Aqui está uma versão ASCII para impressão legível :

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

Explicação

Como ainda há muito trabalho em andamento, não postarei uma explicação completa ainda.

Basicamente, o programa representa o quadro como um gráfico (um tanto estranho) usando cinco tabelas de pesquisa: 2 para conectividade, 1 para direções de junção e 2 para contagem de pontos. Isso foi construído por um script Python de 200 linhas em que passei muitas horas. Em seguida, o programa apenas percorre a entrada e conta os pontos, atualizando as tabelas de pontos para zero à medida que os pontos são coletados.

FAÇAM:

  • Escreva a rotina Python para reordenar os nós até que a tabela de pesquisa contenha o menor número possível de caracteres de escape
  • Tente remover completamente o manuseio da seção (deve remover uma tabela de pesquisa)
    • UPDATE: tentei isso, parece não remover a tabela e aumentar o código
  • Reescreva a lógica do lado Pyth (a atual não é muito golfe)
    • UPDATE: um pouco pronto, o código ainda é imperfeito
PurkkaKoodari
fonte
Por que você não gera apenas o URL para poder executar o código real no TIO? Talvez Dennis deva adicionar uma maneira mais fácil de fazer isso.
mbomb007
@ mbomb007 O TIO não suporta suítes de teste (pelo menos para Pyth), então eu gosto de usar o próprio host do Pyth. Além disso, não estou muito confiante com os navegadores que manipulam bytes nulos corretamente.
precisa saber é o seguinte
Para o conjunto que não é de teste, você poderia. E você ainda pode codificar com nulos, simplesmente não pode copiá-los / colá-los, e é por isso que você precisa gerar o URL.
mbomb007
Resposta Pyth mais longa ainda?
Luis Mendo
@LuisMendo Pelo menos para mim, com base em uma pesquisa 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...

Despejo hexagonal:

$ 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                      ,"".%._.

Os dados binários no final codificam duas matrizes:

  • a consiste em pares de bytes, cada um representando (direção de 64 *) + junctionId

  • b é o número de pontos de Pacman entre cada par de junções em a

O programa lê seu próprio arquivo de origem ( p.k) e decodifica os dados.

A entrada vem do stdin e usa 0x00,0x01,0x02,0x03 (também conhecido como NUL, SOH, STX, ETX - os quatro primeiros códigos ASCII) em vez de FLBR.

Eu uso minha própria implementação do k, que é limitada, inchada, travada e lenta em comparação com a coisa real . Eu testei com o seguinte 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
fonte
Compilei um intérprete para Linux (desculpe, sem Windows) e coloquei os arquivos necessários para executar os testes aqui: github.com/ngn/tmp Para executá-los, digite: ./k tk Se você ainda precisa de um link de download para pk: github.com/ngn/tmp/blob/master/pk?raw=true
ngn