Spiel mit der musikalischen Schildkröte


20

Meine beiden Kinder spielen gerne mit folgendem Spielzeug:

Schildkröte

Die farbigen Bereiche mit den Formen im Inneren können berührt werden und die Schildkröte beleuchtet dann den Bereich und spielt einen Ton ab oder sagt den Namen der Farbe oder der Form im Inneren. Die mittlere Taste ändert den Modus. Es gibt einen Modus, in dem die Bereiche beim Berühren mit einer Drehung unterschiedliche Noten spielen: Berührt das Kind drei aufeinanderfolgende Bereiche im Uhrzeigersinn, wird eine spezielle Melodie 1 gespielt. Wenn die drei aufeinanderfolgenden berührten Bereiche gegen den Uhrzeigersinn platziert werden, wird eine spezielle Melodie 2 abgespielt.

Die Herausforderung

Lassen Sie uns die interne Logik des Spielzeugs simulieren. Bei einer Zeichenfolge mit drei Drücken des Kindes werden zwei eindeutige, kohärente Werte zurückgegeben, wenn die drei Drücken aufeinanderfolgende Bereiche betreffen (im oder gegen den Uhrzeigersinn), und ein dritter eindeutiger Wert, wenn dies nicht der Fall ist.

Einzelheiten

  • Die Eingabebereiche werden jeweils mit einem Buchstaben benannt, der ihre Farbe haben kann: ROYGBfür Rot, Orange, Gelb, Grün und Blau; oder ihre Form: HSRTCfür Herz, Quadrat, Stern ( R), Dreieck und Kreis. Die Groß- und Kleinschreibung spielt keine Rolle. Sie können zwischen Groß- und Kleinschreibung wählen.
  • Das Programm erhält eine Zeichenfolge (oder ein Zeichen-Array oder etwas Äquivalentes) mit drei Drücken. Beispiele (unter Verwendung der Farben): RBO, GYO, BBR, YRG, YGB, ORB...
  • Das Programm gibt drei unterschiedliche, zusammenhängende Werte aus, um die drei möglichen Ergebnisse darzustellen: einen ersten Wert, wenn die Kombination keine spezielle Melodie auslöst, einen zweiten Wert, wenn die Kombination die spezielle Melodie im Uhrzeigersinn auslöst, und einen dritten Wert, wenn die Kombination die auslöst gegen den uhrzeigersinn spezielle melodie. Beispiel: 0Für keine spezielle Kombination, 1für die durch eine Kombination im Uhrzeigersinn -1ausgelöste Melodie und für die durch eine Kombination gegen den Uhrzeigersinn ausgelöste Melodie.
  • Sie müssen sich nicht um falsche Eingaben kümmern.

Testfälle

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

Das ist , also kann der kürzeste Code für jede Sprache gewinnen!


Ist [0,0], [1,0], [0,1]als Ausgang erlaubt? Ich sehe die Mathematica-Antwort, die das tut, und sie würde 3 Bytes in der 05AB1E-Antwort einsparen.
Kevin Cruijssen

1
@ KevinCruijssen können Sie natürlich. Die Ausgabewerte können beliebig sein, solange sie eindeutig und konsistent sind.
Charlie

Antworten:


12

Java 8, 48 39 33 Bytes

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

-6 Bytes dank @RickHitchcock , also stelle sicher , dass du ihn auch positiv bewertest !

Nimmt Großbuchstaben als Eingabezeichenfolge. Ausgänge -1für keine, 7für im Uhrzeigersinn und 15für gegen den Uhrzeigersinn.

Probieren Sie es online aus.

Erläuterung:

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

Alte 39 Bytes Antwort:

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

Nimmt Großbuchstaben als Eingabezeichenfolge. Ausgänge 9362für keine, 0für im Uhrzeigersinn und 1für gegen den Uhrzeigersinn.

Probieren Sie es online aus.

Erläuterung:

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
Ich denke, 9632 ist der beste eindeutige und beständige Wert, den ich bisher in diesen Antworten gesehen habe :)
Misha Lavrov

@MishaLavrov Es könnte auch 10922(Ganzzahlige Division durch /6) oder 8191(Ganzzahlige Division durch /8) sein, aber ich wähle, /7weil es der Index des Leerzeichens in der Zeichenfolge ist. :)
Kevin Cruijssen

1
@ RickHitchcock Danke! Ich dachte, ich hätte einige bitweise Operationen versucht, aber anscheinend nicht richtig genug ..
Kevin Cruijssen

6

JavaScript (ES6), 41 Byte

Nimmt Farbinitialen als Eingabe. Gibt 2für keine, trueim Uhrzeigersinn oder falsegegen den Uhrzeigersinn zurück.

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

Probieren Sie es online!


3
Zumindest eine Antwort von Arnauld kann ich verstehen !! :)
Charlie

3
@ Charlie Ich denke, Arnauld ist krank oder so. Seine Antwort ist nicht nur lesbar und leicht zu verstehen, sie ist sogar länger als meine Java-Antwort! o.Ô Hier stimmt eindeutig etwas nicht. ; p
Kevin Cruijssen

s=>('ROYGBRO_ORBGYOR'.search(s)+8)/8|0
14 m²,

1
Bist du überhaupt royg, Bruder?
Quentin

6

Python 2 , 36 Bytes

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

-1- Keine
0- Im Uhrzeigersinn
1- Gegen den Uhrzeigersinn

Probieren Sie es online!


Heh, großartige Köpfe (oder so) ... codegolf.stackexchange.com/a/174635/53748 (wenn ich das gesehen hätte, bevor ich es selbst ausprobiert habe, hätte ich dir nur das Byte save: p gegeben)
Jonathan Allan

@ JonathanAllan Keine Sorge, Dinge passieren: D Ich habe deine Antwort positiv bewertet, da ich sie nicht ablehnen kann!
Dead Possum

5

Excel, 29 Bytes

=FIND(A1,"ROYGBRO_RBGYORB")<6

Großbuchstaben als Eingabe.

Gibt #VALUE!für kein Muster im TRUEUhrzeigersinn und FALSEgegen den Uhrzeigersinn zurück.

Kann zur Behandlung von Ausnahmefällen in IFERROR( ,0)for +11 byteseinbinden und stattdessen '0' für Fälle ohne Muster zurückgeben.


5

05AB1E , 15 11 Bytes

4 Bytes dank Kevin Cruijssen und Magic Octopus Urn gespeichert .

Verwendet Formen.
Ausgang [0, 0]für keine , [1, 0]für den Uhrzeigersinn und [0, 1]für gegen den Uhrzeigersinn

‚.•ÌöJη•så

Probieren Sie es online! oder als Testsuite

Erläuterung

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

1
Sehr ähnlich wie meine 15-Byte - Antwort , dass ich auf Post war: .•1´₃éC•Â‚εXå}¥was [0], [1]oder [-1], so +1 von mir. Btw, ich glaube (nicht sicher) Sie drei Bytes , die durch die letzten drei Entfernen Ausgeben speichern kann [0, 0], [1, 0]und [0, 1]wie unterschiedliche Werte. Ich sehe, dass die Mathematica-Antwort dasselbe tut. Bittet OP um Bestätigung.
Kevin Cruijssen

Gerade nach OP gefragt, und Sie dürfen tatsächlich die letzten drei Bytes löschen. Solange die drei Ausgänge konsistent und eindeutig sind, ist es in Ordnung, was auch immer es ist.
Kevin Cruijssen

2
‚.•ÌöJη•såbeträgt 11 Bytes, wenn dies [1,0], [0,1] and [0,0]als eindeutig angesehen wird (es sei denn, ich vermisse hier etwas Offensichtliches und ƶOfüge am Ende dieses 11-Bytes immer noch 13 für dieselbe 0, 1, 2-Antwort hinzu, die Sie jetzt haben). Testfälle . Testfälle 2 . Die Umkehrung der Reihenfolge macht die Schleife überflüssig.
Magic Octopus Urn

Laut dem Kommentar zum Original-Thread sollte der 11-Byte-Wert in Ordnung sein, da er 3 verschiedene Werte verwendet, mit denen man Jelly schlagen kann :).
Magic Octopus Urn

@ KevinCruijssen Vielen Dank! Ich scheine immer einzigartig als "einstellige" ohne Grund zu denken :)
Emigna

4

JavaScript (ES6), 32 Byte

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

Gibt -1 zurück, wenn keine Kombination vorliegt, 15, wenn gegen den Uhrzeigersinn, 7, wenn im Uhrzeigersinn.


4

Wolfram Language (Mathematica) , 42 36 Bytes

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

Probieren Sie es online!

Zählt, wie oft die Eingabe in "ROYGBRO"und erscheint "ORBGYOR". Gibt {1,0}für den Uhrzeigersinn, {0,1}für den Gegenuhrzeigersinn und {0,0}für keine spezielle Kombination zurück.

Auf Kosten von nur einem weiteren Byte können wir Ausgaben von 0für nichts, 1für im Uhrzeigersinn und 2für gegen den Uhrzeigersinn mit erhalten "ROYGBRO.ORBGYORBGYOR"~StringCount~#&.


4

x86-Maschinencode, 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

Versammlung:

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'

Probieren Sie es online!

Die Ausgabe ist 23für keine, 7für im Uhrzeigersinn und 15gegen den Uhrzeigersinn. Basierend auf der Antwort von @RickHitchcock.

3 Byte mit einer SSE-Zeichenfolgenvergleichsanweisung anstelle von libc gespeichert.


1
Können Sie hier die Maschinencode-Bytes zählen, da diese Bytes von der Platzierung von strstr in der Binärdatei abhängen? Sie können dieselben Bytes nicht einfach in einem anderen Kontext verwenden und erwarten, dass sie gleich funktionieren.
Robert Fraser

Es gibt reine Maschinencode-Ersetzungen, die nicht auf der Standardbibliothek basieren. Strchr.com/strcmp_and_strlen_using_sse_4.2
Robert Fraser

@RobertFraser Die Platzierung der Funktion wird während der Verknüpfung aufgelöst. Die Byteanzahl ist immer gleich, da die Adresse der Funktion strstrimmer eine 32-Bit-Adresse (4 Byte) ist. Der Maschinencode in meinem Beitrag ist nicht verknüpft.
Logern

1
Ich denke, es ist eine Art Grauzone. Die Funktion stützt sich auf Daten in der Objektdatei (Linker-Map), bevor sie verwendet werden können. Aber Sie könnten argumentieren, dass dies nicht anders ist als ein Java-Lambda, das eine Typdeklaration benötigt.
Robert Fraser

Beachten Sie, dass Sie, um vollständig mit dem ABI kompatibel zu sein, xmm5 oder xmm6 verwenden müssen, die vom Aufrufer gespeicherte Register sind, anstelle von xmm2, das vom Angerufenen gespeichert wird (dies sollte jedoch keine Bytes kosten).
Robert Fraser


3

APL (Dyalog), 22 18 Bytes

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

-4 Bytes dank @ngn

Nimmt eine Reihe von Farbinitialen. Gibt 0 für kein spezielles Muster, -1 für gegen den Uhrzeigersinn und 1 für im Uhrzeigersinn aus.

Probieren Sie es online!


3

Python 2 , 45 43 Bytes

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

Probieren Sie es online!

Mit Ideen von und ernstem Dank an @DeadPossum

-2 mit Dank an @JoKing. Jetzt gibt -1 = gegen den Uhrzeigersinn, 0 = keine, 1 = im Uhrzeigersinn.

Meine ursprüngliche Anstrengung ist unten aus historischen Gründen.

Python 2 , 52 51 Bytes

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

Probieren Sie es online!

0 = keine, 1 = gegen den Uhrzeigersinn, 2 = im Uhrzeigersinn



@DeadPossum Das ist ernsthaft cool und anders als ich, sodass du es als deine eigene Antwort posten kannst. Ich werde stimmen.
ElPedro

3

Python 2 ,  35  36 Bytes

+1 - Aus irgendeinem Grund dachte ich, dass alle Schaltflächen> _ <sind

Entwickelt unabhängig von dem, was ich gerade von Dead Possum gesehen habe (und jetzt hochgestuft habe)

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

Probieren Sie es online!


Ich denke, Sie müssen die Zeichenfolgen trennen. Dies gibt 0 (gegen den Uhrzeigersinn) für "RBR" zurück, das nicht in Ihrer Liste der Kombinationen enthalten ist.
Rick Hitchcock

@ RickHitchcock ah Ich hatte 3 verschiedene Pressen angenommen, was sicherlich falsch ist. Das macht es genauso wie das von Dead Possum!
Jonathan Allan

Kann nicht vom Handy löschen ... wird gelöscht oder später adressiert
Jonathan Allan

Ja, es könnte mehrdeutig sein, aber einer der Testfälle ("OOO") zeigt, dass sie sich wiederholen könnten.
Rick Hitchcock

@RickHitchcock yep das habe ich nach deinem Kommentar gesehen - danke!
Jonathan Allan


2

Pip , 19 Bytes

Y"ROYGBRO"OaNyaNRVy

Ausgänge 10für im Uhrzeigersinn, 01für gegen den Uhrzeigersinn, 00für keine.Probieren Sie es online!

Erläuterung

                     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')|.

Probieren Sie es online!

Wie es funktioniert

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

Maximale Wiederverwendung von Funktionen.



1

R , 38 Bytes

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

Probieren Sie es online!

Kehrt zurück :

  • Keine besondere Kombination: integer(0)
  • Melodie gegen den Uhrzeigersinn ausgelöst: 2
  • Melodie im Uhrzeigersinn ausgelöst: 1

1

Kohle , 18 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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


1

Sauber , 63 Bytes

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

Probieren Sie es online!

[True, True]für keine besonderen Geräusche, [True, False]für gegen den Uhrzeigersinn, [False, True]für im Uhrzeigersinn.


0

Japt, 17 14 Bytes

Nimmt die Farben als Eingabe in Kleinbuchstaben. Rückgabe 0im Uhrzeigersinn, 1gegen den Uhrzeigersinn oder -1wenn keine Kombination vorhanden ist.

`ygß`ê qÔbøU

Versuch es


Expanation

`...`            :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}

Probieren Sie es online!

Eingabe: eine dreistellige Ganzzahl, wobei die Ziffern Farben darstellen:

  • 1 - rot
  • 2 - orange
  • 3 - gelb
  • 4 - grün
  • 5 - blau

Ausgang: 0 für Rechtslauf, 1 für Linkslauf, nilsonst.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.