Reparte cartas etiquetadas de 0 a 9 de un mazo una por vez, formando pilas que comienzan en 0 y cuentan hasta 1.
- Cuando reparte un 0, lo coloca en la mesa para comenzar una nueva pila.
- Cuando repartes cualquier otra carta, la apilas sobre una carta que tiene exactamente un valor inferior, cubriéndola. Si no hay tal carta, el mazo no es apilable.
Dado un mazo, determina si se puede apilar cuando se reparte en el orden dado. De manera equivalente, dada una lista de dígitos, decida si puede dividirse en subsecuencias disjuntas de cada uno de los formularios.0,1,..,k
Ejemplo
Toma la cubierta 0012312425
. Las dos primeras cartas son 0
, así que van sobre la mesa:
Stacks: 00
Deck: 12312425
A continuación, tratamos un 1
, que sigue a un 0
, no importa cuál:
1
Stacks: 00
Deck: 2312425
Luego tratamos 2
encima de lo que acaba de colocar 1
, y 3
encima.
3
2
1
Stacks: 00
Deck: 12425
A continuación, el 1
, 2
y se coloca encima de la primera pila y 4
la cima de la segunda.
4
3
22
11
Stacks: 00
Deck: 25
Ahora, necesitamos colocar un 2
, pero no hay 1
ninguna pila encima. Entonces, este mazo no era apilable.
Entrada: una lista no vacía de dígitos 0-9, o una cadena de ellos. No puede suponer que 0 siempre estará en la entrada.
Salida : uno de dos valores consistentes distintos, uno para secuencias apilables y otro para secuencias no apilables
Casos de prueba:
Apilable:
0
01
01234
00011122234567890
012031
0120304511627328390
No apilable:
1
021
0001111
0012312425
012301210
000112223
Por conveniencia, 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]
Agrupado:
[[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]]
Tabla de clasificación:
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]
en C1
a10
Respuestas:
Python 2 ,
4543 bytes-2 bytes gracias a @TFeld
Pruébalo en línea!
fuente
Haskell , 55 bytes
Una función anónima que toma una lista de enteros y devuelve a
Bool
.Uso:
(all(<1).foldr(?)[]) [0,1,2,3,4]
.Pruébalo en línea!
Cómo funciona
foldr(?)[]
dobla su argumento de lista de derecha a izquierda usando?
, comenzando con una lista vacía. El resultado es la lista de números en la lista que no cabía encima de un número anterior.all(<1)
prueba si los únicos números que no se ajustan sobre un número anterior son ceros.m?l
antepone un númerom
a una listal
de números no adecuados. Sim+1
ya está en la lista, ahora se puede eliminar ya que cabe encimam
.(p,r)<-span(/=m+1)l
divide la listal
en dos partesp
yr
en la primera instancia del númerom+1
. Si no hay ninguno, la parte correctar
estará vacía.m:p++drop 1r
antecedem
a las partes divididas. Sir
no está vacío, debe comenzar conm+1
, que se elimina condrop 1
.fuente
?
recursivamente, pero obtuve la misma longitud .Data.List.delete
Casco , 9 bytes
Pruébalo en línea!
Devoluciones
1
para mazos apilables y0
para mazos no apilables.Parece que Ørjan Johansen en su respuesta de Haskell ya presentó el mismo algoritmo, pero en Husk esto es obviamente mucho más conciso.
Explicación
Abordamos el problema desde otro lado: volteamos la baraja y hacemos pilas descendentes. Si después de pasar por todo el mazo, todas las pilas tienen un 0 en la parte superior, el mazo es apilable.
fuente
Jalea ,
1511 bytesPruébalo en línea!
fuente
‘Ṭ€+\I>0FṀ
Funcionaría siempre?C (gcc),
7473 bytesRequiere la matriz de entrada para marcar el final con -1. Ejemplo de uso:
fuente
return r
?Retina , 42 bytes
Pruébalo en línea!
Explicación
Esto ordena los dígitos, de manera estable, según la frecuencia con la que ese mismo dígito ha ocurrido antes. En efecto, esto recopila las diversas subsecuencias candidatas juntas. La cadena resultante tendrá primero la primera aparición de cada dígito, y luego la segunda aparición de cada dígito, y así sucesivamente. En una entrada apilable, el resultado se verá más o menos así
0123...0123...0123...
, donde cada una de estas subcadenas puede terminar en cualquier punto.Es más fácil determinar si la entrada tiene este tipo de patrón en unario.
Reemplazamos cada dígito n por n
1
s, seguido de una coma para separar los dígitos individuales.Finalmente, hacemos uso de una referencia directa para que coincida con series de dígitos consecutivamente crecientes. Intentamos hacer coincidir toda la cadena ya sea haciendo coincidir una coma (que representa un 0 , que comienza una nueva ejecución) o haciendo coincidir lo anterior precedido por un adicional
1
, que solo funciona si el dígito actual es el sucesor del anterior.fuente
TI-Basic (serie 83), 25 bytes (49 caracteres)
Cómo funciona
Toma la entrada como una lista en
Ans
. Salidas1
para entradas apilables, de lo0
contrario.Para cada uno
I
,cumSum(Ans=I)
calcula una lista de la cantidad de veces queI
ha ocurrido en cada segmento inicial, pormin(cumSum(Ans=I)≤cumSum(Ans=I-1))
lo que solo es 1 si, en cada posición, hemos vistoI-1
al menos tantas veces comoI
. La expresión general es1
cuando esto se cumple para cada unoI
.fuente
JavaScript (ES6),
614540 bytesToma la entrada como una lista.
Casos de prueba
Mostrar fragmento de código
¿Cómo?
Para cada valor 0 ... 9 , hacemos un seguimiento del número de pilas disponibles con la carta anterior encima. Estos contadores se almacenan en un [-9] a un [0] , donde a [] es la matriz de entrada original. El único contador que colisiona con los datos de entrada es un [0] , pero realmente no nos importa este porque 1) las tarjetas etiquetadas como 0 siempre están permitidas y deben procesarse por separado de todos modos y 2) el valor de entrada a [0 ] se procesa antes de que pueda actualizarse.
fuente
MATL , 16 bytes
La entrada es una matriz de números.
El código
1
sale en STDOUT si la entrada es apilable, o sale con un error y vacía la salida en STDOUT si la entrada no es apilable.Pruébalo en línea!
fuente
Retina , 110 bytes
Pruébalo en línea! El enlace incluye casos de prueba. No suelo usarlo
$16
...fuente
Mathematica, 80 bytes
fuente
Python 2 ,
6961554746 bytesPruébalo en línea!
La salida es
error
/no error
.fuente
R , 88 bytes
Pruébalo en línea!
Función que toma un vector R; devuelve
TRUE
apilables y apilablesFALSE
.Explicación:
fuente
Nim, 133 bytes
1
si funciona;0
si no es asíTuve que sacar algunos negocios extravagantes para lidiar con la mutabilidad de las variables en for-loops, oh, bueno.
fuente
Haskell ,
7775 bytesPruébalo en línea! Uso:
g.reverse $ [0,1,2]
. DevolucionesTrue
para entradas apilables y deFalse
otra manera.Esta es una solución recursiva que atraviesa una lista dada de atrás hacia adelante. Implementa la observación de que
r
y último elementox
es apilable sir
es apilable yx
es cero o ambosx-1
aparecen enr
yr
conx-1
eliminado también es apilable.fuente
Java 8,
168150142 bytesDevoluciones
0
/1
si es correctamente apilable o no.Explicación:
Pruébalo aquí.
fuente
C, 248 bytes
Nota: para imprimir el estado de devolución, escriba "echo $ status" en el terminal
Estado de retorno 0: no apilable
Estado de retorno 1: apilable
Explicación: Incrementa el elemento de matriz con el índice equivalente al dígito más actual en la pila. Luego, el programa verifica si este elemento de matriz incrementado ahora es más grande que el elemento que lo precede. Si es así, devuelve 0. De lo contrario, si el programa llega al final de la matriz, devuelve 1.
fuente
Jalea , 15 bytes
Un enlace monádico que toma una lista de enteros no negativos y devuelve
0
si es apilable o1
no apilable.Pruébalo en línea!
¿Cómo?
fuente
Japt , 16 bytes
¡Pruébelo en línea! Salidas
false
para apilables,true
para no apilable.Explicación
fuente
05AB1E , 25 bytes
El desafío no parece tan difícil, pero es bastante difícil en 05AB1E (al menos para mí ...)
Salidas
0
si son apilables y1
si no apilables.Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Java 8, 87 bytes
En lugar de construir las pilas, solo calculo si un elemento no es apilable en los elementos anteriores, y devuelvo 0 cuando se encuentra un elemento no apilable. Si llego al final, toda la cadena es apilable y se devuelve 1:
Pruébalo en línea!
Explicación:
fuente