뮤지컬 거북이와 놀고


20

내 두 아이는 다음 장난감을 가지고 노는 것을 좋아합니다.

터틀

안에 모양이있는 채색 된 영역을 만지면 거북이가 해당 영역을 밝히고 소리를 내거나 색의 이름이나 모양을 말합니다. 중간 버튼은 모드를 변경합니다. 터치시 서로 다른 음표를 연주하는 하나의 모드가 있습니다. 꼬임이 연속적으로 세 개의 연속 영역을 터치하면 특수 멜로디 1이 재생됩니다. 터치 한 3 개의 연속 영역을 시계 반대 방향으로 놓으면 특수 멜로디 2가 연주됩니다.

도전

장난감의 내부 논리를 시뮬레이션 해 봅시다. 아이를 3 번 ​​누르는 문자열이 주어지면, 3 번의 프레스가 연속 영역 (시계 방향 또는 시계 반대 방향)에 대한 것이면 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 답변이 그렇게하는 것을보고 05AB1E 답변에 3 바이트를 절약 할 수 있습니다.
Kevin Cruijssen

1
물론 @KevinCruijssen 할 수 있습니다. 출력 값은 명확하고 일관된 한 아무 것도 될 수 있습니다.
Charlie

답변:


12

자바 8, 48 39 33 바이트

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

@RickHitchcock 덕분에 -6 바이트 이므로 그를 투표 해야 합니다 !

대문자 색을 input-String으로 사용합니다. -1없음, 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없음, 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 내가 :) 지금까지 이러한 답변에 본 최고의 명료하고 일관성있는 가치라고 생각합니다
미샤 라브 로프

@MishaLavrov 또한 10922(정수 나누기 /6) 또는 8191(정수 나누기 /8) 일 수 있지만 /7String의 공간 인덱스이므로 선택합니다 . :)
Kevin Cruijssen

1
@RickHitchcock 감사합니다! 나는 약간의 비트 연산을 시도했지만, 적절하게 충분하지 않다고 생각했다.
Kevin Cruijssen

6

자바 스크립트 (ES6), 41 바이트

컬러 이니셜을 입력으로 사용합니다. 시계 방향 또는 시계 반대 방향으로 2없음을 반환 합니다 .truefalse

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
당신은 royg도합니까?
Quentin

6

파이썬 2 , 36 바이트

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

-1-없음
0-시계 방향
1-반 시계 방향

온라인으로 사용해보십시오!


훗, 좋은 마음 (또는 무언가) ... codegolf.stackexchange.com/a/174635/53748은 : (P 나 자신을 물건을 시도하기 전에 본 적 더라면, 난 그냥 당신이 저장 바이트를 준 것)
조나단 앨런

@JonathanAllan 걱정하지 마세요. 일이 벌어집니다 : D 나는 그것을 싫어합니다.
Dead Possum

5

엑셀, 29 바이트

=FIND(A1,"ROYGBRO_RBGYORB")<6

입력으로 대문자 색상.

시계 방향, 시계 반대 방향으로 #VALUE!패턴이없는 경우 반환 합니다 .TRUEFALSE

예외 처리 를 IFERROR( ,0)위해 랩핑하고 +11 bytes패턴이없는 경우 대신 '0'을 리턴 할 수 있습니다.


5

05AB1E , 15 11 바이트

Kevin CruijssenMagic Octopus Urn 덕분에 4 바이트를 절약했습니다 .

도형을 사용합니다.
출력 [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, 난 당신이 지난 3를 제거 출력하여 3 바이트를 저장할 수 있습니다 (하지 않도록) 생각 [0, 0], [1, 0]그리고 [0, 1]고유 값으로. Mathematica의 답변도 똑같습니다. OP에게 확인을 요청합니다.
Kevin Cruijssen

방금 OP를 요청하면 실제로 마지막 3 바이트를 삭제할 수 있습니다. 세 개의 출력이 일관되고 구별되는 한 그것이 무엇이든 상관 없습니다.
Kevin Cruijssen

2
‚.•ÌöJη•så[1,0], [0,1] and [0,0]고유 한 것으로 간주되는 경우 11 바이트입니다 (여기에서 명백한 것이 누락되지 않는 한 11 바이트 ƶO의 끝에 추가 하는 것은 현재 동일한 0, 1, 2 답변에 대해 13입니다). 테스트 사례 . 테스트 사례 2 . 주문 취소는 루프가 필요하지 않습니다.
매직 문어 Urn

원래 스레드에 대한 의견에 따르면 11 바이트는 괜찮습니다 .3 개의 고유 한 값을 사용하므로 젤리를 그 값으로 이길 수 있습니다. :)
매직 문어 Urn

@KevinCruijssen 감사합니다! 나는 항상 특별한 이유없이 "단일 자리"로 생각하는 것 같습니다 :)
Emigna

4

자바 스크립트 (ES6), 32 바이트

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

조합이 없으면 -1을, 시계 반대 방향으로 15를, 시계 방향으로 7을 반환합니다.


4

Wolfram Language (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의 답변을 기반으로합니다.

libc 대신 SSE 문자열 비교 명령어를 사용하여 3 바이트를 절약했습니다.


1
이 바이트에서 바이너리의 strstr에 의존하기 때문에 머신 코드 바이트를 계산할 수 있습니까? 다른 컨텍스트에서 동일한 바이트를 가져 와서 동일한 작동을 기대할 수는 없습니다.
Robert Fraser


@RobertFraser 함수의 배치는 링크 중에 해결됩니다. 함수의 주소 strstr는 항상 32 비트 (4 바이트) 주소 이기 때문에 바이트 수는 항상 동일 합니다. 내 게시물의 기계 코드가 연결되어 있지 않습니다.
Logern

1
나는 그것이 회색 영역이라고 생각합니다. 이 함수는 사용하기 전에 오브젝트 파일 (링커 맵)의 데이터를 사용합니다. 그러나 유형 선언이 필요한 Java 람다와 다르지 않다고 주장 할 수 있습니다.
Robert Fraser

ABI를 완벽하게 준수하려면 호출자가 저장 한 xmm2 대신에 호출자가 저장 한 xmm5 또는 xmm6을 사용해야합니다 (그러나 바이트 비용이 들지 않아야 함).
Robert Fraser


3

APL (Dyalog), 22 18 바이트

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

@ngn 덕분에 -4 바이트

일련의 색상 이니셜을 가져옵니다. 특수 패턴이 없으면 0을, 시계 반대 방향으로 -1을, 시계 방향으로 1을 출력합니다.

온라인으로 사용해보십시오!


3

파이썬 2 , 45 43 바이트

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

온라인으로 사용해보십시오!

@DeadPossum의 아이디어와 진지한 신용

@JoKing 덕분에 -2. 이제 -1 = 시계 반대 방향, 0 = 없음, 1 = 시계 방향으로 출력합니다.

나의 원래 노력은 역사적인 목적을 위해 아래에 있습니다.

파이썬 2 , 52 51 바이트

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

온라인으로 사용해보십시오!

0 = 없음, 1 = 시계 반대 방향, 2 = 시계 방향



@DeadPossum 그것은 당신이 당신의 자신의 답변으로 게시 할 수있을만큼 시원하고 내 것과 충분히 다릅니다. 공감하겠습니다.
ElPedro

3

파이썬 2 ,  35  36 바이트

+1-어떤 이유로 든 모든 버튼이 고유하다고 생각했습니다.> _ <

Dead Possum 이 방금 본 (현재 투표 한) 것과 독립적으로 개발

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

온라인으로 사용해보십시오!


문자열을 분리해야한다고 생각합니다. 이렇게하면 조합 목록에없는 "RBR"에 대해 0 (시계 반대 방향)이 반환됩니다.
Rick Hitchcock

@RickHitchcock 아 확실히 3 가지 다른 프레스를 가정했습니다 . 이것은 이것을 Dead Possum의 것과 정확히 동일하게 만들 것입니다!
Jonathan Allan

모바일에서 삭제할 수 없습니다 ... 나중에 삭제하거나 주소 지정
Jonathan Allan

예, 모호 할 수 있지만 테스트 사례 중 하나 ( "OOO")는 반복 될 수 있음을 보여줍니다.
Rick Hitchcock

@RickHitchcock 그렇습니다. 귀하의 의견에 따라 본 것입니다.
Jonathan Allan


2

, 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

최대한의 기능 재사용을 달성합니다.



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

apt, 17 14 바이트

색상을 소문자로 입력으로 사용합니다. 0시계 방향, 1반 시계 방향 또는 -1콤보가없는 경우 반환 합니다 .

`ygß`ê qÔbøU

시도 해봐


확장

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

0

루비 , 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.