var QUESTION_ID=106496,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/106496/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
RockPaper
.Ответы:
Groovy,
675650 байтПопробуйте онлайн!
Оказывается, игра «камень, бумага, ножницы» имеет довольно крутое свойство.
Учитывая строки a и b, берут первую букву каждой, это приводит к двум из следующего:
R,P,S
Исчерпывающий список возможных значений (при комбинировании двух вариантов):
Реорганизация списка в:
Дает нам последовательность, которая выглядит обратно синусоидальной, и вы на самом деле можете представить эту формулу примерно как (и, приблизительно, я имею в виду едва ли достаточно, чтобы работать, вы могли бы получить уравнение, которое не работает, но стоит больше байтов):
Упрощение с 4 / pi до 1,3 было сначала предложено @flawr, а затем протестировано @titus для общей экономии 6 байт.
Используя свойства двойного скругления groovy, это приводит к правильному выводу для ножниц для рок-бумаги.
05AB1E , 10 байтов (не конкурируют)
Попробуйте онлайн!
Тот же ответ перенесен на 05AB1E с использованием новых команд, добавленных 26.10.2017.
источник
-sin(x) = sin(-x)
это означает, что только изменение порядкаa
иb
и опуская ведущий-
? Кроме этого, приближение жесткого кодирования из4/Pi
Like1.273
может быть достаточным, или ,1.3
или ,9/7
или5/4
.sin(b-a)
вместо-sin(a-b)
. Отличная находка!1.3
вместо4/Math.PI
; это достаточно точно.XX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
C,
5035 байтВызовите
f
со строкой, содержащей обоих игроков, без разделителя, и он вернет, победит ли первый.Объяснение:
Глядя на девять возможных строк, получается, что пары букв в столбцах 7 и 8 уникальны:
Смещение и дикое приведение, чтобы
short*
получить эти пары букв и интерпретировать их как числа:Тогда это был вопрос грубой силы, чтобы найти
51
и4
остатки, которые применялись последовательно, чтобы уменьшить эти числа до:Который просто идеален, чтобы закрепить еще один остаток в конце и компенсировать результат.
Смотрите это в прямом эфире на Колиру
источник
-f(i)
для подсчета очков другого игрока - результат будет неожиданным!-(f(i))
должно работать нормально. Макросы это весело!MATLAB / Octave ,
63 5452 байтаОчень удобно, что ASCII-коды первых букв
Rock,Paper,Scissors
являютсяR=82,P=80,S=83
. Если мы вычтем,79
мы получим удобно3,1,4
, что мы теперь будем использовать как матричные индексы: Здесь матрица 4x4 жестко закодирована, гдеi,j
-ая запись соответствует результату, если вы вставляете значения из только что:Попробуйте онлайн!
источник
Чистый Баш, 31
Заимствование по формуле Денниса :
Попробуйте онлайн .
Предыдущий ответ:
Чистый Баш,
43354
,5
,8
соответственно , для Rock, Paper, Scissors)Исключающий каждый с 3 , чтобы дать
7
,6
,11
(который при приеме мод 3 дают1
,0
,2
)Затем вычтите и возитесь с модом 3, чтобы получить желаемый результат.
Попробуйте онлайн .
источник
Python ,
4030 байтПопробуйте онлайн!
Фон
Я начал с шаблона функции
и выполнил поиск подходящих параметров методом грубой силы, используя следующую программу, затем выбрал программу с минимальной длиной реализации.
Попробуйте онлайн!
источник
Mathematica, 32 байта
Безымянная функция принимает упорядоченную пару списков символов, например
{{"R","o","c","k"},{"P","a","p","e","r"}}
, и возвращает-1|0|1
.Я хотел, чтобы код избегал не только трех входных слов, но и слишком длинного имени функции
ToCharacterCode
; поэтому4,5,8
вместо этого я работал с длиной входных слов и искал короткую функцию из тех длин, которые давали четкие ответы по модулю 3. (Целочисленное деление на 2 математически многообещающе, но эти функции имеют слишком длинные имена в Mathematica.)Оказывается, что взятие факториала (длина - 3) дает ответы
1,2,120
, которые являются1,-1,0
по модулю 3. Затем мы просто вычисляем, по модулю 3, разницу двух значений (через скалярное произведение{1,-1}.{x,y} = x-y
, что является хорошим способом, когда два значения находятся в списке).источник
Рубин,
363530 байтПопробуйте это на ideone.com
Тестовый вывод:
Используется тот факт, что 7 из 9 правильных результатов получены путем лексикографического сравнения с использованием оператора космического корабля
<=>
.(a+b)[12]
Просто переворачивает входные данные для сравнения , если входыPaper
иScissors
(а такжеScissors
Scissors
- но это0
либо наоборот).Спасибо Хорвату Давиду за то, что он спас мне персонажа, и благодаря Великобритании за то, что он спас мне еще 5.
источник
Python ,
39363433 байтаПопробуйте онлайн!
Как это устроено
Давайте рассмотрим несколько значений длины шести копий x и одной копии y по модулю 7 .
Мы можем кодировать результаты ( {-1, 0, 1} ), отображая их в набор {0, 1, 2, 3} . Например, отображение t - 2 - t достигает этого и является его собственным обратным.
Обозначим результат x и y через o (x, y) . Затем:
К счастью, все биты в последних столбцах согласуются друг с другом, поэтому мы можем ИЛИ использовать их, чтобы сформировать одно целое число n и получить o (x, y) как 2 - ((n ≫ o (x, y))% 4) , Значение n составляет 94 .
источник
Retina ,
3531 байтПопробуйте онлайн!
объяснение
Это работает в два этапа. Сначала мы печатаем знаки минуса для соответствующих входных данных. Затем мы печатаем
0
для связи, а для1
других.Это два этапа. На
)
втором этапе они группируются вместе, что*
делает их пробным прогоном (что означает, что входная строка будет восстановлена после того, как они были обработаны, но результат будет напечатан) и\
подавляет печать завершающего перевода строки. Две стадии вместе напечатают,-
если применимо.Первый этап является
G
этапом Rep , который только держит линию , если она содержит либоk P
,r S
илиs R
. Они соответствуют случаям, когда нам нужно выводить-1
. Если это не один из этих случаев, ввод будет заменен пустой строкой.Второй этап заменяет
.+
(всю строку, но только если она содержит хотя бы один символ) с-
. Так что это печатает-
для этих трех случаев и ничего другого.Это еще два этапа. Первый этап - это
D
обучение. Он сопоставляет слова и удаляет дубликаты. Таким образом, если и только если ввод является связующим, это отбрасывает второе слово.Второй этап подсчитывает количество совпадений
.
, которое представляет собой пробел, за которым следует любой символ. Если вход был привязан, а второе слово было удалено, это приводит к0
. В противном случае второе слово остается на месте, и есть одно совпадение, поэтому оно печатается1
вместо.источник
05AB1E ,
181715109 байт6 байтов, сохраненных с помощью трюка с длиной входного сигнала Digital Trauma
Принимает вход как
[SecondPlayersChoice,FirstPlayersChoice]
Попробуйте онлайн! или проверить все тесты
Альтернативное 9-байтовое решение:
íø¬ÇÆ>3%<
объяснение
Предыдущее 15-байтовое решение
Попробуйте онлайн! или проверить все тесты
объяснение
источник
Ç¥13T/*.½ò
ПОЧЕМУ ЭТО РАБОТАЕТ? НИКТО НЕ ЗНАЕТ.['R','P']
: P Это порт этого.Желе , 8 байт
Попробуйте онлайн! (набор тестов, приведен к целому числу для ясности)
Как это устроено
источник
Python 2 ,
4640 байтПопробуйте онлайн!
Огромное спасибо @Dennis за предоставленную мне возможность заимствовать его тестовый код Try it и за то, что он сэкономил мне 6 байтов
редактировать
@ hashcode55 - Как вы и описали. (x! = y, -1) - двухэлементная последовательность, и [x [0] + y [0] в 'RPSR'] вычисляет, какой элемент взять. Если первая буква x + первая буква y находится в списке символов, она будет иметь значение True или 1, поэтому будет возвращено (x! = Y, -1) [1]. Если это не так (x! = Y, -1) [0]. Это где это становится немного сложнее. Первый элемент сам по себе является фактически другим, если. Если x! = Y, то первый элемент будет True, в противном случае он будет False, поэтому, если x [0] + y [0] в 'RPSR' - false, то будет возвращено либо True, либо False, в зависимости от того, будет ли x == y. + Немного подлый и еще раз спасибо @Dennis за это. X! = Y вернет буквальное значение True или False. Нам нужно 1 или 0. Я до сих пор не знаю, как, но + делает это преобразование. Я могу только предположить, что с помощью математического оператора True / False он заставляет его рассматриваться как целочисленный эквивалент. Очевидно, что + перед -1 все равно вернет -1.
Надеюсь это поможет!
источник
(x!=y,-1)
это работает как если, если список генерирует истину, то -1 в противном случаеx!=y
. Какая польза от этого+
знака? Источник, документирующий этот вид синтаксиса, был бы очень полезен!+
в данном случае, это унарный плюс, например+10
, и, по сути, это короткий способ преобразования в целое число.JavaScript (ES6),
4638 байтИспользует тот факт, что Rock-Paper-Scissors является циклическим. В JavaScript нет ни космического корабля, ни сбалансированных троичных операторов, в противном случае ответ будет
(a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3
.Изменить: Сохранено 8 байт благодаря @WashingtonGuedes.
источник
MATL ,
1413 байтПопробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Если код ASCII начальной буквы первой строки вычитается из кода второй строки, мы получаем значение в столбце D ниже. Принимая по модулю 5 дает значение М . Конечное значение в скобках желаемый результат, R .
Таким образом, если мы вычисляем D и затем M , чтобы получить R, нам нужно только отобразить 0 в 0; 1 и 2 к 1; 3 и 4 до -1. Это можно сделать путем индексации в массиве из пяти записей, равных 0, 1 или -1. Поскольку индексирование в MATL основано на 1 и является модульным, массив должен быть таким
[1, 1, −1, −1, 0]
(первая запись имеет индекс 1, последняя имеет индекс 5 или эквивалентно 0). Наконец, к счастью, операции по модулю 5 можно избежать, поскольку она неявно выполняется модульной индексацией.источник
CJam , 12 байт
Два входа разделены пробелом. Их порядок обратен по отношению к этому в тексте вызова.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Перевод моего ответа MATL . Это использует тот факт, что в CJam
c
(преобразовать в символ) применяется к строке принимает свой первый символ. Кроме того, массив для отображения отличается, потому что индексирование в CJam основано на 0.источник
CJam,
151412 байтВозьмите код ascii последнего символа каждой строки, затем вернитесь:
(a1 - a2 + 19) % 3 - 1
Проверьте это здесь !
источник
Python 3, 54 байта
Попробуйте онлайн!
источник
Java 7, 82 байта
Ungolfed:
Объяснение:
o
,a
иc
, с десятичными знаками ASCII111
,97
и99
.0
(Рок, Рок)14
(Рок, Бумага)12
(Бумага, ножницы)-14
(Бумага, камень)0
(Бумага, бумага)-2
(Бумага, ножницы)-2
(Ножницы, Камень)2
(Ножницы, бумага)0
(Ножницы, Ножницы)4
,2
,-4
,-2
,-2
,2
.x
Теперь делим на 2 следующее для тестовых случаев:2
и-2
неправильны, и должны были быть-1
и1
вместо. Так что, еслиx%2 != x
(все выше1
или ниже-1
) мы разделим,-2
чтобы исправить эти два «крайних случая».Тестовый код:
Попробуй это здесь.
Выход:
источник
c
,p
,i
) со значениями ASCII99
,112
и105
, как казалось , наиболее полезными, и заметил , что это стало бы 4, 2, 0 , если я сделал по модулю 5. Только тогда я понял , я должен был вычесть как, так 4, 2 и 0 были не очень полезны. После некоторых недоразумений / проб и ошибок я попробовал второе письмо и получил более полезные результаты с тем же модулем 5, который все еще присутствует. Тогда я быстро пришел к решению, которое я представил выше. :)18 лет
Попробуйте онлайн .
Обратите внимание, что два аргумента передаются (через пробел) в одну строку в STDIN. Аргументы заключены в квадратные скобки, так
[ ]
как этоdc
нравится его строки.dc
имеет очень ограниченную обработку строк, но оказывается, что вы можете использовать одну изZ
команд, чтобы получить длину строки, которая, к счастью, отличается для "Rock", "Paper" и "Scissors" и может быть довольно просто арифметически манипулировать, чтобы дать желаемый результат.источник
PHP, 34 байта
источник
Pyth, 16
Вероятно, может быть короче.
Интернет .
источник
C #,
8584 байтаСохранено 1 байт, благодаря TheLethalCoder
Он принимает две строки в качестве входных данных и выводит целое число. Существует связь, если две строки равны, в противном случае он проверяет первый символ строк, чтобы определить, какой игрок выигрывает.
источник
a=>b=>...
JavaScript,
37,32, 31 байтЕсли a равно b, выведите ноль.
В противном случае, xor результат проверки, если длина не больше 12 (сравнение ножниц и бумаги) со сравнением больше, чем b.
Если это возвращает 1, верните его.
Если он возвращает 0, используйте оператор OR для замены на -1.
источник
a=>b=>
с карри для сохранения байта?Пакетный, 116 байт
источник
Perl, 33 байта
32 байта кода +
-p
флаг.Чтобы запустить это:
Сохранено 3 байта с использованием регулярного выражения ответа Retina Мартина Эндера . (мое предыдущее регулярное выражение было
/R.*P|P.*S|S.*R/
)Объяснение:
Во-первых,
/(.+) \1/
проверяется, содержит ли вход дважды одно и то же слово, и если да, результат равен0
. В противном случае/k P|r S|s R/
имеет дело со случаем, когда ответ-1
. Если это последнее регулярное выражение ложно, то-/k P|r S|s R/
ложно, поэтому мы возвращаемся1
.источник
Желе , 9 байт
При этом используется алгоритм из ответа Bash @ DigitalTrauma .
Попробуйте онлайн!
Как это устроено
источник
Japt , 19 байт
Попробуй это здесь!
Вдохновленный решением carusocomputing
Старое 53-байтовое решение
Попробуйте онлайн!
Еще раз спасибо, ETHproductions!
источник
©
вместо&&
, меняяUg0 c
кUg c
( то же самое сV
) и заменить-1
сJ
. Это все еще немного дольше, чем ответ JS, хотя, возможно, вы можете взять некоторые идеи из этого©
W=Uc
. Я не знаю, почему я постоянно забываю, чтоc
работает на любой строке: PPHP,
5553 байтасинусоидальная версия,
4946 байтгольф-порт Карусокомпьютинг ответит :
3 байта сохранены пользователем @ user59178
источник
round(x)
на2*x^0
Perl, 25 байт
Код 24 байта +1 байт для
-p
варианта.Ввод должен быть в stdin без разделителей, например:
Первое регулярное выражение ищет первую победу игрока, второе - его поражение. Разница напечатана.
источник
Scala, 148 байт
К счастью, поскольку для разделения нескольких команд на одной строке требуются точки с запятой, Scala выигрывает от наличия форматируемого гольф-кода!
В этой попытке в гольф я узнал, что вы можете заменить
с участием
потому что Scala позволяет вам рассматривать строки как массивы с целью получения символов.
источник