Shantae Dance Matching

8

No jogo Shantae original , há danças de transformação que você precisa inserir no tempo usando o D-Pad, A e B. Se você completar uma sequência predefinida enquanto dança, você se transformará na forma correspondente (ou se teleportará ou curará) . Sua tarefa é gerar o efeito correspondente quando receber uma entrada. O problema é que você pode ter movimentos de dança estranhos na entrada, antes e depois, e pode até não haver uma dança na entrada.

As Danças

Usando UDLRABpara movimentos de dança:

  • Macaco: DR
  • Elefante: DL
  • Aranha: DA
  • Harpia: DB
  • Tinkerbat: DUU
  • Curar: DUA
  • Cidade de Scuttle: DULR
  • Cidade da Água: DURLAB
  • Cidade Oásis: DURRBA
  • Caravana zumbi: DULLBA
  • Cidade dos bandidos: DUBLBR

Codificação

Entrada: uma sequência de movimentos de dança. Pode conter os valores Para cima, Para baixo, Esquerda, Direita, B, A e Aguardar. Use qualquer codificação conveniente.

Saída: um valor correspondente à primeira dança correspondente na sequência ou um valor distinto, se não houver correspondência. Você pode codificar isso de qualquer maneira conveniente.

Exemplos

Usando .para esperar:

  • DR → Macaco
  • UUU.DLUAB → Elefante
  • L.DDBALL → Harpia
  • LRLRDURURLABNenhuma correspondência
  • DUBLBR → Cidade dos Bandidos
  • DURLBANenhuma correspondência
  • DDUDR → Macaco
  • RLABNenhuma correspondência
  • .DUUBBB → Tinkerbat
  • DADRDL → Aranha
  • .DURRBADR → Cidade Oásis
  • DURR.BANenhuma correspondência

Outras regras / notas

  • Aplicam-se regras padrão sobre brechas e métodos de IO
  • Descreva sua codificação para movimentos de dança e danças correspondentes.
  • Pode haver mais de uma dança na entrada. Se for esse o caso, combine apenas o primeiro que aparece na entrada.
  • A espera interrompe as danças.
Beefster
fonte
1
Relacionado
Beefster
Agora o testcase 4 termina em DURLAB, que é Water Town
Skidsdev
@Skidsdev. Boa pegada. Eu pretendia fazer disso um caso de teste sem correspondência lá.
Beefster
1
Você pode codificar isso de qualquer maneira conveniente : podemos retornar a sequência correspondente, por exemplo, "DURRBA" para Oasis Town?
Arnauld
1
Aleatório: há muito tempo, usando apenas 'input' e 'wait' (ou seja, entradas com moedas cronometradas) nos cassinos (em um país que não mencionarei e que você provavelmente não adivinhar e que não é o meu país) (conectado a apenas por "internet") tiveram seu software de caça-níqueis hackeado na fonte, de modo que um jogador pudesse multiplicar seu pote de entrada por um número muito grande. Eles então jogaram, ganharam ou perderam e ganharam muito mais do que tinham recebido. No devido tempo, foi descoberto e consertado. Identifiquei o método com base em uma descrição geral do que estava acontecendo no geral - fornecido por um investigador de segurança confuso.
Russell McMahon

Respostas:

3

JavaScript (ES6),  92 88 61  59 bytes

Economizou 2 bytes graças a uma sugestão de @tsh

Espera UdLRABos movimentos de dança e .a espera. Saídas indefinidas se não houver correspondência ou a sequência da dança correspondente (por exemplo, dRpara Monkey ou dURLABWater Town).

s=>(/d([A-R]|U(U|A|LR|RLAB|RRBA|LLBA|BLBR))/.exec(s)||0)[0]

Experimente online!

ou Experimente com saída aprimorada

Arnauld
fonte
R|L|A|B-> [RLAB]?
Tsh
@tsh Na verdade, d([A-R]|U...)é aparentemente bom, já que qualquer codificação conveniente também pode ser usada para a entrada. Obrigado!
Arnauld
2

JavaScript (Node.js) , 179 164 153 148 137 137 115 bytes

d=>{for(;d;d=d.slice(1))for(z of "R.L.A.B.UU.UA.ULR.URLAB.URRBA.ULLBA.UBLBR".split`.`)if(!d.search('D'+z))return z}

Experimente online!

-11 bytes, graças à resposta de Arnauld, fazendo-me perceber que a saída pode ser simplificada
-8 bytes, graças à falha no bate-papo, ajudando-me a verificar campos vazios de campos de golfe
-12 bytes, graças a Shaggy

Recebe a entrada como uma sequência na mesma formatação dos casos de teste OP.

Produz a sequência de dança correspondente menos a liderança Dde uma partida ou undefinedde nenhuma partida.

O número inteiro corresponde ao índice da correspondência nesta matriz (indexada 0):

0  - Monkey: DR
1  - Elephant: DL
2  - Spider: DA
3  - Harpy: DB
4  - Tinkerbat: DUU
5  - Heal: DUA
6  - Scuttle Town: DULR
7  - Water Town: DURLAB
8  - Oasis Town: DURRBA
9  - Zombie Caravan: DULLBA
10 - Bandit Town: DUBLBR

Provavelmente espaço para jogar golfe, especialmente para comprimir o conjunto de movimentos de dança.

Explicação

Abordagem geral

Itere a sequência de entrada, removendo o primeiro caractere de cada vez e verificando se a sequência resultante começa com uma sequência de dança válida.

A coisa toda é apenas um loop for dentro de um loop for, eu vou dividi-lo em 3 partes:
- Condição
- Loop interno
- Post externo

Doença

Esta é a condição de terminação para o loop externo, ou seja, enquanto isso for verdadeiro, continue em loop.
Bem simples:

d

dé uma string, no JS, as strings vazias são falsey " dnão estão vazias".

Laço interno

É isso que acontece a cada loop:

for(z of "R.L.A.B.UU.UA.ULR.URLAB.URRBA.ULLBA.UBLBR".split`.`)

Então, primeiro definimos uma matriz com:

"R.L.A.B.UU.UA.ULR.URLAB.URRBA.ULLBA.UBLBR".split`.`

Isso cria uma matriz de todas as cordas de dança, perdendo Do início de cada uma delas (todas começam com D). Vamos chamar essa matriz x
. Provavelmente há um potencial significativo de golfe aqui.

Em seguida, iteramos por cada item em x(armazenado em z) e executamos o seguinte:

if(!d.search('D'+z))return z

Isso usa d.searchpara retornar o índice na sequência de 'D'+z. Se e somente se d começar com 'D'+z, isso retornará 0, que é um valor falsey em JS.
Como tal, !d.searchserá única ser verdade quando a corda começa com 'D'+z.

Nota: É por isso que omitimos o Ds in x, pois ele economiza 10 bytes (1 por dança) e custa apenas um byte nesta pesquisa

Então, se a pesquisa corresponder, retornamos z. Esta é a dança que encontramos, sem a liderança D.

Caso contrário, continuamos em loop.

Postagem externa

É isso que acontece no final de cada iteração do loop externo:

d=d.slice(1)

Basta remover o primeiro caractere de d

Sem correspondência

Se dficar vazio e nenhuma correspondência for encontrada, o final da função será atingido. Isso retorna implicitamente undefinedconforme o comportamento padrão do JavaScript

Skidsdev
fonte
@ Shaggy Acabei de fazer a substr -> slicealteração sozinho e continuo esquecendo que dé uma string, não uma matriz. Strings vazias são Falsey: P E boa captura nas braçadeiras, eu esqueci sobre o todo 1 criança declaração coisa
Skidsdev
@ Shaggy ah bom! Presumo d.searchirá retornar 0 se a string de pesquisa é no início do d, que é, naturalmente, um valor Falsey
Skidsdev
Sim. É meio que parecido, indexOfmas suporta RegEx, o que é irrelevante aqui.
Shaggy
E, claro, também é 1 byte mais curto;)
Skidsdev
82 bytes
Shaggy de
2

Retina ,53 43 42. 37 bytes

0L`;\w|;:(:|A|LR|RLAB|RRBA|LLBA|BLBR)

Experimente online!

Desvia ligeiramente da entrada e saída padrão para usar ;:como DUrespectivamente. Inspiração de tsh , economizando 5 bytes.

Combina a primeira dança e a produz, depois de ver a resposta de Arnauld . Economizou 10 bytes graças a Neil, sugerindo o uso do estágio de lista Le limitando a saída à primeira correspondência. Economizou um byte graças ao tsh diminuindo o regex.

O cabeçalho e rodapé apenas permitem várias entradas e tornam a saída legível, respectivamente.

FryAmTheEggman
fonte
43 bytes . Pode ser traduzido para o Retina 0.8.2 usando em 1!vez de 0L, mas nesse caso o rodapé não funcionará ( 1M!funcionará mesmo com o rodapé).
Neil
@ Neil Obrigado pelo golfe, eu sempre esqueço L.
FryAmTheEggman
Talvez R|L|A|B-> [RLAB]?
tsh
@tsh Obrigado! Essa foi uma retração da minha abordagem anterior e eu nunca a verifiquei.
FryAmTheEggman
Mais um passo, que tal D[RLAB]|DU(...)?
Tsh
1

Perl 5 -p , 47 bytes

/D([RLAB]|U(U|A|LR|LLBA|RLAB|RRBA|BLBR))/;$_=$&

Experimente online!

Retorna o código da dança (permitido conforme o comentário de @ Arnauld) ou em branco se não houver correspondência.

Xcali
fonte
1

Carvão , 48 bytes

≔⌊E⁺D⪪”{➙∧⪫⁻Y⟧¹⊟AOP9GKπ⁸Pa↷VB”D⟦⌕⁺θιιLι⟧η✂θ§η⁰Ση

Experimente online! Link é a versão detalhada do código. Explicação:

⁺D⪪”{➙∧⪫⁻Y⟧¹⊟AOP9GKπ⁸Pa↷VB”D

Divida a sequência compactada RDLDADBDUUDUADULRDURLABDURRBADULLBADUBLBR(que contém todas as danças, exceto a principal D) De, em seguida, prefixe a Dvolta para cada entrada.

E...⟦⌕⁺θιιLι⟧

Para cada dança, concatene-a com a entrada e encontre a primeira posição da dança na concatenação, além de medir a duração da dança. Para danças que não foram encontradas, isso significa que o resultado será o comprimento da sequência de entrada em vez de -1.

≔⌊...η

Pegue o mínimo desses resultados, ou seja, a posição e a duração da dança que apareceu primeiro.

✂θ§η⁰Ση

Extraia essa dança da corda original.

Neil
fonte
1

Geléia , 33 28 bytes

“¡ịḟ½NỵC\HỤĊȷṗ~’b6ṣ0;€0ɓUwⱮM

Experimente online!

Toma como entrada uma lista de números inteiros representando os movimentos:

0 D
1 U
2 R
3 B
4 L
5 A
6 .

Retorna um número inteiro quebrado para a resposta ou uma lista de todos esses números inteiros sem correspondência:

1 Monkey
2 Harpy
3 Elephant
4 Spider
5 Tinkerbat
6 Heal
7 ScuttleTown
8 OasisTown
9 WaterTown
10 BanditTown
11 ZombieCaravan
1,2,3,4,5,6,7,8,9,10,11 NoMatch

O link TIO inclui código no rodapé para convertê-los novamente nas seqüências de caracteres da pergunta, mas não é necessário para o programa funcionar usando os números inteiros especificados aqui.

Nick Kennedy
fonte
0

05AB1E , 104 bytes

'dð.•—Áå•«•¼L?D/8¢Am.Z¼ž•6BSèJ#«å.•g³ç¼…¬ÿ¬Õ‚YÙ•“ÆÚàæɾ ÿ“#.•664Îè¡HĆ∍•¸«“scuttle„©Ê´ bandit“#ð“‰à“«««sÏ

Experimente online!


Eu escrevi essa monstruosidade sem perceber que eu poderia usar números para mover nomes ...

Urna de polvo mágico
fonte
0

sfk , 119 91 bytes

xex -i -firsthit
_DR_
_DL_
_DA_
_DB_
_DUU_
_DUA_
_DULR_
_DURLAB_
_DURRBA_
_DULLBA_
_DUBLBR_

Experimente online!

Dá a primeira dança presente como uma sequência de movimentos.

( xexé apenas um editor de stream e, neste caso, _<pattern>_é um texto de pesquisa)

Furioso
fonte
0

05AB1E , 28 27 bytes

Guardado 1 byte graças a Grimy

Œ.Δ•1Λ*#$ß‘«∍@…9\÷•6B1¡1ìQZ

Experimente online!

Produz a correspondência ( 10por exemplo, para Monkey) ou -1sem correspondência

1 = D
0 = R
2 = L
3 = A
4 = B
5 = U
6 = .

Explicação

Œ.Δ                           # Find the first substring of the input
                         Q    # that is equal to
                          Z   # any element in
   •1Λ*#$ß‘«∍@…9\÷•           # 29058694378496950170872579685936
                   6B         # converted to base-6
                     1¡       # split on 1's
                       1ì     # with a 1 prepended to each
Emigna
fonte
@ Grimy: Obrigado! Eu tinha uma versão anterior (mais) onde eu não precisava do ¦, mas eu não acho de reordenação depois que eu mudei o significado dos números :)
Emigna