Giocando con la tartaruga musicale


20

Ai miei due bambini piace giocare con il seguente giocattolo:

Tartaruga

Le aree colorate con le forme all'interno possono essere toccate e la tartaruga illumina quindi l'area e riproduce un suono o dice il nome del colore o della forma all'interno. Il pulsante centrale cambia la modalità. C'è una modalità in cui le aree suonano note musicali diverse quando vengono toccate, con una svolta: se il bambino tocca tre aree consecutive in senso orario, viene riprodotta una melodia speciale 1. Se le tre aree consecutive toccate vengono posizionate in senso antiorario, viene riprodotta una melodia speciale 2.

La sfida

Simuliamo la logica interna del giocattolo. Data una stringa con 3 pressioni del bambino, restituisce due valori distinti e coerenti se le tre pressioni sono per aree consecutive (in senso orario o antiorario) e un terzo valore distinto se non lo sono.

Dettagli

  • Le aree di input saranno denominate ognuna con un carattere, che può essere il loro colore: ROYGBper rosso, arancione, giallo, verde e blu; o la loro forma: HSRTCper cuore, quadrato, stella ( R), triangolo e cerchio. Il caso non ha importanza, puoi scegliere di lavorare con input e output solo in maiuscolo o minuscolo.
  • Il programma riceverà una stringa (o array di caratteri o qualcosa di equivalente) con tre presse. Esempi (utilizzando i colori): RBO, GYO, BBR, YRG, YGB, ORB...
  • Il programma produrrà tre valori distinti e coerenti per rappresentare i tre possibili risultati: un primo valore se la combinazione non attiva una melodia speciale, un secondo valore se la combinazione attiva la melodia speciale in senso orario e un terzo valore se la combinazione attiva il melodia speciale in senso antiorario. Esempio: 0per nessuna combinazione speciale, 1per la melodia attivata da una combinazione in senso orario e -1per la melodia attivata da una combinazione in senso antiorario.
  • Non devi preoccuparti di gestire input errati.

Casi 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

Questo è , quindi può vincere il codice più breve per ogni lingua!


È [0,0], [1,0], [0,1]ha permesso di uscita? Vedo che la risposta di Mathematica lo fa e salverebbe 3 byte nella risposta 05AB1E.
Kevin Cruijssen,

1
@KevinCruijssen ovviamente puoi. I valori di output possono essere qualsiasi cosa purché siano distinti e coerenti.
Charlie,

Risposte:


12

Java 8, 48 39 33 byte

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

-6 byte grazie a @RickHitchcock , quindi assicurati di votare anche lui !

Accetta il colore maiuscolo come stringa di input. Uscite -1per nessuna, 7in senso orario e 15antiorario.

Provalo online.

Spiegazione:

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

Risposta di vecchi 39 byte:

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

Accetta il colore maiuscolo come stringa di input. Uscite 9362per nessuna, 0in senso orario e 1antiorario.

Provalo online.

Spiegazione:

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
Penso che 9632 sia il miglior valore distinto e coerente che abbia visto finora in queste risposte :)
Misha Lavrov,

@MishaLavrov Potrebbe anche essere 10922(divisione intera per /6) o 8191(divisione intera per /8), ma scelgo /7perché è l'indice dello spazio nella stringa. :)
Kevin Cruijssen,

1
@RickHitchcock Grazie! Pensavo di aver provato alcune operazioni bit per bit, ma apparentemente non abbastanza correttamente ..
Kevin Cruijssen,

6

JavaScript (ES6), 41 byte

Accetta le iniziali dei colori come input. Restituisce 2per nessuno, truein senso orario o falseantiorario.

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

Provalo online!


3
Almeno una risposta di Arnauld posso capire !! :)
Charlie,

3
@Charlie Penso che Arnauld sia malato o qualcosa del genere .. Non solo la sua risposta è leggibile e facile da capire, è anche più lunga della mia risposta Java! o.Ô Qualcosa è chiaramente sbagliato qui. ; p
Kevin Cruijssen,

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

1
Sei addirittura royg, fratello?
Quentin,


5

Excel, 29 byte

=FIND(A1,"ROYGBRO_RBGYORB")<6

Colori maiuscoli come input.

ritorna #VALUE! per nessun motivo, TRUEper orario, FALSEper antiorario.

Può includere IFERROR( ,0)per +11 bytesgestire l'eccezione e restituire invece '0' per i casi senza pattern.


5

05AB1E , 15 11 byte

Salvato 4 byte grazie a Kevin Cruijssen e Magic Octopus Urn .

Usa forme.
Uscita [0, 0]per nessuno , [1, 0]per orario e [0, 1]per il senso antiorario

‚.•ÌöJη•så

Provalo online! o come una suite di test

Spiegazione

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

1
Molto simile come la mia risposta 15 byte che stavo per posta: .•1´₃éC•Â‚εXå}¥con conseguente [0], [1]o [-1], in modo da uno da me. Btw, credo (non sono sicuro) è possibile salvare tre byte rimuovendo gli ultimi tre, in uscita [0, 0], [1, 0]e [0, 1]come valori distinti. Vedo che la risposta di Mathematica fa lo stesso. Chiederà all'OP la verifica.
Kevin Cruijssen,

Ho appena chiesto a OP e ti è effettivamente permesso di eliminare gli ultimi tre byte. Finché le tre uscite sono coerenti e distinte, va bene qualunque cosa sia.
Kevin Cruijssen,

2
‚.•ÌöJη•såè 11 byte se [1,0], [0,1] and [0,0]sono considerati unici (a meno che non mi manchi qualcosa di ovvio qui, l'aggiunta ƶOalla fine di quell'11 byte è ancora 13 per la stessa risposta 0, 1, 2 che hai ora). Casi di test . Casi di prova 2 . L'inversione dell'ordine elimina la necessità del loop.
Magic Octopus Urn,

Secondo il commento sul thread originale, l'11 byte dovrebbe andare bene, poiché utilizza 3 valori distinti, puoi battere Jelly con quello :).
Magic Octopus Urn

@KevinCruijssen Grazie! Mi sembra sempre di considerare unica la "cifra singola" senza motivo :)
Emigna,

4

JavaScript (ES6), 32 byte

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

Restituisce -1 se nessuna combinazione, 15 se in senso antiorario, 7 se in senso orario.


4

Wolfram Language (Mathematica) , 42 36 byte

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

Provalo online!

Conta il numero di volte che l'input appare in entrambi "ROYGBRO"e "ORBGYOR". Restituisce {1,0}in senso orario, {0,1}in senso antiorario e {0,0}per nessuna combinazione speciale.

Al costo di un solo byte in più, possiamo ottenere output di 0per niente, 1in senso orario e 2in senso antiorario con "ROYGBRO.ORBGYORBGYOR"~StringCount~#&.


4

codice macchina x86, 39 36 byte

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

Montaggio:

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'

Provalo online!

L'output è 23per nessuno, 7in senso orario e 15antiorario. Basato sulla risposta di @RickHitchcock.

Salvato 3 byte usando un'istruzione di confronto delle stringhe SSE invece di usare libc.


1
Riesci a contare i byte del codice macchina qui, dal momento che quei byte si basano sul plafement di strstr nel binario? Non puoi semplicemente prendere quegli stessi byte in un altro contesto e aspettarti che funzionino allo stesso modo.
Robert Fraser,

Esistono sostituzioni di codice macchina pure che non si basano sulla libreria standard strchr.com/strcmp_and_strlen_using_sse_4.2
Robert Fraser,

@RobertFraser Il posizionamento della funzione viene risolto durante il collegamento, il conteggio dei byte sarà sempre lo stesso perché l'indirizzo della funzione strstrsarà sempre un indirizzo a 32 bit (4 byte). Il codice macchina nel mio post non è collegato.
Logern,

1
Immagino sia una specie di area grigia. La funzione si basa sui dati nel file oggetto (mappa linker) prima di poter essere utilizzata. Ma potresti obiettare che non è diverso da un lambda Java che necessita di una dichiarazione di tipo.
Robert Fraser,

Nota per essere pienamente conforme all'ABI dovresti usare xmm5 o xmm6 che sono registri salvati dal chiamante, invece di xmm2 che viene salvato dalla chiamata (ma che non dovrebbe costare alcun byte).
Robert Fraser,


3

APL (Dyalog), 22 18 byte

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

-4 byte grazie a @ngn

Accetta una serie di iniziali a colori. Emette 0 per nessun modello speciale, -1 per antiorario, 1 per orario.

Provalo online!


3

Python 2 , 45 43 byte

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

Provalo online!

Con idee e seri riconoscimenti a @DeadPossum

-2 grazie a @JoKing. Ora genera -1 = antiorario, 0 = nessuno, 1 = orario.

Il mio sforzo originale è sotto per scopi storici.

Python 2 , 52 51 byte

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

Provalo online!

0 = nessuno, 1 = antiorario, 2 = orario



@DeadPossum È davvero interessante e abbastanza diverso dal mio per essere pubblicato come risposta personale. Valuterò.
ElPedro,

3

Python 2 ,  35  36 byte

+1 - per qualche motivo ho pensato che tutti i pulsanti sarebbero stati distinti> _ <

Sviluppato indipendentemente da quello che ho appena visto (e ora votato) da Dead Possum

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

Provalo online!


Penso che devi separare le stringhe di personaggi. Questo restituisce 0 (in senso antiorario) per "RBR", che non è nell'elenco delle combinazioni.
Rick Hitchcock,

@RickHitchcock ah avevo assunto 3 diverse macchine da stampa, il che è sicuramente errato. Questo renderà esattamente lo stesso di Dead Possum!
Jonathan Allan,

Impossibile eliminare dal cellulare ... verrà eliminato o indirizzato in seguito
Jonathan Allan il

Sì, potrebbe essere ambiguo, ma uno dei casi di test ("OOO") mostra che potrebbero ripetere.
Rick Hitchcock,

@RickHitchcock sì, è quello che ho visto dopo il tuo commento - grazie!
Jonathan Allan,


2

Pip , 19 byte

Y"ROYGBRO"OaNyaNRVy

Uscite 10per orario, 01per antiorario, 00per nessuno dei due. Provalo online!

Spiegazione

                     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 byte

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

Provalo online!

Come funziona

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

Raggiunge la massima quantità di riutilizzo delle funzioni.



1

R , 38 byte

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

Provalo online!

Ritorna :

  • Nessuna combinazione speciale: integer(0)
  • Melodia antioraria attivata: 2
  • Melodia in senso orario attivata: 1

1

Carbone , 18 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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


1

Pulito , 63 byte

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

Provalo online!

[True, True]per nessun rumore speciale, [True, False]per antiorario, [False, True]per orario.


0

Japt, 17 anni 14 byte

Accetta i colori come input, in minuscolo. Restituisce 0in senso orario, 1in senso antiorario o in -1assenza di combo.

`ygß`ê qÔbøU

Provalo


expanation

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

0

Rubino , 53 36 byte

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

Provalo online!

Input: un numero intero di 3 cifre, in cui le cifre rappresentano i colori:

  • 1 - rosso
  • 2 - arancione
  • 3 - giallo
  • 4 - verde
  • 5 - blu

Uscita: 0 per orario, 1 per antiorario, nilaltrimenti.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.