Граючи з музичною черепахою


20

Мої двоє дітей люблять грати з такою іграшкою:

Черепаха

Кольорові ділянки з фігурами всередині можна торкатися, а черепаха тоді освітлює область і відтворює звук або вимовляє назву кольору чи форми всередині. Середня кнопка змінює режим. Існує один режим, коли ділянки відтворюють різні музичні ноти при дотику, з поворотом: якщо дитина торкається трьох послідовних областей за годинниковою стрілкою, відтворюється спеціальна мелодія 1. Якщо три області поспіль, що торкаються, розміщені проти годинникової стрілки, відтворюється спеціальна мелодія 2.

Змагання

Давайте змоделюємо внутрішню логіку іграшки. Давши рядок з 3 натисканнями малюка, поверніть два чіткі цілісні значення, якщо три натискання є для послідовних областей (за годинниковою або проти годинникової стрілки) і третього різного значення, якщо їх немає.

Деталі

  • Області введення будуть названі символом кожного, який може бути їх кольором: ROYGBдля червоного, оранжевого, жовтого, зеленого та синього; або їх форма: HSRTCдля серця, квадрата, зірки ( R), трикутника та кола. Корпус не має значення, ви можете вибрати роботу з введенням і виведенням лише великими або малими літерами.
  • Програма отримає рядок (або масив char або щось еквівалентне) з трьома натисканнями. Приклади ( з використанням кольору): 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.
Кевін Кройсейсен

1
@KevinCruijssen звичайно можна. Вихідні значення можуть бути будь-якими, якщо вони чіткі та послідовні.
Чарлі

Відповіді:


12

Java 8, 48 39 33 байт

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

-6 байт завдяки @RickHitchcock , тому обов'язково підтримайте його також !

Колір верхнього регістру приймає як рядок 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), але я вибираю, /7тому що це індекс простору в рядку. :)
Кевін Кройсейсен

1
@RickHitchcock Дякую! Я думав, що я спробував кілька побітних операцій, але, мабуть, недостатньо правильно ..
Кевін Круїйсен

6

JavaScript (ES6), 41 байт

Бере кольорові ініціали як вхідні. Повертається 2для жодної, trueза годинниковою або falseпроти годинникової стрілки.

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

Спробуйте в Інтернеті!


3
Принаймні відповідь від Арнаульда я можу зрозуміти !! :)
Чарлі

3
@Charlie Я думаю Arnauld хворий або що - то .. Не тільки його відповідь читаним і легко зрозуміти, що це навіть більше , ніж мій Java відповідь! o.Ô Щось тут явно не так. ; p
Кевін Круїссен

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

1
Ти навіть ройг, брате?
Квентін

6

Python 2 , 36 байт

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

-1- Ні
0- За годинниковою стрілкою
1- проти годинникової стрілки

Спробуйте в Інтернеті!


Гей, чудові розуми (чи що-небудь) ... codegolf.stackexchange.com/a/174635/53748 (якби я бачив це, перш ніж спробувати речі, я б просто дав вам зберегти байт: p)
Джонатан Аллан

@JonathanAllan Не хвилюйтесь, речі трапляються: D Я підтримав вашу відповідь, тому що я не можу це не любити!
Мертвий Поссум

5

Excel, 29 байт

=FIND(A1,"ROYGBRO_RBGYORB")<6

Великі кольори як вхідні.

Повертається #VALUE!без малюнка, TRUEза годинниковою стрілкою, FALSEпроти годинникової стрілки.

Можна обернути IFERROR( ,0)для того +11 bytesщоб відрегулювати виключення і повернення «0» для не-шаблону випадків замість цього.


5

05AB1E , 15 11 байт

Збережено 4 байти завдяки Kevin Cruijssen та Magic Octopus Urn .

Використовує форми.
Вихід [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 робить те саме. Попросить ОП для підтвердження.
Кевін Кройсейсен

Щойно запитали ОП, і вам справді дозволено скинути останні три байти. Поки три виходи є послідовними та чіткими, все добре, що б це не було.
Кевін Кройсейсен

2
‚.•ÌöJη•så- це 11 байт, якщо [1,0], [0,1] and [0,0]вони вважаються унікальними (якщо я тут не пропускаю чогось очевидного, додаючи ƶOдо кінця, що 11-байт - це ще 13 для тих самих відповідей 0, 1, 2). Тестові справи . Тестові справи 2 . Скасування замовлення усуває потребу в циклі.
Чарівна восьминога урна

Відповідно до коментаря до оригінальної нитки, 11-байт повинен бути добре, оскільки він використовує 3 різних значення, ви можете перемогти Jelly з цим :).
Magic Octopus Urn

@KevinCruijssen Дякую! Мені здається, що я вважаю унікальним "однозначний" без жодної причини :)
Emigna

4

JavaScript (ES6), 32 байти

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

Повертає -1, якщо немає комбінації, 15 якщо проти годинникової стрілки, 7 якщо за годинниковою стрілкою.


4

Мова Вольфрама (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 у двійковій? Ви не можете просто взяти ці самі байти в іншому контексті і очікувати, що вони будуть працювати однаково.
Роберт Фрейзер

Є чисті заміни машинного коду, які не покладаються на стандартну бібліотеку strchr.com/strcmp_and_strlen_using_sse_4.2
Роберт Фрейзер

@RobertFraser Розміщення функції вирішено під час посилання, кількість байтів завжди буде однаковою, оскільки адреса функції strstrзавжди буде 32-бітовою (4-байтною) адресою. Машинний код у моєму пості від’єднано.
Логерн

1
Я здогадуюсь, що це якась сіра зона. Функція покладається на дані в об’єктному файлі (карта посилання), перш ніж їх можна буде використовувати. Але ви можете стверджувати, що це не що інше, ніж Java-лямбда, яка потребує декларації типу.
Роберт Фрейзер

Зауважте, щоб повністю відповідати 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

3

Python 2 ,  35  36 байт

+1 - я чомусь думав, що всі кнопки будуть виразними> _ <

Розроблений незалежно від того, що я щойно бачив (і зараз його проголосували) Dead Possum

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

Спробуйте в Інтернеті!


Я думаю, вам потрібно відокремити рядки символів. Це повертає 0 (проти годинникової стрілки) для "RBR", що не знаходиться у вашому списку комбінацій.
Рік Хічкок

@ RickHitchcock ах я взяв на себе 3 різних преси, що, безумовно, неправильно. Це дозволить зробити це ефективно таким же, як і Dead Possum!
Джонатан Аллан

Неможливо видалити з мобільного ... видалить або адресуватиме пізніше
Джонатан Аллан

Так, це може бути неоднозначно, але один із тестових випадків ("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

Досягає максимального обсягу повторного використання функції.


2

Желе , 12 байт

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

Спробуйте в Інтернеті!

-4 завдяки Джонатану Аллану .

За годинниковою стрілкою: [1, 0]
проти годинникової стрілки: [0, 1]
інше:[0, 0]


@JonathanAllan Phew, спасибі Щойно побачив знову, що я зробив, ти був лише на 15 годин швидше. : P
Ерік Аутгольфер

1

R , 38 байт

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

Спробуйте в Інтернеті!

Повернення:

  • Немає спеціальної комбінації: integer(0)
  • Мелодія проти годинникової стрілки спрацьовує: 2
  • Мелодія за годинниковою стрілкою спрацьовує: 1




0

Japt, 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}

Спробуйте в Інтернеті!

Введення: трицифрове ціле число, де цифри представляють кольори:

  • 1 - червоний
  • 2 - помаранчевий
  • 3 - жовтий
  • 4 - зелений
  • 5 - синій

Вихід: 0 за годинниковою стрілкою, 1 проти годинникової стрілки, nilінакше.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.