ミュージカルタートルと遊ぶ


20

私の2人の子供は、次のおもちゃで遊ぶのが好きです。

Turtle

内側に図形のある色付きの領域をタッチすると、カメがその領域を照らし、音を鳴らすか、内部の色または形状の名前を言います。中央のボタンはモードを変更します。触れたときに領域が異なる音符を演奏する1つのモードがあります。子供が時計回りに連続する3つの領域に触れると、特別なメロディ1が再生されます。タッチされた3つの連続した領域が反時計回りに配置されている場合、特別なメロディ2が再生されます。

チャレンジ

おもちゃの内部ロジックをシミュレートしましょう。キッドを3回押すと文字列が与えられると、3回押すと連続する領域(時計回りまたは反時計回り)の場合は2つの明確な一貫性のある値を返し、そうでない場合は3番目の明確な値を返します。

詳細

  • 入力エリアはそれぞれ文字で名前が付けられ、色ROYGBは赤、オレンジ、黄色、緑、青の場合があります。またはその形状:HSRTCハート、正方形、星(R)、三角形、円。大文字と小文字は区別されません。入力と出力を大文字と小文字のどちらで扱うかを選択できます。
  • プログラムは、3回押すと文字列(またはchar配列または同等のもの)を受け取ります。例(色を使用): 、RBOGYOBBR、、YRGYGBORB ...
  • プログラムは、3つの可能な結果を​​表す3つの異なるコヒーレントな値を出力します:組み合わせが特別なメロディーをトリガーしない場合は最初の値、組み合わせが時計回りの特別なメロディーをトリガーする場合は2番目の値、組み合わせがトリガーする場合は3番目の値反時計回りの特別なメロディ。例: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もちろんできます。出力値は、明確で一貫している限り、どのような値でもかまいません。
チャーリー

回答:


12

Java 8、48 39 33バイト

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

@RickHitchcockのおかげで-6バイトなので、必ず彼も賛成してください!

入力文字列として大文字の色を使用します。-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は、これらの回答でこれまでに見た中で最も明確で一貫した値だと思います:)
ミシャラブロフ

@MishaLavrov 10922(整数分割/6)または8191(整数分割/8)の場合もあります/7が、文字列内のスペースのインデックスなので選択します。:)
ケビンクルーイッセン

1
@RickHitchcockありがとう!私はいくつかのビット単位の操作を試してみましたが、どうやらない適切に十分なと思っていた...
ケビンCruijssen

6

JavaScript(ES6)、41バイト

入力として色の頭文字を取ります。2なし、true時計回りまたはfalse反時計回りに戻ります。

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

オンラインでお試しください!


3
少なくとも、私は理解できるArnauldからの答え!! :)
チャーリー

3
@Charlie Arnauldは病気か何かだと思います。彼の答えは読みやすく、理解しやすいだけでなく、Javaの答えよりも長くなります。o.Ôここで明らかに何かが間違っています。; p
ケビンクルーイッセン

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をラップしてexceptionを処理し、代わりにパターンなしの場合は「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。ちなみに、最後の3つを削除して出力することで3バイト節約できると思います(わかりません)[0, 0][1, 0]と、[0, 1]個別の値として。Mathematicaの答えでも同じことがわかります。OPに確認を求めます。
ケビンクルーッセン

OPに尋ねると、最後の3バイトをドロップすることが実際に許可されます。3つの出力が一貫していて明確である限り、それが何であれ大丈夫です。
ケビンクルーイッセン

2
‚.•ÌöJη•så[1,0], [0,1] and [0,0]一意であると見なされる場合、11バイトです(ここで明らかなものが欠落していない限り、その11バイトƶOの最後に追加すると、現在の同じ0、1、2の回答に対しても13です)。テストケーステストケース2。順序の反転により、ループの必要がなくなります。
魔法のタコ

元のスレッドのコメントによると、11-byterは3つの異なる値を使用するので問題ありません。その1つでJellyを倒すことができます:)。
魔法のタコUr

@KevinCruijssenありがとうございます!私はいつも理由もなく「一桁」とユニークだと思っているようです:
エミグナ

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}特別な組み合わせがない場合に戻ります。

あと1バイトのコストで、出力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に依存しているため、ここでマシンコードのバイトをカウントできますか?同じバイトを別のコンテキストで取得して、同じ動作を期待することはできません。
ロバートフレイザー


@RobertFraser関数の配置はリンク中に解決されstrstrます。関数のアドレスは常に32ビット(4バイト)アドレスであるため、バイトカウントは常に同じです。私の投稿のマシンコードはリンクされていません。
ローガン

1
灰色の領域だと思います。この関数は、使用する前にオブジェクトファイル(リンカーマップ)のデータに依存します。しかし、Javaラムダが型宣言を必要とすることと同じことを主張できます。
ロバートフレイザー

ABIに完全に準拠するには、呼び出し先で保存されるxmm2ではなく、呼び出し元で保存されるレジスタであるxmm5またはxmm6を使用する必要があります(ただし、バイトはかかりません)。
ロバートフレイザー



3

パイソン245の 43バイト

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

オンラインでお試しください!

@DeadPossumからのアイデアと真剣な信用

-2 @JoKingに感謝します。-1 =反時計回り、0 =なし、1 =時計回りに出力されるようになりました。

私の最初の努力は歴史的な目的のために以下にあります。

パイソン252の 51バイト

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

オンラインでお試しください!

0 =なし、1 =反時計回り、2 =時計回り



@DeadPossumこれは非常にクールで、自分の答えとして投稿するのに十分なものです。私は賛成します。
エルペドロ

3

Python 2 35  36バイト

+1-何らかの理由で、すべてのボタンが異なると思った> _ <

Dead Possumが私が今見た(そして今では投票された)ものとは独立し開発された

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

オンラインでお試しください!


文字列を分離する必要があると思います。これは、「RBR」に対して0(反時計回り)を返しますが、これは組み合わせのリストにはありません。
リックヒッチコック

@RickHitchcockああ、間違いなく間違っている3つの異なるプレスを想定していました。これにより、これはデッドポッサムとまったく同じになります!
ジョナサンアラン

モバイルから削除できません...後で削除またはアドレス指定します
ジョナサンアラン

ええ、それはあいまいかもしれませんが、テストケースの1つ(「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

、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

ジャプト、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.