Hilf Pac-Man, die Pac-Punkte zu zählen

29

Auf Anraten von Frau Pac-Man, die besorgt ist, dass er übergewichtig wird, hat Pac-Man beschlossen, seinen täglichen Pac-Dot-Konsum im Auge zu behalten. Hilf ihm, die Anzahl der Pac-Dots auf einem bestimmten Pfad im Labyrinth zu zählen!

Das Labyrinth

Matze

Um Ihnen bei der Erstellung Ihrer eigenen Codierung des Labyrinths zu helfen, können Sie hier einige Rohdaten abrufen .

Pac-Man's Reise

Im Rahmen dieser Herausforderung gelten folgende Regeln:

  • Erstens die gute Nachricht: Die Geister sind nicht da.
  • Pac-Man startet sein Rennen immer an der auf dem obigen Bild angegebenen Position in Richtung Osten. An der Startposition befindet sich kein Pac-Dot.
  • Solange er einem geraden Weg folgt, rückt er immer weiter auf die nächsten Plätze vor.
  • Wenn er auf eine 90 ° -Drehung trifft, ohne dass ein anderer Weg verfügbar ist (orangefarbene Quadrate auf der Karte), nimmt er die Drehung automatisch und systematisch vor.
  • Wenn er auf eine Kreuzung stößt, an der mehrere Pfade zur Verfügung stehen (grüne Quadrate auf der Karte), kann er entweder in derselben Richtung weiterfahren (falls zutreffend) oder eine andere Richtung wählen (einschließlich einer Kehrtwende).
  • Wenn Pac-Man einen der Ausgänge auf der linken oder rechten Seite des Labyrinths passiert, erscheint er sofort wieder auf der gegenüberliegenden Seite.
  • Pac-Man frisst alle Pac-Dots auf dem Pfad, dem er folgt. Sobald ein Pac-Dot gegessen wurde, wird er aus dem Labyrinth entfernt.

Die Herausforderung

Eingang

Sie erhalten eine Zeichenfolge, die das Verhalten von Pac-Man an den Kreuzungen beschreibt, die er erreichen wird. Diese Zeichenfolge besteht aus folgenden Zeichen:

  • L: 90 ° nach links drehen
  • R: 90 ° nach rechts drehen
  • F: vorwärts gehen (keine Richtungsänderung)
  • B: gehe rückwärts (mach eine Kehrtwende)

Wenn alle Zeichen verarbeitet wurden, stoppt Pac-Man an der nächsten Kreuzung, auf die er trifft.

Ausgabe

Sie müssen die Anzahl der Pac-Dots drucken oder ausgeben, die entlang des Eingabepfads verbraucht wurden.

Regeln

  • Sie können ein vollständiges Programm oder eine Funktion schreiben.
  • Sie können Eingaben entweder in Groß- oder Kleinbuchstaben als Zeichenfolge oder als Array von Zeichen vornehmen. Sie können auch andere Zeichen (aber nur ein Zeichen pro Richtung) oder ganze Zahlen in verwenden [0 .. 9]. Wenn Sie dies tun, geben Sie dies bitte in Ihrer Antwort deutlich an.
  • Sie können davon ausgehen, dass die Eingabe immer gültig ist. (Das folgende jsFiddle erkennt Fehler, aber das solltest du nicht.)
  • Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.
  • Standardlücken sind verboten.

Hinweis

Es ist möglicherweise weder erforderlich noch optimal, die genaue Form des Labyrinths zu speichern.

Testfälle und Demo

Die folgenden Testfälle - oder andere Eingaben - können in diesem jsFiddle getestet werden .

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
quelle
1
Weitere hilfreiche Daten: pastebin.com/G4MnbVww . Es ist eine Liste aller Kreuzungen und die Anzahl der Punkte auf dem Weg zur nächsten Kreuzung, je nachdem, in welche Richtung Sie fahren (0 = aufwärts, 1 = links, 2 = abwärts, 3 = rechts). Möglicherweise sind einige Fehler aufgetreten. Beachten Sie, dass die Junctions 12, 13, 15, 16, 18 und 19 keinen Punkt in der Mitte haben, während alle anderen dies tun.
Esolanging Fruit
@ Challenger5 Das sieht gut aus. Da die Bewegungen relativ sind, möchten Sie wahrscheinlich auch die neue Ausrichtung von Pac-Man verfolgen, wenn die nächste Kreuzung erreicht ist.
Arnauld
Übrigens: Im Spiel kann der Spieler keine Kehrtwende machen
Matthew Roh,
4
@SIGSEGV Mit "Wenden" meine ich nur den Wechsel in die entgegengesetzte Richtung, was im ursprünglichen Arcade-Spiel und allen mir bekannten Klonen jederzeit möglich ist. Soll ich einen anderen Begriff verwenden?
Arnauld
Ich bin mir ziemlich sicher, dass Pac-Man im Arcade-Spiel nach links ging, nicht nach rechts.
mbomb007

Antworten:

10

Pyth, 356 345 + 1 = 346 Bytes

Der Code enthält einige nicht druckbare Dateien. Hier ist also der umkehrbare xxdHexdump.

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.

Benötigt das -MFlag, um die Speicherung zu deaktivieren. Leider kann dies in keinem mir bekannten Online-Testprogramm durchgeführt werden.

Hier ist eine lesbare druckbare ASCII-Version:

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

Erläuterung

Da an dieser Stelle noch sehr viel gearbeitet wird, werde ich noch keine vollständige Erklärung veröffentlichen.

Grundsätzlich stellt das Programm die Karte als (etwas seltsames) Diagramm mit fünf Nachschlagetabellen dar: 2 für die Konnektivität, 1 für die Verbindungsrichtung und 2 für die Punktzahl. Dies wurde durch ein Python-Skript mit 200 Zeilen erstellt, an dem ich viel zu viele Stunden gearbeitet habe. Dann geht das Programm einfach durch die Eingabe und zählt die Punkte, wobei die Punkttabellen auf Null aktualisiert werden, wenn die Punkte gesammelt werden.

MACHEN:

  • Schreiben Sie eine Python-Routine, um die Knoten neu zu ordnen, bis die Nachschlagetabelle so wenig Escape-Zeichen wie möglich enthält
  • Versuchen Sie, die Abschnittsbehandlung vollständig zu entfernen (sollte eine Nachschlagetabelle entfernen).
    • UPDATE: versuchte dies, scheint die Tabelle nicht zu entfernen und den Code zu verlängern
  • Neuschreiben der Pyth-Side-Logik (die aktuelle ist nicht besonders gut)
    • UPDATE: etwas erledigt, Code ist immer noch unvollkommen
PurkkaKoodari
quelle
Warum generieren Sie nicht einfach die URL, damit Sie den echten Code auf TIO ausführen können? Vielleicht sollte Dennis einen einfacheren Weg dazu hinzufügen.
mbomb007
@ mbomb007 TIO unterstützt keine Testsuiten (jedenfalls für Pyth), daher verwende ich gerne Pyths eigenen Host. Außerdem bin ich mit Browsern, die Null-Bytes korrekt verarbeiten, nicht sehr sicher.
PurkkaKoodari
Für die Nicht-Testsuite könnten Sie. Und Sie können immer noch mit Nullen codieren, Sie können sie einfach nicht kopieren / einfügen, weshalb Sie die URL generieren müssen.
mbomb007
Längste Pyth-Antwort schon?
Luis Mendo
@ LuisMendo Zumindest für mich, basierend auf einer schnellen Suche. : ~)
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...

Hex-Dump:

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

Die Binärdaten am Ende codieren zwei Arrays:

  • a besteht aus Bytepaaren, die jeweils (64 * Richtung) + junctionId darstellen

  • b ist die Anzahl der Pacman-Punkte zwischen jedem Knotenpaar in a

Das Programm liest seine eigene Quelldatei ( p.k) und decodiert die Daten.

Die Eingabe stammt von stdin und verwendet anstelle von FLBR 0x00,0x01,0x02,0x03 (auch bekannt als NUL, SOH, STX, ETX - die ersten vier ASCII-Codes).

Ich verwende meine eigene Implementierung von k, die im Vergleich zur Realität begrenzt, aufgebläht, unruhig und langsam ist . Ich teste mit folgendem Programm:

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
quelle
Ich habe einen Interpreter für Linux kompiliert (sorry, kein Windows) und die erforderlichen Dateien zum Ausführen der Tests hier abgelegt: github.com/ngn/tmp Um sie auszuführen, geben Sie einfach Folgendes ein: ./k tk Wenn Sie für immer noch einen Download-Link benötigen pk: github.com/ngn/tmp/blob/master/pk?raw=true
ngn