Considere un trozo de cuerda (como en "cuerda", no como en "un montón de caracteres"), que se pliega de un lado a otro en la línea real. Podemos describir la forma de la cadena con una lista de puntos por los que pasa (en orden). Por simplicidad, asumiremos que todos esos puntos son enteros.
Tomemos como ejemplo [-1, 3, 1, -2, 5, 2, 3, 4]
(tenga en cuenta que no cada entrada implica un pliegue):
La cadena que se extiende a lo largo de la dirección vertical es solo para fines de visualización. Imagina que la cuerda se aplana en la línea real.
Ahora aquí está la pregunta: ¿cuál es el mayor número de piezas en las que se puede cortar esta cadena con un solo corte (que tendría que ser vertical en la imagen de arriba)? En este caso, la respuesta es 6 con un corte entre 2
y 3
:
Para ambigüedades EVITAR, el corte tiene que ser realizado en una posición no entero.
El reto
Dada una lista de posiciones enteras por las que se pliega una cadena, debe determinar el mayor número de piezas en las que se puede cortar la cadena con un solo corte en una posición no entera.
Puede escribir un programa completo o una función. Puede recibir información a través de STDIN, argumento de línea de comando, indicador o parámetro de función. Puede escribir la salida en STDOUT, mostrarla en un cuadro de diálogo o devolverla desde la función.
Puede suponer que la lista está en cualquier lista conveniente o formato de cadena.
La lista contendrá al menos 2 y no más de 100 entradas. Las entradas serán números enteros, cada uno en el rango -2 31 ≤ p i <2 31 . Puede suponer que no hay dos entradas consecutivas idénticas.
Su código debe procesar dicha entrada (incluidos los casos de prueba a continuación) en menos de 10 segundos en una PC de escritorio razonable.
Casos de prueba
Todos los casos de prueba son simplemente de entrada seguidos de salida.
[0, 1]
2
[2147483647, -2147483648]
2
[0, 1, -1]
3
[1, 0, -1]
2
[-1, 3, 1, -2, 5, 2, 3, 4]
6
[-1122432493, -1297520062, 1893305528, 1165360246, -1888929223, 385040723, -80352673, 1372936505, 2115121074, -1856246962, 1501350808, -183583125, 2134014610, 720827868, -1915801069, -829434432, 444418495, -207928085, -764106377, -180766255, 429579526, -1887092002, -1139248992, -1967220622, -541417291, -1617463896, 517511661, -1781260846, -804604982, 834431625, 1800360467, 603678316, 557395424, -763031007, -1336769888, -1871888929, 1594598244, 1789292665, 962604079, -1185224024, 199953143, -1078097556, 1286821852, -1441858782, -1050367058, 956106641, -1792710927, -417329507, 1298074488, -2081642949, -1142130252, 2069006433, -889029611, 2083629927, 1621142867, -1340561463, 676558478, 78265900, -1317128172, 1763225513, 1783160195, 483383997, -1548533202, 2122113423, -1197641704, 319428736, -116274800, -888049925, -798148170, 1768740405, 473572890, -1931167061, -298056529, 1602950715, -412370479, -2044658831, -1165885212, -865307089, -969908936, 203868919, 278855174, -729662598, -1950547957, 679003141, 1423171080, 1870799802, 1978532600, 107162612, -1482878754, -1512232885, 1595639326, 1848766908, -321446009, -1491438272, 1619109855, 351277170, 1034981600, 421097157, 1072577364, -538901064]
53
[-2142140080, -2066313811, -2015945568, -2013211927, -1988504811, -1884073403, -1860777718, -1852780618, -1829202121, -1754543670, -1589422902, -1557970039, -1507704627, -1410033893, -1313864752, -1191655050, -1183729403, -1155076106, -1150685547, -1148162179, -1143013543, -1012615847, -914543424, -898063429, -831941836, -808337369, -807593292, -775755312, -682786953, -679343381, -657346098, -616936747, -545017823, -522339238, -501194053, -473081322, -376141541, -350526016, -344380659, -341195356, -303406389, -285611307, -282860017, -156809093, -127312384, -24161190, -420036, 50190256, 74000721, 84358785, 102958758, 124538981, 131053395, 280688418, 281444103, 303002802, 309255004, 360083648, 400920491, 429956579, 478710051, 500159683, 518335017, 559645553, 560041153, 638459051, 640161676, 643850364, 671996492, 733068514, 743285502, 1027514169, 1142193844, 1145750868, 1187862077, 1219366484, 1347996225, 1357239296, 1384342636, 1387532909, 1408330157, 1490584236, 1496234950, 1515355210, 1567464831, 1790076258, 1829519996, 1889752281, 1903484827, 1904323014, 1912488777, 1939200260, 2061174784, 2074677533, 2080731335, 2111876929, 2115658011, 2118089950, 2127342676, 2145430585]
2
fuente
a reasonable desktop PC
bastante ambiguo?Respuestas:
APL,
1614 bytesGracias a @ngn por guardar 2 bytes.
El
⎕
es en realidad un carácter de cuadro, no un error de fuente faltante. Puede probar el programa en tryapl.org , pero como⎕
no es totalmente compatible allí, debe reemplazarlo por el valor de entrada:Explicación
El programa se explica mejor con la entrada de ejemplo
s = ¯1 3 1 ¯2 5 2 3 4
, que es tomada de STDIN por⎕
. Primero, calculamos el≤
producto externo des
sí mismo usando∘.≤⍨
. Esto da como resultado una matriz booleana cuyai
fila th indica qué elementoss
son menores o iguales ques[i]
:Las ocurrencias de
0 1
y1 0
en la filai
marcan los lugares donde la cadena pasa sobre el puntos[i] + 0.5
. Coincidimos con estos en cada fila usando2≠/
"reducir 2 sublistas por≠
":Lo que queda es tomar las sumas de las filas con
+/
y uno más el máximo de estos con
1+⌈/
:El resultado se imprime automáticamente en STDOUT en la mayoría de las implementaciones de APL.
fuente
×
multiplicación, y reglas de sintaxis muy simples. Google "dominando Dyalog APL" para una buena guía.Python,
887573 bytesSolo una simple lambda
Solo para mostrar otro enfoque:
Pyth,
2827 bytesEste es aproximadamente equivalente a
aplicado a la lista de entrada de STDIN. Pruébelo en el intérprete en línea .
fuente
def f(x):max(sum((a+.5-m)*(a+.5-n)<0for m,n in zip(x,x[1:]))for a in x)+1
+.5
s para guardar algunos caracteres. Me di cuenta de que no tenían sentido en el mío.a = point + .5
y cuenta el número de intervalos que contiene estrictamentea
. Sin el.5
tendrás problemas con casos como el[1, 0, -1]
ejemplo.Pyth :
313029282423 caracteres (Python 68 caracteres)Pruébalo aquí: Pyth Compiler / Executor
Espera una lista de enteros como entrada
[-1, 3, 1, -2, 5, 2, 3, 4]
Es una traducción directa de mi programa Python:
Antigua solución: Pyth 28 char
Solo por razones de archivo.
Un código de Python correspondiente sería:
fuente
,QtQ
[QtQ)
i
no es la línea de intersección,i - 0.5
es. Y por lo tanto1
(en realidad1 - 0.5 = 0.5
) está adentro(-1, 1)
.min(a)<i<=max(a)
es equivalente amin(a) < i - 0.5 < max(a)
, que se resuelve en Pyth conmin(a) < i < max(a)+1
(aviso elh
enheSk
).g
, que es>=
, si lo reemplaza<dheSk
congeSkd
.CJam,
36 34 3330 bytesCreo que hay un mejor algoritmo en la naturaleza. Aún así, esto funciona por debajo del límite requerido para todos los casos de prueba (incluso en el compilador en línea)
La entrada es como
La salida (para el caso anterior) es
Cómo funciona
Ahora suponga que la matriz de entrada es
[-1 3 1 -2 5 2 3 4]
, los pasos de compresión se ven así:La segunda matriz en la última línea son los pliegues de la cadena.
Ahora iteramos
[-1 3 1 -2 5 2 3 4]
y calculamos el número de conjuntos en los que se encuentra cada uno de ellos. Obtenga el máximo de ese número, increméntelo y tenemos nuestra respuesta.Pruébalo en línea aquí
fuente
Matlab
(123) (97)(85)Sí, finalmente un uso para XNOR =) Estoy seguro de que se puede jugar mucho más.
Pero, sinceramente, estoy un poco avergonzado de que MatLab se esté convirtiendo en el idioma que mejor conozco = /
El tiempo de ejecución aproximado es
O(n^2)
.EDIT2:
EDITAR: Nueva versión más golfizada (incluyendo pistas de @DennisJaheruddin, ¡gracias!)
Versión antigua:
@ MartinBüttner: ¡Realmente disfruto de tus pequeños y agradables desafíos justo antes de irme a la cama!
fuente
c=sort(a)-.5
supuesto, el primer punto está fuera del rango, pero seguramente es más fácil lidiar con eso. En el peor de los casos puedes hacerloc(1)=[];
. - También puede quitar el comando disp, simplemente calculando algo lo escribirá en stdout. Finalmente, en este casonumel
puede ser reemplazado connnz
conv
enfoque ... = D. Siempre me olvido delnnz
, muchas gracias!disp
desde que alguien una vez criticado que con el método que usted propuso, también puede obtener otros caracteres (nombre de la variable oans
) por escrito a la salida estándar ...Mathematica
134 133104Divertido de resolver, a pesar del tamaño del código. Se puede seguir jugando al golf reemplazando la idea de
IntervalMemberQ[Interval[a,b],n]
cona<n<b
.Explicación
list1
la lista de puntos dadalist2
es una lista abreviada que elimina los números que no estaban en pliegues; Son irrelevantes. No es necesario hacer esto, pero conduce a una solución más clara y más eficiente.Los intervalos en
list1
ylist2
se muestran en las parcelas a continuación:Solo necesitamos probar una sola línea en cada intervalo determinado por los puntos de plegado. Las líneas de prueba son las líneas verticales discontinuas en el gráfico.
f
encuentra el número de cortes o cruces de cada línea de prueba. La línea en x = 2.5 hace 5 cruces. Eso deja 5 + 1 piezas de cuerda.fuente
Pyth, 21 bytes
Pruébalo aquí
Dar entrada como lista de estilo Python, por ejemplo
[-1, 3, 1, -2, 5, 2, 3, 4]
Estrechamente basado en el programa de @jakube, pero con un algoritmo central mejorado. En lugar de hacer una
>
verificación y una>=
verificación, hago un a.index()
en los tres números combinados y me aseguro de que el índice sea 1, lo que significa que es mayor que el mínimo y menor o igual que el máximo.fuente
R,
8683Estaba trabajando en esto y luego me di cuenta de que esencialmente había encontrado la misma solución que Optimizer y otras que sospecho.
De todos modos aquí es como una función que toma un vector
fuente
R
. FWIW podría guardar 3 caracteres utilizandoT
para "VERDADERO"GolfScript (43 bytes)
En términos de eficiencia, esto es O (n ^ 2) suponiendo que las comparaciones toman O (1) tiempo. Rompe la entrada en segmentos de línea y para cada punto de inicio cuenta los segmentos de línea medio abiertos que la cruzan.
Demostración en línea
fuente
Python - 161
Esto probablemente se puede jugar más al golf. gnibbler ayudó mucho al golf.
fuente
Rubí, 63
Similar a las soluciones de Python en concepto.
Agregue 2 caracteres antes del código, por ejemplo,
f=
si desea una función con nombre. Gracias a MarkReed .fuente
C #,
7365 bytesLeyendo las reglas, pensé que una lambda C # debería funcionar bastante bien.
Editar: ¡recién encontrado
Count
tiene una sobrecarga útil para filtrar!Puede probar esto definiendo el
delegate
tipo apropiado :Y entonces
fuente
Matlab (
6343)La entrada se da como un vector de fila pasado a la función
f
. Entonces, por ejemplo,f([-1, 3, 1, -2, 5, 2, 3, 4])
vuelve6
.Versión más corta:
Octava (31)
En Octave
bsxfun
se puede eliminar gracias a la transmisión automática:fuente
JavaScript (ES6) 80
82Ver comentarios: el recuento de bytes no incluye la asignación a F (que todavía se necesita para probar)
Prueba en la consola FireFox / FireBug
Salida
fuente
lambda
soluciones de Python , no necesita asignar el valor de la función a una variable real, por lo que puede eliminar dos caracteres.Jalea , 10 bytes
Pruébalo en línea!
Cómo funciona
fuente
05AB1E , 6 bytes
Pruébalo en línea!
Explicación:
fuente
JavaScript (Node.js) , 71 bytes
Pruébalo en línea!
fuente
Agregar ++ , 27 bytes
Pruébalo en línea!
Enfoque gracias a Zgarb por su respuesta APL
La parte clave de este desafío es implementar un comando externo del producto. Desafortunadamente, Add ++ no tiene una función integrada para hacerlo, tampoco tiene ninguna forma de definir funciones que tomen otras funciones como argumentos. Sin embargo, aún podemos hacer que un producto externo general funcione de todos modos. Como la única forma de acceder a una función dentro de otra función es haciendo referencia a una función existente, definida por el usuario o incorporada, tenemos que crear un 'incorporado' que haga referencia a dicha función.
Una función de "tabla" generalizada se vería así:
Pruébalo en línea!
donde
func
es una función diádica que contiene nuestro operando. Puede ver ligeras similitudes de esta estructura en la presentación original, al comienzo de la función w , pero aquí queremos, principalmente, una función de producto externo monádico , una función de producto externo que tome el mismo argumento en ambos lados.La función de tabla general aprovecha la forma en que
€
ach quick se acerca a las funciones diádicas. Si la pila se ve asícuando
€{func}
se encuentra, los€
estallidose
, lo vinculan como argumento izquierdo a la díada, y mapean esa función parciala, b, c, d
. Sin embargo, los€
mapas rápidos sobre toda la pila, en lugar de sobre listas. Por lo tanto, primero debemos aplanar las matrices pasadas como argumentos.La función de tabla funciona en general de esta manera
Sin embargo, podemos acortar esto bastante debido al hecho de que necesitamos que nuestra tabla externa sea monádica , y solo necesitamos aplicarla al argumento pasado. El
A
comando empuja cada argumento a la pila de forma individual, por lo que no necesitamos perder el tiempo con ninguna manipulación de la pila. En resumen, si nuestro argumento es la matriz[a b c d]
, necesitamos convertir la pila enEl valor superior es, por supuesto, el argumento. Puede haber notado en el ejemplo general que
bU
es el comando desempaquetar, es decir, salpica la matriz superior a la pila. Entonces, para hacer la configuración anterior, podemos usar el códigoPruébalo en línea!
Sin embargo, esto puede acortarse en un byte. Como un alias para
L,bU
, podemos usar la~
bandera, para salpicar los argumentos a la pila de antemano, convirtiendo nuestro ejemplo de configuración enPruébalo en línea!
que es el comienzo de la segunda línea en el programa. Ahora que hemos implementado un producto externo monádico, solo necesitamos implementar el resto del algoritmo. Una vez recuperar el resultado de mesa con
<
(menor que), y contar el número de[0 1]
y[1 0]
pares en cada fila. Finalmente, tomamos el máximo de estos recuentos y lo incrementamos.El paso completo para caminar paso a paso es
fuente