Jouer avec la tortue musicale

20

Mes deux enfants aiment jouer avec le jouet suivant:

Tortue

Les zones colorées avec les formes à l'intérieur peuvent être touchées et la tortue éclaire alors la zone et émet un son ou dit le nom de la couleur ou de la forme à l'intérieur. Le bouton du milieu change le mode. Il existe un mode dans lequel les zones jouent différentes notes musicales au toucher, avec une torsion: si l'enfant touche trois zones consécutives dans le sens des aiguilles d'une montre, une mélodie spéciale 1 est jouée. Si les trois zones consécutives touchées sont placées dans le sens antihoraire, une mélodie spéciale 2 est jouée.

Le défi

Simulons la logique interne du jouet. Étant donné une chaîne avec 3 pressions de l'enfant, renvoyez deux valeurs distinctes et cohérentes si les trois pressions concernent des zones consécutives (dans le sens horaire ou antihoraire) et une troisième valeur distincte dans le cas contraire.

Détails

  • Les zones de saisie seront nommées avec un caractère chacune, qui peut être leur couleur: ROYGBpour le rouge, l'orange, le jaune, le vert et le bleu; ou leur forme: HSRTCpour coeur, carré, étoile ( R), triangle et cercle. La casse n'a pas d'importance, vous pouvez choisir de travailler avec l'entrée et la sortie uniquement en majuscules ou en minuscules.
  • Le programme recevra une chaîne (ou un tableau de caractères ou quelque chose d'équivalent) avec trois pressions. Des exemples ( en utilisant les couleurs): RBO, GYO, BBR, YRG, YGB, ORB...
  • Le programme affichera trois valeurs distinctes et cohérentes pour représenter les trois résultats possibles: une première valeur si la combinaison ne déclenche pas une mélodie spéciale, une deuxième valeur si la combinaison déclenche la mélodie spéciale dans le sens des aiguilles d'une montre et une troisième valeur si la combinaison déclenche la mélodie spéciale anti-horaire. Exemple: 0pour aucune combinaison spéciale, 1pour la mélodie déclenchée par une combinaison dans le sens horaire et -1pour la mélodie déclenchée par une combinaison dans le sens antihoraire.
  • Vous n'avez pas à vous soucier de la gestion d'une entrée incorrecte.

Cas de test

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

C'est du , alors le code le plus court pour chaque langue peut gagner!

Charlie
la source
Est [0,0], [1,0], [0,1]autorisé en sortie? Je vois la réponse Mathematica faire cela, et cela économiserait 3 octets dans la réponse 05AB1E.
Kevin Cruijssen
1
@KevinCruijssen bien sûr que vous le pouvez. Les valeurs de sortie peuvent être n'importe quoi tant qu'elles sont distinctes et cohérentes.
Charlie

Réponses:

12

Java 8, 48 39 33 octets

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

-6 octets grâce à @RickHitchcock , alors assurez-vous de lui aussi voter positivement !

Prend la couleur en majuscule comme chaîne d'entrée. Sorties -1pour aucun, 7dans le sens horaire et 15dans le sens antihoraire.

Essayez-le en ligne.

Explication:

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

Ancienne réponse de 39 octets:

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

Prend la couleur en majuscule comme chaîne d'entrée. Sorties 9362pour aucun, 0dans le sens horaire et 1dans le sens antihoraire.

Essayez-le en ligne.

Explication:

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)
Kevin Cruijssen
la source
2
Je pense que 9632 est la meilleure valeur distincte et cohérente que j'ai vue dans ces réponses jusqu'à présent :)
Misha Lavrov
@MishaLavrov Cela pourrait aussi être 10922(division entière par /6) ou 8191(division entière par /8), mais je choisis /7parce que c'est l'index de l'espace dans la chaîne. :)
Kevin Cruijssen
1
@RickHitchcock Merci! Je pensais avoir essayé quelques opérations au niveau du bit, mais apparemment pas assez correctement ..
Kevin Cruijssen
6

JavaScript (ES6), 41 octets

Prend les initiales de couleur comme entrée. Renvoie 2pour aucun, truedans le sens horaire ou falseantihoraire.

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

Essayez-le en ligne!

Arnauld
la source
3
Au moins une réponse d'Arnauld que je peux comprendre !! :)
Charlie
3
@Charlie Je pense qu'Arnauld est malade ou quelque chose .. Non seulement sa réponse est lisible et facile à comprendre, elle est encore plus longue que ma réponse Java! o.Ô Quelque chose cloche clairement ici. ; p
Kevin Cruijssen
s=>('ROYGBRO_ORBGYOR'.search(s)+8)/8|0
l4m2
1
Avez-vous même royg, bro?
Quentin
6

Python 2 , 36 octets

lambda i:'ROYGBRO ORBGYOR'.find(i)/7

-1- Aucun
0- Dans le sens horaire
1- Dans le sens antihoraire

Essayez-le en ligne!

Possum mort
la source
Hé, grands esprits (ou quelque chose) ... codegolf.stackexchange.com/a/174635/53748 (si j'avais vu ça avant d'essayer moi-même, je vous aurais juste donné l'octet de sauvegarde: p)
Jonathan Allan
@JonathanAllan Ne vous inquiétez pas, il se passe des choses: D J'ai voté pour votre réponse, car je ne peux pas l'aimer!
Dead Possum
5

Excel, 29 octets

=FIND(A1,"ROYGBRO_RBGYORB")<6

Couleurs majuscules en entrée.

Renvoie #VALUE!sans motif, TRUEdans le sens horaire, dans le sens FALSEanti-horaire.

Peut encapsuler IFERROR( ,0)pour +11 bytesgérer l'exception et retourner à la place «0» pour les cas sans modèle.

Wernisch
la source
5

05AB1E , 15 11 octets

Enregistré 4 octets grâce à Kevin Cruijssen et Magic Octopus Urn .

Utilise des formes.
Sortie [0, 0]pour rien , [1, 0]pour le sens horaire et [0, 1]pour le sens antihoraire

‚.•ÌöJη•så

Essayez-le en ligne! ou comme suite de tests

Explication

‚            # pair the input with its reverse
  .•ÌöJη•     # push the string "hsrtchs"
         så   # check if the input or its reverse is in this string
Emigna
la source
1
Très similaire ma réponse 15 octets que j'étais sur le poste: .•1´₃éC•Â‚εXå}¥entraînant [0], [1]ou [-1], si +1 de moi. BTW, je pense (pas sûr) , vous pouvez enregistrer trois octets en supprimant les trois derniers, la sortie [0, 0], [1, 0]et en [0, 1]tant que valeurs distinctes. Je vois que la réponse Mathematica fait de même. Demander à OP de vérifier.
Kevin Cruijssen
Je viens de demander à OP, et vous êtes en effet autorisé à supprimer les trois derniers octets. Tant que les trois sorties sont cohérentes et distinctes, c'est bien quoi que ce soit.
Kevin Cruijssen
2
‚.•ÌöJη•såest de 11 octets si [1,0], [0,1] and [0,0]sont considérés comme uniques (sauf si je manque quelque chose d'évident ici, ajouter ƶOà la fin de ce 11 octets est toujours de 13 pour la même réponse 0, 1, 2 que vous avez maintenant). Cas de test . Cas de test 2 . L'inversion de l'ordre supprime le besoin de la boucle.
Urne de poulpe magique
Selon le commentaire sur le fil d'origine, le 11 octets devrait être correct, car il utilise 3 valeurs distinctes, vous pouvez battre Jelly avec celui-là :).
Urne de poulpe magique
@KevinCruijssen Merci! Il me semble toujours que l'unique est un "chiffre unique" sans raison :)
Emigna
4

JavaScript (ES6), 32 octets

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

Renvoie -1 si aucune combinaison, 15 si dans le sens antihoraire, 7 si dans le sens horaire.

Rick Hitchcock
la source
4

Wolfram Language (Mathematica) , 42 36 octets

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

Essayez-le en ligne!

Compte le nombre de fois où l'entrée apparaît dans les deux "ROYGBRO"et "ORBGYOR". Renvoie {1,0}pour dans le sens horaire, {0,1}dans le sens antihoraire et {0,0}pour aucune combinaison spéciale.

Au prix d'un seul octet de plus, nous pouvons obtenir des sorties de 0pour rien, 1dans le sens horaire et 2dans le sens antihoraire avec "ROYGBRO.ORBGYORBGYOR"~StringCount~#&.

Misha Lavrov
la source
4

code machine x86, 39 36 octets

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

Assemblée:

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'

Essayez-le en ligne!

La sortie est 23pour aucun, 7dans le sens horaire et 15anti-horaire. Basé sur la réponse de @RickHitchcock.

Enregistré 3 octets en utilisant une instruction de comparaison de chaînes SSE au lieu d'utiliser libc.

Logern
la source
1
Pouvez-vous compter les octets de code machine ici, car ces octets dépendent du plafond de strstr dans le binaire? Vous ne pouvez pas simplement prendre ces mêmes octets dans un autre contexte et vous attendre à ce qu'ils fonctionnent de la même manière.
Robert Fraser
Il existe des remplacements de code machine purs qui ne dépendent pas de la bibliothèque standard strchr.com/strcmp_and_strlen_using_sse_4.2
Robert Fraser
@RobertFraser Le placement de la fonction est résolu lors de la liaison, le nombre d'octets sera toujours le même car l'adresse de la fonction strstrsera toujours une adresse 32 bits (4 octets). Le code machine de mon message n'est pas lié.
Logern
1
Je suppose que c'est une sorte de zone grise. La fonction s'appuie sur les données du fichier objet (carte de l'éditeur de liens) avant de pouvoir être utilisée. Mais vous pourriez dire que ce n'est pas différent d'un lambda Java nécessitant une déclaration de type.
Robert Fraser
Notez que pour être entièrement conforme à l'ABI, vous devez utiliser xmm5 ou xmm6 qui sont des registres enregistrés par l'appelant, au lieu de xmm2 qui est enregistré (mais cela ne devrait pas coûter d'octets).
Robert Fraser
3

APL (Dyalog), 22 18 octets

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

-4 octets grâce à @ngn

Prend une chaîne d'initiales de couleur. Sorties 0 pour aucun motif spécial, -1 pour le sens antihoraire, 1 pour le sens horaire.

Essayez-le en ligne!

Quintec
la source
3

Python 2 , 45 43 octets

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

Essayez-le en ligne!

Avec des idées et un sérieux crédit à @DeadPossum

-2 avec merci à @JoKing. Affiche maintenant -1 = dans le sens antihoraire, 0 = aucun, 1 = dans le sens horaire.

Mon effort d'origine est ci-dessous à des fins historiques.

Python 2 , 52 51 octets

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

Essayez-le en ligne!

0 = aucun, 1 = dans le sens antihoraire, 2 = dans le sens horaire

ElPedro
la source
45 octets
Dead Possum
@DeadPossum C'est vraiment cool et assez différent du mien pour que vous puissiez poster votre propre réponse. Je vais voter.
ElPedro
3

Python 2 ,  35  36 octets

+1 - pour une raison quelconque, je pensais que tous les boutons seraient distincts> _ <

Développé indépendamment de ce que je viens de voir (et maintenant sur-voté) par Dead Possum

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

Essayez-le en ligne!

Jonathan Allan
la source
Je pense que vous devez séparer les chaînes de caractères. Cela renvoie 0 (dans le sens inverse des aiguilles d'une montre) pour "RBR", qui n'est pas dans votre liste de combinaisons.
Rick Hitchcock
@RickHitchcock ah J'avais supposé 3 presses différentes, ce qui est certainement incorrect. Cela rendra cela exactement identique à Dead Possum!
Jonathan Allan
Impossible de supprimer du mobile ... supprimera ou traitera plus tard
Jonathan Allan
Oui, cela pourrait être ambigu, mais l'un des cas de test ("OOO") montre qu'ils pourraient se répéter.
Rick Hitchcock
@RickHitchcock yep c'est ce que j'ai vu après votre commentaire - merci!
Jonathan Allan
2

Stax , 14 13 octets

ù♀e▌d─█£F'♦O▬

Exécuter et déboguer

La sortie est

  • 1 pour aucune combinaison spéciale
  • 2 pour la mélodie dans le sens antihoraire
  • 3 pour la mélodie dans le sens horaire
récursif
la source
2

Pip , 19 octets

Y"ROYGBRO"OaNyaNRVy

Sorties 10pour dans le sens horaire, 01dans le sens antihoraire, 00pour aucun. Essayez-le en ligne!

Explication

                     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)
DLosc
la source
2

J , 21 octets

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

Essayez-le en ligne!

Comment ça fonctionne

-&(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

Permet une réutilisation maximale des fonctions.

Bubbler
la source
2

Gelée , 12 octets

,Ṛẇ€“¤ƈẎṬ%Ȥ»

Essayez-le en ligne!

-4 merci à Jonathan Allan .

Dans le sens horaire: Dans le [1, 0]
sens antihoraire: [0, 1]
Autre:[0, 0]

Erik le Outgolfer
la source
@JonathanAllan Phew, merci. Je viens de revoir ce que j'ai fait, tu étais juste 15 heures plus rapide. : P
Erik the Outgolfer
1

R , 38 octets

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

Essayez-le en ligne!

Retour :

  • Pas de combinaison spéciale: integer(0)
  • Mélodie anti-horaire déclenchée: 2
  • Mélodie dans le sens horaire déclenchée: 1
digEmAll
la source
1

Fusain , 18 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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

Nettoyer , 63 octets

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

Essayez-le en ligne!

[True, True]pour pas de bruits spéciaux, [True, False]pour dans le sens antihoraire, [False, True]pour dans le sens horaire.

Οurous
la source
0

Japt, 17 14 octets

Prend les couleurs en entrée, en minuscules. Retourne 0dans le sens horaire, 1dans le sens antihoraire ou -1s'il n'y a pas de combo.

`ygß`ê qÔbøU

Essayez-le


Expansion

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

Rubis , 53 36 octets

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

Essayez-le en ligne!

Entrée: un entier à 3 chiffres, où les chiffres représentent les couleurs:

  • 1 - rouge
  • 2 - orange
  • 3 - jaune
  • 4 - vert
  • 5 - bleu

Sortie: 0 pour le sens horaire, 1 pour le sens anti-horaire, nilsinon.

GB
la source