Müzikal kaplumbağa ile oynamak


20

İki çocuğum aşağıdaki oyuncakla oynamayı sever:

Kaplumbağa

İçinde şekilleri olan renkli alanlara dokunabilir ve kaplumbağa alanı aydınlatır ve bir ses çalar veya içindeki rengin veya şeklin adını söyler. Ortadaki düğme modu değiştirir. Bir dokunuşla, alanların dokunulduğunda farklı müzik notaları çaldığı bir mod vardır: çocuk saat yönünde üç ardışık alana dokunursa, özel bir melodi 1 çalınır. Dokunan ardışık üç alan saat yönünün tersine yerleştirilirse, özel bir melodi 2 çalınır.

Meydan okuma

Oyuncağın iç mantığını simüle edelim. Çocuğun 3 kez basıldığı bir dize verildiğinde, üç baskı birbirini takip eden alanlar içinse (saat yönünde veya saat yönünün tersine) iki farklı, tutarlı değer ve eğer değilse üçüncü bir farklı değer döndürün.

ayrıntılar

  • Girdi alanları, her biri bir karakterle adlandırılacak ve bu karakterlerin rengi olabilir: ROYGBkırmızı, turuncu, sarı, yeşil ve mavi için; veya şekilleri: HSRTCkalp, kare, yıldız ( R), üçgen ve daire için. Durum önemli değil, sadece büyük veya küçük harflerle giriş ve çıkışla çalışmayı seçebilirsiniz.
  • Program üç basışla bir dize (veya char dizisi veya eşdeğeri bir şey) alacaktır. (Renkleri kullanarak) Örnekler: RBO, GYO, BBR, YRG, YGB, ORB...
  • Program, üç olası sonucu temsil etmek için üç ayrı, tutarlı değer üretir: kombinasyon özel bir melodiyi tetiklemezse bir ilk değer, kombinasyon saat yönünde özel melodiyi tetiklerse ikinci bir değer ve kombinasyon, saat yönünün tersine özel melodi. Örnek: 0özel bir kombinasyon 1için, saat yönünde bir kombinasyon -1tarafından tetiklenen melodi ve saat yönünün tersine bir kombinasyon tarafından tetiklenen melodi için.
  • Yanlış girişleri ele alma konusunda endişelenmenize gerek yoktur.

Test senaryoları

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

Bu , bu yüzden her dil için en kısa kod kazanabilir!


Is [0,0], [1,0], [0,1]çıktı olarak izin? Mathematica cevabının bunu yaptığını görüyorum ve 05AB1E cevabına 3 bayt kazandıracaktı.
Kevin Cruijssen

1
@KevinCruijssen tabii ki yapabilirsiniz. Çıktı değerleri, farklı ve tutarlı oldukları sürece herhangi bir şey olabilir.
Charlie

Yanıtlar:


12

Java 8, 48 39 33 bayt

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

@RickHitchcock sayesinde -6 bayt , bu yüzden onu da oyladığınızdan emin olun !

Büyük harf rengini input-String olarak alır. -1Yok, 7saat yönünde ve saat yönünün tersine çıkışlar 15.

Çevrimiçi deneyin.

Açıklama:

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

Eski 39 bayt cevap:

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

Büyük harf rengini input-String olarak alır. 9362Yok, 0saat yönünde ve saat yönünün tersine çıkışlar 1.

Çevrimiçi deneyin.

Açıklama:

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
Bence 9632 bu cevaplarda şimdiye kadar gördüğüm en belirgin ve tutarlı değer :)
Misha Lavrov

@MishaLavrov Ayrıca 10922(tamsayı-bölüme göre /6) veya 8191(tamsayı-bölüme göre /8) olabilir, ama ben /7String içindeki alanın dizini olduğu için seçiyorum . :)
Kevin Cruijssen

1
@RickHitchcock Teşekkürler! Bazı bitsel operasyonları denediğimi sanıyordum, ama görünüşe göre yeterince düzgün değil ..
Kevin Cruijssen

6

JavaScript (ES6), 41 bayt

Renk baş harflerini girdi olarak alır. İade 2hiçbiri için, truesaat yönünde veya falsesaat yönü tersine için.

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

Çevrimiçi deneyin!


3
En azından Arnauld bir cevap anlayabiliyorum !! :)
Charlie

3
@Charlie Bence Arnauld hasta ya da bir şey .. Sadece cevabı okunabilir ve anlaşılması kolay değil, Java cevabımdan bile daha uzun! o.Ô Burada bir şeyler yanlış. ; p
Kevin Cruijssen

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

1
Hatta royg yapıyorsun kardeşim?
Quentin


5

Excel, 29 bayt

=FIND(A1,"ROYGBRO_RBGYORB")<6

Giriş olarak büyük renkler.

İade #VALUE!hiçbir desen için TRUEsaat yönünde, FALSEsaat yönünün tersine için.

İstisna işlemek IFERROR( ,0)için sarın +11 bytesve modelsiz durumlar için '0' döndürün.


5

05AB1E , 15 11 bayt

Kevin Cruijssen ve Magic Octopus Urn sayesinde 4 bayt tasarruf etti .

Şekiller kullanır.
Çıktı [0, 0]için hiçbiri , [1, 0]için saat yönünde ve [0, 1]için saat yönünün tersine

‚.•ÌöJη•så

Çevrimiçi deneyin! veya Test takımı olarak

açıklama

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

1
: Benim 15 bayt ı mesaja üzere olduğu cevap olarak çok benzer .•1´₃éC•Â‚εXå}¥sonuçlanan [0], [1]ya [-1]benden bu kadar +1. Btw, sana, son üç kaldırarak çıkışı yaparak üç bayt kaydedebilirsiniz (değil emin) düşünmek [0, 0], [1, 0]ve [0, 1]ayrı değerler olarak. Mathematica cevabının da aynı şeyi yaptığını görüyorum. OP'den doğrulama isteyecektir.
Kevin Cruijssen

Sadece OP'ye sordunuz ve gerçekten son üç baytı bırakmanıza izin veriliyor. Üç çıkış tutarlı ve farklı olduğu sürece her ne olursa olsun iyi.
Kevin Cruijssen

2
‚.•ÌöJη•så[1,0], [0,1] and [0,0]benzersiz olarak kabul edilirse 11 bayttır (burada açık bir şey eksik olmadıkça , 11 baytın ƶOsonuna eklemek şu anda sahip olduğunuz 0, 1, 2 yanıtı için hala 13'tür). Test senaryoları . Test senaryoları 2 . Sipariş ters çevrimi döngü ihtiyacını ortadan kaldırır.
Sihirli Ahtapot Urn

Orijinal iş parçacığındaki açıklamaya göre, 11 byter iyi olmalı, 3 farklı değer kullandığından, Jelly'i bununla yenebilirsiniz :).
Sihirli Ahtapot Urn

@KevinCruijssen Teşekkür ederiz! Ben her zaman benzersiz bir neden "tek haneli" olarak düşünüyor gibi görünüyor :)
Emigna

4

JavaScript (ES6), 32 bayt

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

Kombinasyon yoksa -1, saat yönünün tersine 15, saat yönünde 7 döndürür.


4

Wolfram Dili (Mathematica) , 42 36 bayt

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

Çevrimiçi deneyin!

Girdinin hem "ROYGBRO"ve 'de görüntülenme sayısını sayar "ORBGYOR". İade {1,0}saat yönünde, {0,1}saat yönü tersine için ve{0,0} özel bir kombinasyon olmadan .

Sadece bir tane daha byte pahasına, biz çıkışları alabilirsiniz 0şey için 1saat yönünde ve 2birlikte yönünün tersine için "ROYGBRO.ORBGYORBGYOR"~StringCount~#&.


4

x86 makine kodu, 39 36 bayt

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

Montaj:

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'

Çevrimiçi deneyin!

Çıktı 23yok, 7saat yönünde ve15 saat yönünün tersi içindir. @RickHitchcock'un cevabına dayanarak.

Libc yerine bir SSE dizesi karşılaştırma talimatı kullanarak 3 bayt kaydedildi.


1
Makine kod baytlarını burada sayabilir misiniz, çünkü bu baytlar strstr'nin ikili dosyadaki yerleşimini kullanıyor mu? Aynı baytları başka bir bağlamda alıp aynı şekilde çalışmalarını bekleyemezsiniz.
Robert Fraser


@RobertFraser Bağlama sırasında işlevin yerleşimi çözülür, işlevin adresi strstrher zaman 32 bit (4 bayt) bir adres olacağından bayt sayısı her zaman aynı olur. Yazımdaki makine kodunun bağlantısı kaldırıldı.
Logern

1
Sanırım burası gri bir alan. İşlev, kullanılmadan önce nesne dosyasındaki (bağlayıcı harita) verilere dayanır. Ancak bunun bir tür bildirime ihtiyaç duyan bir Java lambda'dan farklı olmadığını iddia edebilirsiniz.
Robert Fraser

ABI ile tam olarak uyumlu olmak için, arayan tarafından kaydedilen xmm2 yerine arayan tarafından kaydedilen kayıtlar olan xmm5 veya xmm6 kullanmanız gerekir (ancak baytlara maliyeti olmamalıdır).
Robert Fraser


3

APL (Dyalog), 22 18 bayt

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

@Ngn sayesinde -4 bayt

Bir renk baş harfleri dizesi alır. Özel bir model olmadan 0, saat yönünün tersine -1, saat yönünde 1 çıkış verir.

Çevrimiçi deneyin!


3

Python 2 , 45 43 bayt

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

Çevrimiçi deneyin!

@DeadPossum'dan fikirler ve ciddi kredi ile

@JoKing sayesinde -2. Şimdi -1 = saat yönünün tersine, 0 = yok, 1 = saat yönünde çıktılar.

Orijinal çabam tarihsel amaçlar için aşağıda.

Python 2 , 52 51 bayt

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

Çevrimiçi deneyin!

0 = yok, 1 = saat yönünün tersine, 2 = saat yönünde



@DeadPossum Bu, kendi cevabınız olarak yayınlayabilmeniz için cidden harika ve benimkinden yeterince farklı. Ben onaylayacağım.
ElPedro

3

Python 2 ,  35  36 bayt

+1 - bir nedenden dolayı tüm düğmelerin farklı olacağını düşündüm> _ <

Dead Possum tarafından az önce gördüğüm (ve şimdi oylanan) şeyden bağımsız olarak geliştirildi

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

Çevrimiçi deneyin!


Bence karakter dizilerini ayırmanız gerekiyor. Bu, kombinasyon listenizde olmayan "RBR" için 0 (saat yönünün tersine) döndürür.
Rick Hitchcock

@RickHitchcock ah Kesinlikle yanlış 3 farklı baskı olduğunu varsaymıştım . Bu, Dead Possum'unkiyle tam olarak aynı olacak!
Jonathan Allan


Evet, belirsiz olabilir, ancak test vakalarından biri ("OOO") tekrar edebileceklerini gösteriyor.
Rick Hitchcock

@ RickHitchcock evet, yorumundan sonra gördüğüm şey bu - teşekkürler!
Jonathan Allan


2

bip , 19 bayt

Y"ROYGBRO"OaNyaNRVy

10Saat yönünde çıkışlar ,01 saat yönünün tersine00 . Çevrimiçi deneyin!

açıklama

                     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 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

Maksimum işlev yeniden kullanım miktarına ulaşır.



1

R , 38 bayt

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

Çevrimiçi deneyin!

İadeler :

  • Özel kombinasyon yok: integer(0)
  • Saat yönünün tersine melodi tetiklendi: 2
  • Saat yönünde melodi tetiklendi: 1

1

Kömür , 18 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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


1

Temiz , 63 bayt

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

Çevrimiçi deneyin!

[True, True]özel sesler [True, False]için, [False, True]saat yönünün tersine, saat yönünde.


0

Japt, 17 14 bayt

Renkleri küçük harfle girdi olarak alır. 0Saat yönünde, 1saat yönünün tersine veya -1combo yoksa döndürür .

`ygß`ê qÔbøU

Dene


bunların açıklaması

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

0

Yakut , 53 36 bayt

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

Çevrimiçi deneyin!

Girdi: basamakların renkleri temsil ettiği 3 basamaklı bir tam sayı:

  • 1 - kırmızı
  • 2 - turuncu
  • 3 - sarı
  • 4 - yeşil
  • 5 - mavi

Çıkış: saat yönünde 0, saat yönünün tersine 1, nilaksi takdirde.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.