Inspirado e em memória de meu querido amigo e colega,
Dan Baronet , 1956 - 2016. RIP
Ele encontrou a solução de APL mais curta possível para esta tarefa:
Tarefa
Dada uma lista booleana, conte o número de valores de verdade à direita.
Casos de exemplo
{}
→ 0
{0}
→ 0
{1}
→ 1
{0, 1, 1, 0, 0}
→ 0
{1, 1, 1, 0, 1}
→ 1
{1, 1, 0, 1, 1}
→ 2
{0, 0, 1, 1, 1}
→ 3
{1, 1, 1, 1, 1, 1}
→ 6
01100
?Respostas:
Dyalog APL,
62 bytesTeste-o no TryAPL .
Como funciona
⊥ (uptack, diádico: decodificação) realiza a conversão de base. Se o operando esquerdo for um vetor, ele realiza a conversão de base mista , o que é perfeito para esta tarefa.
Para um vector de base b = b n , ⋯, b 0 e um dígito de vector a = a n , ⋯, um 0 , b ⊥ um converte um para a base mista b , ou seja, ele calcula b 0 ⋯ b n-1 um n + ⋯ + b 0 b 1 a 2 + b 0 a 1 + a 0 .
Agora, ⍨ (dieresis til , commute ) modifica o operador para a esquerda da seguinte maneira. Em um contexto monádico, ele chama o operador com argumentos iguais à esquerda e à direita.
Por exemplo, ⊥⍨ a é definido como ⊥ a , que calcula a 0 ⋯ a n + ⋯ + a 0 a 1 a 2 + a 0 a 1 + a 0 , a soma de todos os produtos cumulativos da direita para a esquerda .
Para os k à direita, os k produtos à direita são 1 e todos os outros são 0 , portanto, sua soma é igual a k .
fonte
b⊥b
e⊥⍨b
dando até infinito velocidade-up.JavaScript (ES6), 21 bytes
Casos de teste
Mostrar snippet de código
fonte
f(l)+1
retorna um valor> 2
?l.pop()?(l.pop()?(l.pop()?(...etc...)+1:0)+1:0)+1:0
.Gelatina , 4 bytes
Experimente online! ou Verifique todos os casos de teste.
Para o caso em que a lista está vazia, existem algumas observações curiosas. Primeiro, o comprimento da execução que codifica a lista vazia
[]
retorna outra lista vazia[]
. Em seguida, recupere o último elemento usandoṪ
retornos finais em0
vez de um par,[value, count]
que são os elementos regulares de uma matriz codificada no comprimento da execução. Em seguida, o produtoP
retorna0
quando chamado,0
qual é o resultado esperado.Explicação
fonte
ŒgṪS
funciona!Ṫ
in Jelly é implementado como:lambda z: iterable(z).pop() if iterable(z) else 0
.iterable
quando chamado em uma lista apenas retorna a lista, e a lista vazia é obviamente falsa.Braquilog ,
765 bytesExperimente online!
Explicação
Desde que
@] - Suffix
começa do maior sufixo até o menor, ele encontrará o mais longo primeiro.fonte
CJam (8 bytes)
Conjunto de testes online
Dissecação
fonte
Haskell,
2625 bytesUso:
Versão sem ponto (26 bytes):
Usando uma lista inteira em vez de uma lista bool (21 bytes, graças a Christian Sievers):
Uso:
Versão sem ponto (25 bytes)
fonte
foldl
idéia trabalha coma%b=b*(a+1)
Retina ,
75 bytesExperimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)
Definir o formato de entrada para o Retina não é totalmente inequívoco. Como Retina não tem nenhum conceito de qualquer tipo, exceto strings (e também nenhum valor que possa ser usado para nossa definição usual de verdade e falsidade), eu geralmente uso
0
e1
(ou algo positivo em geral) para corresponder a verdade e falsidade, pois elas representam zero ou algumas correspondências, respectivamente.Com representações de caracteres únicos, também não precisamos de um separador para a lista (que, de certa forma, é mais a representação de lista mais natural para um idioma que possui apenas strings). Adám confirmou que este é um formato de entrada aceitável.
Quanto ao próprio regex, ele corresponde da
r
direita para a esquerda e\G
ancora cada partida à anterior. Portanto, isso conta quantos1
s podemos corresponder a partir do final da string.fonte
05AB1E ,
121065 bytesEconomizou 1 byte graças à carusocomputação .
Experimente online!
Explicação
fonte
0¡¤g
é de quatro bytes.J0¡¤g
também é ainda mais curto;).Î
para lidar com a entrada vazia, mas ainda é um byte salvas graças :)Python, 31 bytes
fonte
Gelatina , 4 bytes
TryItOnline! ou todos os testes
Quão?
fonte
MATL , 4 bytes
Experimente online!
fonte
Mathematica,
2524 bytesfonte
FromDigits[b=Boole@#,MixedRadix@b]&
(35 bytes).Pitão, 6 bytes
Experimente aqui!
Acrescenta um 0, reverte e encontra o índice do primeiro 0
fonte
C90 (gcc), 46 bytes
A entrada é via argumentos da linha de comando (um número inteiro por argumento), a saída é via código de saída .
Experimente online!
Como funciona
r é uma variável global. Seu tipo padrão é int e, sendo global, o valor padrão é 0 .
O argumento da função c também padroniza int . Ele manterá o número inteiro n + 1 para matrizes de n booleanos; o primeiro argumento de main é sempre o caminho do executável.
O argumento da função v é declarado como
int**
. O tipo real de v seráchar**
, mas como examinaremos apenas o bit menos significativo de cada argumento para diferenciar os caracteres 0 (ponto de código 48 ) e 1 (ponto de código 49 ), isso não será importante para os pequenos endianistas. máquinasO loop while diminui c e o compara a 0 . Uma vez que c atinge 0 , vamos sair do loop. Isso é necessário apenas se a matriz não contiver 0 .
Enquanto
0<--c
retorna 1 , que leva o c th argumento de linha de comando (v[c]
) e extrair seu primeiro personagem com dereferenciando o ponteiro (*
). Tomamos o AND bit a bit do Booleano0<--c
e o ponto de código do caractere (e três bytes de lixo que o seguem), portanto a condição retornará 0 assim que um 0 for encontrado, interrompendo o loop.No outro caso, enquanto os argumentos de linha de comando são 1 ,
r++
incrementa r por 1 , tendo assim em conta o número de arrasto 1 's.Por fim,
c=r
armazena o valor calculado de r em c . Com as configurações padrão, o compilador otimiza e remove a atribuição; na verdade gera amovl %eax, -4(%rbp)
instrução. Comoret
retorna o valor do registro EAX, isso gera a saída desejada.Observe que esse código não funciona com C99, que retorna 0 do main se o final do main for atingido.
fonte
argc
pelo menos1
(comargv[0]
o nome do arquivo)? Você pode salvar um byte em--c&&
vez de0<--c&
. o código de saída do gcc foi retiradoargc
? Arrumado.*v[c]
é o ponto de código de 1 ou 0 ; portanto, é 49 ou 48 e, portanto, sempre é verdade.k, 6 bytes
Essa composição de função se traduz em
sum mins reverse
inq
, o irmão mais legível do idioma, em que mins é o mínimo contínuo.fonte
J,
93 bytesEsta é a conversão de base mista reflexiva. Porque isso é o mesmo que conversão de base mista. Novamente.
Casos de teste
fonte
R,
40 3925 bytesSolução completamente reformulada graças a @Dason
Leia a entrada de stdin, inverta o vetor e, se o primeiro elemento de, em
!=0
seguida, forneça o primeiro comprimento da codificação de comprimento de execução (rle
), caso contrário0
.fonte
ifelse(r$v,r$l,0)[1]
. (Vectorized se, e, em seguida, tomar o primeiro elemento.)Haskell, 24 bytes
Repete a lista, adicionando um para cada elemento, redefinindo para
0
depois que ele atinge aFalse
.16 bytes com entrada 0/1:
Se a lista fosse garantida como não vazia, poderíamos obter 14 bytes:
Isso calcula o produto cumulativo na parte de trás e depois os soma. O produto cumulativo permanece 1 até que um 0 seja atingido e depois se torne 0. Portanto, os 1s correspondem aos 1s finais.
fonte
Pyke,
106 bytesExperimente aqui!
fonte
C # 6,
10372 bytesUsar lista não genérica bate a lista genérica por 1 byte lol
-31 bytes graças a Scott
fonte
int
s, você pode sair comint a(int[] l)=>l.Reverse().TakeWhile(i=>i>0).Sum();
Func<bool[], int>
para 57 bytes ieusing System.Linq;l=>l.Reverse().TakeWhile(x=>x).Count();
Python, 37 bytes
fonte
DASH , 16 bytes
Não é a solução DASH mais curta possível, mas a solução DASH mais curta possível está me incomodando. Estou postando essa nova abordagem em seu lugar.
Uso:
Explicação
fonte
Scala, 25 bytes
Ungolfed:
Inverte a lista, acrescenta um 0 e encontra o primeiro índice de 0, que é o número de elementos antes do primeiro 0
fonte
Lote, 57 bytes
Recebe a entrada como parâmetros da linha de comando. Funciona multiplicando o acumulador pelo valor atual antes de adicioná-lo, para que quaisquer zeros na linha de comando redefinam a contagem. Observe que
%%n
não é o mesmo quen
ou%n%
variável.fonte
GolfSharp, 14 bytes
fonte
Java 7, 62 bytes
Ungolfed & código de teste:
Experimente aqui.
Resultado:
fonte
Perl 5.10, 22 bytes
21 bytes + 1 byte para
-a
sinalizador. Desde que a expressão baseada em regex foi feita ...: pOs valores de entrada para a matriz devem ser separados por um espaço.
Experimente online!
fonte
perl -E '$_++while pop;say' 0 1 1 0 1 1 1
mas isto não faz nada saída para0
(não sei se isso é um problema embora!)Perl, 22 bytes
21 bytes de código + 1 byte para
-p
sinalizador.Para executá-lo:
(Na verdade, o formato da entrada não importa muito:
0110111
,0 1 1 0 1 1 1
,[0,1,1,0,1,1,1]
etc. faria todo o trabalho)Versão de 18 bytes do @Dom Hastings, mas é necessário fornecer a entrada como uma sequência de 0 e 1, o que não é permitido:
fonte
;
truque :) Se format é uma seqüência contínua:perl -pE '/1*$/;$_=length$&' <<< '0110111'
para 18, não tenho certeza se isso é quebrar as regras ou não embora ...PHP, 50 bytes
Estranhamente, minha primeira tentativa com um regex acabou sendo mais curta do que minha tentativa com matrizes ...
Use como:
fonte
Ruby
3732 bytesCria uma função anônima que encontra a instância mais à direita de um valor falso e conta o tamanho da sub-matriz iniciando nesse valor.
Ele usa
!0
como false, como 0 são valores verdadeiros no Ruby.rindex
localiza o último índice de um valor em uma matriz.Uso :
Retorna 1
Se me permitissem passar uma sequência de 0s e 1s como parâmetros de linha de comando (que não é como o ruby representa listas de booleanos), eu poderia reduzi-lo para 24:
Isso usa expressões regulares e imprime o comprimento da string retornada pela expressão regular
/(1*)\z/
, onde\z
é o final da string.$*[0]
é o primeiro argumento passado e é uma sequência de 0s e 1s.Uso:
Retorna 1.
fonte