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)
code-golf
array-manipulation
Michael Klein
fonte
fonte
Respostas:
Pitão,
1716 bytesUsa um contador mágico pós-atribuição sofisticado, juntamente com a codificação da duração da execução.
Toma de entrada como uma série de
0
s e1
s, por exemplo[1, 1, 0, 1, 0]
. Resultados como no desafio, por exemplo[[0, 1], [3, 3]]
.Suíte de teste
fonte
Pitão, 18 bytes
Suíte de teste
True é representado como
1
, False como0
.As faixas são representadas inclusive.
fonte
Retina ,
823427 bytesA linha vazia deve conter um único espaço.
Input é uma sequência plana de
_
para true e:
false. A saída é pares separados por espaço, cada um em uma linha separada.Experimente online.
Explicação
O golfe pesado de 82 até 27 bytes foi possível pela escolha inteligente da representação de verdadeiro e falso. Eu escolhi um caractere de palavra
_
, (que não é um dígito) para verdadeiro e um caractere:
que não seja de palavra (que não precisa ser escapado) para falso. Isso me permite detectar os fins dos intervalos como limites de palavras.Combinamos um limite de palavras. Queremos substituir esse limite pelo índice correspondente do valor de verdade. Em princípio, isso é bastante fácil com o
$#
recurso recente de Retina , que conta o número de capturas de um grupo. Simplesmente capturamos cada personagem na frente dessa posição em um grupo. Contando esses caracteres, obtemos a posição. O único problema é que as extremidades do intervalo estão fora de um agora. Na verdade, queremos o índice do personagem na frente da partida. Isso também é facilmente corrigido combinando opcionalmente um_
que não é capturado, pulando um caractere quando estamos no final de um intervalo.Agora substituímos todas as execuções de sublinhados por um espaço. Ou seja, inserimos um espaço entre o início e o final de cada intervalo, enquanto nos livramos dos sublinhados.
Isso deixa os dois pontos (e ainda precisamos separar os pares). Fazemos isso dividindo a cadeia inteira em linhas ao redor de cada dois pontos. Os
S
ativos modo de dividir, e os_
Suprime segmentos vazios de tal forma que não recebem toneladas de linhas vazias quando temos corridas de dois pontos.fonte
Python 2, 69 bytes
Exemplo de saída:
Uma abordagem direta, sem built-ins. Rastreia o valor atual
x
e o valor anteriorp
. Quando estes são diferentes, mudamos de execução. Ao mudar0
para1
, imprime o índice atuali
. Ao alternar1
para0
, imprime o índice atual menos um seguido por ponto e vírgula.O
if
é muito fedido. Talvez a recursão fosse melhor,fonte
MATL , 17
1820bytesUsos a versão atual (9.1.0) do idioma / compilador.
Entrada é uma sequência que contém caracteres
T
eF
. A saída é uma tabela de duas linhas, em que cada coluna indica um intervalo usando a indexação 1, que é o padrão do idioma.Agradecimentos a Stewie Griffin por remover 2 bytes.
Exemplo
Explicação
É baseado em uma simples expressão regular:
fonte
Oitava, 43 bytes
find(diff([0,x,0]))
localiza todas as posições em que a matriz de entrada muda entre verdadeiro e falso. Ao remodelar isso em uma matriz de 2 por n, conseguimos duas coisas: As alterações de verdadeiro para falso e de falso para verdadeiro são divididas em duas linhas. Isso torna possível subtrair 1 e 2 de cada uma dessas linhas. Subtrair 1 da linha um é necessário porque a oitava é indexada em 1, e não em zero. Subtrair 2 da linha dois é necessário porque ofind(diff())
encontra a posição do primeiro valor falso, enquanto queremos o último valor verdadeiro. A parte de subtração só é possível no Octave, não no MATLAB.fonte
CJam,
2725 bytesEspera entrada como
TTFTFT
. Experimente online .Explicação
fonte
Japonês,
343125 bytesTentando uma nova abordagem realmente funcionou desta vez.
Experimente online!
Input é uma string com
F
forfalse
eT
fortrue
. Saída é uma matriz de matrizes; a representação da string faz com que pareça uma única matriz.Como funciona
Nota: Agora vejo que várias pessoas já criaram esse algoritmo, mas eu o descobri de forma independente.
Versão não concorrente, 22 bytes
No último commit do GitHub , adicionei um novo recurso: um líder
;
define as variáveisA-J,L
com valores diferentes.A
é definido como uma matriz vazia, eliminando assim a necessidade de criá-lo manualmente.fonte
Haskell, 74 bytes
Exemplo de uso:
map(\l->(fst$l!!0,fst$last l)).wordsBy(not.snd).zip[0..] $ [True,False,True,True,False]
->[(0,0),(2,3)]
.Como funciona:
fonte
J, 26 bytes
Este é um verbo monádico sem nome (função unária) que retorna uma matriz ou números 2D. É usado da seguinte maneira.
Explicação
fonte
Ruby, 39
Chamada de amostra:
O
..
é como rubi representa intervalos inclusivos.A única coisa interessante aqui é como eu recebo o índice do final do intervalo. É estranho. Crio dinamicamente uma expressão regular que corresponde ao último caractere do intervalo e, em seguida, todos os caracteres subseqüentes e o final da string para forçar a correspondência correta. Então eu uso
=~
para obter o índice desse regex na string original.Suspeita que possa haver uma maneira mais curta de fazer isso no Ruby usando os sinalizadores -naF.
fonte
JavaScript (ES6), 59
Uma função anônima, entrada como uma sequência de
T
eF
retornando a saída como uma matriz de matrizesTESTE
fonte
18, 18 caracteres / 28 bytes
Try it here (Firefox only).
Explicação
fonte
Haskell, 62 bytes
Toma como entrada uma lista de 0 e 1.
Dada a lista
l
, a preenche com 0 em ambos os lados e calcula a lista indexada de pares consecutivos. Por exemploEm seguida, extraia os índices correspondentes aos elementos consecutivos
(0,1)
e(1,0)
, que são o início dos blocos de 0 e 1, subtraindo 1 do início de 0 para obter o final de 1 e feche os resultados.fonte
f l=(\s->zip[i|(i,0,1)<-s][i-1|(i,1,0)<-s])$zip3[0..](0:l)$l++[0]
.Pitão,
1918 bytesExplicação:
Experimente aqui .
fonte
Perl, 47 bytes
Com as seguintes opções de perlrun
-lpe
:Alternativa em que a saída é separada por linha (34 bytes):
fonte
Python 2, 108 bytes
Casos de teste:
Certamente, existe uma solução mais curta que essa, mas funciona.
fonte
Haskell: 123 bytes (exemplo, não é possível vencer)
Menos golfe:
fonte
allTrue s e = and (subList s e)
ou talvezallTrue = (and.) . sublist
.all (==True) (subList s e)
é muito claro.CJam, 30 bytes
De entrada como um arranjo de estilo CJam de
0
s e1
s. Saída como uma matriz de pares no estilo CJam.Execute todos os casos de teste. (Cuida da conversão dos formatos de entrada.)
fonte
Japonês, 27 bytes
Tem que haver uma maneira de jogar golfe ...
Enfim, é o mesmo que a minha resposta.
fonte
APL, 17 caracteres
Em
⎕IO←0
e⎕ML←3
. Em inglês:⍵×⍳⍴⍵
: zere os elementos do vetor de índice, contanto que o argumento em que o argumento seja falso⍵⊂
: cortar no início de cada série de verdades e jogar fora as falsas(↑,↑∘⊖)¨
: pegue o primeiro e o último elemento de cada sub-matrizfonte
PowerShell, 82 bytes
Solução Regex, usando MatchInfo as propriedades do objeto .
Exemplo
fonte
Mathematica, 45 bytes
Não é particularmente interessante; usa um builtin.
fonte
Clojure, 109 caracteres
A primeira coisa que me veio à mente, baseada
reduce
epartition-by
.Caso de teste simples (mapeia
T
paratrue
eF
parafalse
):fonte