In der Arcade-Version des Spiels isst Pac-Man Pac-Dots. Bei dieser Herausforderung ist er jedoch hungrig nach alphanumerischen Zeichen und Satzzeichen in einer Zeichenfolge.
Ihre Aufgabe ist es, eine Funktion zu erstellen, die Pac-Man eine Zeichenfolge zuführt, bewertet, ob er sie essen kann oder nicht, und die Zeichenfolge mit der Position von Pac-Man darin zurückgibt.
Pac-Man ( <
) frisst die Zeichen von links nach rechts und hinterlässt für jedes Zeichen einen Unterstrich oder ein Leerzeichen. Sein Ziel ist es, von der ersten Position-1 bis zur letzten Position + 1 zu gelangen:
1. <Pac
2. _<ac
3. __<c
4. ___<
Pac-Mans natürlicher Feind, der Geist, wird ihn jedoch stoppen, wenn er auf einen der Buchstaben im Wort "GHOST" stößt (ohne Berücksichtigung der Groß- und Kleinschreibung). Ihre Funktion sollte den String mit Pac-Mans Position zurückgeben, wenn er auf das ghost
Zeichen stößt :
1. <No!
2. _<o!
Das Einzige, was einen Geist besiegen kann, ist ein Kraftpellet. Wenn Pac-Man einen Buchstaben im Wort "PELLET" erreicht (auch ohne Berücksichtigung der Groß- und Kleinschreibung), bevor er zu einem Geist kommt, wird er den Geist essen und in Bewegung bleiben, und das Pellet wird aufgebraucht. Kraftpellets können sich stapeln (dh in ppgg
beiden Geistern würde gegessen). Das T- Zeichen existiert sowohl als Geist als auch als Pellet, so dass es ignoriert werden kann (wie jeder andere Buchstabe auch a
).
1. <Pop
2. _<op
3. __<p
4. ___<
Zur weiteren Verdeutlichung werden in der Zeichenfolge "Pac-Man verliert hier" die folgenden Vorgänge ausgeführt:
P <P, +1 Pellet (1 pellet)
a <a
c <c
- <-
M <M
a <a
n <n
<[space]
l <l, +1 Pellet (2 pellets)
o <o, -1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
e <e, +1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
<[space]
h <h, ghost wins, returns
e
r
e
Beispiele
Input: Pacman wins!
Output: ____________<
Input: Pacman loses wah-wah :(
Output: _______________<h-wah :(
Input: PELLET PELLET GHOST
Output: ___________________<
Input: Hello World!
Output: <Hello World!
Input: <_!@12<_<_<
Output: ___________<
Dies ist Code-Golf - die niedrigste Punktzahl in Bytes gewinnt.
quelle
<
Symbol schaue, einen getarnten grauen Pacman mit schwarzen Lippen ...Antworten:
Jelly,
3433 BytesProbieren Sie es online!
Ich glaube, ich fange endlich an, Jelly zu verstehen. Fühlt sich ein bisschen unheimlich an.
quelle
Retina ,
5538 BytesProbieren Sie es online! (In der ersten Zeile können nur mehrere Testfälle gleichzeitig ausgeführt werden.)
Erläuterung
Das Problem besteht im Wesentlichen darin, das längste Präfix zu finden, das keine unübertroffene schließende Klammer enthält. Abgesehen davon, dass wir entweder verwenden können
e
,l
oderp
anstelle von(
und entwederg
,h
,o
oders
anstelle von)
.Somit ist diese Lösung fast ein Lehrbuchbeispiel für Bilanzkreise. Ich werde nicht zu detailliert darauf eingehen, wie sie funktionieren, da dieser Code im Wesentlichen mit dem Standardbeispiel übereinstimmt, das Sie in meiner SO-Antwort zu Bilanzkreisen nachlesen können .
Das gesamte Programm ist daher eine einzelne Regex-Ersetzung. Das
i
aktiviert die Groß- und Kleinschreibung. Dann passen wir entweder ein Pellet an[elp]
und erhöhen den Tiefenzähler (in Form des Erfassungsstapels der Gruppe2
), oder wir passen etwas an, das kein Geist ist,[ghos]
oder wir passen einen Geist an.
und dekrementieren den Tiefenzähler, indem wir vom Stapel springen2
. Grundsätzlich ist es damit zwar möglich, ein Pellet mit dem[^ghos]
Abschnitt oder ein Nicht-Ghost mit dem.
Abschnitt abzugleichen, aber dank des gierigen Abgleichs und der Art und Weise, wie der Regex zurückverfolgt wird, werden diese Möglichkeiten von der Regex-Engine nie ausprobiert.Die Ersetzung verwendet dann zwei Retina-spezifische Merkmale:
$*
Wiederholt das Zeichen zu seiner Rechten so oft, wie durch den Token zu seiner Linken angegeben. Dieser Token ist$.&
die Länge des gesamten Matches. Dies bedeutet nur, dass wir jedes Zeichen in der Übereinstimmung mit einem ersetzen_
. Und dann hängen wir<
an diese Unterstriche auch ein an. Der nicht verzehrte Teil der Eingabe bleibt von der Ersetzung einfach unberührt.quelle
Python 2,
114113108 Bytesquelle
None
, nicht die Antwort. Und wie zählt man 107? Ich zähle 110.Python 2, 89 Bytes
Manchmal hat meine hartnäckige Entschlossenheit, Python zu einer funktionalen Sprache zu machen, ihre Vorteile.
(Leicht) ungolfed:
Baut die Ergebniszeichenfolge mithilfe von Rekursion auf. Das Update auf
l
(für "Leben") addiert 1 für Pellets (True - False == 1
), subtrahiert 1 für Geister (False - True == -1
) und addiert 0 für jedes andere Zeichen. Außerdem wird 0 hinzugefügt, wenns
der String leer ist, dank Pythons Aufteilen und der Tatsache'' in any_str == True
, dass Pellet und Ghost abbrechen.In der return-Anweisung wird
test and b or a
anstelle vona if test else b
ein Byte gespeichert. Der Grundfall der Rekursion tritt auf, wenn entweder die Zeichenfolge endet oder Pac-Man keine Pellets mehr hat, kurz dargestellt alss*p
, was''
entweders == ''
oder gleich ist (und daher falsch ergibt)p == 0
.quelle
C #,
269256232212211 BytesPoste zum ersten Mal hier, das ist wahrscheinlich viel länger als es sein könnte (und wahrscheinlich, weil es in C # ist). Irgendwelche Tipps, wo ich es verkürzen könnte, wären toll!
Vielen Dank an alle in den Kommentaren, die mir geholfen haben!
Golf Version
Ungolfed-Version
quelle
else
Speicherung von 5 weiteren Zeichen funktionieren . Und indem Sie die Schleife bei starteni = 1
, sollten Sie in der Lage sein, das letzte if zu entfernen, da der Code jedes Mal ausgeführt werden kann.s[i]
Zugriff für 5 Zeichen inline .P="PELpel"
undG="GHOSghos"
? Sie verwenden sie jeweils nur einmal. Vermisse ich etwas oder sind das nur 4 zusätzliche Zeichen? Benötigen Sie auch dieelse
?"PELpel".Contains(c)
und"GHOSghos".Contains(c)
sollten sich gegenseitig ausschließen.Pyth,
534844 Bytes4 Bytes danke an @ Pietu1998 für den
!!@
->}
Trick (den nur Leute verstehen können, die Pyth kennen)Testsuite.
quelle
!!@
nur eine Trigraphie für}
, oder? : pMATL ,
373635 BytesProbieren Sie es online!
Erläuterung
quelle
JavaScript (ES6), 98 Byte
Erläuterung:
p
Behält die aktuelle Anzahl der Pellets bei. Wenn es bereits negativ ist, geben wir einfach das Zeichen zurück und fahren fort, so dass der Rest der Zeichenkette unberührt bleibt. Andernfalls untersuchen wir das aktuelle Zeichen, und wenn diesp
negativ wird, fügen wir das<
Zeichen ein, andernfalls ersetzen wir das aktuelle Zeichen durch_
. Wenn dasp
Ergebnis nie negativ wird, setzen wir ein Suffix<
an die Zeichenfolge.quelle
Pyth,
474644 BytesProbieren Sie es online aus. Testsuite.
Eine ganz andere Herangehensweise als die von Leaky Nun, und ich bin mir ziemlich sicher, dass man hier weiter Golf spielen kann.
quelle
Z
anstelle vonG
und wechseln Sief!
zuf!h
t
in"ghost"
sollte entfernt werdenLua,
198190184185163 BytesOk, ich gebe zu, das ist lang. Sehr lang. Lua hat einige Werkzeuge, um mit Streichern herumzuspielen, aber es ist begrenzt, dasselbe gilt für Bedingungen, die viel Platz beanspruchen.
Edit: danke @LeakyNun für das Speichern von 9 Bytes :) Einige Bytes verloren, um einen Fehler zu beheben
Edit 2: 163 Bytes Lösung gefunden von @LeakyNun
Alt 185
Ungolfed
quelle
d=c:lower()
und suchen Sie auch nach Großbuchstabenand 1or s and 1or s
s and s
print(('').rep('_',i)..','..z:sub(i+1))
i
kannnil
Python 3,
176157150149134133124 BytesDefinieren Sie eine Funktion mit dem Namen
f
, die den String als Argument verwendetKann wohl mehr golfen werden
Vielen Dank an alle, die kommentiert haben: D
quelle
x=c.upper()
und suchen Sie nach Übereinstimmungen in Kleinbuchstaben;
anstatt sie in einer eigenen Zeile zu haben. Sie können auch Python 2 verwenden, mit dem Sie Leerzeichen als erste Absichtsebene und Tabulatoren als zweite verwenden können.n=i=0
nichtn=0
undi=0
.t[i]="_"
stattdessent[i] = "_"
das gleiche fürt[i] = "<"
.return''.join(t)
, entferne diesen Raum."GgHhOoSs"
und"PpEeLl"
.Python 3,
114110 BytesMein erster Code Golf.
Vielen Dank an Dr. Green Eggs und Iron Man für die Einsparung von 4 Bytes.
Verwendet die Auswertung von Booleschen Werten auf eins und null, um ein logisches UND zu einer Multiplikation zu verdichten. (0 * 0 = 0, 1 * 0 = 0, 1 * 1 = 1). Ich hoffe, das ist ein guter erster Versuch.
quelle
while s[x:]*l
4 Bytes entfernen.Powershell, 185
Ungolfed:
quelle
Python3,
211184 BytesDas Argument 's' ist eine Zeichenfolge
Ich würde mich über Golftipps freuen, da dies mein erster Code-Golfversuch ist
Danke für den Kommentar :)
quelle
return "_"*c + "<" + s[c:]
durch einen ersetzen,break
da dieser Code ohnehin nach der for-Schleife ausgeführt wird.Haskell,
119113 BytesDanke an Daniel Wagner für 6 Bytes weniger.
Nennen Sie es als
p "Hello World!"
.Dies
1then
ist ein Randfall, der in meinem GHC (7.10) korrekt interpretiert wird, aber die meisten Syntax-Highlighter auslöst. Es könnte also auch in Ihrem Compiler anders interpretiert werden.Ungolfed:
quelle
n!(c:s)|elem c"blah"=blah|elem c"blah"=blah|0<1=blah
.C 237 Bytes
quelle
C ++,
315373327 Bytes(Hinweis: noch Golf spielen)
quelle
if()
und Entfernen Räume um!=
,||
,=
,-
, und<=
. Funktioniert auch nichtcin>>input
stattgetline
? Sie können auch herum kondensieren;
.Rubin, (119 Bytes)
Es gibt wahrscheinlich einige Dinge, die mir fehlen, da ich neu in diesem Bereich bin ...
Ruby ist mein Freund :)
quelle
Perl, 54 (52 + 2) Bytes
Muss
-p
in den Befehlszeilenoptionen angegeben werden.Erläuterung:
Die
-p
Option bewirkt, dass die Anweisung in eine Lese-Änderungs-Druck-Schleife eingeschlossen wird, in der während jeder Schleifeniteration$_
eine Eingabezeile einschließlich des Zeilentrennzeichens enthalten ist.Der reguläre Ausdruck ist im Wesentlichen derselbe wie in der Retina-Antwort.
Nennen Sie das Suchmuster
([pel](?1)*[ghos]|[^ghos ])*
"akzeptabel". Dann kann es rekursiv definiert werden als:Eine Zeichenfolge ist "akzeptabel", wenn:
PELLET
except forT
, gefolgt von einer akzeptablen Zeichenfolge, gefolgt von einem Zeichen inGHOST
except forT
.GHOST
Ausnahme,T
dass es sich nicht um ein Newline-Zeichen handelt.Diese Definition erlaubt mehr Pellets als Geister: Ein
PEL
Zeichen kann entweder als Pellet-Zeichen oder als Nicht-Geister-Zeichen abgeglichen werden.Die leere Zeichenfolge wird als akzeptabel angesehen, daher wird garantiert, dass die Regex an Position 0 übereinstimmt, an der die längste akzeptable Teilzeichenfolge übereinstimmt.
Diese längste akzeptable Teilzeichenfolge wird dann von gleich langen Unterstrichen gefolgt
<
.quelle
-p
schon benutzt wird-
, zBperl -e
->perl -pe
, dann-
ist der kostenlos. Aber ich denke, dieperl -e
Version ist länger, weil ich zitiere, deshalb denke ich, dass ich das hier nicht verwenden kann.