Você distribui cartas de 0 a 9 de um baralho uma vez, formando pilhas que começam em 0 e contam até 1.
- Quando você recebe um 0, você o coloca na mesa para iniciar uma nova pilha.
- Quando você distribui qualquer outra carta, você a empilha sobre uma carta com exatamente um valor menor, cobrindo-a. Se não houver tal carta, o baralho não é empilhável.
Dado um baralho, determine se ele pode ser empilhado quando distribuído na ordem dada. De maneira equivalente, dada uma lista de dígitos, decida se ele pode ser particionado em subsequências separadas, cada um dos formulários.0,1,..,k
Exemplo
Pegue o baralho 0012312425
. As duas primeiras cartas são 0
, então elas vão para a mesa:
Stacks: 00
Deck: 12312425
Em seguida, lidamos com a 1
, que continua a 0
, não importa qual:
1
Stacks: 00
Deck: 2312425
Em seguida, lidamos com 2
os que acabaram de colocar 1
e os que estão 3
em cima.
3
2
1
Stacks: 00
Deck: 12425
Em seguida, o 1
, 2
e colocado em cima da primeira pilha e 4
sobre a segunda.
4
3
22
11
Stacks: 00
Deck: 25
Agora, precisamos colocar a 2
, mas não há 1
nenhuma pilha no topo. Portanto, esse deck não era empilhável.
Entrada: uma lista não vazia de dígitos de 0 a 9 ou uma sequência deles. Você não pode assumir que 0 sempre estará na entrada.
Saída : um dos dois valores consistentes distintos, um para sequências empilháveis e outro para sequências não empilháveis
Casos de teste:
Empilhável:
0
01
01234
00011122234567890
012031
0120304511627328390
Não empilháveis:
1
021
0001111
0012312425
012301210
000112223
Por conveniência, como listas:
[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]
Agrupados:
[[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]]
Entre os melhores:
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]
em C1
até10
Respostas:
Python 2 ,
4543 bytes-2 bytes graças a @TFeld
Experimente online!
fonte
Haskell , 55 bytes
Uma função anônima pegando uma lista de números inteiros e retornando a
Bool
.Uso:
(all(<1).foldr(?)[]) [0,1,2,3,4]
.Experimente online!
Como funciona
foldr(?)[]
dobra seu argumento de lista da direita para a esquerda usando?
, começando com uma lista vazia. O resultado é a lista de números na lista que não coube em cima de um número anterior.all(<1)
testa se os únicos números que não se encaixam em cima de um número anterior são zeros.m?l
anexa um númerom
a uma listal
de números não ajustados. Sem+1
já estiver na lista, agora pode ser removido conforme se encaixam
.(p,r)<-span(/=m+1)l
divide a listal
em duas partesp
er
na primeira instância do númerom+1
. Se não houver, a parte certar
estará vazia.m:p++drop 1r
precedem
às partes divididas. Ser
não estiver vazio, deve começar comm+1
, o qual é removido pordrop 1
.fonte
?
recursivamente, mas obtive o mesmo comprimento .Data.List.delete
Casca , 9 bytes
Experimente online!
Retorna
1
para decks empilháveis e0
para decks não empilháveis.Parece que Ørjan Johansen em sua resposta Haskell já apresentou o mesmo algoritmo, mas em Husk isso é obviamente muito mais conciso.
Explicação
Abordamos o problema de outro lado: vire o convés e faça pilhas descendentes. Se depois de passar por todo o baralho todas as pilhas tiverem um 0 no topo, o baralho será empilhável.
fonte
Geléia ,
1511 bytesExperimente online!
fonte
‘Ṭ€+\I>0FṀ
sempre?C (gcc),
7473 bytesRequer a matriz de entrada para marcar o final com -1. Exemplo de uso:
fonte
return r
?Retina , 42 bytes
Experimente online!
Explicação
Isso classifica os dígitos, de forma estável, pela frequência com que o mesmo dígito ocorreu antes. Com efeito, isso reúne as várias subsequências candidatas. A sequência resultante terá primeiro a primeira ocorrência de cada dígito e, em seguida, a segunda ocorrência de cada dígito e assim por diante. Em uma entrada empilhável, o resultado será semelhante a
0123...0123...0123...
, onde cada uma dessas substrings pode terminar a qualquer momento.É mais fácil determinar se a entrada tem esse tipo de padrão unário.
Substituímos cada dígito n por n
1
s, seguido por uma vírgula para separar dígitos individuais.Finalmente, usamos uma referência direta para corresponder a consecutivas crescentes execuções de dígitos. Tentamos combinar a sequência inteira combinando uma única vírgula (representando um 0 , que inicia uma nova execução) ou combinando a coisa anterior precedida por uma adicional
1
, que só funciona se o dígito atual for o sucessor do anterior.fonte
TI-Basic (série 83), 25 bytes (49 caracteres)
Como funciona
Leva a entrada como uma lista em
Ans
. Saídas1
para entradas empilháveis,0
caso contrário.Para cada
I
,cumSum(Ans=I)
calcula uma lista do número de vezesI
que ocorreu em cada segmento inicial; portanto,min(cumSum(Ans=I)≤cumSum(Ans=I-1))
é apenas 1 se, em todas as posições, vimosI-1
pelo menos quantas vezesI
. A expressão geral é1
sempre que isso vale para cada umI
.fonte
JavaScript (ES6),
614540 bytesLeva a entrada como uma lista.
Casos de teste
Mostrar snippet de código
Quão?
Para cada valor de 0 a 9 , registramos o número de pilhas disponíveis com o cartão anterior no topo. Esses contadores são armazenados em [-9] a [0] , onde a [] é a matriz de entrada original. O único contador que colide com os dados de entrada é um [0] , mas realmente não nos importamos com este, porque 1) cartões rotulados como 0 são sempre permitidos e precisam ser processados separadamente de qualquer maneira e 2) o valor de entrada a [0 ] é processado antes de poder ser atualizado.
fonte
MATL , 16 bytes
Entrada é uma matriz de números.
O código sai
1
em STDOUT se a entrada é empilhável ou sai com um erro e esvazia a saída em STDOUT se a entrada não é empilhável.Experimente online!
fonte
Retina , 110 bytes
Experimente online! O link inclui casos de teste. Não costumo usar
$16
...fonte
Mathematica, 80 bytes
fonte
Python 2 ,
6961554746 bytesExperimente online!
A saída é
error
/no error
.fonte
R , 88 bytes
Experimente online!
Função que aceita um vetor R; retorna
TRUE
para empilhável e não empilhávelFALSE
.Explicação:
fonte
Nim, 133 bytes
1
se isso funcionar;0
se nãoTive que puxar alguns negócios descolados para lidar com a mutabilidade de variáveis em for-loops, tudo bem.
fonte
Haskell ,
7775 bytesExperimente online! Uso:
g.reverse $ [0,1,2]
. RetornaTrue
para entradas empilháveis eFalse
outros.Esta é uma solução recursiva que percorre uma determinada lista de trás para frente. Isso implementa a observação de que
r
e último elementox
é empilhável ser
for empilhável ex
é zero ou ambosx-1
aparecem emr
er
comx-1
removido também são empilháveis.fonte
Java 8,
168150142 bytesRetorna
0
/1
se está corretamente empilhável ou não.Explicação:
Experimente aqui.
fonte
C, 248 bytes
Nota: Para imprimir o status de retorno, digite "echo $ status" no terminal
Status de retorno 0: Não empilhável
Status de retorno 1: empilhável
Explicação: Incrementa o elemento da matriz com o índice equivalente ao dígito mais atual na pilha. Em seguida, o programa verifica se esse elemento da matriz agora incrementado é maior que o elemento que o precede. Nesse caso, retorna 0. Caso contrário, se o programa chegar ao final da matriz, retornará 1.
fonte
Gelatina , 15 bytes
Um link monádico que obtém uma lista de números inteiros não negativos e retorna
0
se empilhável ou1
não empilhável.Experimente online!
Quão?
fonte
Japonês , 16 bytes
Teste online! Saídas
false
para empilháveis,true
para não empilháveis.Explicação
fonte
05AB1E , 25 bytes
O desafio não parece tão difícil, mas é bastante difícil no 05AB1E (pelo menos para mim ..)
Saídas
0
se empilháveis e1
se não empilháveis.Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Java 8, 87 bytes
Em vez de criar as pilhas, apenas calculo se um elemento é invencível nos elementos anteriores e retorno 0 quando um elemento não empilhável é encontrado. Se eu chegar ao final, toda a cadeia é empilhável e 1 é retornado:
Experimente online!
Explicação:
fonte