Entrada:
- Un entero
n
en el rango2 <= n <= 10
- Una lista de enteros positivos
Salida:
Convierta los enteros a su representación binaria (sin ceros a la izquierda), y únalos a todos juntos.
Luego determine todas las subcadenas binarias que forman una 'cerca binaria' usando la n
cantidad de postes de cerca. Los espacios (ceros) entre cada poste de la cerca son irrelevantes (al menos 1), pero los postes de la cerca deben tener el mismo ancho.
Aquí las expresiones regulares que las subcadenas binarias deben coincidir para cadan
:
n Regex to match to be a 'binary fence' Some examples
2 ^(1+)0+\1$ 101; 1100011; 1110111;
3 ^(1+)0+\10+\1$ 10101; 1000101; 110011011;
4 ^(1+)0+\10+\10+\1$ 1010101; 110110011011; 11110111100001111001111;
etc. etc. You get the point
Mirando los n=4
ejemplos:
1010101
^ ^ ^ ^ All fence posts have a width of one 1
^ ^ ^ with one or more 0s in between them
110110011011
^^ ^^ ^^ ^^ All fence posts have a width of two 1s
^ ^^ ^ with one or more 0s in between them
11110111100001111001111
^^^^ ^^^^ ^^^^ ^^^^ All fence posts have a width of four 1s
^ ^^^^ ^^ with one or more 0s in between them
Luego sacamos los números que usan dígitos binarios de las coincidencias 'cercas binarias'.
Ejemplo:
Entrada: n=4
,L=[85,77,71]
La representación binaria de estos enteros unidos es:
1010101 1001101 1000111
(NOTA: Los espacios solo se agregan como aclaración para el ejemplo).
Desde entonces n=4
, buscamos subcadenas que coincidan con la expresión regular (1+)0+\10+\10+\1
, en cuyo caso podemos encontrar dos:
1010101
(en la posición (1010101) 1001101 1000111
); y 11001101100011
(en la posición 101010(1 1001101 100011)1
)
La primera cerca binaria solo usa dígitos binarios de 85
, y la segunda cerca binaria usa dígitos binarios de los tres enteros. Entonces la salida en este caso sería:
[[85],[85,77,71]]
Reglas de desafío:
- Aunque también se menciona en el ejemplo anterior, la última oración es importante: sacamos los números para los que se utilizan dígitos binarios en la subcadena 'cerca binaria'.
- I / O es flexible. La entrada puede ser una lista / matriz / secuencia de enteros, espacio / coma / cadena delimitada por nueva línea, etc. La salida puede ser una lista entera en 2D, una sola cadena delimitada, una lista de cadenas, una nueva línea impresa en STDOUT, etc. Todo depende de usted, pero indique lo que ha utilizado en su respuesta.
- El orden de salida de la lista en sí es irrelevante, pero la salida de cada lista interna es, por supuesto, en el mismo orden que la lista de entrada. Entonces, con el ejemplo anterior, también
[[85,77,71],[85]]
es una salida válida, pero[[85],[77,85,71]]
no lo es. - Como ya habrás notado en el ejemplo (the
85
), los dígitos binarios se pueden usar varias veces. - Las expresiones regulares deben coincidir con la subcadena por completo. Por lo tanto,
110101
o010101
no son nunca una 'cerca binaria' válida (10101
es, sin embargo, iffn=3
). - Los elementos en la lista de salida no son únicos, solo las posiciones binarias de las 'cercas binarias' son únicas. Si se pueden crear múltiples 'cercas binarias' con los mismos enteros, los agregamos varias veces a la lista de salida.
Por ejemplo:n=2
,L=[109, 45]
(binario1101101 101101
) puede formar estas subcadenas 'valla binario':11011
(en la posición(11011)01 101101
);101
(en la posición1(101)101 101101
);11011
(en la posición110(1101 1)01101
);101
(en la posición1101(101) 101101
);11011
(en la posición110110(1 1011)01
);101
(en la posición1101101 (101)101
);101
(en la posición1101101 101(101)
), entonces la salida sería[[109],[109],[109,45],[109],[109,45],[45],[45]]
.
Otro ejemplo:n=2
,L=[8127]
(binario1111110111111
) puede formar estas subcadenas 'valla binario':1111110111111
(en la posición(1111110111111)
);11111011111
(en la posición1(11111011111)1
);111101111
(en la posición11(111101111)11
);1110111
(en la posición111(1110111)111
);11011
(en la posición1111(11011)1111
);101
(en la posición11111(101)11111
), entonces la salida sería[[8127],[8127],[8127],[8127],[8127],[8127]]
. - Si no hay salida válida es posible, puede devolver una lista vacía o algún otro tipo de salida Falsey- (
null
,false
, arroja un error, etc. Una vez más, su llamada).
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolfing. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
- Además, se recomienda agregar una explicación para su respuesta.
Casos de prueba:
Input: Output
(the binary below the output are added as clarification,
where the parenthesis indicate the substring matching the regex):
4, [85,77,71] [[85],[85,77,71]]
(1010101) 1001101 1000111; 101010(1 1001101 100011)1
2, [109,45] [[109],[109],[109,45],[109],[109,45],[45],[45]]
(11011)01 101101; 1(101)101 101101; 110(1101 1)01101; 1101(101) 101101; 110110(1 1011)01; 1101101 (101)101; 1101101 101(101)
3, [990,1,3,3023,15,21] [[990,1,3,3023],[990,1,3,3023],[1,3,3023],[21]]
(1111011110 1 11 1)01111001111 1111 10101; 11110(11110 1 11 101111)001111 1111 10101; 1111011110 (1 11 101111001111) 1111 10101; 1111011110 1 11 101111001111 1111 (10101)
2, [1,2,3,4,5,6,7,8,9,10] [[1,2,3],[2,3],[4,5],[5],[5,6,7],[6,7],[6,7],[8,9],[9],[10]]
(1 10 11) 100 101 110 111 1000 1001 1010; 1 (10 1)1 100 101 110 111 1000 1001 1010; 1 10 11 (100 1)01 110 111 1000 1001 1010; 1 10 11 100 (101) 110 111 1000 1001 1010; 1 10 11 100 10(1 110 111) 1000 1001 1010; 1 10 11 100 101 (110 11)1 1000 1001 1010; 1 10 11 100 101 1(10 1)11 1000 1001 1010; 1 10 11 100 101 110 111 (1000 1)001 1010; 1 10 11 100 101 110 111 1000 (1001) 1010; 1 10 11 100 101 110 111 1000 1001 (101)0
3, [1,2,3,4,5,6,7,8,9,10] [[4,5],[8,9]]
1 10 11 (100 101 )110 111 1000 1001 1010; 1 10 11 100 101 110 111 (1000 1001) 1010
10, [1,2,3,4,5,6,7,8,9,10] []
No binary fences are possible for this input
6, [445873,2075] [[445873,2075],[445873,2075],[445873,2075]]
(1101100110110110001 1)00000011011; 110(1100110110110001 100000011)011; 1101100(110110110001 100000011011)
2, [8127] [[8127],[8127],[8127],[8127],[8127],[8127]]
(1111110111111); 1(11111011111)1; 11(111101111)11; 111(1110111)111; 1111(11011)1111; 11111(101)11111
2, [10,10] [[10],[10,10],[10]]
(101)0 1010; 10(10 1)010; 1010 (101)0
4, [10,10,10] [[10,10],[10,10,10],[10,10]]
(1010 101)0 1010; 10(10 1010 1)010; 1010 (1010 101)0
fuente
[1,2,3]
válido para el caso de prueba 4? Veo la cerca(1 10 11)
2, [10, 10]
que debería traducirse en[[10],[10,10],[10]]
si entiendo el desafío correctl.yRespuestas:
Casco , 33 bytes
Pruébalo en línea!
Pasa todos los casos de prueba. Este fue un desafío difícil y mi solución se siente algo complicada.
Explicación
El programa recorre los segmentos de la entrada y los repite tantas veces como contiene una coincidencia de la expresión regular. Queremos contar solo aquellas coincidencias que se superponen a la expansión binaria de cada número en el segmento. Esto parece difícil, pero es más fácil contar esas coincidencias que no usan el primer número: simplemente elimine ese número y cuente todas las coincidencias. Para obtener las buenas coincidencias, contamos todas las coincidencias, luego restamos el número de coincidencias que no usan el primer número y las que no usan el último número. Las coincidencias que no usan ninguno se cuentan dos veces, por lo que debemos agregarlas nuevamente para obtener el resultado correcto.
Contar el número de coincidencias en un segmento es cuestión de concatenar las expansiones binarias y recorrer los segmentos del resultado. Como Husk no tiene soporte para expresiones regulares, usamos la manipulación de listas para reconocer una coincidencia. La función
g
divide una división en grupos de elementos adyacentes iguales. Luego debemos verificar lo siguiente:n
.Primero cortamos los grupos en pares. Si 1 y 2 se mantienen, entonces el primer grupo de cada par es un grupo 1 y el último par es un singleton. Luego reducimos esta lista de pares comprimiéndolos con la suma de componentes. Esto significa que los grupos 1 y 0 se agregan por separado. La adición conserva elementos que se desbordan, por lo que agrega
[1,1,1]
y[1,1]
da[2,2,1]
. La compresión no lo hace, así que si el último par es un singleton, la suma componente de los grupos 0 desaparece del resultado. Finalmente, verificamos que todos los números en el resultado sean iguales an
.fuente
Perl 6 ,
114,112,110,107,106,104 bytesPruébalo en línea!
Explicación
fuente
JavaScript (ES6),
187184177173 bytesToma entrada como
(n)(list)
. Devuelve una matriz de matrices.Pruébalo en línea!
¿Cómo?
Primero calculamos la cadena binarias y una lista si que describe los límites de cada número en s .
Ejemplo:
Utilizamos la siguiente plantilla para generar una expresión regular que coincida con vallas binarias:
Esta expresión regular se aplica as , comenzando desde una posición pag .
Empezamos conp = 0 y actualícelo en cada iteración de acuerdo con la posición de la coincidencia anterior.
Cada vez que un partidometro se encuentra en s : para cada yo -th número en la matriz de entrada, probamos si el intervalo está hecho de sus límites (almacenado en si ) se superpone al intervalo realizado de las posiciones inicial y final de metro en s .
fuente
Python 2 ,
271246223214208202200195 bytesPruébalo en línea!
fuente
Python 2 , 182 bytes
Pruébalo en línea!
fuente
n
entrada mayor que 2. Además, incluso conn=2
eso da un resultado incorrecto para el caso de prueban=2, L=[10,10]
. Sinn=2
embargo, los otros casos de prueba con trabajo.[10,10]
; déjame ver lo costoso que es arreglar eso ...05AB1E ,
3836 bytesInspirado por la respuesta Husk de @Zgarb .
Salida de las listas delimitadas por nueva línea.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente