Desafio:
Escreva uma função ou programa que aceite uma lista de valores booleanos e retorne todos os intervalos de True.
Casos de teste:
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]]
Regras:
- Você pode escolher como a entrada é codificada, por exemplo, uma lista, matriz, string, etc.
- A saída deve ser codificada como uma lista de gostos de lista ou uma sequência que mostre tais matrizes, listas, tuplas, matrizes, vetores, etc.
- Os valores booleanos devem ser codificados como constantes, mas, caso contrário, qualquer conversão simples de T / F para constantes desejadas é permitida
- EDIT: eval ou similar durante o tempo de execução é permitido.
- Não se esqueça de explicar como a entrada é passada para o programa / função e fornecer sua entrada / saída para os casos de teste
- Conversão para o formato de entrada desejado não contado
- As brechas padrão não são permitidas
- Se seu idioma tem uma função para fazer isso, não é permitido
- Não aceitarei minha própria inscrição
- EDIT: O formato de saída é flexível. Se não estiver imprimindo uma lista ou semelhante, os valores dos intervalos devem ser separados por um caractere não numérico e também por intervalos separados.
Pontuação:
- A pontuação está em bytes, a menos que não seja adequado ao seu idioma (como codels em Piet)
- Menor pontuação ganha
Há um pouco de flexibilidade na entrada e na saída, mas as soluções em que o T / F é substituído por funções que fazem todo o trabalho são proibidas.
Depuração:
Se você escreve o seu em Haskell ou pode chamá-lo em Haskell, o seguinte irá verificar sua função / 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)