Na versão arcade do jogo, Pac-Man come pac-dots. No entanto, neste desafio, ele tem fome de caracteres alfanuméricos e pontuação em uma sequência.
Sua tarefa é criar uma função que alimente uma sequência de caracteres do Pac-Man, avalie se ele pode ou não comê-la e retorne a sequência com a localização do Pac-Man.
Pac-Man ( <
) come caracteres da esquerda para a direita, deixando um sublinhado ou espaço para cada personagem à medida que avança, e seu objetivo é ir da primeira posição-1 à última posição + 1:
1. <Pac
2. _<ac
3. __<c
4. ___<
No entanto, o inimigo natural do Pac-Man, o fantasma, irá detê-lo se ele encontrar uma das letras da palavra "FANTASMA" (não diferencia maiúsculas de minúsculas). Sua função deve retornar a string com a localização do Pac-Man quando ele encontrar o ghost
personagem:
1. <No!
2. _<o!
A única coisa que pode derrotar um fantasma é um pellet de poder. Se o Pac-Man alcançar uma letra com a palavra "PELLET" (também não diferencia maiúsculas de minúsculas) antes de chegar a um fantasma, ele o comerá e continuará se movendo, e esse pellet será usado. Grânulos de poder podem empilhar (ou seja, em ppgg
ambos os fantasmas seriam comidos). O caractere T existe como um fantasma e um pellet, para que possa ser ignorado (tratado como qualquer outra letra, como a
).
1. <Pop
2. _<op
3. __<p
4. ___<
Para esclarecer, na sequência "Pac-Man perde aqui", ocorrem as seguintes operações:
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
Exemplos
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: ___________<
Isso é código-golfe - a menor pontuação em bytes ganha.
fonte
<
símbolo ...Respostas:
Geléia,
3433 bytesExperimente online!
Acho que finalmente estou começando a entender Jelly. Parece um pouco assustador.
fonte
Retina ,
5538 bytesExperimente online! (A primeira linha apenas permite executar vários casos de teste ao mesmo tempo.)
Explicação
O problema é essencialmente encontrar o prefixo mais longo que não tem um parêntese de fechamento incomparável. Exceto que podemos usar
e
,l
oup
no lugar de(
e oug
,h
,o
ous
no lugar de)
.Portanto, essa solução é quase um exemplo de grupo de balanceamento. Não entrarei em muitos detalhes sobre como eles funcionam, pois esse código é essencialmente o mesmo que o exemplo padrão que você pode ler na minha resposta SO sobre grupos de balanceamento .
O programa inteiro é, portanto, uma única substituição de regex. A
i
ativa caso insensibilidade. Em seguida, combinamos um pellet[elp]
e incrementamos o contador de profundidade (na forma da pilha de captura de grupo2
), ou combinamos com algo que não é um fantasma[ghos]
ou com um fantasma.
e diminuímos o contador de profundidade ao sair da pilha2
. Obviamente, em princípio, isso permite combinar um pellet com a[^ghos]
seção ou um não-fantasma com a.
seção, mas, graças à correspondência gananciosa e à maneira como a regex é retornada, essas possibilidades nunca são tentadas pelo mecanismo de regex.A substituição usa dois recursos específicos da Retina:
$*
repete o caractere à sua direita quantas vezes for especificado pelo token à sua esquerda. Esse token é$.&
a duração de toda a partida. Isso significa apenas que substituímos cada personagem da partida por a_
. E também anexamos a<
a esses sublinhados. A parte da entrada que não é consumida simplesmente não é afetada pela substituição.fonte
Python 2,
114113108 bytesfonte
None
, não a resposta. E como você conta 107? Conto 110.Python 2, 89 bytes
Às vezes, minha determinação obstinada de tornar o Python uma linguagem funcional tem seus benefícios.
(Levemente) não destruído:
Constrói a sequência de resultados usando recursão. A atualização para
l
(para "vidas") adiciona 1 para pellets (True - False == 1
), subtrai 1 para fantasmas (False - True == -1
) e adiciona 0 para qualquer outro caractere. Ele também adiciona 0 quandos
a string vazia, graças ao fatiamento do Python e ao fato de que'' in any_str == True
, portanto, o pellet e o ghost são cancelados.A declaração de retorno usa
test and b or a
no lugar dea if test else b
para salvar um byte. O caso da base de recursão ocorre quando a corda termina ou o Pac-Man fica sem pellets, representado sucintamente comos*p
, o que é igual''
(e, portanto, avalia falso) quando és == ''
oup == 0
.fonte
C #,
269256232212211 BytesPrimeiro post aqui, então isso provavelmente é muito mais longo do que poderia ser (e provavelmente porque está em C #). Qualquer dica sobre onde eu poderia encurtar seria ótimo!
Obrigado a todos nos comentários que me ajudaram!
Versão Golfed
Versão ungolfed
fonte
else
salvar mais 5 caracteres. E iniciando o loop,i = 1
você poderá remover o último se o código puder ser executado sempre.s[i]
acesso para 5 caracteres.P="PELpel"
eG="GHOSghos"
? Você os usa apenas uma vez cada. Estou faltando alguma coisa, ou são apenas 4 caracteres extras? Além disso, você precisa doelse
?"PELpel".Contains(c)
e"GHOSghos".Contains(c)
deve ser mutuamente exclusivo.Pitão,
534844 bytes4 bytes graças a @ Pietu1998 pelo truque
!!@
->}
(que somente pessoas que conhecem Pyth podem entender)Suíte de teste.
fonte
!!@
é apenas um trigrama para}
, certo? : pMATL ,
373635 bytesExperimente online!
Explicação
fonte
JavaScript (ES6), 98 bytes
Explicação:
p
mantém o número atual de pelotas. Se já é negativo, retornamos o caractere e seguimos em frente, para que o restante da string seja intocado. Caso contrário, examinamos o caractere atual e, se isso sep
tornar negativo, inserimos o<
caractere, caso contrário, substituímos o caractere atual por_
. Por fim, sep
nunca se tornar negativo, temos o sufixo<
a na string.fonte
Pitão,
474644 bytesExperimente online. Suíte de teste.
Uma abordagem bem diferente da da Leaky Nun's, e tenho certeza de que isso pode ser ainda mais importante.
fonte
Z
em vez deG
e mudançaf!
paraf!h
t
no"ghost"
deve ser removidoLua,
198190184185 185163 BytesOk, eu admito, isso é longo. Muito longo. Lua tem algumas ferramentas para brincar com strings, mas é limitado, o mesmo vale para condicionais que ocupam muitos espaços.
Edit: obrigado @LeakyNun por me salvar 9 bytes :) Perdi alguns bytes para corrigir um erro
Edit 2: 163 Bytes solution found by @LeakyNun
Antigo 185
Ungolfed
fonte
d=c:lower()
e pesquise também os caracteres maiúsculos #and 1or s and 1or s
s and s
print(('').rep('_',i)..','..z:sub(i+1))
i
pode ser #nil
Python 3,
176157150149134133124 bytesDefina uma função nomeada
f
que aceita a string como argumentoProvavelmente pode ser jogado mais
Obrigado a todos que comentaram: D
fonte
x=c.upper()
e procure correspondências em minúsculas;
vez de ter cada uma em sua própria linha. Além disso, você pode usar o Python 2, que permite usar espaços como primeiro nível de intenção e tabulações como segundo.n=i=0
, nãon=0
ei=0
.t[i]="_"
em vez det[i] = "_"
, o mesmo parat[i] = "<"
.return''.join(t)
, remova esse espaço."GgHhOoSs"
e"PpEeLl"
.Python 3,
114110 bytesMeu primeiro código de golfe.
Agradecimentos ao Dr. Green Eggs e Iron Man por salvar 4 bytes.
Utiliza a avaliação de booleanos para um e zero para condensar um AND lógico a uma multiplicação. (0 * 0 = 0, 1 * 0 = 0, 1 * 1 = 1). Espero que seja uma boa primeira tentativa.
fonte
while s[x:]*l
para tirar 4 bytes.Powershell, 185
Ungolfed:
fonte
Python3,
211184 bytesO argumento 's' é uma string
Gostaria muito de receber algumas dicas de golfe, pois esta é minha primeira tentativa de golfe com código
Obrigado por comentar :)
fonte
return "_"*c + "<" + s[c:]
por apenas a,break
pois esse código será executado após o loop for de qualquer maneira.Haskell,
119113 bytesObrigado a Daniel Wagner por 6 bytes a menos.
Chame como
p "Hello World!"
.O
1then
é um caso extremo que é interpretado corretamente no meu GHC (7,10), mas ele lança da maioria dos marcadores de sintaxe. Portanto, também pode ser interpretado de forma diferente no seu compilador.Ungolfed:
fonte
n!(c:s)|elem c"blah"=blah|elem c"blah"=blah|0<1=blah
.C, 237 bytes
fonte
C ++,
315373327 bytes(Nota: ainda jogando golfe)
fonte
if()
, e remover os espaços em torno!=
,||
,=
,-
, e<=
. Além disso, nãocin>>input
funciona em vez degetline
? Você também pode condensar;
.Ruby, (119 bytes)
Provavelmente há algumas coisas que estou perdendo, pois sou novo nisso ...
Ruby é meu amigo :)
fonte
Perl, 54 (52 + 2) bytes
Precisa
-p
ser especificado nas opções da linha de comandos.Explicação:
A
-p
opção faz com que a instrução seja quebrada em um loop de leitura-modificação-impressão, onde durante cada iteração do loop,$_
contém uma linha de entrada, incluindo o delimitador de linha.O regex é basicamente a mesma idéia da resposta da Retina.
Chame o padrão de pesquisa
([pel](?1)*[ghos]|[^ghos ])*
"aceitável". Em seguida, pode ser definido recursivamente como:Uma string é "aceitável" se:
PELLET
exceto porT
, seguido por uma sequência aceitável, seguido por um caractere emGHOST
exceto porT
.GHOST
excetoT
que não é um caractere de nova linha.Essa definição permite mais pellets do que fantasmas: um
PEL
caractere pode ser correspondido como um caractere de pellet ou um caractere não fantasma.A cadeia vazia é considerada aceitável; portanto, é garantido que o regex corresponde à posição 0, onde a substring aceitável mais longa será correspondida.
Essa substring aceitável mais longa é correspondida por sublinhados de comprimento igual, seguidos por
<
.fonte
-p
usada-
, por exemploperl -e
- ->perl -pe
, a opção-
será gratuita. Mas acho que aperl -e
versão é mais longa por causa da citação, então acho que não posso usá-la aqui.