Напишите программу, которая представляет собой полиглот на трех языках и играет в нее ножницами .
Ввод для любой версии программы всегда является одной из строк rock
или paper
или scissors
.
На первом языке программа должна вывести выбор «камень-бумага-ножницы», который превосходит ввод:
Input Output
rock paper
paper scissors
scissors rock
На втором языке программа должна вывести выбор «камень - бумага - ножницы», который связывает ввод:
Input Output
rock rock
paper paper
scissors scissors
На третьем языке программа должна вывести выбор «камень-бумага-ножницы», который проигрывает входу:
Input Output
rock scissors
paper rock
scissors paper
Самый короткий код в байтах побеждает. Ответ Tiebreaker выше.
Входы и / или выходы могут опционально иметь завершающий символ новой строки, но в остальном должны быть только простые строки rock
/ paper
/ scissors
. Вы можете использовать верхний регистр ROCK
, PAPER
, SCISSORS
если это необходимо.
Вы не можете использовать разные версии одного и того же языка (например, Python 2 и 3).
Ответы:
Python, brainfuck и JavaScript,
10399 байт Yay до 100 байт!В Python это определяет функцию, которая превосходит ввод, в brainfuck это просто простая программа cat, а в JavaScript она проигрывает. Вот версия, которая дает функциям имя
f
, а также запрашивает ввод в JavaScript и Python 3:Попробуйте онлайн (старая версия): Python , brainfuck , JavaScript
Объяснение:
В Python
"""..."""
это многострочная строка, которую можно использовать как любой токен. В автономном режиме он вообще ничего не делает. Я использую это, чтобы «скрыть» код JavaScript от Python. То же самое относится и к(0,[.5,])
битам, это просто кортеж, содержащий a0
и список5
, а также1//1
часть//
в Python с целочисленным делением, но начинающая комментарий в JavaScript. Вот код, лишенный этих токенов:Первая строка довольно понятна, она просто определяет список, который
p
будет содержать различные варианты в «бумажных ножницах». Вторая строка определяет безымянную функцию, которая принимает один аргументx
и возвращает выбор, который бьетx
(например, предыдущий элемент вp
)В JavaScript
//
обозначает однострочный комментарий. Как и в Python, одиночные токены игнорируются, поэтому код, очищенный от этих токенов:Это работает аналогично Python, сначала устанавливая список
p
для выбора, а затем определяя анонимную функцию, которая дает проигрышный выбор.-~x
то же самое,x+1
но с более высоким приоритетом, так что я могу пропустить парены.В Brainfuck все персонажи, кроме
+-,.[]<>
, удаляются, оставляя это:Команда
,
читает один байт ввода,.
печатает его и[...]
зацикливает, пока значение не равно нулю. Затем эта программа читает входные данные и печатает их по одному символу за раз, пока символ не\0
будет найден. Поскольку в коде этого нет, мы можем игнорировать остальную часть программы. По сути, это просто отражает все, что пользователь вводит, эффективно связывая их.источник
x=>p[p.indexOf(x)+1]||"rock"//"""
может быть сокращено доx=>p[(p.indexOf(x)+1)%3]//"""
1//1,[.5,];
[]
во второй строке, чтобы сохранить больше байтов:1//1,;lambda x:p[p.index(x,0)+-1];"""
Python 2, Ruby, Retina,
9083 байта-7 байт благодаря Value Ink
Попробуйте онлайн: Python , Ruby , Retina
Побеждает в Ruby, проигрывает в Python и связывает в Retina. Это решение использует тот факт, что
0
верно в Ruby, но неверно в Python. Он также использует отрицательную индексацию как в Python, так и в Ruby.источник
and
имеет приоритет над операторомor
, поэтомуs.index(0and STDIN.gets or input())
работает. Кроме того,gets
псевдоним дляSTDIN.gets
в Ruby.V, Brain-flak и Python 2,
97, 86, 81, 77, 75 байтовДва байта сохранены благодаря @ nmjcman101!
Это было супер весело! Мне очень нравится этот ответ, потому что это крутой обзор языков, которые мне нравятся: мой любимый редактор, мой любимый неэзотерический язык и язык, который я написал. (Технически Python 3 лучше, но Python 2 лучше для гольфа
¯\_(ツ)_/¯
).Попробуйте онлайн! в Python (немного изменен, чтобы вы могли видеть результат), который печатает то, что проигрывает на входе.
Попробуйте онлайн! в Brain-Flak, который печатает, что связано с вводом.
Попробуйте онлайн! в V, который печатает то, что бьет вход.
Поскольку V опирается на непечатаемые символы ASCII, вот hexdump:
Объяснение:
питон
В питоне это очень просто. Мы определяем список из трех элементов и возвращаем элемент прямо перед входом. Так как
-1
возвращает элемент back, это работает циклически, и все это очень просто и легко. Тогда все после#
- это комментарий.Мозг-Flak
Это также чрезвычайно просто в мозговых штурмах. Если бы нам пришлось выиграть или проиграть, это было бы, вероятно, несколько сотен байтов. Но это на самом деле работает в 0 байтов. При запуске программы все входные данные загружаются в стек. В конце программы весь стек печатается неявно.
Как только мы удалим все нерелевантные символы, код мозговой зрелище увидит
Который просто оценивает
1 + -1
, но так как это значение вообще не используется, это NOOP.В
Вот где это становится немного странным. Называть список питонов
o
могло бы показаться произвольным, но это определенно не так. В Vo
открывает новую строку и переводит нас в режим вставки. Затем,вставляется в буфер. После этого соответствующий код:
Объяснение:
источник
.split()
них легче избавиться, чем от различных скобок и кавычек, которые появляются в вашем решении.xx
и заменить его на a,2
чтобы сделать команду,2f'
так как='
она будет удаленаd*
позже. РЕДАКТИРОВАТЬ: вы могли бы сделать этоt.
?CJam , Retina , PHP,
928685 байтДолжен быть запущен в PHP с использованием
-r
флага.Попробуй в CJam
Попробуйте в Retina
Попробуйте в PHP
CJam
В CJam все заглавные буквы являются предопределенными переменными. В первой строке многие из этих значений помещаются в стек вместе с некоторыми строковыми и массивными литералами. Некоторые увеличения, уменьшения и другие операции выполняются.
После всего этого стек оборачивается в array (
]
) и discarded (;
), поэтому ничего из этого не имеет значения вообще. Основная программа CJam просто:Сетчатка
Это почти похоже на обман ...
Retina заменит любое совпадение с регулярным выражением
ECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];
на входе#];"scissors paper rock"S/rci=
. То , что соответствует это регулярное выражение, это , конечно , ничего не в матчеrock
,paper
илиscissors
, так замена не производится. Немодифицированный ввод затем неявно выводится.PHP
Вторая строка - это комментарий, поэтому он игнорируется.
В первой строке используется тот же алгоритм, что и в части CJam, но с другим порядком результатов.
источник
C, C ++, Python;
227226216 байтСохраненный байт благодаря @Mat!
Определяет функцию
f
на всех языках. Побеждает в C, связывает в Python, проигрывает в C ++. Как C ++ всегда делает / sЧасть между
/*
и*/
является блоком комментариев в C и C ++, в то время как это объявление лямбда-функции в Python. Он в основном сравнивает первый символ аргумента функции и возвращает ход, начинающийся с этой буквы.Часть между
"""
s - это многострочная строка в Python, в то время как это объявление функции в C и C ++.sizeof'b'-1
выясняет, является ли текущий язык C из C ++. Он имеет истинное значение, если размер не равен 1, в противном случае - ложное значение. В C символьные литералы имеют 4-байтовый тип, а в C ++ - однобайтовый. Затем, после определения языка, он просто смотрит на первую букву ввода и выводит соответственно.С
Попробуйте онлайн!
C ++
Попробуйте онлайн!
питон
Попробуйте онлайн!
источник
C ++, R, C;
252240226220209 байтИспользует разницу между C и C ++ в том, что размер символьного литерала составляет 4 байта в C и 1 байт в C ++.
C ++:
Попробуйте онлайн!
Р:
Результат:
C:
Попробуйте онлайн!
источник
Gawk, Retina, Perl; 68 байт
(с новой строкой в конце)
Гоук (победитель)
Некоторый мусор ради Perl, затем измените содержимое строки (
$_
что совпадает с$0
тем, что переменная_
не определена) в зависимости от того, содержит онаk
или ac
, затем напечатайте результат. Проигнорируйте любое предупреждение о escape-последовательностях, я хотел сделать это.Сетчатка (галстук)
Тот же трюк, что и у Basic Sunset и других: замените совпадения некоторых глупых регулярных выражений в первой строке содержимым второй строки, поэтому пропустите ввод.
Perl (неудачник)
Прочитайте строку и преобразуйте ее в верхний регистр, затем выберите слово на основе содержащейся в нем буквы и распечатайте результат. Первый и последний шаг обернуты, используя,
eval
чтобы скрыть их от awk.Gawk, Сетчатка,
perl -p
; 57 байтЯ ввожу это в качестве бонуса, потому что переключение командной строки
perl -p
должно быть частью программы по обычным правилам на этом сайте, что сделает его не полиглотом.Снова с заключительной новой строкой для Retina . На этот раз, при
perl -p
автоматической печати вывода, накладные расходы perl значительно уменьшаются. Я могу позволить назначению$_
вызвать неявную печать в awk .источник
perl -p
пуст, это должно быть ошибка на TIO.> <>, Retina, Python 2:
144127123 байта1 байт сохранен благодаря @Loovjo, удалив пробел
4 байта сохранены благодаря @ mbomb007 с использованием
input
вместоraw_input
Размещенный в TNB как вызов , я решил опробовать эту комбинацию языков.
> <>
Попробуйте онлайн!
IP начинает двигаться вправо.
Возможные символы, которые будут приняты во входные данные
PRS
(поскольку программа принимает только первый символ). Их ASCII-значение80
,81
и82
.Если вход был рок, то это то, что произойдет:
В противном случае, если вход был
SCISSORS
илиPAPER
, это то, с чем столкнулся бы IP:Если вход был
PAPER
, то:В противном случае (если вход был
SCISSORS
):Сетчатка
Попробуйте онлайн!
В этом случае Retina рассматривает каждую пару из двух строк как пару совпадения и замены. Например, он пытается заменить что-либо, совпадающее с первой строкой, второй строкой, но, поскольку первая строка никогда не совпадает, он никогда не заменяет ее чем-либо, тем самым сохраняя входные данные.
Python 2
Попробуйте онлайн!
Программа Python требует ввода между
"
s.Первые две строки - это комментарии в Python.
источник
print
последней строки необходим.input()
вместоraw_input()
.Рубин, Clojure, Common Lisp - 251 байт
Более читаемая версия с пробелами:
Clojure всегда побеждает, Ruby всегда рисует, Common Lisp всегда проигрывает.
Для Ruby все внутри
'
s является строкой. Он охватывает две линии. Затем он использует[]
оператор со строковым аргументом, который возвращает саму строку, если она присутствует в строке. Результат распечатывается, Ruby просто отражает ввод.Вторая строка - комментарий для Clojure и Common Lisp. Связка
eval
иquote
должна использоваться, потому что Clojure должен убедиться, что все символы действительны. Было бы неплохо повторно использовать код, но дажеnth
функции имеют разные подписи на этих языках. Обычно Clojureif()
оценивается как true и переходит к первой ветви, когда вызывается хэш-карта возможных вариантов с аргументом, считанным из stdin. Common Lisp переходит ко второй ветви, он находит позицию аргумента из stdin в списке и возвращает соответствующий элемент из результирующего списка.Я думаю, что часть Common Lisp может быть в гольфе больше.
Смотрите это онлайн: Ruby , Common Lisp , Clojure
источник
Scala, Javascript и Ook, 167 байтов
Попробуй в Scala Попробуй в Javascript Попробуй версию Ook для ума
Скала - выигрывает
Javascript - проигрывает
Ук! - галстуки
Часть Ook - это простая программа
,[.,]
для кошек- мозговиков, переведенная на Ook.источник
a[(a.indexOf(s)+2)%3]
то вам не нужно устанавливатьa[-1]="rock"
. Кроме того, вы не можете поместить код Ook внутри строки JavaScript тоже?