Reto:
Escriba una función o programa que acepte una lista de valores booleanos y devuelva todos los rangos de True.
Casos de prueba:
f [F] = []
f [T] = [[0,0]]
f [T,T,F,T] = [[0,1],[3,3]]
f [F,T,T,F,F,T,T,T] = [[1,2],[5,7]]
f [F,T,T,F,F,F,T,T,T,T] = [[1,2],[6,9]]
f [T,T,F,F,F,T,T,T,T,T,T,T,T,T,T,F] = [[0,1],[5,14]]
f [F,F,T,T,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T] = [[2,3],[12,19],[33,54],[93,94]]
Reglas:
- Puede elegir cómo se codifica la entrada, por ejemplo, una lista, matriz, cadena, etc.
- La salida debe codificarse como una lista de me gusta de lista o una cadena que lo muestre, por lo que matrices, listas, tuplas, matrices, vectores, etc.
- Los valores booleanos deben codificarse como constantes, pero de lo contrario se permite cualquier conversión simple de T / F a las constantes deseadas
- EDITAR: eval o similar durante el tiempo de ejecución está permitido.
- No olvides explicar cómo se pasa la entrada al programa / función y dar su entrada / salida para los casos de prueba
- Conversión al formato de entrada deseado sin contar
- Las lagunas estándar no están permitidas
- Si su idioma tiene una función para hacer esto, no está permitido
- No aceptaré mi propia presentación
- EDITAR: El formato de salida es flexible. Si no se imprime una lista o similar, los valores de rango deben estar separados por un carácter no numérico y también por separado.
Tanteo:
- La puntuación está en bytes, a menos que no sea adecuada para su idioma (como los códeles en Piet)
- La puntuación más baja gana
Hay una buena flexibilidad en la entrada y salida, pero las soluciones en las que T / F se reemplazan con funciones que hacen todo el trabajo no están permitidas.
Depuración
Si escribe el suyo en Haskell o puede llamarlo desde Haskell, lo siguiente verificará su función / programa:
import Test.QuickCheck
tf = cycle [True,False]
gen l = foldl (++) [] $ map (\i -> [tf!!i | x<-[1..i]]) l
putIn (a,b) l = zipWith (||) l [(a <= p) && (p <= b) | p <- [0..length l]]
putAllIn rs len = foldr putIn [False|i<-[1..len]] rs
main = print $ quickCheck (check functionNameGoesHere)
code-golf
array-manipulation
Michael Klein
fuente
fuente
Respuestas:
Pyth,
1716 bytesUtiliza un poco de magia de contador post-asignación elegante junto con la codificación de longitud de ejecución.
Toma de entrada como una matriz de
0
s y1
s, por ejemplo[1, 1, 0, 1, 0]
. Salidas como en el desafío, por ejemplo[[0, 1], [3, 3]]
.Banco de pruebas
fuente
Pyth, 18 bytes
Banco de pruebas
Verdadero se representa como
1
, Falso como0
.Los rangos están representados inclusivamente.
fuente
Retina ,
823427 bytesLa línea vacía debe contener un solo espacio.
La entrada es una cadena plana de
_
para verdadero y:
para falso. La salida es pares separados por espacios, cada uno en una línea separada.Pruébalo en línea.
Explicación
El golf pesado de 82 a 27 bytes fue posible mediante la elección inteligente de la representación de verdadero y falso. Elegí un carácter de palabra
_
, (que no es un dígito) para verdadero y un carácter que no es de palabra,,:
(que no necesita escapar) para falso. Eso me permite detectar los extremos de los rangos como límites de palabras.Hacemos coincidir un límite de palabra. Queremos reemplazar ese límite con el índice correspondiente del valor de verdad. En principio, eso es bastante fácil con la
$#
característica reciente de Retina , que cuenta el número de capturas de un grupo. Simplemente capturamos a cada personaje frente a esa posición en un grupo. Al contar esos personajes obtenemos la posición. El único inconveniente es que los extremos del rango están desactivados por uno ahora. De hecho, queremos el índice del personaje delante del partido. Eso también se soluciona fácilmente al hacer coincidir opcionalmente un_
que no se captura, omitiendo así un personaje cuando estamos al final de un rango.Ahora reemplazamos todas las series de guiones bajos con un espacio. Es decir, insertamos un espacio entre el principio y el final de cada rango, mientras eliminamos los guiones bajos.
Eso deja los dos puntos (y aún necesitamos separar pares). Hacemos eso dividiendo la cadena completa en líneas alrededor de cada colon. El
S
modo dividido activo, y_
suprime los segmentos vacíos de modo que no se obtienen toneladas de líneas vacías cuando tenemos series de dos puntos.fuente
Python 2, 69 bytes
Salida de ejemplo:
Un enfoque directo, no incorporado. Rastrea el valor actual
x
y el valor anteriorp
. Cuando estos son diferentes, hemos cambiado de ejecución. Al cambiar0
a1
, imprime el índice actuali
. Al cambiar1
a0
, imprime el índice actual menos uno seguido de un punto y coma.El
if
es bastante maloliente. Quizás la recursión sería mejorfuente
MATL , 17
1820bytesUtiliza la versión actual (9.1.0) del lenguaje / compilador.
La entrada es una cadena que contiene caracteres
T
yF
. La salida es una tabla de dos filas, donde cada columna indica un rango que utiliza la indexación 1, que es el idioma predeterminado.Gracias a Stewie Griffin por eliminar 2 bytes.
Ejemplo
Explicación
Se basa en una expresión regular simple:
fuente
Octava, 43 Bytes
find(diff([0,x,0]))
encuentra todas las posiciones donde la matriz de entrada cambia entre verdadero y falso. Al transformar esto en una matriz de 2 por n, logramos dos cosas: los cambios de verdadero a falso y de falso a verdadero se dividen en dos filas. Esto hace posible restar 1 y 2 de cada una de esas filas. Restar 1 de la fila uno es necesario porque Octave está indexado 1, no indexado a cero. Restar 2 de la fila dos es necesario porquefind(diff())
encuentra la posición del primer valor falso, mientras que queremos el último valor verdadero. La parte de resta solo es posible en Octave, no en MATLAB.fuente
CJam,
2725 bytesEspera entrada como
TTFTFT
. Pruébalo en línea .Explicación
fuente
Japt,
343125 bytesIntentar un nuevo enfoque realmente funcionó esta vez.
Pruébalo en línea!
La entrada es una cadena con
F
forfalse
yT
fortrue
. La salida es una matriz de matrices; la representación de cadena hace que se vea como una sola matriz.Cómo funciona
Nota: Ahora veo que varias personas ya habían ideado este algoritmo, pero lo descubrí de forma independiente.
Versión no competitiva, 22 bytes
En la última confirmación de GitHub , agregué una nueva característica: un líder
;
establece las variablesA-J,L
en diferentes valores.A
se establece en una matriz vacía, lo que elimina la necesidad de crearlo manualmente.fuente
Haskell, 74 bytes
Ejemplo de uso:
map(\l->(fst$l!!0,fst$last l)).wordsBy(not.snd).zip[0..] $ [True,False,True,True,False]
->[(0,0),(2,3)]
.Cómo funciona:
fuente
J 26 bytes
Este es un verbo monádico sin nombre (función unaria) que devuelve una matriz 2D o enteros. Se usa de la siguiente manera.
Explicación
fuente
Ruby, 39
Invocación de muestra:
El
..
es como rubíes representa rangos inclusivos.Lo interesante aquí es cómo obtengo el índice del final del rango. Es raro. Creo dinámicamente una expresión regular que coincide con el último carácter del rango, y luego todos los caracteres posteriores y el final de la cadena para forzar la coincidencia correcta. Luego uso
=~
para obtener el índice de esa expresión regular en la cadena original.Sospeche que podría haber una forma más corta de hacer esto en Ruby usando las banderas -naF.
fuente
JavaScript (ES6), 59
Una función anónima, ingresada como una cadena de
T
yF
, devolviendo la salida como una matriz de matricesPRUEBA
fuente
𝔼𝕊𝕄𝕚𝕟, 18 caracteres / 28 bytes
Try it here (Firefox only).
Explicación
fuente
Haskell, 62 bytes
Toma como entrada una lista de 0 y 1.
Dada la lista
l
, la rellena con 0 en ambos lados y calcula la lista indexada de pares consecutivos. Por ejemploLuego, extraiga los índices correspondientes a elementos consecutivos
(0,1)
y(1,0)
, que son los inicios de bloques de 0 y 1, restando 1 de los inicios de 0 para obtener los extremos de 1, y comprime los resultados.fuente
f l=(\s->zip[i|(i,0,1)<-s][i-1|(i,1,0)<-s])$zip3[0..](0:l)$l++[0]
.Pyth,
1918 bytesExplicación:
Pruébalo aquí .
fuente
Perl, 47 bytes
Con las siguientes opciones de perlrun
-lpe
:Alternativa donde la salida está separada por líneas (34 bytes):
fuente
Python 2, 108 bytes
Casos de prueba:
Seguramente hay una solución más corta que esta, pero funciona.
fuente
Haskell: 123 bytes (Ejemplo, no puede ganar)
Menos golfizado:
fuente
allTrue s e = and (subList s e)
o tal vezallTrue = (and.) . sublist
.all (==True) (subList s e)
es muy claro.CJam, 30 bytes
Ingrese como una matriz de estilo CJam de
0
sy1
s. Salida como una matriz de pares estilo CJam.Ejecute todos los casos de prueba. (Se encarga de la conversión de los formatos de entrada).
fuente
Japt, 27 bytes
Tiene que haber una manera de jugar golf ...
De todos modos, es lo mismo que mi respuesta 𝔼𝕊𝕄𝕚𝕟.
fuente
APL, 17 caracteres
En
⎕IO←0
y⎕ML←3
. En inglés:⍵×⍳⍴⍵
: pone a cero los elementos del vector índice siempre que el argumento donde el argumento sea falso⍵⊂
: corta al comienzo de cada serie de verdades y tira las falsas(↑,↑∘⊖)¨
: toma el primer y último elemento de cada submatrizfuente
PowerShell, 82 bytes
Solución de expresiones regulares, utilizando las propiedades del objeto MatchInfo .
Ejemplo
fuente
Mathematica, 45 bytes
No particularmente interesante; usa un incorporado.
fuente
Clojure, 109 caracteres
Lo primero que me vino a la mente, basado en
reduce
ypartition-by
.Caso de prueba sencilla (mapea
T
atrue
yF
afalse
):fuente