Вы раздаете из колоды карты с метками от 0 до 9, формируя стопки, которые начинаются с 0 и считаются до 1.
- Когда вы разыгрываете 0, вы кладете его на стол, чтобы начать новый стек.
- Когда вы сдаете любую другую карту, вы кладете ее на карту, стоимость которой точно на одну ниже, и покрываете ее. Если такой карты нет, колода не складывается.
Для данной колоды определите, может ли она быть сложена, когда раздается в указанном порядке. Эквивалентно, учитывая список цифр, решить, можно ли его разбить на непересекающиеся подпоследовательности в каждой форме0,1,..,k
пример
Возьми колоду 0012312425
. Первые две карты есть 0
, поэтому они идут на стол:
Stacks: 00
Deck: 12312425
Далее, мы имеем дело с 1
, который идет на 0
, не имеет значения, который:
1
Stacks: 00
Deck: 2312425
Затем мы разыгрываем 2
верхнюю часть только что размещенного 1
и 3
поверх него.
3
2
1
Stacks: 00
Deck: 12425
Далее 1
, 2
и помещают поверх первого стека и на 4
вершине второй.
4
3
22
11
Stacks: 00
Deck: 25
Теперь нам нужно разместить a 2
, но 1
поверх стека нет. Итак, эта колода не была составной.
Входные данные: непустой список цифр 0-9 или их строка. Вы не можете предполагать, что 0 всегда будет на входе.
Вывод : одно из двух различных непротиворечивых значений, одно для суммируемых последовательностей и одно для не стекируемых
Тестовые случаи:
Составная:
0
01
01234
00011122234567890
012031
0120304511627328390
Не штабелируется:
1
021
0001111
0012312425
012301210
000112223
Для удобства в виде списков:
[0]
[0, 1]
[0, 1, 2, 3, 4]
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[0, 1, 2, 0, 3, 1]
[0, 1, 2, 0, 3, 0, 4, 5, 1, 1, 6, 2, 7, 3, 2, 8, 3, 9, 0]
[1]
[0, 2, 1]
[0, 0, 0, 1, 1, 1, 1]
[0, 0, 1, 2, 3, 1, 2, 4, 2, 5]
[0, 1, 2, 3, 0, 1, 2, 1, 0]
[0, 0, 0, 1, 1, 2, 2, 2, 3]
Сгруппированные:
[[0], [0, 1], [0, 1, 2, 3, 4], [0, 0, 0, 1, 1, 1, 2, 2, 2, 3], [0, 1, 2, 0, 3, 1], [0, 1, 2, 0, 3, 0, 4, 5, 1, 1, 6, 2, 7, 3, 2, 8, 3, 9, 0]]
[[1], [0, 2, 1], [0, 0, 0, 1, 1, 1, 1], [0, 0, 1, 2, 3, 1, 2, 4, 2, 5]]
Leaderboard:
var QUESTION_ID=144201,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/144201/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>
int a[99]
на C1
до10
Ответы:
Python 2 ,
4543 байта-2 байта благодаря @TFeld
Попробуйте онлайн!
источник
Haskell , 55 байтов
Анонимная функция, принимающая список целых чисел и возвращающая
Bool
.Использование:
(all(<1).foldr(?)[]) [0,1,2,3,4]
.Попробуйте онлайн!
Как это работает
foldr(?)[]
сворачивает свой аргумент списка справа налево, используя?
, начиная с пустого списка. В результате получается список чисел в списке, который не помещается поверх предыдущего числа.all(<1)
проверяет, являются ли нули только единственными числами, не помещающимися поверх предыдущего числа.m?l
добавляет числоm
к спискуl
неподходящих номеров. Еслиm+1
он уже есть в списке, его можно удалить, если он помещается поверхm
.(p,r)<-span(/=m+1)l
разбивает списокl
на две частиp
иr
в первом экземпляре числаm+1
. Если их нет, правая частьr
будет пустой.m:p++drop 1r
зависитm
от разделенных частей. Еслиr
не пусто, то оно должно начинаться с тогоm+1
, что удаляется с помощьюdrop 1
.источник
?
рекурсивно, но получил ту же длину .Data.List.delete
Шелуха , 9 байт
Попробуйте онлайн!
Возвращает
1
для стекируемых колод и не0
для стекируемых колод.Похоже, что Орджан Йохансен в своем ответе на Haskell уже придумал тот же алгоритм, но в Husk это, очевидно, гораздо более лаконично.
объяснение
Мы решаем задачу с другой стороны: переворачиваем колоду и делаем нисходящие сваи. Если после прохождения всей колоды все стопки имеют 0 наверху, колода может быть наращиваемой.
источник
Желе ,
1511 байтПопробуйте онлайн!
источник
‘Ṭ€+\I>0FṀ
работать всегда?C (gcc),
7473 байтаТребуется, чтобы входной массив отмечал конец -1. Пример использования:
источник
return r
?Сетчатка , 42 байта
Попробуйте онлайн!
объяснение
Это сортирует цифры, стабильно, по тому, как часто эта же цифра встречалась раньше. По сути, это объединяет различные подпоследовательности кандидатов вместе. Результирующая строка сначала будет иметь первое вхождение каждой цифры, а затем второе вхождение каждой цифры и так далее. В стековом вводе результат будет выглядеть примерно так
0123...0123...0123...
, где каждая из этих подстрок может завершаться в любой точке.Проще всего определить, имеет ли вход такой тип паттерна в унарном формате.
Мы заменяем каждую цифру n на n
1
s, после которой ставим запятую для разделения отдельных цифр.Наконец, мы используем прямую ссылку для сопоставления последовательно увеличивающихся серий цифр. Мы пытаемся сопоставить всю строку либо путем сопоставления одной запятой (представляющей 0 , которая запускает новый прогон), либо путем сопоставления предыдущей вещи, которой предшествует дополнительная
1
, которая работает, только если текущая цифра является преемницей предыдущей.источник
TI-Basic (серия 83), 25 байтов (49 символов)
Как это работает
Принимает ввод как список в
Ans
. Выходы1
для наращиваемых входов, в0
противном случае.Для каждого
I
,cumSum(Ans=I)
вычисляет список того , сколько разI
произошли в каждом начальном сегменте, такmin(cumSum(Ans=I)≤cumSum(Ans=I-1))
только 1 , если в любом положении, мы видели , поI-1
крайней мере , столько раз , сколькоI
. Общее выражение1
всякий раз, когда это верно для каждогоI
.источник
JavaScript (ES6),
614540 байтПринимает ввод в виде списка.
Контрольные примеры
Показать фрагмент кода
Как?
Для каждого значения 0 ... 9 мы отслеживаем количество доступных стеков с предыдущей картой сверху. Эти счетчики хранятся от [-9] до [0] , где a [] - исходный входной массив. Единственный счетчик, который сталкивается с входными данными, это [0] , но нас это не волнует, потому что 1) карты с меткой 0 всегда разрешены и в любом случае должны обрабатываться отдельно и 2) входное значение a [0 ] обрабатывается до того, как появится возможность его обновления.
источник
MATL , 16 байт
Ввод представляет собой массив чисел.
Код выводится
1
в STDOUT, если ввод является наращиваемым, или завершается с ошибкой, и пустой вывод в STDOUT, если ввод не является наращиваемым.Попробуйте онлайн!
источник
Сетчатка , 110 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Я не часто пользуюсь
$16
...источник
Mathematica, 80 байт
источник
Python 2 ,
6961554746 байтПопробуйте онлайн!
Выход
error
/no error
.источник
R , 88 байт
Попробуйте онлайн!
Функция, которая принимает вектор R; возвращает
TRUE
для наращиваемых и неFALSE
суммируемых.Объяснение:
источник
Ним, 133 байта
1
если он работает;0
если это не так.Пришлось потянуть какой-нибудь интересный бизнес, чтобы разобраться с изменчивостью переменных в циклах for, ну да ладно.
источник
Haskell ,
7775 байтПопробуйте онлайн! Использование:
g.reverse $ [0,1,2]
. ВозвращаетTrue
для наращиваемых входов и вFalse
противном случае.Это рекурсивное решение, которое пересекает заданный список задом наперед. Он реализует наблюдение, что
r
и последним элементомx
является стекируемым, еслиr
он стекируемый и либоx
равен нулю, либо обаx-1
появляются вr
иr
сx-1
удаленным, также стекируемый.источник
Java 8,
168150142 байтаВозвращает
0
/ является1
ли он правильно составляемым или нет.Объяснение:
Попробуй это здесь.
источник
C 248 байт
Примечание. Чтобы напечатать возвращаемый статус, введите «echo $ status» в терминал
Статус возврата 0: не стекируется
Статус возврата 1: наращиваемый
Объяснение: Увеличивает элемент массива с индексом, эквивалентным самой последней цифре в стеке. Затем программа проверяет, больше ли этот только что увеличенный элемент массива, чем предшествующий ему элемент. Если это так, возвращает 0. Иначе, если программа доходит до конца массива, возвращает 1.
источник
Желе , 15 байт
Монадическая ссылка, берущая список неотрицательных целых чисел и возвращающая,
0
если она может быть наращиваемой или1
не складываемой.Попробуйте онлайн!
Как?
источник
Japt , 16 байт
Проверьте это онлайн! Выходы
false
для стекируемых,true
для не стекируемых.объяснение
источник
05AB1E , 25 байтов
Задача не выглядит такой сложной, но в 05AB1E она довольно сложная (по крайней мере, для меня ...)
Выходы,
0
если они могут быть стекируемыми, а1
если нет.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Java 8, 87 байт
Вместо того, чтобы строить стеки, я просто вычисляю, является ли элемент стекируемым на предыдущих элементах, и возвращаю 0, когда встречается не стекируемый элемент. Если я достигну конца, вся строка будет наращиваемой и возвращается 1:
Попробуйте онлайн!
Объяснение:
источник