Играя с музыкальной черепахой


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.
Кевин Круйссен,

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

Ответы:


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 - это лучшее четкое и последовательное значение, которое я когда-либо видел в этих ответах :)
Миша Лавров,

@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
@ Чарли Я думаю, что Арно болен или что-то в этом роде. Мало того, что его ответ читабелен и легок для понимания, он даже дольше, чем мой ответ на 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 байта благодаря Кевину Круйссену и Волшебной Осьминоге Урна .

Использует фигуры.
Вывод ни[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, и вам действительно разрешено сбросить последние три байта. Пока эти три выхода последовательны и различны, все в порядке, что бы это ни было.
Кевин Круйссен,

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

Согласно комментарию к исходной теме, 11-байтовый код должен быть в порядке, так как он использует 3 различных значения, с этим можно превзойти Jelly :).
Волшебная Урна Осьминога

@KevinCruijssen Спасибо! Кажется, я всегда думаю об уникальности как о «единой цифре» без всякой причины :)
Emigna

4

JavaScript (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.

Сохранено 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 - я почему-то думал, что все кнопки будут отличаться> _ <

Разработанный независимо от того, что я только что видел (и теперь за него проголосовали) Мертвым Опоссумом

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

Попробуйте онлайн!


Я думаю, что вам нужно разделить строки символов. Это возвращает 0 (против часовой стрелки) для «RBR», которого нет в вашем списке комбинаций.
Рик Хичкок,

@RickHitchcock, ах, я принял 3 разных нажатия, что, безусловно, неправильно. Это сделает его практически таким же, как у Мертвого Опоссума!
Джонатан Аллан

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

Да, это может быть неоднозначно, но один из тестовых случаев («ООО») показывает, что они могут повториться.
Рик Хичкок,

@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




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

Рубин , 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.