Aidez Pac-Man à compter les Pac-Dots

29

Sur les conseils de Mme Pac-Man qui craint qu'il ne fasse de l'embonpoint, Pac-Man a décidé de suivre son apport quotidien en Pac-Dot. Aidez-le à compter le nombre de Pac-Dots sur un chemin donné dans le labyrinthe!

Le labyrinthe

Labyrinthe

Pour vous aider à créer votre propre encodage du labyrinthe, vous pouvez obtenir des données brutes ici .

Le voyage de Pac-Man

Dans le cadre de ce défi, les règles suivantes s'appliquent:

  • Tout d'abord, la bonne nouvelle: les fantômes ne sont pas là.
  • Pac-Man commence toujours sa course à la position indiquée sur l'image ci-dessus, en direction de l'Est. Il n'y a pas de Pac-Dot à la position de départ.
  • Tant qu'il suit un chemin droit, il continue de progresser vers les cases suivantes.
  • Lorsqu'il rencontre un virage à 90 ° sans aucun autre chemin disponible (carrés orange sur la carte), il prend automatiquement et systématiquement le virage.
  • Lorsqu'il rencontre une jonction où plusieurs chemins sont disponibles (carrés verts sur la carte), il peut soit continuer dans la même direction - le cas échéant - soit choisir une autre direction (y compris faire demi-tour).
  • Lorsque Pac-Man passe par l'une des sorties du milieu gauche ou du milieu droit du labyrinthe, il réapparaît immédiatement du côté opposé.
  • Pac-Man mange tous les Pac-Dots sur le chemin qu'il suit. Une fois qu'un Pac-Dot a été mangé, il est retiré du labyrinthe.

Le défi

Contribution

Vous recevrez une chaîne décrivant le comportement de Pac-Man sur les jonctions qu'il va atteindre. Cette chaîne sera composée des caractères suivants:

  • L: tourner à 90 ° vers la gauche
  • R: tourner à 90 ° vers la droite
  • F: aller de l'avant (pas de changement de direction)
  • B: reculer (faire demi-tour)

Lorsque tous les personnages ont été traités, Pac-Man s'arrête à la prochaine jonction qu'il rencontre.

Sortie

Vous devez imprimer ou imprimer le nombre de Pac-Dots consommés le long du chemin d'entrée.

Règles

  • Vous pouvez écrire un programme complet ou une fonction.
  • Vous pouvez prendre les entrées en majuscules ou en minuscules, sous la forme d'une chaîne ou d'un tableau de caractères. Vous pouvez également utiliser d'autres caractères (mais un seul caractère par direction) ou des entiers dans [0 .. 9]. Si vous le faites, veuillez le préciser clairement dans votre réponse.
  • Vous pouvez supposer que l'entrée est toujours valide. (Le jsFiddle ci-dessous détectera les erreurs, mais vous n'êtes pas censé le faire.)
  • Il s'agit de code-golf, donc le code le plus court en octets l'emporte.
  • Les failles standard sont interdites.

Allusion

Il peut ne pas être nécessaire ni optimal pour stocker la forme exacte du labyrinthe.

Cas de test et démo

Les cas de test suivants - ou toute autre entrée - peuvent être testés dans ce 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
la source
1
Voici quelques données supplémentaires pour vous aider: pastebin.com/G4MnbVww . C'est une liste de chaque jonction et du nombre de pac-dots sur la route de la prochaine jonction selon la direction dans laquelle vous allez (0 = haut, 1 = gauche, 2 = bas, 3 = droite). Il peut y avoir quelques erreurs, et gardez à l'esprit que les jonctions 12, 13, 15, 16, 18 et 19 n'ont pas de point au milieu, tandis que toutes les autres le font.
Esolanging Fruit
@ Challenger5 Cela semble bon. Parce que les mouvements sont relatifs, vous voudrez probablement également garder une trace de la nouvelle orientation de Pac-Man lorsque la prochaine jonction sera atteinte.
Arnauld
BTW Dans le jeu pac man ne peut pas faire demi-tour
Matthew Roh
4
@SIGSEGV Par «demi-tour», je veux juste dire changer dans la direction opposée, ce qui est possible à tout moment dans le jeu d'arcade original et tous les clones que je connais. Dois-je utiliser un autre terme?
Arnauld
Je suis sûr que Pac-Man a commencé à se diriger vers la gauche dans le jeu d'arcade, pas vers la droite.
mbomb007

Réponses:

10

Pyth, 356 345 + 1 = 346 octets

Le code contient des non imprimables, voici donc le xxdvidage hexadécimal réversible .

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.

Nécessite le -Mdrapeau pour désactiver la mémorisation. Malheureusement, cela ne peut être fait dans aucun exécuteur en ligne que je connaisse.

Voici une version ASCII imprimable et lisible :

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

Explication

Il s'agit d'un travail en cours, donc je ne publierai pas encore d'explication complète.

Fondamentalement, le programme représente la carte sous la forme d'un graphique (quelque peu étrange) utilisant cinq tables de recherche: 2 pour la connectivité, 1 pour les directions de jonction et 2 pour le nombre de points. Cela a été construit par un script Python de 200 lignes sur lequel j'ai passé beaucoup trop d'heures. Ensuite, le programme parcourt simplement l'entrée et compte les points, mettant à jour les tables de points à zéro au fur et à mesure que les points sont collectés.

FAIRE:

  • Écrire une routine Python pour réorganiser les nœuds jusqu'à ce que la table de recherche contienne le moins de caractères nécessitant un d'échappement
  • Essayez de supprimer complètement la gestion des sections (devrait supprimer une table de recherche)
    • MISE À JOUR: essayé cela, semble ne pas supprimer la table et allonger le code
  • Réécrire la logique côté Pyth (l'actuelle n'est pas très jouée)
    • MISE À JOUR: un peu fait, le code est toujours imparfait
PurkkaKoodari
la source
Pourquoi ne générez-vous pas simplement l'URL pour pouvoir exécuter le vrai code sur TIO? Dennis devrait peut-être ajouter un moyen plus simple de le faire.
mbomb007
@ mbomb007 TIO ne prend pas en charge les suites de tests (pour Pyth, de toute façon), donc j'aime utiliser le propre hôte de Pyth. De plus, je ne suis pas très confiant avec les navigateurs qui gèrent correctement les octets nuls.
PurkkaKoodari
Pour la suite non-test, vous pourriez. Et vous pouvez toujours coder avec des valeurs nulles, vous ne pouvez tout simplement pas les copier / coller, c'est pourquoi vous devez générer l'URL.
mbomb007
La plus longue réponse Pyth à ce jour?
Luis Mendo
@LuisMendo Au moins pour moi, basé sur une recherche rapide. : ~)
PurkkaKoodari
2

k, 264 octets

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...

Vidage hexadécimal:

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

Les données binaires à la fin codent deux tableaux:

  • a se compose de paires d'octets, chacune représentant (64 * direction) + junctionId

  • b est le nombre de points Pacman entre chaque paire de jonctions a

Le programme lit son propre fichier source ( p.k) et décode les données.

L'entrée provient de stdin et utilise 0x00,0x01,0x02,0x03 (alias NUL, SOH, STX, ETX - les quatre premiers codes ASCII) au lieu de FLBR.

J'utilise ma propre implémentation de k qui est limitée, gonflée, planteuse et lente par rapport à la réalité . Je teste avec le programme suivant:

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
la source
J'ai compilé un interpréteur pour Linux (désolé, pas de Windows) et j'ai mis les fichiers nécessaires pour exécuter les tests ici: github.com/ngn/tmp Pour les exécuter, tapez simplement: ./k tk Si vous avez toujours besoin d'un lien de téléchargement pour pk: github.com/ngn/tmp/blob/master/pk?raw=true
ngn