Introdução
Todos os anos, a Dyalog Ltd. realiza uma competição estudantil. O desafio é escrever um bom código APL. Esta é uma edição de código-golfe independente de idioma do oitavo problema deste ano.
Tenho permissão explícita para postar esse desafio aqui, do autor original da competição. Sinta-se livre para verificar, seguindo o link fornecido e entrando em contato com o autor.
Problema
Dada uma lista booleana *, "desative" todas as verdades após a primeira verdade.
Sem verdades? Sem problemas! Basta retornar a lista sem modificações.
Exemplos
[falsy,truthy,falsy,truthy,falsy,falsy,truthy]
→ [falsy,truthy,falsy,falsy,falsy,falsy,falsy]
[]
→ []
[falsy,falsy,falsy,falsy]
→ [falsy,falsy,falsy,falsy]
* Todas as suas verdades devem ser idênticas e todas as suas falsidades devem ser idênticas. Isso inclui saída.
Respostas:
Python 2 , 35 bytes
Experimente online! Entrada e saída são linhas de Verdadeiro / Falso.
Baseado na solução de Dennis . Redefine a variável
True
a serFalse
depois que umaTrue
entrada é encontrada. Dessa forma, qualquer entrada adicionalTrue
será avaliadaFalse
e impressa como tal.A redefinição é
True&=b<1
, ieTrue = True & (b<1)
. Quando a entradab
éTrue
, então(b<1)
é False (sinceTrue==1
), entãoTrue
se tornaFalse
.fonte
True, False = False, True
.APL , 2 bytes
Avalia a função "varredura usando menor que". Experimente online!
Explicação
No APL, o operador
\
(varredura) reduz cada prefixo não vazio de uma matriz da direita, usando a função fornecida. Por exemplo, dado o array0 1 0
, ele calcula0
(prefixo do comprimento 1),0<1
(prefixo do comprimento 2) e0<(1<0)
(prefixo do comprimento 2) e coloca os resultados em um novo array; os parênteses se associam à direita. A redução<
da direita resulta1
exatamente quando o último elemento da matriz é1
e o restante é0
, portanto, o prefixo correspondente à extremidade esquerda1
é reduzido1
e os demais a0
.fonte
Aceto ,
1917 bytes não concorrenteNova versão (17 bytes):
Esta nova versão leva os caracteres um de cada vez e é melhor executada com a
-F
opção Funciona de maneira semelhante, mas não idêntica à solução anterior:Resposta antiga (19 bytes):
(Não concorrente porque tive que corrigir dois erros no intérprete)
Esta é a primeira resposta do Aceto que destaca o que ele pode fazer relativamente bem, eu diria. As "listas" são fluxos de entrada, com uma entrada por linha, "1" para verdadeiro e "0" para falso, com uma sequência vazia significando o fim da lista.
Os programas Aceto são executados em uma curva de Hilbert, começando no canto inferior esquerdo e terminando no canto inferior direito. Primeiro, nós
r
amarramos uma string,d
uplicamos e a negamos (!
), transformando strings vazias em True, e todo o resto em False. Depois, há um espelho horizontal condicional (|
): se o elemento superior da pilha for verdadeiro, espelhe horizontalmente. Isso acontece quando a string estava vazia. Se fizermos o espelhamento, aterrissaremos noX
, que mata o intérprete.Caso contrário, convertemos a cópia restante na pilha em um
i
nteger e fazemos outro espelho horizontal condicional: Dessa vez, porque 1 é verdadeiro e 0 é falso, espelhamos se vemos o (primeiro) valor verdadeiro. Se não espelhamos (então vimos um 0), criamos op
que está na pilha (já que a pilha está vazia, um zero) e pulamos para aO
rigidez da curva, onde começamos, iniciando todo o processo novamente.Caso contrário, quando vimos um 1, espelhamos e pousamos no
u
, o que inverte a direção em que nos movemos na curva de Hilbert.1p
imprime um 1, e agora continuamos da mesma maneiraO
que teríamos se tivéssemos visto um 0, mas como estamos no "modo reverso", nossa origem está no canto inferior direito , então pulamos para lá.Agora,
r
lemos outra corda e a negamos. Se a seqüência estava vazio e, portanto, o elemento superior da pilha é truthy,`
vai não escapar o próximo comando (X
), fazendo-nos sair.Caso contrário (se a cadeia não estava vazio), nós não escapar do
X
e ignorá-lo. Nesse caso, vamos para a esquerda (<
),p
rint 0 (porque a pilha está vazia) e retornamos aoO
rigin.fonte
Java8,
2419 bytesEspero que isso seja legal; Tive a impressão de que a entrada / saída não precisa ser avaliada como verdadeira / falsa no idioma. Leva um tempo como entrada e fornece um como saída, com uns sendo verdadeiros e zeros sendo falsos na representação binária. Por exemplo, o binário 00101 é 5 e retornaria o binário 00100, que é 4.
Cinco bytes graças a @puhlen
fonte
Long::highestOneBit
que produz o resultado idêntico com uma sintaxe mais curtajava.lang
pacote é importado por padrão. Na especificação de idioma "Uma unidade de compilação tem acesso automaticamente a todos os tipos declarados em seu pacote e também importa automaticamente todos os tipos públicos declarados no pacote predefinido java.lang."Retina , 6 bytes
Experimente online!
Entrada é uma lista de
0
s (para Falso)1
es (para Verdadeiro).Corresponde a todos
1
e substitui cada um, exceto o primeiro (1>
) por a0
.fonte
V , 7 bytes
Experimente online!
Minha primeira submissão em V! \ o /
Como funciona
fonte
r0
com<C-x>
para diminuir os formatos e salvar um byte.Haskell , 25 bytes
Função anônima recebendo e retornando uma lista de
Bool
s.Use como
(foldr(\x l->x:map(x<)l)[])[False,True,False,False]
.Experimente online!
Como funciona
x
é o elemento a ser anexado à sublistl
.False
compara menos do queTrue
, por issomap(x<)l
vai se transformar qualquerTrue
s eml
emFalse
sex
éTrue
.fonte
Gelatina , 4 bytes
Experimente online!
Aqui está um algoritmo bastante diferente da maioria das outras soluções de linguagem de golfe (embora depois que eu o publiquei, notei que a solução R também usa esse algoritmo) e vincule-o ao atual detentor de registro do Jelly.
Explicação
Desde que todos os elementos à esquerda de um elemento sejam 0, a soma acumulada até um elemento será igual ao próprio elemento. À direita do primeiro 1, os dois são diferentes (porque agora estamos adicionando o total diferente de zero dos elementos à esquerda). Assim,
+\=
nos fornece uma lista contendo 1 (ou seja, verdadeiro) até e incluindo o primeiro elemento de verdade. Finalmente, AND lógico com a lista original nos dará um 1 apenas para o primeiro elemento de verdade.fonte
JavaScript (ES6),
3326 bytesA E / S está em matrizes de 0s e 1s.
fonte
05AB1E , 6 bytes
Código:
Explicação:
Usa a codificação 05AB1E . Experimente online!
fonte
1k>sƶ-_
é outra, pior ainda. Alift
ideia pode ter potencial embora.Simulador de máquina de Turing , 39 bytes
Experimente online!
fonte
brainfuck , 55 bytes
Experimente online!
fonte
Gelatina , 4 bytes
Uma porta da minha resposta 05AB1E.
Explicação (argumento α ):
Experimente online!
fonte
R , 24 bytes
Experimente online!
Exemplo:
Para
FALSE TRUE TRUE FALSE
cumsum(T<-scan(,F))==T
retornos de entradaTRUE TRUE FALSE FALSE
. OF na varredura garante entrada lógica.FALSE TRUE TRUE FALSE
eTRUE TRUE FALSE FALSE
éFALSE TRUE FALSE FALSE
. Um single&
faz uma comparação elementar.fonte
Oitava, 23 bytes
Experimente online!
Primeira diferença do máximo cumulativo da lista.
fonte
J , 3 bytes
Define um verbo monádico. Esta é uma porta trivial da minha resposta APL . Experimente online!
fonte
Python, 58 bytes
Se
x[i]
for falso, a saída é falsa; caso contrário, indica se o elemento é ou não a primeira ocorrência na matriz em si.fonte
PHP, 37 bytes
fonte
Perl 5, 20 bytes
Verdade é
1
e Falsey é''
(uma string vazia).Explicação:
map
faz um loop sobre os elementos da lista@_
, os argumentos passados para a sub-rotina, definindo cada elemento como $ _ localmente e retornando uma matriz dos valores de retorno que calcula de cada elemento.$_&&!$x++
produz$_
se$_
for falsey e!$x++
se for verdade. (Observe que && está em curto-circuito, portanto,!$x++
não é executado até que o primeiro valor de verdade seja atingido).$x++
retorna0
(que é falsey) na primeira vez em que é executado e depois aumenta a cada vez (e assim permanece verdadeiro). O!
nega$x++
, e assim retorna verdadeiramente na primeira vez que é encontrado e desaparece depois disso.fonte
sub{...}
).Pitão - 9 bytes
Experimente aqui
fonte
m&!~|Z
.Python 2 ,
4536 bytesEntrada e saída são um Booleano ( Verdadeiro ou Falso ) por linha.
Experimente online!
fonte
C #, 77 bytes
Compila para um
Func<bool[], bool[]>
. Nada realmente inteligente, apenas uma solução direta.fonte
sed ,
1619 bytes15códigode origem de18 bytes + 1 byte para o sinalizador -r (ou o sinalizador -E para BSD sed).Experimente online!
Edit: Obrigado Riley por apontar um erro.
fonte
Gelatina , 4 bytes
Experimente online!
Quão?
Isso faz o que foi solicitado em um sentido bastante literal:
fonte
c (com built-in gcc), 40
Uma abordagem ligeiramente diferente:
Isso pode ser considerado inválido - caso em que, felizmente, marcarei isso como não concorrente.
"Matrizes" de entrada e saída são números inteiros não assinados de 32 bits - isso limita o tamanho da lista de entrada a exatamente 32 - pode ser um desqualificador. Se a entrada tiver menos de 32 bits, poderá ser preenchida com zero bits no final.
Experimente online .
fonte
Lote,
8573 bytesRecebe entrada como argumentos de linha de comando. Por exemplo:
1.bat 0 1 0 1 0 0 1
Versão anterior
fonte
Flacidez cerebral , 230 bytes
Vou explicar em breve, mas minha mãe me cozinhou algumas batatas fritasExperimente online!
Agradecimentos especiais
Agradecimentos especiais ao Wheat Wizard e Riley por me ajudarem bastante com o código!
fonte
Python 3,
696664605453 bytesLeva uma matriz de
false
s etrue
s. Essa é uma compreensão da lista defalse
s, exceto se o valor da iteração atual fortrue
e for o primeirotrue
na entrada.Parece um pouco longo (e é o meu primeiro lambda), por isso, se você encontrar uma maneira de jogar golfe, seria muito apreciado!
fonte
0 for
0for
.Flacidez Cerebral ,
146144 bytesExperimente online!
fonte
Perl 5 , 12 bytes
Código de 10 bytes + 2 para
-pl
.Experimente online!
fonte