O pannenkoek2012 tem como objetivo completar o Super Mario 64 com o menor número possível de pressionamentos do botão A, o que faz Mario pular. Cada "A press" consiste em três partes:
- Pressionando o botão
- Segurando-o por qualquer período de tempo
- Liberando-o
Veja este vídeo (1:15 - 3:23) para uma ótima explicação que inclui a imagem acima. (No entanto, esse desafio não usará a terminologia de meia imprensa e colocará obstáculos que exigem a liberação de A.)
Tarefa:
Dada uma sequência de obstáculos que exigem pressionar (P), segurar (H) ou soltar (R) o botão A, produz o menor número de pressionamentos necessários para superá-los na ordem indicada. O botão A inicialmente não está pressionado.
Declarado formalmente: dada uma sequência S de caracteres PHR
, considere as sequências de forma (PH*R)*
que contenham S como uma subsequência e produza o menor número possível de P
s nessa sequência. Ou, como alternativa, encontre o menor número de pedaços da forma em P?H*R?
que S pode ser dividido.
Exemplo
Vamos dar uma olhada na entrada RHRPHHHR
. O botão A começa a não R
ser pressionado ; portanto, para superar o obstáculo inicial, é necessário pressionar e soltar o botão (pressione # 1). Em seguida, é necessário manter o botão pressionado H
, o que novamente exige que ele seja pressionado primeiro (pressione # 2). Em seguida, ele pode ser liberado posteriormente para satisfazer o R
depois. Por fim, o restante PHHHR
pode ser satisfeito com uma única pressão (pressione # 3) seguida de segurar HHH
e soltarR
. Portanto, a contagem de saída é 3.
Outra maneira de ver isso é que podemos dividir a string de entrada em 3 partes do formulário, PHH..HHR
onde as letras podem ser omitidas.
R
HR
PHHHR
Formato de entrada
A entrada será uma lista ou sequência de elementos que representam pressionar, segurar e liberar como sua escolha:
P, H, R
p, h, r
1, 2, 3
0, 1, 2
correspondido na ordem indicada. A entrada não estará vazia.
Casos de teste:
P 1
H 1
R 1
HP 2
RHP 3
HHR 1
PHRH 2
RHRPHHHR 3
HHHHHH 1
PPRRHHPP 6
HPPRHRPRHPPRHPPHRP 12
PRHRHPHHPRRRHPPRHHPPRRRHRHPRPHPRPRHHRPPPRHPRP 28
Entre os melhores:
Respostas:
Retina , 9 bytes
Experimente online!
fonte
Pitão , 13 bytes
Experimente aqui! ou Verifique todos os casos de teste.
Observe que
1
também funciona no lugar de3
.Como funciona?
Mais sobre o regex:
fonte
Gelatina , 10 bytes
Uma cadeia monádica pegando uma lista (a
P,H,R : 0,1,2
opção) e retornando um número inteiro, a contagem.Experimente online! ou veja a suíte de testes
Quão?
Efetivamente funciona, obtendo todos os pares adjacentes, em seguida, contar os que não são "pares de continuação" (
PR
,PH
,HR
ouHH
) e adicionando um.Solução anterior de 11 bytes:
Experimente online! ou veja a suíte de testes
Quão?
Funciona como o descrito acima, mas de uma maneira completamente diferente ...
e outro, novamente bem diferente:
(adicione 19 a cada um e, em seguida, para os pares adjacentes, faça exponenciação, módulo por 13, módulo por 2, somar e adicionar um).
fonte
Lote, 69 bytes
Recebe entrada como uma lista de parâmetros de linha de comando indexados a 0, mas você pode usar uma lista de letras
p, h, r
em maiúsculas ou minúsculas se digitarset /a p=0, h=1, r=2
primeiro. Explicação:b
mantém a última entrada (padrão2
para liberada) en
a contagem de impressoras. Cada entrada adiciona uma impressora se a última entrada foi uma liberação ou a entrada atual é uma impressora.fonte
set
pode definir várias variáveis ao mesmo tempo? Útil saber.set /a
é uma avaliação aritmética, desde que todas as variáveis que você deseja definir sejam numéricas, você pode simplesmente usar o operador de vírgula para concatenar as expressões de atribuição.Python 2, 44 bytes
Usa P-> 1 H-> 2 R-> 3
fonte
Deorst , 11 bytes
Experimente online!
Usa a regex do Sr. Xcoder
fonte
Japonês, 11 bytes
Experimente |Verifique todos os casos de teste
è
conta o número de correspondências do RegEx na entrada eÉ
subtrai 1.fonte
Python 2 , 48 bytes
Experimente online!
Toma
0,1,2
como entrada.fonte
Casca ,
65 bytesExperimente online! A entrada é uma lista acima
0,1,2
(o link TIO usa letras para facilitar a cópia e colar dos casos de teste).Explicação
Eu uso a mesma idéia geral da resposta de Jonathan Allan Jelly : divida nas ocorrências dos "pares de descontinuidade" PP, HP, RH, RR e RP e conte os blocos resultantes. Na codificação 0,1,2, esses pares são exatamente aqueles cujo elemento esquerdo é 2 ou elemento direito é 0.
fonte
Javascript (ES6), 30 bytes
fonte
Haskell , 36 bytes
Experimente online!
Usa a
0,1,2
codificação.fonte
Gelatina , 10 bytes
Experimente online! ou suíte de teste! (
Roubadoemprestado de Jonathan.)Alternativo:
Experimente online!
Gelatina , 11 bytes
Guardou 1 byte com a ajuda de caird coinheringaahing.
Experimente online!
fonte
μ
partir do terceiroKotlin , 36 bytes
Embelezado
Teste
TIO
TryItOnline
fonte
J ,
1817 bytes-1 Obrigado a @FrownyFrog
Recebe entrada na forma de
0,1,2
. A função auxiliar no TIO converte os casos de teste para este formulário.Experimente online!
A lógica das comparações ainda pode ser jogável. Estou torcendo meu cérebro, tentando pensar em declarações mais equivalentes e mais curtas.
Explicação (solução anterior)
A única diferença entre a solução atual e a anterior é como as comparações são geradas. A solução atual compara explicitamente elementos adjacentes deslocando a matriz e a solução anterior compara elementos adjacentes observando infixes de 2.
Isso seria muito mais limpo se duas retenções não fizessem nada. O código pega infixes de dois e verifica se eles não estão em ascensão e não em duas retenções. Se for esse o caso, adicionamos um à nossa contagem final. Nós temos que adicionar 1 ao final, já que estamos fora de um caso contrário (ou você pode acrescentar um
_
ou qualquer valor maior que 2).A maneira como verifica se o infixo é duas retenções é multiplicando os dois valores e ver se é um (duas retenções são
1 1
).fonte
1+1#.}:(<+:1=*)}.
é um mais curto.1+1#.0=}.*2-}:
Vim +
wc
, 25 bytes␊
é a chave de retorno e␘
é Ctrl+XExperimente online!
Explicação
fonte