В игре Yahtzee игроки бросают пять шестигранных кубиков и пытаются создать определенные руки, чтобы набрать очки. Одной из таких рук является небольшая стрит : четыре последовательных числа, не обязательно по порядку. Три возможные небольшие стрит 1, 2, 3, 4
, 2, 3, 4, 5
и 3, 4, 5, 6
.
Например, [3, 5, 6, 1, 4]
содержит небольшой прямой [3, 4, 5, 6]
.
вход
Несортированный список из пяти целых чисел, каждое от 1 до 6 включительно, представляющих руку Яхтзе.
Выход
Истинное значение, если рука содержит маленькую стрит, а в противном случае - ложное значение.
Контрольные примеры
Truthy:
[[1, 2, 3, 3, 4], [1, 2, 3, 4, 5], [3, 5, 6, 1, 4], [1, 5, 3, 4, 6], [4, 5, 2, 3, 5], [1, 4, 3, 2, 2], [5, 4, 3, 6, 3], [5, 3, 5, 4, 6], [2, 4, 5, 1, 3], [3, 6, 4, 5, 3], [5, 6, 4, 3, 5], [4, 5, 3, 6, 3], [4, 5, 5, 3, 2], [4, 5, 2, 3, 5], [4, 6, 5, 3, 6], [4, 2, 3, 1, 5], [3, 6, 4, 6, 5], [5, 2, 1, 3, 4], [4, 4, 1, 2, 3], [4, 1, 4, 2, 3], [5, 1, 4, 3, 6], [5, 2, 2, 3, 4], [4, 4, 6, 5, 3], [2, 4, 3, 5, 1], [5, 4, 2, 5, 3], [2, 3, 5, 5, 4], [1, 6, 3, 4, 5], [4, 5, 3, 3, 6], [6, 4, 3, 6, 5], [4, 6, 6, 5, 3], [4, 3, 5, 2, 2], [2, 3, 2, 1, 4], [4, 2, 6, 1, 3], [4, 4, 5, 3, 6], [4, 5, 6, 3, 6]]
Falsy:
[[1, 2, 3, 5, 6], [5, 1, 1, 6, 6], [4, 6, 4, 1, 1], [6, 4, 1, 6, 4], [4, 6, 3, 6, 6], [2, 1, 4, 6, 4], [2, 6, 1, 5, 6], [2, 6, 1, 5, 6], [3, 6, 5, 3, 2], [3, 2, 3, 5, 3], [5, 5, 6, 2, 3], [3, 4, 6, 4, 3], [1, 4, 5, 5, 1], [1, 4, 4, 4, 1], [1, 6, 5, 1, 4], [6, 6, 4, 5, 4], [5, 3, 3, 3, 2], [5, 2, 1, 5, 3], [3, 5, 1, 6, 2], [6, 4, 2, 1, 2], [1, 3, 1, 3, 2], [3, 1, 3, 4, 3], [4, 3, 1, 6, 3], [4, 6, 3, 3, 6], [3, 6, 3, 6, 4], [1, 1, 3, 1, 3], [5, 5, 1, 3, 2], [3, 4, 2, 6, 6], [5, 4, 2, 6, 1], [2, 4, 4, 5, 4], [3, 6, 2, 5, 5], [2, 5, 3, 5, 1], [3, 2, 2, 3, 4], [5, 2, 2, 6, 2], [5, 6, 2, 5, 6]]
Вдохновленный этим
Каталог
var QUESTION_ID=74997;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=30525;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"http://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#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="language-list"> <h2>Shortest Solution 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> <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> <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>
code-golf
number
array-manipulation
game
decision-problem
lirtosiast
источник
источник
[1,2,3,3,4]
. Многие ответы умирают из-за этого.Ответы:
MATL ,
71211986 байтБольшое спасибо @lirtosiast за удаление 2 байтов
Истина - это массив ненулевых значений. Falsy - пустой массив (без вывода данных).
Начиная с версии 16.2.0,
u
стабильно по умолчанию. Таким образом,S
для сортировки вывода требуется дополнительный код :uSd7BXf
( 7 байт ). Ссылка включает в себя эту модификацию.Попробуйте онлайн!
источник
Python, 44 байта
Вернуться через 9 месяцев с улучшением. Нам не нужно проверять, есть ли
i
в наборе идея Згарба о проверке только начальных значений в наборе. Теперь мы можем также использовать<
для строгих подмножеств, потому чтоi
также должны быть включены.47 байт:
Проверяет, есть ли броски кубика, это начало небольшого стрита. Спасибо Zgarb за идею проверки только начальных значений в списке, экономя 5 байтов.
Python 3.5 имеет более короткий набор преобразований, на 45 байт
Это та же длина сделать
{*range(i,i+4)}
так{i,i+1,i+2,i+3}
.источник
Лабиринт, 41 байт
Совместный ответ с @ MartinBüttner. Я думаю, что мы сжали это далеко за пределы моих первоначальных ожиданий.
Выход
1
для правдивых, пустой для ложных. Попробуйте онлайн!Быстрое объяснение
Преобразование каждого числа
n
в двоичное целое число 1 с последующимиn+1
нулями, то есть2^(n+1)
. Побитовое ИЛИ результаты и проверьте1111
(в двоичном виде). Возведение в степень должно быть осуществлено вручную в Лабиринте.Детальное объяснение
Обычный праймер:
n
выталкивают и толкаютn*10 + <digit>
. Чтобы начать новый номер,_
толкает ноль.Настроить
Выполнение начинается в верхнем левом углу, указатель инструкции направлен вправо. Мы выполняем:
Помимо эффективного нажатия на нули, эти инструкции не меняют стек.
Левый цикл: возведение в степень и побитовое ИЛИ
Лабиринт не имеет возведения в степень, поэтому нам нужно реализовать его вручную. Сначала мы читаем целое число с
?
, и, поскольку это гарантированно будет положительным, мы поворачиваем направо._1
нажимаем 1 и мы входим во внутренний цикл.Внутренний цикл делает следующее:
Поскольку это цикл do-while, для ввода
n
рассчитывается2^(n+1)
. Мы заканчиваем30
нулевым вводом в стеке и превращаем этот ноль в 30. Затем мы выполняем те же инструкции из установки, но на этот раз они действительно полезны.Этот цикл продолжается для каждого числа на входе до EOF, когда
?
возвращается 0. Это заставляет нас двигаться вперед, а не поворачиваться, приводя к ...Мост: некоторые дополнительные настройки
После
30
того, как?
превращает 0 из EOF в 30, который вставляется во вспомогательный стек через}
. Важным является тот факт, что мы помещали 30 во вспомогательный стек для каждого входного числа, поэтому теперь вспомогательный стек содержит5 + 1 = 6
копии числа 30 .Между тем, основной стек содержит побитовое ИЛИ
2^(n+1)
для каждого входаn
. Давайте назовем это побитовым ИЛИb
, так как оно модифицируется в правильном цикле.Правый цикл: проверить результат и вывод
Вот что происходит в правой части цикла:
Теперь завершение немного сложнее с этой программой. Вот возможные пути завершения программы:
После 3 итераций правого цикла, и
b
все еще положительно: Помните, как мы поместили шесть 30-х во вспомогательный стек? Поскольку мы используем два из них в каждой итерации, на четвертой итерации мы начинаем вытягивать нули из нижней части вспомогательного стека. Это вызывает деление на ноль, когда мы делаем{/
, и программа завершается.После вывода 1 для небольшого стрита : Итак, мы выполнили,
!
затем повернули направо на"
перекрестке без операции . Затем нас ждут американские горки, и мы снова начинаем ползать по всей левой половине:После нескольких поездок в экспоненте, стек выглядит примерно так
[12 | 30 30]
, который выдает ошибку делением на ноль после двух других итераций в правом цикле.:
в правом цикле находится на стыке. Если бы вход был, скажем, то1 1 1 1 1
, тоb
был бы4
, тогда2
, тогда1
,0
после третьей итерации. Вместо того, чтобы поворачиваться в:
, IP теперь движется прямо вперед, и что-то похожее на предыдущий случай может привести к возможному завершению.В общем, это беспорядок, как программа завершается, но что угодно, чтобы сохранить эти несколько байтов!
источник
Mathematica,
394344313944 байтаисточник
Haskell,
3934 байтаПример использования:
f [1,2,3,3,4]
->True
.Аналогичен ответу @ xnor , т. Е. Проверьте, есть ли какие-либо небольшие прямые в списке ввода. На самом деле я тестирую все «маленькие прямые» (то есть 4 последовательных числа), начиная с любого из чисел из списка ввода, некоторые из них являются недействительными и поэтому всегда не проходят
all
тест и не искажаютany
тест, например[5,6,7,8]
.Редактировать: @Zgarb сохранил 5 байтов. Благодарность!
источник
MATL, 11 байт
Попробуйте онлайн
источник
JavaScript (ES6),
5553 байтавозвращается
true
за правдой иfalse
ложью.Как это работает
Возврат, если какое-либо значение в [0, 1, 2, 3] удовлетворяет условию, что для каждого значения в [0, 1, 2, 3] сумма этих двух значений находится во входном массиве.
Итак, верните, если массив имеет все значения в [0, 1, 2, 3] (невозможно), [1, 2, 3, 4], [2, 3, 4, 5] или [3, 4, 5 , 6].
источник
Руби, 31
Вместо того, чтобы пытаться быть умным, как первый ответ Ruby , он просто просматривает массив целых чисел и для каждого целого числа видит, есть ли небольшая прямая на входе, начинающаяся с этого целого числа. Не беспокоиться о возможных значениях или уникальности.
Похоже, что он использует тот же алгоритм, что и ответ Шерлока .
источник
Рубин,
585550474333 байтаЯ только сейчас увидел, что меня избил ответ Пола Руби . Однако я не сдерживаюсь, так как думаю, что это все еще может быть достойным ответом с еще большим количеством игры в гольф. Частично основано на ответе xnor на Python .
Редактировать: немного игры в гольф и исправление путаницы в троичной условно.
Редактировать: я теперь использую,
.any?
как не то, что Чарльз делает в своем ответе на Ruby, но только потому, что мне нужен был простой способ удалитьa
и вернуть только правду и ложь с,!([*i..i+3]-l)[0]
так.map
как возвращал бы массивtrue
иfalse
.Возвращает либо
true
илиfalse
.Ungolfed:
Важное замечание: Для тех , кто хочет использовать
(a2 - a1).empty?
код , чтобы определить, все ли элементыa2
вa1
, заметим , что если вы хотите , чтобы убедиться , что сделать, например,[2,1,2]
в[1,2,3,3]
кратности элементов, вам нужен другой код. Актуальное обсуждение этой проблемы здесь .источник
0
в Ruby это правда, я думаю, что ваш ответ неверен.p
является ложным значением из одного символа.Japt,
1312 байтПроверьте это онлайн! или Проверьте все контрольные примеры .
Как это работает
источник
Perl,
474342393729 байтВключает +1 для
-p
Запустите с последовательностью на STDIN, например,
smallstraight.pl
:объяснение
источник
CJam,
161512 байтВозвращает непустую строку для истинных тестовых случаев и пустую строку для ложных.
Тестирование.
объяснение
В конце программы этот список сведен в одну строку и напечатан в STDOUT. Если были обнаружены какие-либо из небольших прямых, их оставшиеся элементы будут в строке. В противном случае все списки были пусты, и поэтому строка также пуста.
источник
[0 1 2 3]
обойдется в 2 байта.05AB1E ,
9810 байтИстина содержит массив в выводе, ложь - когда вывод не производится. Код:
Объяснение устарело :
Попробуйте онлайн!
Использует кодировку CP-1252 .
источник
Javascript ES6 47 байт
Javascript ES6 52 байта
Старый ответ
Javascript ES6 64 байта
спасибо ETHproductions за помощь в сохранении нескольких байтов
тестирование
источник
t=(t>4)?t:1
.q=>q.sort().map(o=>(o-s?o-s<2?t++:t=t>4?t:1:0,s=o),t=1,s=9)|t>3
эта версия возвращается1
для правдивости и0
ложности.C #,
156151150131121939290 байтовили: (такое же количество байтов)
Ungolfed:
Big Edit: только что понял, что мне нужно опубликовать функцию, а не целую программу. Это экономит много. Нет шаблонов, нет необходимости преобразовывать строковый ввод в числа и т. Д. Теперь мы приближаемся к порядочному числу байтов (во всяком случае, для языка без игры в гольф).
источник
main
в C # должен возвращаться либоvoid
илиint
.) К сожалению, я также получил 2 байта, потому что ожидал 0-5 вместо 1-6. Так что чистый убыток в 1 байт все равно.Рубин - 80 -> 79 -> 76 -> 54 -> 48 -> 40 байтов
Пятая попытка (40 байт):
Использует лямбда-синтаксис для определения функции. (Спасибо конкурирующему Ruby golfer @ Sherlock9 за эту идею.)
Чтобы проверить использование лямбда-вызова:
Четвертая попытка:
Заменил ноль? и отрицание с оператором ===.
Третья попытка:
Использует регулярное выражение.
Вторая попытка:
Новый подход использует dedup (uniq), сортировку и объединение, плюс включают? искать совпадения любых решений во входных данных, представленных в виде строки.
Первая попытка: 79 байт
Tester:
Используется дедупликация (функция uniq) плюс установка пересечения (& оператор), чтобы проверить, соответствует ли какая-либо из хороших последовательностей данной последовательности. Сортировка не требуется.
источник
Pyth,
13112 байта благодаря Якубе!
Возвращает непустой список для правдивого, пустой список для ложных.
Попробуйте онлайн или запустите Test Suite (разделенный синтаксической ошибкой для Readability ™).
источник
.PQ4
вместо.:{SQ4
PHP, 95 байт
В разобранном виде Вход / вызов функции Выходисточник
Серьезно, 21 байт
Попробуйте онлайн!
Выводит положительное значение для true и 0 для false.
Объяснение:
источник
PARI / GP , 71 байт
Это, вероятно, может быть дальше, но для начала:
Я не вижу способа уменьшить дублирование, не используя больше места; эта версия составляет 75 байт:
источник
Сетчатка ,
7054 байтаВвод - это одна строка из целых чисел
13342
. Выход -1
если найден, или0
если нет.Обратите внимание, что удаление дубликатов должно происходить только один раз, поскольку существует только пять чисел. Необходимость удалить более одного числа означала бы, что в любом случае нет маленькой прямой.
Попробуйте онлайн
Спасибо Мартину за идею перенести запятые в группы захвата, сэкономив колоссальные 16 байтов.
источник
. $*x Replace numbers with n x's, where n is the number.
+` Repeat the following until the string stabilizes
(x+(x+,))\2 $2$1 Replace n*xm*x,m*x, with m*x,n*xm*x
(x+,)\1 $1 Replace x*n,x*n, with x*n,
(x+,)x\1xx\1xxx\1 Match n*x,xn*x,xxn*x,xxxn*x
ОбновленоPyth, 11 байт
Тестирование
Сгенерируйте подстроки длиной 4 из [1..6], затем отфильтруйте их по отсутствующим элементам, когда элементы ввода удалены.
источник
Желе, 9 байт
Должно быть 8-байтовое решение, продолжим поиск ... Код:
Это то же самое, что и мое решение 05AB1E .
Объяснение:
Попробуйте онлайн!
источник
Œ!I=1ZS3e
...[1, 2, 1, 2, 1]
, как и ваш другой ответ, к сожалению. Моя альтернатива, кажется, работает (но я ошибался раньше ... проверил ее тоже :)), не стесняйтесь использовать это.Желе, 8 байт
Попробуйте онлайн! или проверьте достоверные контрольные примеры и ложные контрольные примеры .
Как это работает
источник
Scala,
76706160 байтTester:
источник
Javascript ES6 43 байта
// не могу заставить это работать: /
Это берет число 62 (111110 в двоичном формате) Для каждого числа во входном массиве это удаляет тот бит
Полученное число должно быть
поэтому я проверяю, является ли результат меньше 7 (0000111) или равен 32 (100000)источник
[3, 4, 5, 4, 3]
. Я думаю, вам нужно использовать 126 вместо 62 ...TI-BASIC, 25 байтов
Эквивалентное (ungolfed) выражение Python, которое вы можете проверить :
За этим стоит идея делимости. Чтобы проверить , является ли
1, 2, 3, 4
,2, 3, 4, 5
или3, 4, 5, 6
происходит, мы можем сопоставить число 1-6 до 37-42, а затем умножить правильные цифры вместе.Каждое из чисел в [37,42] имеет главный фактор, которого нет у других чисел.
Следовательно, если произведение пяти чисел делится на 37, исходный список содержал 1. Если на 19 он содержал 2; и т.д. Если он делится на
37*19*13*5
=65*703
, она содержит1
,2
,3
, и4
аналогично для двух других чисел.Это решение является улучшением того, которое @Weregoose опубликовал в 2009 году.
источник
Свинка
11378 байтВерсия Mumps, которую я использую, - InterSystems Cache.
Я не могу придумать способ игры в гольф покороче; с другой техникой это может быть возможно, но сейчас это подойдет и, по крайней мере, короче, чем C ++ ... но ненамного. Так или иначе...Хорошо, вот более короткий путь. Вместо трех отдельных переменных для коротких серий используйте одну переменную для всех 6 кубиков и извлеките порции позже:
так много для меня, что я не могу найти лучший способ с той же техникой ... Я должен посмотреть, прежде чем прыгнуть, а? ;-)
Я оставлю свой оригинальный ответ ниже для исторических целей ...
и вот объяснение того, что происходит с кодом:
Я не проверял каждый ввод правдивых и ложных данных, так как он вводил их вручную; но я проверил примерно первую половину каждого, проверил, что длинные стриты все еще показывают правдивость, и некоторые из прогонов, отмеченных как не обязательно работающие правильно ([4,2,5,3,4], [1,2,3,3 , 4] и т. Д.) И, кажется, работает правильно.
источник
Дьялог АПЛ , 15 байт
{∨/∧/⍵∊⍨⍵∘.+⍳4}
использования
⎕IO=0
⍳4
является0 1 2 3
⍵∘.+⍳4
5 × 4 матрица каждого кристалла, увеличенная на каждый из⍳4
⍵∊⍨
проверяет, находятся ли элементы матрицы в руке, результат - логическая (0-или-1) матрица, нам нужно найти строку всех 1∧/
- и-сокращение по строкам, результат - логический вектор∨/
или сокращение этого вектораисточник
Желе, 11
Попробуйте онлайн!
Это в значительной степени копия моего ответа Pyth, просто пытаюсь понять, как связать вещи. Чувствуется, что это должно быть пригодным для игры в гольф.
Расширение:
Если вы хотите задать какие-либо сложные вопросы, например, почему разделители отличаются, то я отвечу вам: «Я отвечу через 6-8 недель»: P (Более серьезно, я думаю, что это сопоставление с образцом, monad-dyad против нилад-диад, но я не знаю и не хочу распространять дезинформацию.)
источник
Q Unique elements
Ṣ sort the list
ṡ4 all slices of length 4
ðf filter by {
6R range form 1 to 6
ṡ4 all slices of length 4 from that
Q
с заглавными операторами overdot в документации. Может быть, когда-то это был овердот?