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)