Dans la version arcade du jeu, Pac-Man mange des pac-dots. Cependant, dans ce défi, il a soif de caractères alphanumériques et de ponctuation dans une chaîne.
Votre tâche consiste à créer une fonction qui alimente une chaîne avec Pac-Man, évalue s’il peut la manger ou non, et renvoie la chaîne contenant la localisation de Pac-Man.
Pac-Man ( <
) mange les personnages de gauche à droite, en laissant un trait de soulignement ou un espace pour chaque personnage au fur et à mesure de son passage, et son objectif est de passer de la première position à la dernière position + 1:
1. <Pac
2. _<ac
3. __<c
4. ___<
Cependant, l'ennemi naturel de Pac-Man, le fantôme, l'arrêtera s'il rencontre l'une des lettres du mot "GHOST" (non sensible à la casse). Votre fonction devrait renvoyer la chaîne contenant l'emplacement de Pac-Man lorsqu'il rencontre le ghost
personnage:
1. <No!
2. _<o!
La seule chose qui peut vaincre un fantôme est une pastille de pouvoir. Si Pac-Man parvient à une lettre contenant le mot "PELLET" (sans tenir compte de la casse) avant d' arriver à un fantôme, il mangera le fantôme et continuera à avancer, et ce pellet sera utilisé. Les granules de pouvoir peuvent empiler (c.-à-d., Les ppgg
fantômes seraient mangés) Le caractère T existe à la fois comme un fantôme et une pastille, de sorte qu'il peut être ignoré (traité comme toute autre lettre, comme a
).
1. <Pop
2. _<op
3. __<p
4. ___<
Pour clarifier davantage, dans la chaîne "Pac-Man perd ici", les opérations suivantes ont lieu:
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
Exemples
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: ___________<
Ceci est code-golf - le score le plus bas en octets gagne.
la source
<
symbole ...Réponses:
Gelée,
3433 octetsEssayez-le en ligne!
Je pense que je commence enfin à comprendre Jelly. Se sent un peu effrayant.
la source
Retina ,
5538 octetsEssayez-le en ligne! (La première ligne permet simplement d'exécuter plusieurs cas de test à la fois.)
Explication
Le problème est essentiellement de trouver le préfixe le plus long qui n’ait pas de parenthèse fermante sans correspondance. Sauf que nous pouvons utiliser soit
e
,l
oup
à la place(
et soitg
,h
,o
ous
à la place de)
.Par conséquent, cette solution est presque un exemple classique d'équilibrage de groupes. Je n’entrerai pas dans les détails sur leur fonctionnement, car ce code est essentiellement le même que l’exemple standard que vous pouvez lire dans ma réponse au SO sur l’équilibrage des groupes .
L'ensemble du programme est donc une substitution de regex unique. Le
i
active insensibilité à la casse. Ensuite, nous apparions une pastille[elp]
et incrémentons le compteur de profondeur (sous la forme de la pile de capture du groupe2
), ou nous associons quelque chose qui n'est pas un fantôme[ghos]
ou nous associons un fantôme avec.
et décrémentons le compteur de profondeur en sautant de la pile.2
. Bien sûr, cela permet en principe de faire correspondre une pastille avec la[^ghos]
section ou un non-fantôme avec la.
section, mais grâce à la correspondance gourmande et au retour en arrière de la regex, ces possibilités ne sont jamais tentées par le moteur de regex.La substitution utilise ensuite deux fonctionnalités spécifiques à Retina:
$*
répète le caractère à sa droite autant de fois que spécifié par le jeton à sa gauche. Ce jeton est$.&
la longueur de la partie entière. Cela signifie simplement que nous remplaçons chaque caractère du match par un_
. Et puis nous ajoutons aussi un a<
à ces traits de soulignement. La partie de l'entrée qui n'est pas consommée reste simplement non affectée par la substitution.la source
Python 2,
114113108 octetsla source
None
, pas la réponse. Et comment comptez-vous 107? Je compte 110.Python 2, 89 octets
Parfois, ma détermination obstinée à faire de Python un langage fonctionnel a ses avantages.
(Légèrement) ungolfed:
Construit la chaîne de résultat en utilisant la récursivité. La mise à jour de
l
(pour "vies") ajoute 1 pour pellets (True - False == 1
), soustrait 1 pour fantômes (False - True == -1
) et ajoute 0 pour tout autre personnage. Il ajoute également 0 quands
est la chaîne vide, grâce au découpage en Python et au fait que'' in any_str == True
, de sorte que la pastille et le fantôme s'annulent.La déclaration return utilise
test and b or a
à la place dea if test else b
pour sauvegarder un octet. Le cas de base de la récursivité se produit lorsque la chaîne se termine ou que Pac-Man manque de pastilles, représentées succinctement pars*p
ce qui est égal à''
(et donc égal à faux) lorsques == ''
oup == 0
.la source
C #,
269256232212211 octetsTout premier message ici, c'est probablement beaucoup plus long que prévu (et probablement parce qu'il est en C #). Des conseils sur où je pourrais raccourcir ce serait génial!
Merci à tout le monde dans les commentaires qui m'a aidé!
Version golfée
Version non-golfée
la source
else
enregistrer 5 caractères supplémentaires. Et en démarrant la boucle à,i = 1
vous devriez pouvoir supprimer le dernier si le code peut être exécuté à chaque fois.s[i]
accès pour 5 caractères.P="PELpel"
etG="GHOSghos"
? Vous ne les utilisez qu'une fois chacun. Est-ce que je manque quelque chose, ou est-ce seulement 4 caractères supplémentaires? Aussi, avez-vous besoin deelse
?"PELpel".Contains(c)
et"GHOSghos".Contains(c)
devrait être mutuellement exclusif.Pyth,
534844 octets4 octets grâce à @ Pietu1998 pour le
!!@
->}
trick (dont seuls les gens qui savent Pyth peut comprendre)Suite de tests.
la source
!!@
un trigraphe pour}
, non? : pMATL ,
373635 octetsEssayez-le en ligne!
Explication
la source
JavaScript (ES6), 98 octets
Explication:
p
conserve le nombre actuel de pellets. Si c'est déjà négatif, nous retournons simplement le personnage et passons à autre chose, afin que le reste de la chaîne ne soit pas touché. Sinon, nous examinons le caractère actuel et si celap
devient négatif, nous insérons le<
caractère, sinon nous remplaçons le caractère actuel par_
. Enfin, sip
jamais devient négatif, nous ajoutons un suffixe a<
à la chaîne.la source
Pyth,
474644 octetsEssayez-le en ligne. Suite de tests.
Une approche très différente de celle de Leaky Nun, et je suis tout à fait sûr que cela peut être joué plus loin.
la source
Z
au lieu deG
et changezf!
pourf!h
t
dans"ghost"
devrait être enlevéLua,
198190184185163 OctetsOk, je l'avoue, c'est long. Très long. Lua a quelques outils pour jouer avec les chaînes, mais il est limité, il en va de même pour les conditionnelles qui prennent beaucoup d'espace.
Edit: merci @ LeakyNun pour m'avoir sauvé 9 octets :) Perdu quelques octets pour corriger un bogue
Edit 2: solution de 163 octets trouvée par @LeakyNun
Vieux 185
Ungolfed
la source
d=c:lower()
et recherchez également les caractères majusculesand 1or s and 1or s
s and s
print(('').rep('_',i)..','..z:sub(i+1))
i
peut êtrenil
Python 3,
176157150149134133124 octetsDéfinir une fonction nommée
f
qui prend la chaîne en argumentPeut être probablement joué au golf plus
Merci à tous ceux qui ont commenté: D
la source
x=c.upper()
et rechercher les correspondances minuscules;
plutôt que de les avoir chacune sur sa propre ligne. Vous pouvez également utiliser Python 2, qui vous permet d’utiliser des espaces comme premier niveau d’intention et des onglets comme second.n=i=0
, pasn=0
eti=0
.t[i]="_"
au lieu det[i] = "_"
, la même chose pourt[i] = "<"
.return''.join(t)
, supprimez cet espace."GgHhOoSs"
et"PpEeLl"
.Python 3,
114110 octetsMon premier code golf.
Merci au Dr Green Eggs et à Iron Man d’avoir économisé 4 octets.
Utilise l'évaluation des booléens à un et zéro pour condenser un ET logique en une multiplication. (0 * 0 = 0, 1 * 0 = 0, 1 * 1 = 1). J'espère que c'est un bon premier essai.
la source
while s[x:]*l
supprimer 4 octets.Powershell, 185
Ungolfed:
la source
Python3,
211184 octetsL'argument 's' est une chaîne
J'apprécierais tous les conseils de golf car c'est ma première tentative de code de golf
Merci d'avoir commenté :)
la source
return "_"*c + "<" + s[c:]
par un simplebreak
car ce code sera exécuté après la boucle for de toute façon.Haskell,
119113 octetsMerci à Daniel Wagner pour 6 octets de moins.
Appelez ça comme
p "Hello World!"
.Le
1then
est un cas de bord qui est interprété correctement dans mon GHC (7.10), mais il jette la plupart des surligneurs de syntaxe. Cela pourrait donc aussi être interprété différemment dans votre compilateur.Ungolfed:
la source
n!(c:s)|elem c"blah"=blah|elem c"blah"=blah|0<1=blah
.C, 237 octets
la source
C ++,
315373327 octets(Note: toujours en train de jouer)
la source
if()
et la suppression des espaces autour!=
,||
,=
,-
et<=
. Aussi, necin>>input
fonctionne pas au lieu degetline
? Vous pouvez aussi vous condenser;
.Ruby, (119 octets)
Il y a probablement des choses qui me manquent car je suis novice dans ce domaine ...
Ruby est mon amie :)
la source
Perl, 54 (52 + 2) octets
Doit
-p
être spécifié dans les options de ligne de commande.Explication:
L'
-p
option entraîne l'enveloppe de l'instruction dans une boucle lecture-modification-impression, où, lors de chaque itération de la boucle,$_
contient une ligne d'entrée, y compris le délimiteur de ligne.La regex est en grande partie la même idée que dans la réponse de la rétine.
Appelez le motif de recherche
([pel](?1)*[ghos]|[^ghos ])*
"acceptable". Ensuite, il peut être défini de manière récursive comme:Une chaîne est "acceptable" si:
PELLET
exception deT
, suivi d'une chaîne acceptable, suivi d'un caractère à l'GHOST
exception deT
.GHOST
sauf queT
ce n'est pas un caractère de nouvelle ligne.Cette définition autorise plus de pastilles que de fantômes: un
PEL
personnage peut être comparé en tant que personnage de pastille ou non fantôme.La chaîne vide est considérée comme acceptable. Par conséquent, il est garanti que la regex correspond à la position 0, où la sous-chaîne acceptable la plus longue sera recherchée.
Cette sous-chaîne acceptable la plus longue est ensuite comparée à des traits de soulignement de longueur égale, suivis de
<
.la source
-p
déjà utilisé-
, par exempleperl -e
->perl -pe
, alors-
est libre. Mais je pense que laperl -e
version est plus longue à cause de la citation, donc je pense que je ne peux pas l'utiliser ici.