เล่นกับเต่าดนตรี


20

ลูกสองคนของฉันชอบเล่นกับของเล่นต่อไปนี้:

เต่า

พื้นที่สีที่มีรูปร่างอยู่ด้านในสามารถสัมผัสได้และเต่าก็จะทำการจุดไฟและเล่นเสียงหรือบอกชื่อของสีหรือรูปร่างที่อยู่ภายใน ปุ่มกลางเปลี่ยนโหมด มีโหมดหนึ่งที่พื้นที่เล่นโน้ตดนตรีที่แตกต่างกันเมื่อสัมผัสกับการบิด: หากเด็กสัมผัสสามพื้นที่ต่อเนื่องตามเข็มนาฬิกาจะมีการเล่นทำนองพิเศษ 1 หากวางทั้งสามพื้นที่ติดต่อกันเป็นทวนเข็มนาฬิกาจะมีการเล่นทำนองพิเศษ 2

ความท้าทาย

ลองจำลองตรรกะภายในของของเล่น ให้สตริงที่มี 3 กดของเด็กคืนสองค่าที่ชัดเจนและเชื่อมโยงกันหากกดสามครั้งสำหรับพื้นที่ต่อเนื่อง (ตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา) และค่าที่แตกต่างที่สามถ้าพวกเขาไม่ได้

รายละเอียด

  • พื้นที่ป้อนข้อมูลจะถูกตั้งชื่อด้วยอักขระแต่ละตัวซึ่งสามารถเป็นสีของพวกเขา: ROYGBสำหรับสีแดงสีส้มสีเหลืองสีเขียวและสีน้ำเงิน หรือรูปร่างของพวกเขา: HSRTCสำหรับหัวใจ, สี่เหลี่ยม, ดาว ( R), สามเหลี่ยมและวงกลม เคสไม่สำคัญคุณสามารถเลือกทำงานกับอินพุตและเอาต์พุตได้เป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก
  • โปรแกรมจะได้รับสตริง (หรืออาร์เรย์ถ่านหรืออะไรก็ตามที่เทียบเท่า) ด้วยการกดสามครั้ง ตัวอย่าง (โดยใช้สี): RBO, GYO, BBR, YRG, YGB, ORB...
  • โปรแกรมจะแสดงผลลัพธ์ที่แตกต่างกันสามค่าที่เชื่อมโยงกันเพื่อแสดงผลลัพธ์ที่เป็นไปได้สามประการ: ค่าแรกหากการรวมกันไม่ทำให้เกิดท่วงทำนองพิเศษค่าที่สองถ้าการรวมกันก่อให้เกิดท่วงทำนองพิเศษตามเข็มนาฬิกาและค่าที่สาม ท่วงทำนองพิเศษทวนเข็มนาฬิกา ตัวอย่าง: 0ไม่มีชุดค่าผสมพิเศษ1สำหรับทำนองที่เกิดจากการผสมตามเข็มนาฬิกาและ-1สำหรับทำนองที่เกิดจากการผสมทวนเข็มนาฬิกา
  • คุณไม่จำเป็นต้องกังวลเกี่ยวกับการจัดการอินพุตที่ไม่ถูกต้อง

กรณีทดสอบ

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

นี่คือดังนั้นอาจเป็นรหัสที่สั้นที่สุดสำหรับแต่ละภาษาที่ชนะ!


คือ[0,0], [1,0], [0,1]ได้รับอนุญาตเป็นผลผลิต? ฉันเห็นคำตอบของ Mathematica ทำเช่นนั้นและมันจะประหยัดได้ 3 ไบต์ในคำตอบ 05AB1E
Kevin Cruijssen

1
@KevinCruijssen แน่นอนคุณสามารถ ค่าเอาต์พุตสามารถเป็นอะไรก็ได้ตราบใดที่มันแตกต่างและสอดคล้องกัน
Charlie

คำตอบ:


12

Java 8, 48 39 33 ไบต์

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

-6 ไบต์ขอบคุณ@RickHitchcockดังนั้นอย่าลืมโหวตให้ดีเช่นกัน !

ใช้สีตัวพิมพ์ใหญ่เป็น Input-String เอาต์พุต-1สำหรับ none, 7ตามเข็มนาฬิกาและ15สำหรับทวนเข็มนาฬิกา

ลองออนไลน์

คำอธิบาย:

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

คำตอบเก่า 39 ไบต์:

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

ใช้สีตัวพิมพ์ใหญ่เป็น Input-String เอาต์พุต9362สำหรับ none, 0ตามเข็มนาฬิกาและ1สำหรับทวนเข็มนาฬิกา

ลองออนไลน์

คำอธิบาย:

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
ผมคิดว่า 9632 เป็นค่าที่ดีที่สุดที่แตกต่างกันและสอดคล้องผมเคยเห็นในคำตอบเหล่านี้เพื่อให้ห่างไกล :)
Misha Lavrov

@MishaLavrov มันอาจเป็น10922(จำนวนเต็มหารด้วย/6) หรือ8191(จำนวนเต็มหารด้วย/8) แต่ฉันเลือก/7เพราะมันเป็นดัชนีของพื้นที่ในสตริง :)
Kevin Cruijssen

1
@ RickHitchcock ขอบคุณ! ฉันคิดว่าฉันได้ลองใช้การดำเนินการระดับบิตบางอย่าง แต่ดูเหมือนว่าไม่เหมาะสมพอ ..
Kevin Cruijssen

6

JavaScript (ES6), 41 ไบต์

ใช้ชื่อย่อของสีเป็นอินพุต ส่งคืน2สำหรับไม่มีtrueตามเข็มนาฬิกาหรือfalseทวนเข็มนาฬิกา

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

ลองออนไลน์!


3
อย่างน้อยคำตอบจาก Arnauld ฉันเข้าใจได้ !! :)
Charlie

3
@ Charlie ฉันคิดว่าArnauldไม่สบายหรือบางสิ่งบางอย่าง .. คำตอบของเขาไม่เพียง แต่สามารถอ่านและเข้าใจง่ายเท่านั้น แต่มันยังนานกว่าคำตอบ Java ของฉัน! o.Ôมีบางอย่างผิดปกติที่นี่ ; p
Kevin Cruijssen

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

1
คุณเคยลองไหม
เควนติน

6

Python 2 , 36 ไบต์

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

-1- ไม่มี
0- ตามเข็มนาฬิกา
1- ทวนเข็มนาฬิกา

ลองออนไลน์!


Heh, จิตใจที่ดี (หรือบางอย่าง) ... codegolf.stackexchange.com/a/174635/53748 (ถ้าฉันเห็นสิ่งนี้ก่อนที่จะลองทำเองฉันจะให้ byte save: p)
Jonathan Allan

@JanathanAllan ไม่ต้องกังวลอะไรเกิดขึ้น: D ฉันได้ตอบคำถามของคุณแล้วเพราะฉันไม่ชอบมัน!
Dead Possum

5

Excel, 29 ไบต์

=FIND(A1,"ROYGBRO_RBGYORB")<6

สีตัวพิมพ์ใหญ่เป็นอินพุต

ส่งคืนโดย#VALUE!ไม่มีรูปแบบTRUEสำหรับทวนเข็มนาฬิกาFALSEสำหรับทวนเข็มนาฬิกา

สามารถห่อในIFERROR( ,0)สำหรับ+11 bytesการยกเว้นจับและผลตอบแทน '0' สำหรับกรณีที่ไม่มีรูปแบบแทน


5

05AB1E , 15 11 ไบต์

ที่บันทึกไว้ 4 ไบต์ต้องขอบคุณเควิน Cruijssenและเมจิกปลาหมึกโกศ

ใช้รูปร่าง
เอาท์พุท[0, 0]สำหรับใคร , [1, 0]สำหรับเข็มนาฬิกาและ[0, 1]สำหรับทวนเข็มนาฬิกา

‚.•ÌöJη•så

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

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

1
คล้ายกันมากเป็นคำตอบที่ 15 ไบต์ของฉันที่ฉันได้เกี่ยวกับการโพสต์: .•1´₃éC•Â‚εXå}¥ผลใน[0], [1]หรือ[-1]เพื่อ +1 จากฉัน Btw ผมคิดว่า (ไม่แน่ใจ) คุณสามารถบันทึกสามไบต์โดยการเอาช่วงสามที่แสดงผล[0, 0], [1, 0]และ[0, 1]เป็นค่าที่แตกต่างกัน ฉันเห็นว่าคำตอบทางคณิตศาสตร์นั้นเหมือนกัน จะขอ OP สำหรับการตรวจสอบ
Kevin Cruijssen

เพิ่งถาม OP และคุณได้รับอนุญาตให้ทิ้งสามไบต์สุดท้าย ตราบใดที่เอาต์พุตทั้งสามนั้นมีความสอดคล้องและชัดเจน
Kevin Cruijssen

2
‚.•ÌöJη•såคือ 11 ไบต์หาก[1,0], [0,1] and [0,0]ถือว่าไม่ซ้ำกัน (เว้นแต่ว่าฉันขาดอะไรที่ชัดเจนที่นี่การเพิ่มƶOไปยังจุดสิ้นสุดของ 11-byter นั้นยังคงเป็น 13 สำหรับ 0, 1, 2 คำตอบเดียวที่คุณมีตอนนี้) กรณีทดสอบ กรณีทดสอบ 2 การกลับคำสั่งซื้อช่วยลดความจำเป็นในการวนซ้ำ
Magic Octopus Urn

ตามความคิดเห็นในเธรดดั้งเดิม 11-byter น่าจะดีเพราะมันใช้ 3 ค่าที่ต่างกันคุณสามารถเอาชนะ Jelly ได้ด้วย :)
Magic Octopus Urn

@KevinCruijssen ขอขอบคุณ! ฉันมักจะดูเหมือนจะคิดว่าของที่ไม่ซ้ำกันเป็น "หลักเดียว" ไม่มีเหตุผล :)
Emigna

4

JavaScript (ES6), 32 ไบต์

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

ส่งกลับ -1 ถ้าไม่มีการรวมกัน 15 ถ้าทวนเข็มนาฬิกา 7 ถ้าทวนเข็มนาฬิกา


4

ภาษา Wolfram (Mathematica) , 42 36 ไบต์

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

ลองออนไลน์!

นับจำนวนครั้งการป้อนข้อมูลที่ปรากฏทั้งในและ"ROYGBRO" "ORBGYOR"ส่งคืน{1,0}ตามเข็มนาฬิกา{0,1}สำหรับทวนเข็มนาฬิกาและ{0,0}ไม่มีการรวมกันพิเศษ

ที่ค่าใช้จ่ายเพียงหนึ่งไบต์มากขึ้นเราจะได้รับผลของ0เพื่ออะไร1สำหรับเข็มนาฬิกาและสำหรับทวนเข็มนาฬิกาด้วย2"ROYGBRO.ORBGYORBGYOR"~StringCount~#&


4

รหัสเครื่อง x86, 39 36 ไบต์

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

สภา:

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'

ลองออนไลน์!

เอาท์พุท23สำหรับไม่มี7ตามเข็มนาฬิกาและ15ทวนเข็มนาฬิกา ตามคำตอบของ @RickHitchcock

บันทึก 3 ไบต์โดยใช้คำสั่งการเปรียบเทียบสตริง SSE แทนที่จะใช้ libc


1
คุณสามารถนับจำนวนไบต์ของรหัสเครื่องได้ที่นี่เนื่องจากจำนวนไบต์เหล่านั้นขึ้นอยู่กับความสมบูรณ์ของ strstr ในไบนารี่ คุณไม่สามารถรับไบต์เดียวกันเหล่านั้นในบริบทอื่นและคาดหวังให้ทำงานเหมือนกัน
Robert Fraser

มีการเปลี่ยนรหัสเครื่องที่ไม่ต้องพึ่งพาไลบรารีมาตรฐานstrchr.com/strcmp_and_strlen_using_sse_4.2
Robert Fraser

@RobertFraser การวางตำแหน่งของฟังก์ชั่นได้รับการแก้ไขในระหว่างการเชื่อมโยงจำนวนไบต์จะเหมือนกันเสมอเพราะที่อยู่ของฟังก์ชั่นstrstrจะเป็นที่อยู่แบบ 32 บิต (4 ไบต์) เสมอ รหัสเครื่องในโพสต์ของฉันถูกยกเลิกการเชื่อมโยง
Logern

1
ฉันคิดว่ามันเป็นพื้นที่สีเทา ฟังก์ชั่นนี้ใช้ข้อมูลในไฟล์วัตถุ (linker map) ก่อนที่จะสามารถใช้งานได้ แต่คุณสามารถยืนยันว่าไม่แตกต่างจากแลมบ์ดาของ Java ที่ต้องการการประกาศประเภท
Robert Fraser

โปรดทราบว่าจะต้องสอดคล้องกับ ABI อย่างสมบูรณ์คุณจะต้องใช้ xmm5 หรือ xmm6 ซึ่งเป็นผู้ลงทะเบียนที่บันทึกการโทรแทน xmm2 ซึ่งเป็น callee-save (แต่ไม่ควรเสียค่าใช้จ่ายไบต์ใด ๆ )
Robert Fraser


3

APL (Dyalog), 22 18 ไบต์

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

-4 ไบต์ขอบคุณ @ngn

ใช้ชื่อย่อของสี เอาต์พุต 0 สำหรับไม่มีรูปแบบพิเศษ, -1 สำหรับทวนเข็มนาฬิกา, 1 สำหรับทวนเข็มนาฬิกา

ลองออนไลน์!


3

Python 2 , 45 43 ไบต์

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

ลองออนไลน์!

ด้วยแนวคิดจากและเครดิตที่จริงจังถึง @DeadPossum

-2 ขอบคุณ @JoKing ตอนนี้เอาท์พุท -1 = ทวนเข็มนาฬิกา, 0 = ไม่มี, 1 = ทวนเข็มนาฬิกา

ความพยายามเริ่มต้นของฉันต่ำกว่าเพื่อจุดประสงค์ทางประวัติศาสตร์

Python 2 , 52 51 ไบต์

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

ลองออนไลน์!

0 = ไม่มี, 1 = ทวนเข็มนาฬิกา, 2 = ตามเข็มนาฬิกา



@DeadPossum นั่นเจ๋งมากและแตกต่างจากของฉันมากสำหรับคุณที่จะโพสต์เป็นคำตอบ ฉันจะโหวตขึ้น
ElPedro

3

Python 2 ,  35  36 ไบต์

+1 - ด้วยเหตุผลบางอย่างฉันคิดว่าปุ่มทั้งหมดจะแตกต่างกัน> _ <

พัฒนาเป็นอิสระจากสิ่งที่ฉันได้เห็นเพียง (และตอนนี้ขึ้นโหวต) โดยตายพอสซัม

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

ลองออนไลน์!


ฉันคิดว่าคุณต้องแยกสายอักขระ ส่งกลับค่า 0 (ทวนเข็มนาฬิกา) สำหรับ "RBR" ซึ่งไม่ได้อยู่ในรายการชุดค่าผสมของคุณ
Rick Hitchcock

@RickHitchcock อาผมถือว่า 3 ที่แตกต่างกันกดที่ไม่ถูกต้องอย่างแน่นอน นั่นจะทำให้สิ่งนี้มีประสิทธิภาพเหมือนกับของ Dead Possum อย่างแน่นอน!
Jonathan Allan

ไม่สามารถลบจากมือถือ ... จะลบหรือที่อยู่ในภายหลัง
Jonathan Allan

ใช่มันอาจจะคลุมเครือ แต่หนึ่งในกรณีทดสอบ ("OOO") แสดงให้เห็นว่าพวกเขาสามารถทำซ้ำได้
Rick Hitchcock

@ RickHitchcock ใช่นั่นคือสิ่งที่ฉันเห็นหลังจากความคิดเห็นของคุณ - ขอบคุณ!
Jonathan Allan


2

Pip , 19 ไบต์

Y"ROYGBRO"OaNyaNRVy

เอาต์พุต10สำหรับทวนเข็มนาฬิกา01สำหรับทวนเข็มนาฬิกา00สำหรับทั้ง ลองออนไลน์!

คำอธิบาย

                     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 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

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

รับฟังก์ชั่นกลับมาใช้ใหม่ได้สูงสุด


2

เยลลี่ 12 ไบต์

,Ṛẇ€“¤ƈẎṬ%Ȥ»

ลองออนไลน์!

-4 ขอบคุณที่โจนาธานอัลลัน

ตามเข็มนาฬิกา: [1, 0]
ทวนเข็มนาฬิกา: [0, 1]
อื่น ๆ :[0, 0]


@JonathanAllan Phew ขอบคุณ เพิ่งเห็นอีกครั้งสิ่งที่ฉันทำคุณแค่ 15 ชั่วโมงเร็ว : P
Erik the Outgolfer

1

R , 38 ไบต์

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

ลองออนไลน์!

คืนสินค้า:

  • ไม่มีชุดค่าผสมพิเศษ: integer(0)
  • ท่วงทำนองทวนเข็มนาฬิกาเรียก: 2
  • ท่วงทำนองตามเข็มนาฬิกาทริกเกอร์: 1

1

ถ่าน 18 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

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



0

Japt, 17 14 ไบต์

ใช้สีเป็นอินพุตเป็นตัวพิมพ์เล็ก ส่งคืน0ตามเข็มนาฬิกา1สำหรับทวนเข็มนาฬิกาหรือ-1หากไม่มีคำสั่งผสม

`ygß`ê qÔbøU

ลองมัน


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 ไบต์

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

ลองออนไลน์!

อินพุต: จำนวนเต็ม 3 หลักซึ่งตัวเลขแสดงถึงสี:

  • 1 - สีแดง
  • 2 - ส้ม
  • 3 - สีเหลือง
  • 4 - สีเขียว
  • 5 - สีน้ำเงิน

เอาท์พุท: 0 สำหรับทวนเข็มนาฬิกา 1 สำหรับทวนเข็มนาฬิกาnilมิฉะนั้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.