Encontre a execução mais longa de true em uma lista de booleanos. Retorne a mesma lista, com todas as outras verdades falsificadas.
Entrada, saída
Uma lista; qualquer formato usual (por exemplo, uma lista delimitada como uma string).
Detalhes
Verdadeiro e falso podem ser qualquer coisa que seu idioma normalmente use para esses valores ou os números inteiros 1 e 0. Se você usar caracteres únicos, a lista poderá ser uma concatenação (por exemplo, 10001
).
Se houver um empate na corrida mais longa, mantenha todas as corridas vinculadas verdadeiras e falsifique todas as corridas mais curtas.
Exemplos
input ↦ output
1,0,1,0,1 ↦ 1,0,1,0,1
1,1,0,1,1,0,1 ↦ 1,1,0,1,1,0,0
1,1,0,1,1,1,0,1,1 ↦ 0,0,0,1,1,1,0,0,0
1,1,1 ↦ 1,1,1
0,0,1 ↦ 0,0,1
0,0 ↦ 0,0
1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,1,0,1,1,1,1,0,0,1,0 ↦ 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0
(diretamente de https://stackoverflow.com/q/37447114 )
code-golf
array-manipulation
msh210
fonte
fonte
Haskell,
59,58,55, 64 bytesNota divertida, isso funciona em qualquer lista de valores em que
falsy < truthy
. AssimFalse/True
,0/1
,'f'/'t'
, etc.Nota:
Como várias pessoas apontaram (incluindo
@proud haskeller
e@nimi
), a versão anterior falhou em uma lista de todos os valores falsos. A adição de.([1<2]:)
corrigiu isso, conforme sugerido por@proud haskeller
. Estou deixando a explicação da mesma forma por enquanto, porque acho que ainda faz sentido. Se alguém comentar, pedindo uma explicação sobre a edição, eu editarei.Explicação:
Primeiro vou desugar sem o
group
e depois adicioná-lo novamente. Primeiro, acho que as palavras costumam ser mais fáceis para os olhos do que os símbolos, então farei algumas substituições. (Observe que=<<
é 'elegante', portanto se aplica de maneira diferente a listas e funções. Estou chamandobind
a versão de=<<
for functions.)Os últimos detalhes são que
x <$ list
substitui todos os elementos delist
comx
e osgroup list
dividemlist
em partes de elementos iguais. Entãogroup [1, 1, 2, 3, 3, 3] == [[1, 1], [2], [3, 3, 3]]
.Para resumir tudo, a função divide a lista de valores em grupos somente de verdade e grupos somente de falso. Em seguida, para cada grupo, substitua cada elemento pelo resultado da declaração
this is the biggest group
(o maior grupo detrue
's será o maior) e concatene os grupos.Quatro bytes salvos por
@Zgarb
fonte
(\y->(maximum g==y)<$y)
por((<$)=<<(==maximum g))
. Eu não testei embora.f
pela função sem ponto((=<<)=<<(=<<)(<$).(==).maximum).group
. Salva três bytes e é totalmente ilegível!b=(=<<);b b(b(<$).(==).maximum).group
é um byte mais curto ainda. Eu nunca vi nada como isso antes em Haskell golfe :)(:[t])
antes do máximo ou algo semelhanteRetina,
474336.Experimente online! ou tente todos os casos de teste
Graças ao msh210 por jogar 4 bytes!
Também muito obrigado a Martin por 7 bytes!
Explicação:
Substitua todos os
0
s por!
s. Isso é feito para tornar os grupos correspondentes de1
s mais curtos, como agora1!
e!1
terá um limite de palavras (\b
) entre eles, que também corresponde ao início ou ao final da string.Esta é uma opção de configuração que diz que, após aplicar o regex após o backtick à entrada, em cada correspondência, traduza todos os caracteres ascii imprimíveis em um
0
caractere.Essa regex corresponde a grupos de
1
s que são cercados por zeros, mas não podem corresponder a um1
seguido por si mesmo em qualquer lugar da sequência. Estes são os grupos não máximos que serão falsificados. Além disso, isso também corresponde aos!
caracteres que adicionamos para convertê-los novamente em0
s.fonte
MATL, 14 bytes
Experimente Online!
Versão modificada com todos os casos de teste
Explicação
fonte
Python 2, 62 bytes
Teste em Ideone .
Como funciona
s.split('0')
divide a sequência de entrada s em execuções de zero ou mais 1 'sPara cada execução t , verificamos se
t+'1'
é uma substring de s .Se for, a execução não é máxima,
t+'1'in s
retorne True ,1-(t+'1'in s)
retorne 1 - True = 0 e a execução será substituída por uma execução de 0 do mesmo comprimento.Caso contrário, a execução é máxima,
t+'1'in s
retorne False ,1-(t+'1'in s)
retorne 1 - False = 1 e a execução será substituída por uma execução de 1 do mesmo comprimento, ou seja, por si só.Finalmente,
'0'.join
restaura todas as removidos 0 's.fonte
J, 25 bytes
Este é um verbo monádico que recebe e retorna uma matriz 0-1. Use-o assim:
Explicação
fonte
;.
.Pitão,
26242321 bytesSuíte de teste.
1/0
outrue/false
na entrada.true/false
na saída.Explicação
23 bytes anteriores
Suíte de teste.
1/0
outrue/false
na entrada.1/0
na saída.24 bytes anteriores
Suíte de teste.
1/0
outrue/false
na entrada.1/0
na saída.26 bytes anteriores
Suíte de teste.
1/0
outrue/false
na entrada.1/0
na saída.fonte
Jr.b,N&YNrQ8)9qReSJJ
ouJrm,hd*FdrQ8 9qReSJJ
. Ambas as versões economizam um byte. Ou fique ainda mais loucoJrXR1*FdrQ8 9qReSJJ
e economize dois. ;-)Oracle SQL 12.1,
137135 bytesSem golfe
A entrada usa caracteres únicos. Ex: '1100111'
fonte
Mathematica ,
4641Trabalhos em listas de
0
e1
. Eu pensei que tinha me saído muito bem até que eu olhei para as outras respostas!Explicação para a versão de 46 caracteres; Vou atualizar quando não puder melhorá-lo ainda mais.
Uma explicação desse código foi solicitada.
Um equivalente sem código de golfe (usando os formulários de operador da versão 10) é:
Isso significa uma função composta de cinco etapas (subfunções) aplicadas em ordem de cima para baixo.
Split
: divida em execuções de elementos idênticos: {1,1,0,1,1,0,1} ↦ {{1,1}, {0}, {1,1}, {0,0}}Map[# Tr@# &]
: Para cada sub-lista (Map
) multiplique (#
) pela sua soma (rastreamento de vetor,Tr
): {1,1} ↦ {2, 2}# - Max[1, #] &
subtraia de cada elemento o valor máximo que aparece em qualquer lugar da lista de listas, ou um, o que for maior. (Esse lida com o caso de todos os zeros.)UnitStep
: igual a 0 para x <0 e 1 para x> = 0, aplicado a todos os elementos.Apply[Join]
: junte as sub-listas em uma única lista. Também pode ser feito comFlatten
ouCatenate
, mas em forma abreviadaJoin@@
é mais conciso.fonte
C,
135129 bytesExperimente on-line
Ungolfed
fonte
JavaScript (ES6), 56 bytes
Funciona verificando todas as execuções de 1s e substituindo os caracteres por 0s, a menos que a execução seja (igualmente) mais longa, conforme medido pesquisando na sequência por uma execução mais longa de 1s.
Solução recursiva anterior de 72 bytes:
Não faz nada se não houver execuções de 1s (ou seja, 1s no máximo). Caso contrário, subtrai um
1
de cada um1
ou executa-os, depois se chama recursivamente nas execuções mais curtas e depois adiciona-as1
novamente nas execuções (agora igualmente mais longas). O número de chamadas recursivas é um menor que o comprimento da execução mais longa.fonte
Julia, 51 bytes
Experimente online!
Como funciona
replace
encontra todas as todas as corridas de um ou mais 1 's na entrada de string s via regexr"1+"
e chama o lambdat->map(c->c-contains(s,"1"t),t)
para determinar a seqüência de substituição.O lambda mapeia
c->c-contains(s,"1"t)
todos os caracteres na sequência dos t .Se
"1"t
(concatenação) é uma substring de s , a corrida não é maximal,contains
retorna verdadeiro ec-contains(s,"1"t)
retorna '1' - verdadeiros = '0' , substituindo todas 1 é nesse prazo com 0 's.Se
"1"t
(concatenação) não for uma substring de s , a execução será máxima,contains
retornará false ec-contains(s,"1"t)
retornará '1' - false = '1' , deixando a execução sem modificação.fonte
APL, 22 caracteres
Em inglês (da direita para a esquerda em blocos):
fonte
Java 8, 205 bytes
Esta é uma expressão lambda para um
Function<String,String>
:entrada / saída é um
String
onde true é representado por 1 e false é representado por 0. Não há caracteres delimitadores que separam os valores.código com explicação:
veja ideona para os casos de teste
fonte
Clojure, 137 bytes
Primeiro, particiona a entrada em zeros e uns consecutivos e os mapeia em "tuplas" do primeiro elemento das partições e na contagem de elementos. Em seguida, repete o número necessário de zeros ou uns, dependendo se essa é a sequência de comprimento máximo de um ou não.
Menos golfe:
fonte
Perl 5, 68 bytes
67, mais 1 para em
-pe
vez de-e
Espera e imprime uma sequência (concatenação) de 0s e 1s.
fonte