Jugando con la tortuga musical


20

A mis dos hijos les gusta jugar con el siguiente juguete:

Tortuga

Se pueden tocar las áreas coloreadas con las formas en el interior y la tortuga luego ilumina el área y reproduce un sonido o dice el nombre del color o la forma en el interior. El botón central cambia el modo. Hay un modo en el que las áreas tocan diferentes notas musicales cuando se tocan, con un giro: si el niño toca tres áreas consecutivas en el sentido de las agujas del reloj, se reproduce una melodía especial 1. Si las tres áreas consecutivas tocadas se colocan en sentido antihorario, se reproduce una melodía especial 2.

El reto

Simulemos la lógica interna del juguete. Dada una cadena con 3 presiones del niño, devuelve dos valores distintos y coherentes si las tres presiones son para áreas consecutivas (en sentido horario o antihorario) y un tercer valor distinto si no lo son.

Detalles

  • Las áreas de entrada se nombrarán con un carácter cada una, que puede ser su color: ROYGBpara rojo, naranja, amarillo, verde y azul; o su forma: HSRTCpara corazón, cuadrado, estrella ( R), triángulo y círculo. El caso no importa, puede elegir trabajar con entrada y salida solo en mayúsculas o minúsculas.
  • El programa recibirá una cadena (o una matriz de caracteres o algo equivalente) con tres pulsaciones. Ejemplos (utilizando los colores): RBO, GYO, BBR, YRG, YGB, ORB...
  • El programa generará tres valores distintos y coherentes para representar los tres resultados posibles: un primer valor si la combinación no activa una melodía especial, un segundo valor si la combinación activa la melodía especial en el sentido de las agujas del reloj, y un tercer valor si la combinación activa Melodía especial en sentido antihorario. Ejemplo: 0para ninguna combinación especial, 1para la melodía activada por una combinación en sentido horario y -1para la melodía activada por una combinación en sentido antihorario.
  • No necesita preocuparse por manejar entradas incorrectas.

Casos de prueba

Input   Output      // Input based on colors
--------------
RBO     0           // No special combination
GYO     -1          // Counterclockwise melody triggered
BBR     0           // No special combination
YRG     0           // No special combination
YGB     1           // Clockwise melody triggered
ORB     -1          // Counterclockwise melody triggered
OOO     0           // No special combination
BRO     1           // Clockwise melody triggered

Este es el , ¡así que puede ganar el código más corto para cada idioma!


Es [0,0], [1,0], [0,1]permitido como salida? Veo la respuesta de Mathematica haciendo eso, y ahorraría 3 bytes en la respuesta 05AB1E.
Kevin Cruijssen

1
@KevinCruijssen, por supuesto que puedes. Los valores de salida pueden ser cualquier cosa siempre que sean distintos y consistentes.
Charlie

Respuestas:


12

Java 8, 48 39 33 bytes

s->"ROYGBRO BGYORBG".indexOf(s)|7

-6 bytes gracias a @RickHitchcock , ¡así que asegúrate de votarlo también !

Toma el color en mayúscula como cadena de entrada. Salidas -1para none, 7para sentido horario y 15para sentido antihorario.

Pruébalo en línea.

Explicación:

s->      // Method with String parameter and integer return-type
   "ROYGBRO BGYORBG".indexOf(s)
         //  Get the index of the input in the String "ROYGBRO BGYORBG",
         //  which will result in -1 if the input is not a substring of this String
    |7   //  Then take a bitwise-OR 7 of this index, and return it as result

Antigua respuesta de 39 bytes:

s->(char)"ROYGBRO BGYORBG".indexOf(s)/7

Toma el color en mayúscula como cadena de entrada. Salidas 9362para none, 0para sentido horario y 1para sentido antihorario.

Pruébalo en línea.

Explicación:

s->      // Method with String parameter and integer return-type
   (char)"ROYGBRO BGYORBG".indexOf(s)
         //  Get the index of the input in the String "ROYGBRO BGYORBG",
         //  which will result in -1 if the input is not a substring of this String
         //  And cast it to a char (-1 becomes character with unicode value 65535)
    /7   //  Integer-divide it by 7 (the char is implicitly converted to int doing so)

2
Creo que 9632 es el mejor valor distinto y consistente que he visto en estas respuestas hasta ahora :)
Misha Lavrov

@MishaLavrov También podría ser 10922(división entera por /6) o 8191(división entera por /8), pero elijo /7porque es el índice del espacio en la Cadena. :)
Kevin Cruijssen

1
@RickHitchcock ¡Gracias! Pensé que había intentado algunas operaciones bit a bit, pero aparentemente no lo suficiente ...
Kevin Cruijssen

6

JavaScript (ES6), 41 bytes

Toma las iniciales de color como entrada. Devuelve 2para ninguno, trueen sentido horario o falseen sentido antihorario.

s=>~(x='ROYGBRO_ORBGYOR'.search(s))?x<5:2

Pruébalo en línea!


3
¡Al menos una respuesta de Arnauld que puedo entender! :)
Charlie

3
@ Charlie Creo que Arnauld está enfermo o algo así. No solo su respuesta es legible y fácil de entender, ¡es incluso más larga que mi respuesta Java! o.Ô Algo está claramente mal aquí. ; p
Kevin Cruijssen

s=>('ROYGBRO_ORBGYOR'.search(s)+8)/8|0
l4m2

1
¿Incluso royg, hermano?
Quentin


5

Excel, 29 bytes

=FIND(A1,"ROYGBRO_RBGYORB")<6

Colores en mayúscula como entrada.

Devuelve #VALUE!sin patrón, TRUEen sentido horario, FALSEen sentido antihorario.

Puede ajustarse IFERROR( ,0)para +11 bytesmanejar excepciones y devolver '0' para casos sin patrón.


5

05AB1E , 15 11 bytes

Guardado 4 bytes gracias a Kevin Cruijssen y Magic Octopus Urn .

Utiliza formas.
Salida [0, 0]para ninguno , [1, 0]en sentido horario y [0, 1]en sentido antihorario

‚.•ÌöJη•så

Pruébalo en línea! o como un conjunto de pruebas

Explicación

‚            # pair the input with its reverse
  .•ÌöJη•     # push the string "hsrtchs"
         så   # check if the input or its reverse is in this string

1
Muy similar a mi hijo de 15 bytes respuesta que estaba a punto de mensaje: .•1´₃éC•Â‚εXå}¥lo que resulta en [0], [1]o [-1], por lo 1 de mí. Por cierto, creo (no estoy seguro) puede guardar tres bytes mediante la eliminación de los tres últimos, la salida [0, 0], [1, 0]y [0, 1]como valores distintos. Veo que la respuesta de Mathematica hace lo mismo. Le pedirá a OP la verificación.
Kevin Cruijssen

Acabo de preguntarle a OP, y de hecho puedes dejar caer los últimos tres bytes. Mientras las tres salidas sean consistentes y distintas, está bien, sea lo que sea.
Kevin Cruijssen

2
‚.•ÌöJη•såes de 11 bytes si [1,0], [0,1] and [0,0]se consideran únicos (a menos que me falte algo obvio aquí, agregar ƶOal final de ese 11 byter sigue siendo 13 para la misma respuesta 0, 1, 2 que tiene ahora). Casos de prueba . Casos de prueba 2 . La inversión del orden elimina la necesidad del bucle.
Urna mágica de pulpo

Según el comentario en el hilo original, el 11-byter debería estar bien, ya que usa 3 valores distintos, puedes vencer a Jelly con ese :).
Urna mágica del pulpo

@KevinCruijssen ¡Gracias! Siempre parezco pensar en unico como "un solo digito" sin ninguna razon :)
Emigna

4

JavaScript (ES6), 32 bytes

s=>'ROYGBRO_ORBGYOR'.search(s)|7

Devuelve -1 si no hay combinación, 15 si es en sentido antihorario, 7 si es en sentido horario.


4

Wolfram Language (Mathematica) , 42 36 bytes

{"ROYGBRO","ORBGYOR"}~StringCount~#&

Pruébalo en línea!

Cuenta el número de veces que aparece la entrada en ambos "ROYGBRO" y "ORBGYOR". Devuelve {1,0}en sentido horario, {0,1}en sentido antihorario y {0,0}sin combinación especial.

Al costo de solo un byte más, podemos obtener salidas de 0nada, 1en sentido horario y 2en sentido antihorario con"ROYGBRO.ORBGYORBGYOR"~StringCount~#& .


4

código de máquina x86, 39 36 bytes

00000000: f30f 6f11 b800 0000 0066 0f3a 6310 0c89  ..o......f.:c...
00000010: c883 c807 c352 4f59 4742 524f 2042 4759  .....ROYGBRO BGY
00000020: 4f52 4247                                ORBG

Montaje:

section .text
	global func
func:					;the function uses fastcall conventions
					;no stack setup needed because we don't need to use stack
	movdqu xmm2,[ecx]		;Move DQword (16 bytes) from 1st arg to func(ecx) to SSE reg
	mov eax, msg			;Load address of constant str 'msg' into eax
	PcmpIstrI xmm2, [eax], 1100b	;Packed Compare String Return Index, get idx of [eax] in xmm2
	mov eax, ecx			;Move returned result into reg eax
	or eax, 7			;Bitwise OR eax with 7 to get consistent values
	ret				;return to caller, eax is the return register
section .data
	msg db 'ROYGBRO BGYORBG'

Pruébalo en línea!

La salida es 23para ninguno,7 para las agujas del reloj y 15para las agujas del reloj. Basado en la respuesta de @RickHitchcock.

Se guardaron 3 bytes usando una instrucción de comparación de cadenas SSE en lugar de usar libc.


1
¿Puede contar los bytes del código de máquina aquí, ya que esos bytes se basan en la colocación de strstr en el binario? No puede simplemente tomar esos mismos bytes en otro contexto y esperar que funcionen igual.
Robert Fraser

Hay reemplazos puros de código de máquina que no dependen de la biblioteca estándar strchr.com/strcmp_and_strlen_using_sse_4.2
Robert Fraser

@RobertFraser La ubicación de la función se resuelve durante la vinculación, el recuento de bytes siempre será el mismo porque la dirección de la función strstrsiempre será una dirección de 32 bits (4 bytes). El código de máquina en mi publicación está desvinculado.
Logern

1
Supongo que es una especie de área gris. La función se basa en los datos del archivo de objeto (mapa del vinculador) antes de poder usarse. Pero podría argumentar que no es diferente a una lambda de Java que necesita una declaración de tipo.
Robert Fraser

Tenga en cuenta que para cumplir totalmente con la ABI, tendría que usar xmm5 o xmm6, que son registros guardados por la persona que llama, en lugar de xmm2, que está guardada por la persona que llama (pero eso no debería costar ningún byte).
Robert Fraser


3

APL (Dyalog), 22 18 bytes

+/(⍷-⍷∘⌽)∘'ROYGBRO'

-4 bytes gracias a @ngn

Toma una cadena de iniciales de color. Salidas 0 para ningún patrón especial, -1 para sentido antihorario, 1 para sentido horario.

Pruébalo en línea!


3

Python 2 , 45 43 bytes

lambda i,a='ROYGBRO':(i in a)-(i[::-1]in a)

Pruébalo en línea!

Con ideas y crédito serio para @DeadPossum

-2 con agradecimiento a @JoKing. Ahora produce -1 = en sentido antihorario, 0 = ninguno, 1 = en sentido horario.

Mi esfuerzo original está abajo para propósitos históricos.

Python 2 , 52 51 bytes

lambda i,a='ROYGBRO':((0,1)[i[::-1]in a],2)[i in a]

Pruébalo en línea!

0 = ninguno, 1 = en sentido antihorario, 2 = en sentido horario



@DeadPossum Eso es realmente genial y lo suficientemente diferente al mío para que puedas publicarlo como tu propia respuesta. Votaré
ElPedro

3

Python 2 ,  35  36 bytes

+1: por alguna razón, pensé que todos los botones serían distintos> _ <

Desarrollado independientemente de lo que acabo de ver (y ahora votado) por Dead Possum

lambda s:'ORBGYO.BROYGBR'.find(s)/7

Pruébalo en línea!


Creo que necesitas separar las cadenas de caracteres. Esto devuelve 0 (en sentido antihorario) para "RBR", que no está en su lista de combinaciones.
Rick Hitchcock

@RickHitchcock ah, asumí 3 prensas diferentes, lo cual es ciertamente incorrecto. ¡Eso hará que esto sea exactamente igual al de Dead Possum!
Jonathan Allan

No se puede eliminar del móvil ... se eliminará o se abordará más tarde
Jonathan Allan

Sí, podría ser ambiguo, pero uno de los casos de prueba ("OOO") muestra que podrían repetirse.
Rick Hitchcock

@RickHitchcock sí, eso es lo que vi después de tu comentario, ¡gracias!
Jonathan Allan


2

Pip , 19 bytes

Y"ROYGBRO"OaNyaNRVy

Salidas 10para sentido horario, 01para sentido antihorario, 00para ninguno.Pruébalo en línea!

Explicación

                     a is 1st cmdline argument
Y"ROYGBRO"           Yank that string into y variable
           aNy       Count of occurrences of a in y
          O          Output without newline
                RVy  y reversed
              aN     Count of occurrences of a in that string
                     Print (implicit)

2

J , 21 bytes

-&(OR@E.&'ROYGBRO')|.

Pruébalo en línea!

Cómo funciona

-&(OR@E.&'ROYGBRO')|.  Monadic 2-verb hook. Input: a string.

                   |.  Map over [input string, input string reversed]:
      E.&'ROYGBRO'     Find exact matches of input in 'ROYGBRO'
  (OR@            )    Reduce with OR; is it a substring of 'ROYGBRO'?
-&                     Reduce with -; result is 1 for CW, -1 for CCW, 0 otherwise

Logra la máxima cantidad de reutilización de funciones.



1

R , 38 bytes

grep(scan(,''),c('ROYGBRO','ORBGYOR'))

Pruébalo en línea!

Devoluciones :

  • Ninguna combinación especial: integer(0)
  • Melodía en sentido antihorario activada: 2
  • Melodía en sentido horario activada: 1

1

Carbón , 18 bytes

≔ROYGBROηI⁻№ηθ№⮌ηθ

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

 ROYGBRO            Literal string
≔       η           Assign to variable
            η   η   Value of variable
               ⮌    Reversed
             θ   θ  Input string
           №  №     Count matches
          ⁻         Subtract
         I          Cast to string
                    Implicitly print


1

Limpio , 63 bytes

import StdEnv,Text
$s=map((>)0o indexOf s)["ROYGBRO","BGYORBG"]

Pruébalo en línea!

[True, True]sin ruidos especiales, [True, False]en sentido antihorario, [False, True]en sentido horario.


0

Japt, 17 14 bytes

Toma los colores como entrada, en minúsculas. Devuelve 0en sentido horario, 1en sentido antihorario o -1si no hay combo.

`ygß`ê qÔbøU

Intentalo


Expansión

`...`            :Compressed string "roygbrow"
     ê           :Palindromise
       qÔ        :Split on "w"
         b       :Index of the first element
          ø      : That contains
           U     :  The input string

0

Ruby , 53 36 bytes

->n{"\a\fDch+".index(""<<n%111)&./3}

Pruébalo en línea!

Entrada: un entero de 3 dígitos, donde los dígitos representan colores:

  • 1 - rojo
  • 2 - naranja
  • 3 - amarillo
  • 4 - verde
  • 5 - azul

Salida: 0 para sentido horario, 1 para sentido antihorario, de lo nilcontrario.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.