Bermain dengan kura-kura musikal


20

Dua anak saya suka bermain dengan mainan berikut:

Penyu

Area berwarna dengan bentuk di dalamnya dapat disentuh dan kura-kura kemudian menyalakan area dan memainkan suara atau menyebutkan nama warna atau bentuk di dalamnya. Tombol tengah mengubah mode. Ada satu mode di mana area memainkan not musik yang berbeda ketika disentuh, dengan twist: jika anak menyentuh tiga area berturut-turut searah jarum jam, dimainkan melodi khusus 1. Jika tiga area berurutan yang disentuh ditempatkan berlawanan arah jarum jam, melodi khusus 2 dimainkan.

Tantangan

Mari kita simulasikan logika internal mainan. Diberikan string dengan 3 penekanan anak, kembalikan dua nilai yang berbeda dan koheren jika tiga penekanan tersebut untuk area yang berurutan (searah atau berlawanan arah jarum jam) dan nilai berbeda ketiga jika tidak.

Detail

  • Area input akan diberi nama dengan karakter masing-masing, yang dapat menjadi warna mereka: ROYGBuntuk merah, oranye, kuning, hijau dan biru; atau bentuknya: HSRTCuntuk jantung, kotak, bintang ( R), segitiga dan lingkaran. Kasus tidak masalah, Anda dapat memilih untuk bekerja dengan input dan output hanya dalam huruf besar atau kecil.
  • Program akan menerima string (atau array char atau yang setara) dengan tiga penekanan. Contoh (menggunakan warna): RBO, GYO, BBR, YRG, YGB, ORB...
  • Program akan menghasilkan tiga nilai yang berbeda dan koheren untuk mewakili tiga hasil yang mungkin: nilai pertama jika kombinasi tidak memicu melodi khusus, nilai kedua jika kombinasi memicu melodi khusus searah jarum jam, dan nilai ketiga jika kombinasi memicu Melodi khusus berlawanan arah jarum jam. Contoh: 0tanpa kombinasi khusus, 1untuk melodi yang dipicu oleh kombinasi searah jarum jam dan -1untuk melodi yang dipicu oleh kombinasi berlawanan arah jarum jam.
  • Anda tidak perlu khawatir tentang penanganan input yang salah.

Uji kasus

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

Ini adalah , jadi semoga kode terpendek untuk setiap bahasa menang!


Apakah [0,0], [1,0], [0,1]diperbolehkan sebagai output? Saya melihat jawaban Mathematica melakukan itu, dan itu akan menghemat 3 byte dalam jawaban 05AB1E.
Kevin Cruijssen

1
@KevinCruijssen tentu saja bisa. Nilai output dapat berupa apa saja asalkan berbeda dan konsisten.
Charlie

Jawaban:


12

Java 8, 48 39 33 byte

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

-6 bytes terima kasih kepada @RickHitchcock , jadi pastikan untuk memperbaiki dia juga !

Mengambil warna huruf besar sebagai input-String. Output -1untuk tidak ada, 7untuk searah jarum jam, dan 15untuk berlawanan arah jarum jam.

Cobalah online.

Penjelasan:

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

Jawaban 39 byte:

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

Mengambil warna huruf besar sebagai input-String. Output 9362untuk tidak ada, 0untuk searah jarum jam, dan 1untuk berlawanan arah jarum jam.

Cobalah online.

Penjelasan:

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
Saya pikir 9632 adalah nilai berbeda dan konsisten terbaik yang pernah saya lihat dalam jawaban ini sejauh ini :)
Misha Lavrov

@MishaLavrov Bisa juga dengan 10922(integer-division by /6) atau 8191(integer-division by /8), tapi saya memilih /7karena ini adalah indeks ruang di String. :)
Kevin Cruijssen

1
@RickHitchcock Terima kasih! Saya pikir saya telah mencoba beberapa operasi bitwise, tetapi ternyata tidak cukup baik ..
Kevin Cruijssen

6

JavaScript (ES6), 41 byte

Mengambil inisial warna sebagai input. Pengembalian 2tanpa, trueuntuk searah jarum jam atau falseberlawanan arah jarum jam.

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

Cobalah online!


3
Setidaknya jawaban dari Arnauld bisa saya mengerti !! :)
Charlie

3
@Charlie Saya pikir Arnauld sakit atau semacamnya .. Jawabannya tidak hanya mudah dibaca dan mudah dimengerti, bahkan lebih lama dari jawaban Java saya! o.Ô Jelas ada yang salah di sini. ; p
Kevin Cruijssen

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

1
Apakah Anda bahkan royg, bro?
Quentin


5

Excel, 29 byte

=FIND(A1,"ROYGBRO_RBGYORB")<6

Warna huruf besar sebagai input.

Mengembalikan #VALUE!tanpa pola, TRUEuntuk searah jarum jam, FALSEuntuk berlawanan arah jarum jam.

Dapat membungkus IFERROR( ,0)untuk +11 bytesmenangani pengecualian, dan mengembalikan '0' untuk kasus tanpa pola.


5

05AB1E , 15 11 byte

Disimpan 4 byte berkat Kevin Cruijssen dan Magic Octopus Urn .

Menggunakan bentuk.
Output [0, 0]untuk tidak ada , [1, 0]untuk searah jarum jam dan [0, 1]untuk berlawanan arah jarum jam

‚.•ÌöJη•så

Cobalah online! atau sebagai Test suite

Penjelasan

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

1
Sangat mirip seperti saya jawaban 15-byte bahwa saya hendak posting: .•1´₃éC•Â‚εXå}¥mengakibatkan [0], [1]atau [-1], sehingga 1 dari saya. Btw, saya pikir (tidak yakin) Anda dapat menyimpan tiga byte dengan menghilangkan tiga terakhir, keluaran [0, 0], [1, 0]dan [0, 1]sebagai nilai-nilai yang berbeda. Saya melihat bahwa jawaban Mathematica melakukan hal yang sama. Akan meminta OP untuk verifikasi.
Kevin Cruijssen

Hanya bertanya OP, dan Anda memang diizinkan untuk menjatuhkan tiga byte terakhir. Selama ketiga output konsisten dan berbeda tidak masalah apa pun itu.
Kevin Cruijssen

2
‚.•ÌöJη•såadalah 11 byte jika [1,0], [0,1] and [0,0]dianggap unik (kecuali jika saya melewatkan sesuatu yang jelas di sini, menambahkan ƶOpada akhir 11-byter itu masih 13 untuk jawaban yang sama 0, 1, 2 yang Anda miliki sekarang). Uji kasus . Uji kasus 2 . Order reversal menghilangkan kebutuhan akan loop.
Magic Octopus Mm

Menurut komentar di utas asli, 11-byter harus baik-baik saja, karena menggunakan 3 nilai berbeda, Anda dapat mengalahkan Jelly dengan yang itu :).
Magic Octopus Mm

@KevinCruijssen Terima kasih! Saya selalu menganggap unik sebagai "satu digit" tanpa alasan :)
Emigna

4

JavaScript (ES6), 32 byte

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

Mengembalikan -1 jika tidak ada kombinasi, 15 jika berlawanan arah jarum jam, 7 jika searah jarum jam.


4

Bahasa Wolfram (Mathematica) , 42 36 byte

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

Cobalah online!

Menghitung berapa kali input muncul di keduanya "ROYGBRO"dan "ORBGYOR". Kembali {1,0}untuk searah jarum jam, {0,1}berlawanan dengan jarum jam, dan {0,0}tanpa kombinasi khusus

Dengan biaya hanya satu byte lagi, kita bisa mendapatkan output 0tanpa biaya, 1untuk searah jarum jam, dan 2dengan berlawanan arah jarum jam "ROYGBRO.ORBGYORBGYOR"~StringCount~#&.


4

kode mesin 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

Majelis:

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'

Cobalah online!

Output 23tidak ada, 7untuk searah jarum jam, dan 15untuk berlawanan arah jarum jam. Berdasarkan jawaban @RickHitchcock.

Disimpan 3 byte dengan menggunakan instruksi perbandingan string SSE daripada menggunakan libc.


1
Bisakah Anda menghitung byte kode mesin di sini, karena byte-byte itu bergantung pada penambahan strstr dalam biner? Anda tidak bisa hanya mengambil byte yang sama dalam konteks lain dan berharap mereka bekerja sama.
Robert Fraser

Ada penggantian kode mesin murni yang tidak bergantung pada pustaka standar strchr.com/strcmp_and_strlen_using_sse_4.2
Robert Fraser

@RobertFraser Penempatan fungsi diselesaikan selama menghubungkan, jumlah byte akan selalu sama karena alamat fungsi strstrakan selalu menjadi alamat 32-bit (4 byte). Kode mesin di pos saya tidak terhubung.
Logern

1
Saya kira itu semacam daerah abu-abu. Fungsi ini bergantung pada data dalam file objek (peta tautan) sebelum dapat digunakan. Tapi Anda bisa berargumen bahwa tidak ada bedanya dengan lambda Jawa yang membutuhkan deklarasi tipe.
Robert Fraser

Catatan untuk sepenuhnya mematuhi ABI Anda harus menggunakan xmm5 atau xmm6 yang merupakan register yang disimpan oleh penelepon, alih-alih xmm2 yang disimpan oleh callee (tetapi itu tidak memerlukan biaya byte).
Robert Fraser


3

APL (Dyalog), 22 18 byte

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

-4 byte terima kasih kepada @ngn

Mengambil string inisial warna. Output 0 tanpa pola khusus, -1 untuk berlawanan arah jarum jam, 1 untuk searah jarum jam.

Cobalah online!


3

Python 2 , 45 43 byte

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

Cobalah online!

Dengan ide dari dan kredit serius ke @DeadPossum

-2 dengan terima kasih kepada @ JoKing. Sekarang output -1 = berlawanan arah jarum jam, 0 = tidak ada, 1 = searah jarum jam.

Upaya awal saya di bawah ini untuk tujuan sejarah.

Python 2 , 52 51 byte

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

Cobalah online!

0 = tidak ada, 1 = berlawanan arah jarum jam, 2 = searah jarum jam



@DeadPossum Itu benar-benar keren dan cukup berbeda dari saya untuk Anda posting sebagai jawaban Anda sendiri. Saya akan menang.
ElPedro

3

Python 2 ,  35  36 byte

+1 - untuk beberapa alasan saya pikir semua tombol akan berbeda> _ <

Dikembangkan secara independen dari apa yang baru saja saya lihat (dan sekarang terpilih) oleh Dead Possum

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

Cobalah online!


Saya pikir Anda perlu memisahkan string karakter. Ini mengembalikan 0 (berlawanan arah jarum jam) untuk "RBR," yang tidak ada dalam daftar kombinasi Anda.
Rick Hitchcock

@RickHitchcock ah saya telah mengasumsikan 3 penekanan berbeda yang tentu saja salah. Itu akan membuat ini secara efektif persis sama dengan Dead Possum!
Jonathan Allan

Tidak dapat menghapus dari ponsel ... akan menghapus atau mengatasinya nanti
Jonathan Allan

Ya, itu bisa ambigu, tetapi salah satu kasus uji ("OOO") menunjukkan bahwa mereka bisa mengulang.
Rick Hitchcock

@RickHitchcock ya itulah yang saya lihat setelah komentar Anda - terima kasih!
Jonathan Allan


2

Pip , 19 byte

Y"ROYGBRO"OaNyaNRVy

Output 10untuk searah jarum jam, 01untuk berlawanan arah jarum jam, 00untuk keduanya. Cobalah online!

Penjelasan

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

Cobalah online!

Bagaimana itu bekerja

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

Mencapai jumlah maksimum fungsi yang digunakan kembali.



1

R , 38 byte

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

Cobalah online!

Pengembalian:

  • Tidak ada kombinasi khusus: integer(0)
  • Melodi yang berlawanan dipicu: 2
  • Melodi searah jarum jam dipicu: 1

1

Arang , 18 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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


1

Bersih , 63 byte

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

Cobalah online!

[True, True]tanpa suara khusus, [True, False]untuk berlawanan arah jarum jam, [False, True]untuk searah jarum jam.


0

Japt, 17 14 byte

Mengambil warna sebagai input, dalam huruf kecil. Kembali 0untuk searah jarum jam, 1untuk berlawanan arah jarum jam atau -1jika tidak ada kombo.

`ygß`ê qÔbøU

Cobalah


Ekspansi

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

0

Ruby , 53 36 byte

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

Cobalah online!

Input: bilangan bulat 3 digit, di mana digit mewakili warna:

  • 1 - merah
  • 2 - oranye
  • 3 - kuning
  • 4 - hijau
  • 5 - biru

Output: 0 untuk searah jarum jam, 1 untuk berlawanan arah jarum jam, niljika tidak.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.