Zabawa z muzycznym żółwiem


20

Moje dwoje dzieci lubi bawić się następującą zabawką:

żółw

Kolorowe obszary z kształtami w środku można dotknąć, a żółw zaświeci obszar i odtworzy dźwięk lub wypowie nazwę koloru lub kształt w środku. Środkowy przycisk zmienia tryb. Jest jeden tryb, w którym obszary odtwarzają różne nuty po dotknięciu, z akcentem: jeśli dziecko dotknie trzech kolejnych obszarów zgodnie z ruchem wskazówek zegara, odtwarzana jest specjalna melodia 1. Jeśli trzy kolejne dotknięte obszary zostaną umieszczone przeciwnie do ruchu wskazówek zegara, odtwarzana jest specjalna melodia 2.

Wyzwanie

Symulujmy wewnętrzną logikę zabawki. Biorąc pod uwagę ciąg z 3 naciśnięciami dziecka, zwróć dwie wyraźne, spójne wartości, jeśli trzy naciśnięcia dotyczą kolejnych obszarów (zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara) i trzecią wyraźną wartość, jeśli nie są.

Detale

  • Obszary wejściowe będą nazwane znakami, każdy może mieć ich kolor: ROYGBczerwony, pomarańczowy, żółty, zielony i niebieski; lub ich kształt: HSRTCdla serca, kwadratu, gwiazdy ( R), trójkąta i koła. Wielkość liter nie ma znaczenia, możesz wybrać pracę z danymi wejściowymi i wyjściowymi tylko wielkimi lub małymi literami.
  • Program otrzyma ciąg (lub tablicę znaków lub cokolwiek równoważnego) z trzema naciśnięciami. Przykłady (za pomocą kolorów): RBO, GYO, BBR, YRG, YGB, ORB...
  • Program wyświetli trzy różne spójne wartości reprezentujące trzy możliwe wyniki: pierwszą wartość, jeśli kombinacja nie wyzwala specjalnej melodii, drugą wartość, jeśli kombinacja uruchomi specjalną melodię zgodnie z ruchem wskazówek zegara, i trzecią wartość, jeśli kombinacja wyzwoli specjalna melodia przeciwna do ruchu wskazówek zegara. Przykład: 0brak specjalnej kombinacji, 1melodia uruchamiana przez kombinację zgodną z ruchem wskazówek zegara i -1melodia uruchamiana przez kombinację przeciwną do ruchu wskazówek zegara.
  • Nie musisz się martwić obsługą niewłaściwych danych wejściowych.

Przypadki testowe

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

To jest , więc wygrywa najkrótszy kod dla każdego języka!


Jest [0,0], [1,0], [0,1]dozwolony jako wyjście? Widzę, że robi to odpowiedź Mathematica, i zaoszczędziłoby 3 bajty w odpowiedzi 05AB1E.
Kevin Cruijssen

1
@KevinCruijssen oczywiście możesz. Wartości wyjściowe mogą być dowolne, o ile są odrębne i spójne.
Charlie

Odpowiedzi:


12

Java 8, 48 39 33 bajtów

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

-6 bajtów dzięki @RickHitchcock , więc pamiętaj, aby go zagłosować !

Pobiera kolor wielkich liter jako ciąg wejściowy. Wyjścia -1dla none, 7dla wskazówek zegara i 15dla wskazówek zegara.

Wypróbuj online.

Wyjaśnienie:

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

Stara 39 bajtów odpowiedź:

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

Pobiera kolor wielkich liter jako ciąg wejściowy. Wyjścia 9362dla none, 0dla wskazówek zegara i 1dla wskazówek zegara.

Wypróbuj online.

Wyjaśnienie:

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
Myślę, że 9632 jest najlepszą wyraźną i konsekwentną wartością, jaką do tej pory widziałem w tych odpowiedziach :)
Misha Lavrov

@MishaLavrov Może to być również 10922(dzielenie przez liczby całkowite /6) lub 8191(dzielenie przez liczby całkowite /8), ale wybieram, /7ponieważ jest to indeks przestrzeni w ciągu znaków. :)
Kevin Cruijssen

1
@RickHitchcock Thanks! Myślałem, że próbowałem trochę bitowych operacji, ale najwyraźniej nie wystarczająco właściwie ...
Kevin Cruijssen

6

JavaScript (ES6), 41 bajtów

Pobiera inicjały kolorów jako dane wejściowe. Zwraca 2za brak, truew prawo lub falsew lewo.

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

Wypróbuj online!


3
Przynajmniej odpowiedź Arnaulda, którą rozumiem !! :)
Charlie,

3
@Charlie Myślę, że Arnauld jest chory czy coś takiego. Jego odpowiedź jest nie tylko czytelna i łatwa do zrozumienia, ale jest nawet dłuższa niż moja odpowiedź w Javie! o.Ô Coś tu jest wyraźnie nie tak. ; p
Kevin Cruijssen

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

1
Czy ty w ogóle Roy, stary?
Quentin

6

Python 2 , 36 bajtów

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

-1- Brak
0- Zgodnie z ruchem wskazówek zegara
1- Przeciwnie do ruchu wskazówek zegara

Wypróbuj online!


Heh, wielkie umysły (lub coś w tym stylu) ... codegolf.stackexchange.com/a/174635/53748 (gdybym to widział przed wypróbowaniem czegoś osobiście, dałbym ci bajt save: p)
Jonathan Allan

@JonathanAllan Nie martw się, coś się dzieje: D Poparłem twoją odpowiedź, ponieważ nie mogę jej nie lubić!
Dead Possum

5

Excel, 29 bajtów

=FIND(A1,"ROYGBRO_RBGYORB")<6

Kolory wielkich liter jako dane wejściowe.

Zwraca #VALUE!brak wzorca, TRUEzgodnie z ruchem wskazówek zegara, FALSEprzeciwnie do ruchu wskazówek zegara.

Można owinąć IFERROR( ,0)dla, +11 bytesaby obsłużyć wyjątek i zamiast tego zwrócić „0” dla przypadków bez wzorca.


5

05AB1E , 15 11 bajtów

Zaoszczędzono 4 bajty dzięki Kevinowi Cruijssenowi i Magic Octopus Urn .

Używa kształtów.
Wyjście [0, 0]dla nikogo , [1, 0]do ruchu wskazówek zegara , a [0, 1]na lewo

‚.•ÌöJη•så

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

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

1
Bardzo podobnie jak mój 15-bajtowy odpowiedź, że miał postu: .•1´₃éC•Â‚εXå}¥co powoduje [0], [1], lub [-1], więc +1 ode mnie. Btw, myślę, że (nie jestem pewien) można zapisać trzy bajty usuwając ostatnie trzy, wyprowadzanie [0, 0], [1, 0]oraz [0, 1]jako odrębne wartości. Widzę, że odpowiedź Mathematica robi to samo. Poprosi OP o weryfikację.
Kevin Cruijssen

Właśnie zapytałem OP i rzeczywiście możesz upuścić ostatnie trzy bajty. Tak długo, jak trzy wyjścia są spójne i wyraźne, wszystko jest w porządku.
Kevin Cruijssen

2
‚.•ÌöJη•såma 11 bajtów, jeśli [1,0], [0,1] and [0,0]są uważane za unikalne (chyba że brakuje mi czegoś oczywistego tutaj, dodanie ƶOna końcu tego 11-bajtowego to wciąż 13 dla tej samej odpowiedzi 0, 1, 2, którą masz teraz). Przypadki testowe . Przypadki testowe 2 . Odwrócenie zamówienia eliminuje potrzebę pętli.
Magic Octopus Urn

Zgodnie z komentarzem do oryginalnego wątku 11-bajtowy powinien być w porządku, ponieważ wykorzystuje 3 różne wartości, możesz pokonać Jelly tym :).
Magic Octopus Urn

@KevinCruijssen Dziękujemy! Wydaje mi się, że zawsze myślę o niepowtarzalnym jako „pojedynczej cyfrze” bez powodu :)
Emigna,

4

JavaScript (ES6), 32 bajty

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

Zwraca -1, jeśli nie ma kombinacji, 15, jeśli przeciwnie do ruchu wskazówek zegara, 7, jeśli zgodnie z ruchem wskazówek zegara.


4

Wolfram Language (Mathematica) , 42 36 bajtów

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

Wypróbuj online!

Zlicza, ile razy wejście pojawia się zarówno w, jak "ROYGBRO"i "ORBGYOR". Zwraca {1,0}dla wskazówek zegara, {0,1}dla wskazówek zegara i {0,0}bez specjalnej kombinacji.

Kosztem tylko jednego bajtu możemy uzyskać dane wyjściowe 0za nic, 1zgodnie z ruchem wskazówek zegara i 2przeciwnie do ruchu wskazówek zegara za pomocą "ROYGBRO.ORBGYORBGYOR"~StringCount~#&.


4

kod maszynowy x86, 39 36 bajtów

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

Montaż:

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'

Wypróbuj online!

Dane wyjściowe są 23w stanie „brak”, 7zgodnie z ruchem wskazówek zegara i 15przeciwnie do ruchu wskazówek zegara. Na podstawie odpowiedzi @RickHitchcock.

Zapisano 3 bajty, używając instrukcji porównywania ciągów SSE zamiast libc.


1
Czy możesz policzyć bajty kodu maszynowego, ponieważ te bajty opierają się na grze strstr w pliku binarnym? Nie możesz po prostu wziąć tych samych bajtów w innym kontekście i oczekiwać, że będą działać tak samo.
Robert Fraser

Istnieją czyste zamienniki kodu maszynowego, które nie polegają na standardowej bibliotece strchr.com/strcmp_and_strlen_using_sse_4.2
Robert Fraser

@RobertFraser Umiejscowienie funkcji jest rozstrzygane podczas łączenia, liczba bajtów zawsze będzie taka sama, ponieważ adres funkcji strstrzawsze będzie adresem 32-bitowym (4 bajty). Kod maszynowy w moim poście jest niepowiązany.
Logern

1
Myślę, że to trochę szara strefa. Funkcja polega na danych w pliku obiektowym (mapa linkera), zanim będzie można jej użyć. Można jednak argumentować, że nie różni się niczym od lambda Java wymagającego deklaracji typu.
Robert Fraser

Należy pamiętać, że aby być w pełni zgodnym z interfejsem ABI, należy użyć xmm5 lub xmm6, które są rejestrami rozmówców, zamiast xmm2, który jest zapisywany przez odbiorcę (ale to nie powinno kosztować żadnych bajtów).
Robert Fraser


3

APL (Dyalog), 22 18 bajtów

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

-4 bajty dzięki @ngn

Wykonuje ciąg inicjałów kolorów. Wyjście 0 dla braku specjalnego wzorca, -1 dla przeciwnego do ruchu wskazówek zegara, 1 dla zgodnego z ruchem wskazówek zegara.

Wypróbuj online!


3

Python 2 , 45 43 bajtów

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

Wypróbuj online!

Z pomysłami i poważnym podziękowaniem dla @DeadPossum

-2 dzięki dzięki @JoKing. Teraz wyprowadza -1 = przeciwnie do ruchu wskazówek zegara, 0 = brak, 1 = zgodnie z ruchem wskazówek zegara.

Mój oryginalny wysiłek jest poniżej dla celów historycznych.

Python 2 , 52 51 bajtów

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

Wypróbuj online!

0 = brak, 1 = przeciwnie do ruchu wskazówek zegara, 2 = zgodnie z ruchem wskazówek zegara



@DeadPossum To jest naprawdę fajne i wystarczająco różni się od mojego, abyś mógł opublikować własną odpowiedź. Będę głosować.
ElPedro

3

Python 2 ,  35  36 bajtów

+1 - z jakiegoś powodu myślałem, że wszystkie przyciski będą odrębne> _ <

Opracowany niezależnie od tego, co właśnie widziałem (a teraz głosowałem) Dead Possum

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

Wypróbuj online!


Myślę, że musisz oddzielić ciągi znaków. Zwraca 0 (przeciwnie do ruchu wskazówek zegara) dla „RBR”, którego nie ma na liście kombinacji.
Rick Hitchcock

@ RickHitchcock ah Przyjąłem 3 różne prasy, co z pewnością jest nieprawidłowe. To sprawi, że będzie to dokładnie tak samo jak Dead Possum!
Jonathan Allan

Nie można usunąć z telefonu komórkowego ... usunie lub zaadresuje później
Jonathan Allan

Tak, to może być niejednoznaczne, ale jeden z przypadków testowych („OOO”) pokazuje, że mogą się powtórzyć.
Rick Hitchcock

@ RickHitchcock tak właśnie zobaczyłem po twoim komentarzu - dzięki!
Jonathan Allan


2

Pip , 19 bajtów

Y"ROYGBRO"OaNyaNRVy

Wyjścia 10dla zgodnego z ruchem wskazówek zegara, 01dla przeciwnego do ruchu wskazówek zegara, 00dla żadnego. Wypróbuj online!

Wyjaśnienie

                     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 bajtów

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

Wypróbuj online!

Jak to działa

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

Osiąga maksymalne ponowne użycie funkcji.



1

R , 38 bajtów

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

Wypróbuj online!

Zwroty:

  • Brak specjalnej kombinacji: integer(0)
  • Uruchomiona melodia przeciwna do ruchu wskazówek zegara: 2
  • Uruchomiona melodia zgodnie z ruchem wskazówek zegara: 1

1

Węgiel drzewny , 18 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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


1

Czysty , 63 bajty

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

Wypróbuj online!

[True, True]bez specjalnych dźwięków, [True, False]w kierunku przeciwnym do ruchu wskazówek zegara, [False, True]w kierunku zgodnym z ruchem wskazówek zegara.


0

Japt, 17 14 bajtów

Pobiera kolory jako dane wejściowe, małymi literami. Zwraca 0dla wskazówek zegara, 1dla wskazówek zegara lub -1jeśli nie ma kombinacji.

`ygß`ê qÔbøU

Spróbuj


Wyjaśnienie

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

0

Rubin , 53 36 bajtów

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

Wypróbuj online!

Dane wejściowe: trzycyfrowa liczba całkowita, gdzie cyfry oznaczają kolory:

  • 1 - czerwony
  • 2 - pomarańczowy
  • 3 - żółty
  • 4 - zielony
  • 5 - niebieski

Wyjście: 0 dla ruchu wskazówek zegara, 1 dla ruchu wskazówek zegara, w nilprzeciwnym razie.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.