Considere una serie de enteros:
[1, 0, 9, 1, 3, 8]
Hay muchas maneras de dividir esta lista en sublistas consecutivas. Aquí hay tres:
A: [[1, 0, 9], [1, 3, 8]]
B: [[1], [0, 9], [1, 3], [8]]
C: [[1, 0], [9, 1], [3, 8]]
Llamaremos a una partición Y y al refinamiento de otra partición X si se puede obtener X de Y uniendo algunas de sus sublistas nuevamente.
Entonces, B
es un refinamiento de A
: si unimos las dos primeras y las últimas dos sublistas nuevamente, obtenemos A
. Pero noC
es un refinamiento de : tendríamos que dividir el y el para recuperarnos de él. Además, cualquier partición es trivialmente un refinamiento de sí misma.A
9
1
A
Tenga en cuenta que no podemos reorganizar ninguna sublista o elemento en ningún momento.
El reto
Dadas dos particiones (listas de listas de enteros) X
y Y
, determinar si Y
es un refinamiento de X
.
Puede suponer que las particiones solo contendrán enteros desde 0
hasta 9
, inclusive. No debe suponer eso X
y Y
son particiones de la misma lista (si no lo son, tampoco son refinamientos entre sí). X
y / o Y
puede estar vacío pero nunca contendrá sublistas vacías.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
La entrada puede tomarse en cualquier cadena conveniente o formato de lista. Dado que los elementos solo serán enteros de un solo dígito, puede optar por omitir un delimitador dentro de las sublistas, pero asegúrese de que los 0
s iniciales sean posibles. Puede elegir tomar X
y Y
en orden opuesto.
La salida debe ser veraz si Y
es un refinamiento X
y una falsedad de lo contrario.
Su código debe poder resolver cada uno de los casos de prueba a continuación en 1 segundo en una máquina de escritorio razonable. (Esto es simplemente un control de cordura para evitar soluciones simples de fuerza bruta).
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
Cada caso de prueba está en su propia línea, escrita como X Y
. Estoy usando la notación de matriz estilo GolfScript / CJam para ahorrar espacio horizontal:
Verdad:
[] []
[[0]] [[0]]
[[1 0 9 1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9 1 3 8]] [[1 0 9 1 3] [8]]
[[1 0 9 1 3 8]] [[1] [0] [9] [1] [3] [8]]
[[1 0 9] [1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5] [1 4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]
Falsy
[[0]] []
[[0]] [[1]]
[[1 0 9]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9 1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9]]
[[1 0 9] [1 3 8]] [[1 0] [9]]
[[1 0 9] [1 3 8]] [[1 0] [9 1] [3 8]]
[[1] [0 9] [1 3] [8]] [[1 0 9] [1 3 8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5 1] [4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51719</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
Desafíos relacionados
fuente
[[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]]
o[["109" "138"] ["1" "09" "13" "8"]]
sería un formato de entrada aceptable?Respuestas:
CJam,
13109 bytesPruébelo en línea en el intérprete de CJam .
Gracias a @ MartinBüttner por sugerir el ingenioso formato de entrada de @ edc65 .
Gracias a @ jimmy23013 por mejorar el formato de entrada y jugar 3 bytes adicionales.
I / O
Entrada
Las sublistas están separadas
;
entre sí por,
:Salida
Cómo funciona
Para cadenas de diferente longitud,
.-
dejará caracteres en la matriz, que no pueden ser iguales a los enteros 0 o 15.fuente
;
como separador ...ll.m27m0-!
.,
y;
son sintaxis de matriz común (y CJam no utiliza ninguna de ellas) ¡Gracias!Pyth, 19 bytes
Pruébelo en línea: demostración o prueba de arnés
Estoy usando el formato de tupla / lista de Pyth como entrada. Simplemente reemplace los espacios de los casos de prueba con comas.
Explicación:
Dado que el pseudocódigo sigue siendo un poco confuso, demostraré el algoritmo usando una entrada de ejemplo.
La
.u+NYdY
parte calcula todas las sublistas continuas que contienen el primer elemento.B
es un refinamiento deA
, si cada sublista continua deA
es también una sublista continua deB
(solo hay una excepción).Así que simplemente verifico si el conjunto de sublistas continuas de
A
es un subconjunto del conjunto de sublistas continuas deB
(gF_m.u+NYdYQ
).La única excepción es, si la primera lista de entrada contiene menos elementos que la segunda lista de entrada. Por ejemplo
<Fm.u+YdYQ
, volveríaTrue
para la entrada[[1]],[[1],[2]]
.Por lo tanto, también verifico si las listas unidas también son iguales
&...qFsMQ
.fuente
JavaScript ( ES6 ), 67
70Editar 3 bytes guardados thx @apsillers
Ejecute el fragmento a continuación en Firefox para probar
fuente
OK
yKO
.C, 69
75Una función con 2 parámetros de cadena, que devuelve 0 o 1.
Formato de parámetro: sublista separada con espacios (''), elementos de lista separados por comas.
Ejemplo:
"1,0,9 1,3,8"
"1,0 9,1,3,8"
Menos golf
Prueba de ideona (anticuada)
fuente
Haskell, 76 bytes
Devoluciones
True
oFalse
. Ejemplo de uso:[[1,0,9],[1,3,8]] # [[1,0],[9]]
->False
.Enfoque recursivo simple: si los primeros elementos coinciden, continúe con las colas, de lo contrario, comience de nuevo pero concatene los dos elementos al principio de la segunda lista. Los casos base son: ambas listas están vacías ->
True
; ambas listas con un solo elemento -> compárelas; solo una lista vacía ->False
.fuente
CJam, 19 bytes
Pruébalo en línea.
I / O
Entrada
Salida
Idea
Cada partición se puede identificar de forma única observando las siguientes dos propiedades:
La lista formada al concatenar todas las sublistas.
Los "puntos de corte", incluidos los extremos de la lista.
Podemos combinar ambos criterios en uno reemplazando cada punto de corte con la sublista de elementos desde el punto de corte hasta el final de la lista.
Para verificar que una partición dada es más fina que otra, solo tenemos que verificar si la partición más gruesa, representada como arriba, es un subconjunto de la más fina y si las listas más grandes de ambas particiones coinciden.
Código
Para la entrada del ejemplo de E / S, la pila contiene
antes de ejecutar
-!
.Tenga en cuenta que el primer elemento de cada matriz tiene un espacio final. Esto asegura que comparemos la lista completa de la primera entrada con la lista completa de la segunda.
fuente
CJam, 24 bytes
Algoritmo
Aquí simplemente usamos un algoritmo codicioso para ver si las primeras
N
sublistas de la segunda lista pueden fusionarse para formar la primera sublista de la primera lista. Una vez queN
se encuentra, eliminamos las primerasN
sublistas de la segunda lista y la primera sublista de la primera lista y repetimos el proceso.Idealmente, si la segunda lista era un refinamiento de la primera, deberíamos quedar con 2 listas vacías en la pila. Simplemente verificamos eso e imprimimos
1
si ese es el caso. En cualquier otra combinación, después de iterar completamente sobre las sublistas de la segunda lista, no terminaremos con 2 listas vacías. Por lo tanto0
, se imprimirá a para tales casos.Expansión de código
Pruébelo en línea aquí o ejecute el conjunto de pruebas completo aquí
fuente
C,
120114 bytesNo he jugado mucho al golf recientemente, así que pensé en probarlo.
Definimos una función
R(char* s, char* t)
que devuelve1
sit
es una partición refinada des
, y de lo0
contrario.s
yt
se espera que tengan el formato[DDDD...][DDDD...]...
Donde cada unoD
es otro elemento de un solo dígito.Código de prueba:
Lo anterior imprime lo siguiente:
Parece funcionar, al menos.
fuente
Haskell,
525053 bytesCompletamente diferente de mi otra solución . Utiliza el mismo formato de entrada inteligente que la respuesta de @ edc65 , es decir, los elementos se separan
,
y se enumeran con.
Ejemplo de uso:
"1,0,9,1,3,8" # "1,0,9 1,3,8"
->True
.El segundo parámetro es un refinamiento del primero, si tienen elementos iguales en cada posición o si el primero lo es
,
. Tengo que agregar un token final único (->..
) a ambos parámetros, porquezipWith
trunca el parámetro más largo y, por ejemplo"1,2,3" # "1,2"
, también lo seríaTrue
.fuente
(\a b->a==b||a>b)
es justo(>=)
."."
lugar de".."
trabajar también?"2"#"1"
porque las funciones solo verifican si los valores son más grandes, no iguales"."
no funcionará, porque daría un falso positivo para el"2,1" # "2"
cual primero se expandiría"2,1." # "2."
y luego se truncaría porzipWith
a"2," # "2."
. Una coma en la primera cadena coincide con todo.Mathematica, 65 bytes
fuente
¡Las matemáticas con expresiones regulares son divertidas!
Javascript ES6, 53 caracteres
Javascript Vintage, 70 caracteres
Utiliza el mismo formato de entrada que la respuesta de edc65 .
Demo completa que incluye todos los casos de prueba aquí.
fuente
Mathematica, 55 bytes
Esto define una función sin nombre, tomando las dos particiones en una sola lista , en orden inverso (es decir
Y
, primero,X
segundo).Explicación
Esto comprueba que ambas particiones son en realidad particiones de la misma lista.
Esta es una forma de golf de mi enfoque en esta pregunta sobre Mathematica.SE , que inspiró este desafío. Básicamente, una partición se define como un número de índices donde se insertan divisiones, y esto comprueba que todas las posiciones de división
X
también aparecenY
acumulando las longitudes de las sublistas.fuente
Python 2,
6851 bytes¡Gracias a xnor por algunos considerables ahorros en bytes!
Función anónima que toma dos cadenas de la forma
"1,0,9 1,3,8"
(tomada de la respuesta C de edc65 ) y devuelveTrue
oFalse
. La nueva versiónmap(None)
ya no funciona en Python 3.Banco de pruebas:
Solución anterior de 92 bytes que toma datos como
"109 138"
:fuente
None
pero el otro índice tiene un número, yai==j or"0">i>j
que no se puede mantener.i==','
. Esto le permite combinar las pruebas comoi in[',',j]
(no podemos haceri in ','+j
) porquej
podría serNone
.b
tiene un número en ese lugar?" ... olvidando que con este formato de entrada, eso no es posible.