Shantae Dance Matching

8

En el juego Shantae original , hay danzas de transformación que debes ingresar a tiempo usando el D-Pad, A y B. Si completas una secuencia predefinida mientras bailas, te transformarás en la forma correspondiente (o teletransportarse o sanar) . Su tarea es generar el efecto correspondiente cuando se le da una entrada. El problema es que puede obtener movimientos de baile extraños en la entrada, tanto antes como después, y puede que ni siquiera haya un baile en la entrada.

Los bailes

Utilizando UDLRABpara movimientos de baile:

  • Mono: DR
  • Elefante: DL
  • Araña: DA
  • Arpía: DB
  • Tinkerbat: DUU
  • Sanar: DUA
  • Ciudad Scuttle: DULR
  • Ciudad del agua: DURLAB
  • Oasis Town: DURRBA
  • Caravana de zombis: DULLBA
  • Ciudad de bandidos: DUBLBR

Codificación

Entrada: una secuencia de movimientos de baile. Esto puede contener los valores Arriba, Abajo, Izquierda, Derecha, B, A y Esperar. Use cualquier codificación conveniente.

Salida: un valor correspondiente a la primera danza coincidente en la secuencia o un valor distinto si no hay coincidencia. Puede codificar esto de cualquier manera conveniente.

Ejemplos

Usando .para esperar:

  • DR → mono
  • UUU.DLUAB → Elefante
  • L.DDBALL → Arpía
  • LRLRDURURLABNo coincide
  • DUBLBR → Ciudad de bandidos
  • DURLBANo coincide
  • DDUDR → mono
  • RLABNo coincide
  • .DUUBBB → Tinkerbat
  • DADRDL → araña
  • .DURRBADR → Oasis Town
  • DURR.BANo coincide

Otras reglas / notas

  • Se aplican reglas estándar sobre lagunas y métodos de IO
  • Describa su codificación para movimientos de baile y bailes coincidentes.
  • Puede haber más de un baile en la entrada. Si ese es el caso, coincida solo con el primero que aparece en la entrada.
  • Esperar interrumpe los bailes.
Carne de res
fuente
1
Relacionado
Beefster
Ahora termina el caso de prueba 4 DURLAB, que es Water Town
Skidsdev
@Skidsdev. Buena atrapada. Quise hacer de eso un caso de prueba de no coincidencia allí.
Beefster
1
Puede codificar esto de cualquier manera conveniente : ¿podemos devolver la secuencia correspondiente, por ejemplo, "DURRBA" para Oasis Town?
Arnauld
1
Aleatorio: hace mucho tiempo, usando solo 'input' y 'wait' (es decir, entradas de monedas cronometradas) los casinos (en un país que no mencionaré y que es poco probable que adivines y que no sea mi país) (conectado a yo solo por "internet") tenía su software de máquina tragamonedas pirateado en la fuente de manera que un jugador pudiera multiplicar su bote de entrada por un número grande. Luego jugaron, ganaron o perdieron y cobraron mucho más de lo que tenían. A su debido tiempo fue descubierto y reparado. Identifiqué el método basado en una descripción general de lo que estaba sucediendo en general, proporcionado por un investigador de seguridad desconcertado.
Russell McMahon

Respuestas:

3

JavaScript (ES6),  92 88 61  59 bytes

Guardado 2 bytes gracias a una sugerencia de @tsh

Espera UdLRABlos movimientos de baile y la .espera. Salidas indefinidas si no hay coincidencia, o la secuencia de la danza coincidente (por ejemplo, dRpara Monkey o dURLABWater Town).

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

Pruébalo en línea!

o Pruébalo con salida mejorada

Arnauld
fuente
R|L|A|B-> [RLAB]?
tsh
@tsh En realidad, d([A-R]|U...)aparentemente está bien, ya que cualquier codificación conveniente también puede usarse para la entrada. ¡Gracias!
Arnauld
2

JavaScript (Node.js) , 179 164 153 148 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}

Pruébalo en línea!

-11 bytes gracias a la respuesta de Arnauld, haciéndome dar cuenta de que la salida se puede simplificar
-8 bytes gracias a flawr en el chat que me ayuda a comprobar el vacío de la matriz de golf
-12 bytes gracias a Shaggy

Toma la entrada como una cadena en el mismo formato que los casos de prueba OP.

Emite la secuencia de baile coincidente menos la guía Dpara un partido, o undefinedpara ningún partido.

El entero corresponde al índice de la coincidencia en esta matriz (indexado 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

Probablemente espacio para jugar al golf, especialmente al comprimir el conjunto de movimientos de baile.

Explicación

Enfoque general

Itere a través de la cadena de entrada, eliminando el primer carácter cada vez y verificando si la cadena resultante comienza con una cadena de baile válida.

Todo es solo un bucle for dentro de un bucle for, lo dividiré en 3 partes:
- Condición
- Bucle interno
- Poste externo

Condición

Esta es la condición de terminación para el bucle externo, IE, mientras que esto es cierto, siga bucleando.
Bastante sencillo:

d

des una cadena, en JS las cadenas vacías son falsey " dno está vacío".

Bucle interior

Esto es lo que sucede en cada ciclo:

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

Entonces, primero definimos una matriz con:

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

Esto crea una serie de todas las cuerdas de movimiento de baile, faltando Dal comienzo de cada una de ellas (todas comienzan con D). Llamaremos a este conjunto x
. Probablemente haya un potencial de golf significativo aquí.

Luego iteramos a través de cada elemento en x(almacenado en z) y ejecutamos lo siguiente:

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

Esto se usa d.searchpara devolver el índice en la cadena de 'D'+z. Si y solo si d comienza con 'D'+z, esto regresará 0, lo cual es un valor falso en JS.
Como tal, !d.searchserá solamente ser verdad cuando la cadena comienza con 'D'+z.

Nota: esta es la razón por la que omitimos el Ds in x, ya que nos ahorra 10 bytes (1 por baile), y solo nos cuesta un solo byte en esta búsqueda

Luego, si la búsqueda coincide, regresamos z. Este es el baile que hemos encontrado, sin el protagonista D.

Si no, seguimos en bucle.

Poste exterior

Esto es lo que sucede al final de cada iteración del bucle externo:

d=d.slice(1)

Solo elimina el primer personaje de d

Sin coincidencia

Si dse vacía y no se ha encontrado ninguna coincidencia, se alcanza el final de la función. Esto regresa implícitamente undefinedsegún el comportamiento estándar de JavaScript

Skidsdev
fuente
@Shaggy Yo mismo había hecho el substr -> slicecambio, y sigo olvidando que des una cadena, no una matriz. Las cadenas vacías son falsey: P Y bueno, me olvidé de todo lo de la declaración de 1 hijo
Skidsdev
@ Shaggy ah bien! Supongo d.searchque devolverá 0 si la cadena de búsqueda está al comienzo de d, lo que por supuesto es un valor
falsey
Sí. Es un poco como, indexOfpero es compatible con RegEx, lo cual es irrelevante aquí.
Shaggy
Y, por supuesto, también es 1 byte más corto;)
Skidsdev
82 bytes
Shaggy
2

retina ,53 43 42 37 bytes

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

Pruébalo en línea!

Se desvía ligeramente de la entrada y salida estándar para utilizar ;:como DUrespectivamente. Inspiración de tsh , ahorrando 5 bytes.

Coincide con el primer baile y lo emite, después de ver la respuesta de Arnauld . Ahorró 10 bytes gracias a Neil que sugirió usar la etapa de lista Ly limitar la salida a la primera coincidencia. Guardado de un byte gracias a TSH acortar la expresión regular.

El encabezado y el pie de página solo permiten múltiples entradas y hacen que la salida sea legible, respectivamente.

FryAmTheEggman
fuente
43 bytes . Se puede traducir a Retina 0.8.2 usando en 1!lugar de 0L, pero en ese caso el pie de página no funcionará ( 1M!funcionará incluso con el pie de página).
Neil
@Neil Gracias por el golf, siempre me olvido L.
FryAmTheEggman
Tal vez R|L|A|B-> [RLAB]?
tsh
@tsh Gracias! Eso fue un vestigio de mi enfoque anterior y nunca lo revisé.
FryAmTheEggman
Un paso más, ¿qué pasa en su D[RLAB]|DU(...)lugar?
tsh
1

Perl 5 -p , 47 bytes

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

Pruébalo en línea!

Devuelve el código del baile (permitido según el comentario de @ Arnauld) o en blanco si no coincide.

Xcali
fuente
1

Carbón , 48 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

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

Divida la cadena comprimida RDLDADBDUUDUADULRDURLABDURRBADULLBADUBLBR(que contiene todos los bailes, excepto el inicio D) Dy luego prefija la parte Dposterior de cada entrada.

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

Para cada baile, concatene a la entrada y encuentre la primera posición del baile en la concatenación, además de tomar la duración del baile. Para los bailes que no se encontraron, esto significa que el resultado será la longitud de la cadena de entrada en lugar de -1.

≔⌊...η

Tome el mínimo de esos resultados, es decir, la posición y la duración del baile que apareció primero.

✂θ§η⁰Ση

Extrae ese baile de la cuerda original.

Neil
fuente
1

Jalea , 33 28 bytes

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

Pruébalo en línea!

Toma como entrada una lista de enteros que representan los movimientos:

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

Devuelve un entero envuelto para la respuesta, o una lista de todos estos enteros para ninguna coincidencia:

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

El enlace TIO incluye código en el pie de página para traducirlos nuevamente a las cadenas en la pregunta, pero no es necesario para que el programa funcione usando los enteros especificados aquí.

Nick Kennedy
fuente
0

05AB1E , 104 bytes

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

Pruébalo en línea!


Escribí esta monstruosidad sin darme cuenta de que podía usar números para mover nombres ...

Urna de pulpo mágico
fuente
0

sfk , 119 91 bytes

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

Pruébalo en línea!

Da el primer regalo de baile como una secuencia de movimientos.

( xexes solo un editor de flujo, y en este caso _<pattern>_es texto de búsqueda)

Οurous
fuente
0

05AB1E , 28 27 bytes

Guardado 1 byte gracias a Grimy

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

Pruébalo en línea!

Emite la coincidencia (es decir, 10para Monkey) o -1no coincide

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

Explicación

Œ.Δ                           # 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
fuente
@ Grimy: ¡Gracias! Tenía una versión anterior (más larga) donde no la necesitaba ¦, pero no pensé en reordenar después de cambiar el significado de los números :)
Emigna