Escriba un programa para determinar si una secuencia periódica de enteros positivos tiene la propiedad de que, por cada entero que nocurre en la secuencia, nunca hay más que notros 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 2tener como máximo dos enteros entre ellas (como 2, 3, 5, 2y 2, 3, 6, 2; cada par de ocurrencias consecutivas de 3tener como máximo tres enteros entre ellas; y lo mismo para 5y 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
aser el jefe de la lista ybla cola. El resultado esTruesibestá vacío o el número de elementos al principio debque no son iguales aano es mayor queay la llamada recursiva def bes 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
spanes más corto que usartakeWhile, así que no lo miré en absoluto.takeWhilecasi siempre se puede acortar afst$spanofst.span, lo que ahorra otro byte.Python ,
5756 bytes-1 bytes gracias a Dennis (reemplace
i+1:i+v+2coni:i-~vcon unidesplazamiento de 1 aenumerate)Pruébalo en línea!
Función sin nombre que toma una lista,
ay probar la condición de que cada valor,vapareceinla rebanada pertinente a su derecha en una concatenación deaconsigo mismo,(a+a)[i:i-~v], donde el índice basado en 1 devena,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
acomo entrada. Luego, el.somemétodo itera sobre esa matriz, ejecutando otra función para cada elemento.Esta función interna toma dos argumentos,
byc, 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.somefunción también regresatrue. Si ninguno de los cheques regresatrue, la.somefunció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
1de falsedad,0de verdad.Corre con
-nr.$na 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 él0mismo). Esto es efectivamente una negación lógica de la salida.fuente
JavaScript (ES6), 47 bytes
Cómo funciona
Reutilizamos la matriz de entrada
apara almacenar la posición de la última aparición encontrada de cada enteroa. Usamos la tecla-npara 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 == NaNy la comparación con~nsiempre 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
0para falso y1para 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
nno seguidos porn+1otros números diferentes.Para hacerlo, primero hacemos coincidir el número, capturando cada uno
1en 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
_1que 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