Escriba un programa para determinar si una secuencia periódica de enteros positivos tiene la propiedad de que, por cada entero que n
ocurre en la secuencia, nunca hay más que n
otros enteros entre dos ocurrencias consecutivas n
.
Por ejemplo, 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
tiene esta propiedad: cada par de ocurrencias consecutivas de 2
tener como máximo dos enteros entre ellas (como 2, 3, 5, 2
y 2, 3, 6, 2
; cada par de ocurrencias consecutivas de 3
tener como máximo tres enteros entre ellas; y lo mismo para 5
y 6
.
Sin embargo, 2, 3, 5, 2, 3, 4, 2, 3, 5, 2, 3, 4, ...
no tiene esta propiedad: dos ocurrencias consecutivas de 4
, a saber 4, 2, 3, 5, 2, 3, 4
, tienen más de cuatro enteros entre ellas.
Entrada : una representación razonable de una secuencia periódica de enteros positivos. Por ejemplo, una lista finita como {2, 3, 5, 2, 3, 6}
puede representar la primera secuencia infinita 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
anterior. (Para el caso, el problema podría plantearse para listas finitas que se envuelven en lugar de para listas periódicas infinitas).
Salida : un valor verdadero / falso.
Ejemplos verdaderos:
{1}
{8, 9}
{2, 3, 4}
{5, 5, 3, 3, 6}
{2, 3, 5, 2, 3, 6}
{6, 7, 3, 5, 3, 7}
{9, 4, 6, 7, 4, 5}
{1, 1, 1, 1, 1, 100, 1}
{1, 9, 1, 8, 1, 7, 1, 11}
Falsy ejemplos:
{1, 2, 3}
{2, 3, 9, 5}
{3, 5, 4, 4, 6}
{2, 3, 5, 2, 3, 4}
{3, 5, 7, 5, 9, 3, 7}
{5, 6, 7, 8, 9, 10, 11}
{1, 9, 1, 8, 1, 6, 1, 11}
Este es codegolf , por lo que gana el código más corto. Se alientan las respuestas en todos los idiomas.
fuente
Respuestas:
Haskell
60 60575655 bytesAsume que la lista de entrada contiene al menos un elemento.
Ejemplo de uso:
g [1]
->True
. Pruébalo en línea!Deje
a
ser el jefe de la lista yb
la cola. El resultado esTrue
sib
está vacío o el número de elementos al principio deb
que no son iguales aa
no es mayor quea
y la llamada recursiva def b
es tambiénTrue
, de lo contrarioFalse
. Comience con el doble de la lista de entrada.Editar: @Leo guardó 3 bytes. ¡Gracias!
Edición 2: @Laikoni guardó 1 byte. ¡Gracias!
fuente
span
es más corto que usartakeWhile
, así que no lo miré en absoluto.takeWhile
casi siempre se puede acortar afst$span
ofst.span
, lo que ahorra otro byte.Python ,
5756 bytes-1 bytes gracias a Dennis (reemplace
i+1:i+v+2
coni:i-~v
con uni
desplazamiento de 1 aenumerate
)Pruébalo en línea!
Función sin nombre que toma una lista,
a
y probar la condición de que cada valor,v
aparecein
la rebanada pertinente a su derecha en una concatenación dea
consigo mismo,(a+a)[i:i-~v]
, donde el índice basado en 1 dev
ena
,i
, es proporcionado porenumerate(a,1)
.fuente
JavaScript (ES6),
67 65 55 54 5149 bytesAhorro 3B gracias a @ETHproductions y 2B gracias a @Arnauld
Explicación
Esto define una función que toma una matriz
a
como entrada. Luego, el.some
método itera sobre esa matriz, ejecutando otra función para cada elemento.Esta función interna toma dos argumentos,
b
yc
, el valor actual y su índice. La función encuentra el índice del valor actual, comenzando por el índicec + 1
. Luego verifica si este índice es mayor que el valor actual más el índice actual (la diferencia entre dos ocurrencias del mismo valor es mayor queb
). Tenga en cuenta que esto devuelve exactamente lo contrario de lo que queremos.Si uno de estos valores de retorno es
true
, la.some
función también regresatrue
. Si ninguno de los cheques regresatrue
, la.some
función regresafalse
. Una vez más, lo contrario del valor que queremos devolver, por lo que este resultado se niega y luego se devuelve.Pruébalo
Pruebe todos los casos de prueba aquí:
fuente
.shift()
para guardar en el segmento:a=>!a.some(b=>z.indexOf(z.shift())>b,z=a.concat(a))
a=>!a.some((n,i)=>a.concat(a).indexOf(n,++i)>n+i)
?Jalea , 11 bytes
Pruébalo en línea!
Cómo funciona
fuente
Jalea , 8 bytes
Insipred by @ JonathanAllan's Python answer .
Pruébalo en línea!
Cómo funciona
fuente
SWI-Prolog, 83 bytes
La lista debe ingresarse dos veces:
Si esto no se considera aceptable, puede agregar el predicado
que agrega 14 bytes adicionales.
Pruébalo en línea
nb: puede probar diferentes casos falsos a la vez separando sus consultas con ';' (o) y pruebe diferentes casos verdaderos separándolos con ',' (y)
es decir, usando los ejemplos de OP:
y
fuente
PHP, 52 bytes
toma secuencia de argumentos de línea de comando; sale con código
1
de falsedad,0
de verdad.Corre con
-nr
.$n
a través de argumentos:, no haga nada, de lo contrario salga con el código
1
$$n
( variables variables )0
(implícito)fuente
Retina , 50 bytes
Ingrese como una lista de números unarios separados por comas.
Pruébalo en línea!
Explicación
Duplique la entrada para que podamos verificar los pasos que se ajustan al final.
Empareje y devuelva cada sección (la más corta) entre dos valores idénticos, por ejemplo
11,111,1,11
.Repetidamente elimine un dígito del primer número, junto con un número entero después de él. Si el espacio es lo suficientemente pequeño, esto eliminará por completo el primer número. De lo contrario, quedará al menos un dígito.
Cuente con qué frecuencia
1,
aparece en todas las líneas. Si aparece en alguna parte, uno de los pasos era demasiado ancho.Intente hacer coincidir un número que comience con
0
(es decir, solo él0
mismo). Esto es efectivamente una negación lógica de la salida.fuente
JavaScript (ES6), 47 bytes
Cómo funciona
Reutilizamos la matriz de entrada
a
para almacenar la posición de la última aparición encontrada de cada enteroa
. Usamos la tecla-n
para almacenar esta posición para que no interfiera con los índices originales dea
.Cuando
a[-n]
existe, se produce la prueba real. Cuandoa[-n]
no existe, la expresióna[-n] - (a[-n] = i)
es igualundefined - i == NaN
y la comparación con~n
siempre es falsa, que es el resultado esperado.Casos de prueba
Mostrar fragmento de código
fuente
Retina ,
4139 bytes2 bytes de golf gracias a Martin Ender, que por cierto me presentó a equilibrar grupos con su fantástica guía sobre SO
La entrada es una lista separada por comas de números unarios. La salida es
0
para falso y1
para verdadero.Pruébalo en línea! (Conjunto de pruebas que convierte automáticamente de decimal)
Recientemente aprendí sobre el equilibrio de grupos, así que quería probarlos. No se encuentran entre las herramientas más fáciles de usar, pero seguro que son poderosas.
Explicación
Como hacen muchas otras presentaciones, duplicamos la lista para tratar el ajuste. También agregamos una coma al final, para que cada número sea seguido por una coma (esto hace las cosas un poco más fáciles más adelante)
Aquí es donde las cosas se ponen interesantes. Esta es una etapa de reemplazo, reemplazamos todo lo que coincida con la primera línea con la segunda línea, en este caso, buscamos eliminar todos los números
n
no seguidos porn+1
otros números diferentes.Para hacerlo, primero hacemos coincidir el número, capturando cada uno
1
en un grupo (capturando el grupo número 2 en este caso). Luego, con una anticipación positiva, para tener una afirmación de ancho cero, tratamos repetidamente de hacer coincidir en un grupo de equilibrio-2
, que no tendrá éxito más que el número de capturas realizadas por grupo2
, un número seguido de una coma. Después de esta secuencia de números, estamos satisfechos si alcanzamos el primer número nuevamente o el final de la línea.Nota: esta expresión podría coincidir solo con la parte final de un número, si no logra encontrar una coincidencia con el número completo. Esto no es un problema, porque entonces la primera parte del número permanecerá en la cadena y sabremos que el reemplazo no tuvo éxito por completo.
Finalmente, el resultado debería ser verdadero si eliminamos completamente todos los números de la lista. Intentamos hacer coincidir la cadena vacía y devolver el número de coincidencias encontradas.
fuente
\b
. Eliminarlo provocará coincidencias parásitas, pero no podrán eliminar todo el número, por lo que no terminará con una cadena vacía de todos modos.Jalea , 11 bytes
Pruébalo en línea!
fuente
Python 3 , 101 bytes
Pruébalo en línea!
fuente
Röda , 50 bytes
Pruébalo en línea!
¡Finalmente! He estado esperando para este desafío ...
Es una función que devuelve un valor verdadero o falso. Se necesita un argumento, la matriz.
Se itera sobre una secuencia de índices y verifica para cada índice
_1
que la distancia del índice actual y el índice siguientea[_1]
no sea mayor quea[_1]
.fuente
_1
?_
, pero se refiere al primer valor extraído. Si hubiera usado múltiples_
s, cada uno habría obtenido un valor separado. Por ejemplo,[1, 2, 3] | print(_, _, _)
imprime123
, pero[1,2,3] | print(_, _1, _1)
imprime111 222 333
(en líneas separadas).05AB1E , 13 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente