玩音乐乌龟


20

我的两个孩子喜欢玩以下玩具:

龟

可以触摸内部形状的着色区域,然后乌龟会照亮该区域并播放声音或说出颜色或内部形状的名称。中间按钮更改模式。有一种模式,其中的区域在触摸时会弹奏不同的音符,并带有一种扭曲:如果孩子顺时针触摸三个连续的区域,则会播放特殊的旋律1。如果将三个连续触摸的区域逆时针放置,则会播放特殊的旋律2。

挑战

让我们模拟玩具的内部逻辑。给定一个带有3次按压的字符串,如果这3次按压是针对连续区域(顺时针或逆时针)的,则返回两个不同的连贯值;如果不是连续的,则返回第三个不同的值。

细节

  • 输入区域将分别用一个字符命名,该字符可以是它们的颜色:ROYGB红色,橙色,黄色,绿色和蓝色。或它们的形状:HSRTC用于心脏,正方形,星形(R),三角形和圆形。大小写无关紧要,您可以选择只使用大写还是小写来处理输入和输出。
  • 该程序将通过三次按下来接收字符串(或char数组或任何等效形式)。例子(使用颜色): ,RBOGYOBBR,,YRG ...YGBORB
  • 程序将输出三个截然不同的连贯值,以表示三种可能的结果:如果组合未触发特殊旋律,则为第一个值;如果组合触发顺时针特殊旋律,则为第二个值;如果组合触发了特殊旋律,则为第三个值。逆时针特殊旋律。例如: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个字节。
凯文·克鲁伊森

1
@KevinCruijssen当然可以。输出值可以是任意值,只要它们是不同且一致的即可。
查理

Answers:


12

Java 8,48 39 33字节

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

-6个字节感谢@RickHitchcock,所以请确保也对他进行投票

将大写颜色作为输入字符串。输出-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

将大写颜色作为输入字符串。输出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是迄今为止我在这些答案中看到的最好的独特和一致的值:)
Misha Lavrov

@MishaLavrov它也可以是10922(integer-division by /6)或8191(integer-division by /8),但我选择/7是因为它是String中空格的索引。:)
Kevin Cruijssen

1
@RickHitchcock谢谢!我以为我尝试了一些按位操作,但显然不够用
。–凯文·克鲁伊森

6

JavaScript(ES6),41个字节

将颜色缩写作为输入。不返回2true顺时针或false逆时针返回。

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

在线尝试!


3
至少我能理解Arnauld的答案!!:)
查理

3
@Charlie我认为Arnauld病了或有些什么。他的答案不仅可读而且易于理解,甚至比我的Java答案还要长!o.Ô这里显然有问题。; p
Kevin Cruijssen

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

1
兄弟,你还养猪吗?
昆汀


5

Excel,29个字节

=FIND(A1,"ROYGBRO_RBGYORB")<6

大写颜色作为输入。

返回#VALUE!无模式,TRUE顺时针,FALSE逆时针。

可以包装IFERROR( ,0)for +11 bytes以处理异常,对于无模式的情况可以返回'0'。


5

05AB1E15 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。顺便说一句,我认为(不知道),你可以通过删除最后三个,输出保存三个字节[0, 0][1, 0]以及[0, 1]为不同的值。我看到Mathematica的答案也一样。将要求OP进行验证。
凯文·克鲁伊森

刚问过OP,确实可以删除最后三个字节。只要这三个输出是一致且不同的,就可以了。
凯文·克鲁伊森

2
‚.•ÌöJη•så如果[1,0], [0,1] and [0,0]认为是唯一的,则为11个字节(除非我在这里遗漏了一些明显的东西,ƶO对于您现在具有的相同0、1、2答案,在11字节的末尾仍为13字节)。测试用例测试用例2。订单冲销消除了对循环的需要。
魔术章鱼缸

根据对原始线程的评论,11字节应该没问题,因为它使用3个不同的值,因此您可以用一个值击败Jelly :)。
魔术章鱼缸

@KevinCruijssen谢谢!我似乎总是无缘无故地认为唯一性是“单个数字” :)
Emigna

4

JavaScript(ES6),32个字节

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

如果没有组合,则返回-1;如果逆时针,则返回15;如果顺时针,则返回7。



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的答案。

通过使用SSE字符串比较指令而不是libc节省了3个字节。


1
您可以在这里计算机器码字节,因为这些字节依赖于二进制文件中的strstr?您不能只将这些相同的字节放在另一个上下文中并期望它们工作相同。
罗伯特·弗雷泽

有纯粹的机器代码替代品,它们不依赖于标准库strchr.com/strcmp_and_strlen_using_sse_4.2
Robert Fraser

@RobertFraser在链接过程中解析函数的位置,字节数将始终相同,因为函数的地址strstr将始终为32位(4字节)地址。我的帖子中的机器代码未链接。
Logern

1
我想这是一个灰色区域。该功能依赖于目标文件(链接器映射)中的数据,然后才能使用。但是您可能会说,这与需要类型声明的Java lambda没什么不同。
罗伯特·弗雷泽

请注意,要完全符合ABI,您必须使用保存为调用方的寄存器xmm5或xmm6,而不是保存为被调用方保存的xmm2(但不应占用任何字节)。
罗伯特·弗雷泽


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 '18 -10-23

3

Python 2中 35  36个字节

+1-由于某种原因,我认为所有按钮都将是不同的> _ <

独立于Dead Possum 我刚刚看到(现在被投票)的东西开发

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

在线尝试!


我认为您需要分隔字符串。这将为“ RBR”返回0(逆时针),该值不在您的组合列表中。
里克·希区柯克

@RickHitchcock啊,我假设有3 种不同的印刷机,但这肯定是不正确的。这将使它实际上与Dead Possum的一样!
乔纳森·艾伦

无法从手机中删除...将在以后删除或处理
Jonathan Allan

是的,它可能是模棱两可的,但是其中一个测试用例(“ OOO”)表明它们可以重复。
里克·希区柯克

@RickHitchcock是的,我是在您发表评论后看到的-谢谢!
乔纳森·艾伦


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


1

干净,63字节

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

在线尝试!

[True, True]没有特殊的噪音,[True, False]逆时针,[False, True]顺时针。


0

杰普特 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否则。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.