Есть несколько вопросов, касающихся этой игры , даже соревнование « Король горы » здесь . Но я думаю, что все эти испытания и конкурсы нуждаются в способе автоматического определения победителя в игре. Так:
Вызов
Учитывая два входа в диапазоне, ["rock", "paper", "scissors", "lizard", "spock"]
представляющем выборы для игрока 1 и игрока 2, определите победителя матча.
правила
[Winner] [action] [loser]
-----------------------------
scissors cut paper
paper covers rock
rock crushes lizard
lizard poisons spock
spock smashes scissors
scissors decapitates lizard
lizard eats paper
paper disproves spock
spock vaporizes rock
rock crushes scissors
ограничения
- На входе будет пара строк в заданном диапазоне (никакие другие строки не могут быть использованы). Вы можете использовать массивы символов, если хотите, если они представляют любое из упомянутых значений.
- Вы можете выбрать, использовать строчные, прописные (
"ROCK"
) или верблюжьи ( ) регистры"Rock"
для входных строк, если выбранный регистр одинаков для всех входных данных. - Результатом будет трио значений, определяющих победителя, которое может быть любым, если ответы последовательны. Пример:
1
если первый вход выигрывает,2
если второй вход выигрывает,0
если есть ничья. Или, может быть,A
если первый вход выигрывает,B
если второй вход выигрывает,<empty string>
если есть ничья.
Цель
Это код-гольф , поэтому может быть самая короткая программа / метод / функция / лямбда для каждого языка!
тесты
[Input 1] [Input 2] [Output: 1/2/0]
-----------------------------------
rock paper 2
rock scissors 1
lizard spock 1
spock rock 1
spock paper 2
rock rock 0
cake
хитростью).Ответы:
Python 3 ,
685048 байтовРЕДАКТИРОВАТЬ: Благодаря 3 трюков от Нила и 2 от мистера Xcoder
Каждая входная строка имеет четкий четвёртый символ, поэтому я использую это, чтобы различать их. Если вы расположите элементы в цикле (ножницы, бумага, камень, ящерица, спок), то каждый элемент будет бить элемент сразу после него, и элемент 3 будет циклически располагаться вправо. Таким образом, мы вычитаем позиции входов в цикле. Если это число 0, это ничья. Если это 1 или 3, это победа для первого игрока. В моем первоначальном решении разность циклов указала бы в строке «210100», чтобы отличить результаты игры. Нейл как-то понял, что это можно сделать без индексации, добавив 7 и взяв модуль на 3. Редактировать: Первоначально я использовал второй символ, чтобы идентифицировать строку, но если вы используете четвертый и перевернете цикл, вы получите торт. И мы все могли бы использовать больше торта.
Попробуйте онлайн!
Старая версия:
Попробуйте онлайн!
Оригинальная версия:
Попробуйте онлайн!
источник
.index
на.find
)p
,"chaoi"
достаточно)JavaScript (ES6), 56 байт
Принимает ввод в синтаксисе карри
(a)(b)
. Возвращает,0
если победит,1
если побеждает B илиfalse
за ничью.демонстрация
Показать фрагмент кода
Как?
Определим хеш-функцию H () как:
Это дает:
Учитывая два входа a и b , рассмотрим следующие утверждения:
Из (1) и (2) мы определяем, должен ли результат a> b быть инвертирован для получения правильного победителя, и сохраняем этот флаг в N-м бите маски поиска.
Отсюда и биты:
Считая это снизу вверх и игнорируя ведущие нули, мы получим 1001100110 , или 614 в десятичном виде.
источник
05AB1E , 16 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
Использует очень хороший
cake
трюк от пользователя 507295источник
Рубин , 36 байт
Возвращает,
0
если 1-й игрок выигрывает,1
если 2-й игрок выигрывает, и2
для ничьей.Основано на ответе пользователя 507295, но использует математическую формулу для выполнения хэша.
a.sum
является суммой всех ASCII-кодов строкиa
mod1<<16
и предназначена для элементарной контрольной суммы. Хеш был найден с использованием следующего кода:Это дало два значения,
j
которые дали подходящий хэш для строчных букв, а именно 88 и 80, оба из которых дали нисходящую последовательность[3,2,1,0,4]
(или[4,3,2,1,0]
если спок циклически округлен до начала).Как объяснено в других ответах, хеш, который дает постоянную разницу по модулю 5 для последовательных элементов в приведенной выше последовательности, необходим для
(h[a]-h[b])%5
работы формулы . Каждый элемент бьет элемент 1 или 3 места справа и проигрывает элементу 2 или 4 места справа.Попробуйте онлайн!
источник
JavaScript (ES6),
63545349 байтПорт моего гольфа на ответ @ WhatToDo. Примечание: фрагмент декодирует числовой результат во что-то чуть менее нечитаемое. Редактировать: 1 байт сохранен благодаря @Arnauld. Сохранено 4 байта благодаря @ovs.
источник
C, 53 байта
Я рассматривал эту проблему как конечный автомат, 25 состояний которого определены двумя, пятью входами состояний.
Определяя результаты состояний в массиве битов. Я просматриваю результаты с помощью уникальных маркеров на входах.
Как отмечено в других решениях, символы 2, 3 и 4 являются уникальными среди возможных входных данных. Я сконцентрировал использование символов 2 и 3, которые я использую, чтобы выбрать соответствующий бит в моем массиве ответов.
Внутри символа 2 биты с 1 по 4 четко идентифицируют вход. Маскируя эти биты и соответствующим образом сдвигая [это «* y & 47 >> 1»], вход можно отметить как 0, 1, 4, 7 или 8. Следовательно, моя строка ответа имеет 9 символов. (отдельные интересные биты)
Внутри символа 3 биты 0, 1 и 2 четко идентифицируют вход. Маскируя эти биты (сдвиг не требуется) [это «* x & 7»], вход можно отметить как 0, 1, 2, 3 или 7. (отдельные интересные биты)
Строка ответа может быть рассчитана путем простого заполнения битов для соответствующих символов.
Итак, установите бит в char, где Y выигрывает
Тогда логика проста: если второй символ такой же, то нарисуйте, в противном случае получите символ ascii на основе второго символа y, сдвиньте биты на третий символ x и добавьте один. Это дает ответы 0 для ничьей, 1 для выигрыша х и 2 для выигрыша у.
источник
Clojure,
130118 байтов-12 байт, избавившись от моего странного использования
comp
.Я думал, что я был умен, но это оказалось наивным по сравнению с некоторыми другими ответами, и многое дольше.
Принимает первые 2 буквы каждой строки перемещения, получает коды символов и суммирует их. Затем вычитает суммы, чтобы получить
d
. Еслиd
равно 0, это ничья (0), если он входит в набор#{5 -16 12 -14 13 1 4 -18 2 11}
, p1 выигрывает (1), иначе p2 выигрывает (2).Чтобы получить «магические числа», которые определяют, выигрывает ли P1, я побежал
Который генерирует список
d
значений для каждого возможного сценария:Затем я сравнил график выигрышей с этим результатом. К счастью, не было никаких «столкновений», кроме 0.
источник