Isso foi inspirado no Problema 13 - Binário Não Repetitivo da recente concorrência do HP CodeWars.
Vamos pegar um número decimal aleatório, digamos
727429805944311
e veja sua representação binária:
10100101011001011111110011001011101010110111110111
Agora divida essa representação binária em subsequências onde os dígitos 0
e 1
alternam.
1010 010101 10 0101 1 1 1 1 1 10 01 10 0101 1 1010101 101 1 1 1 101 1 1
E converta cada subsequência novamente em decimal.
10 21 2 5 1 1 1 1 1 2 1 2 5 1 85 5 1 1 1 5 1 1
A tarefa
Pegue um inteiro único positivo como entrada e faça a saída da sequência de números inteiros positivos obtida pelo processo acima.
Detalhes
- A entrada e a saída devem estar em decimal ou unário.
- Os números na saída devem ser separados de maneira sensível e legível por humanos, e devem estar em decimal ou unário. Nenhuma restrição no espaço em branco. Estilos de saída válidos:
[1,2,3]
,1 2 3
,1\n2\n3
onde\n
são novas linhas literais, etc.
Casos de teste
Input | Output
0 | 0
1 | 1
2 | 2
3 | 1 1
4 | 2 0
5 | 5
6 | 1 2
7 | 1 1 1
8 | 2 0 0
9 | 2 1
10 | 10
50 | 1 2 2
100 | 1 2 2 0
1000 | 1 1 1 1 10 0 0
10000 | 2 1 1 2 0 2 0 0 0
12914 | 1 2 2 1 1 2 2
371017 | 5 42 10 2 1
Nota adicional: todos os números na saída devem estar no formato (2^k-1)/3
ou 2*(2^k-1)/3
. Ou seja, 0 1 2 5 10 21, 42, 85, 170, ...
que é A000975 no OEIS.
code-golf
sequence
base-conversion
binary
subsequence
El'endia Starman
fonte
fonte
|tac
permanecerá na minha resposta então :)Respostas:
Pitão,
1716 bytes1 byte graças a Jakube
Demonstração
Uma solução agradável e inteligente. Usa alguns recursos menos conhecidos do Pyth, como
x<int><list>
ec<str><list>
.fonte
tJ
por+dJ
você pode removerhM
.Mathematica, 47 bytes
Ungolfed:
Split[list,f]
divide uma lista em várias listas, quebrando na posição entrea
eb
sef[a,b]
não retornarTrue
.FromDigits[n,2] => Fold[#+##&,n]
é uma dica legal de alefalpha.fonte
Python, 86 bytes
Desde que fui terrivelmente derrotado em Pyth, vamos fazê-lo novamente em Python.
Experimente aqui!
Explicação
Começamos com a conversão do número de entrada
n
em uma string binária.bin(n)[2:]
cuida disso. Precisamos descartar os 2 primeiros caracteres dessa sequência, pois elabin()
retorna no formato0b10101
.Em seguida, precisamos identificar as bordas das subsequências. Isso pode ser feito com o regex
(?<=(.))(?=\1)
que corresponde às posições de comprimento zero na string que têm o mesmo número à esquerda e à direita.A maneira óbvia de obter uma lista de todas as subsequências seria usar o
re.split()
que divide uma string em um determinado regex. Infelizmente, esta função não funciona para correspondências de tamanho zero. Mas, felizmentere.sub()
, substituímos essas correspondências de comprimento zero por espaços e dividimos a sequência naquelas depois disso.Depois, basta analisar cada uma dessas subsequências em um número decimal com
int(s,2)
e pronto.fonte
Gelatina, 12 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Utilitários Bash + GNU, 51
Entrada retirada do STDIN.
dc -e2o?p
lê o número inteiro de entrada de STDIN e gera uma string de base 2sed -r ':;s/(.)\1/\1 \1/;t'
divide a string da base 2 com um espaço em todos os lugares onde há os mesmos dígitos consecutivosdc -e2i?f
lê o binário dividido de uma só vez, colocando cada parte na pilha e depoisf
despeja toda adc
pilha (números de saída na ordem inversa) ...tac
.fonte
JavaScript (ES6) 58
62 63Editar 1 byte salvo thx @ETHproductions
Editar 4 bytes salvos thx @Neil
fonte
/(01)*0?|(10)*1?/g
ou isso atrapalhava alguma coisa?x=>'0b'+x-0+' '
para salvar um byte./((.)(?!\2))*./g
poupa 4 bytes legais.Pitão, 26 bytes
Experimente aqui!
Explicação
Como a função split () do Python não se divide em correspondências de comprimento zero, eu tenho que substituir essas correspondências por um espaço e dividir o resultado nisso.
fonte
Pitão,
2221 bytesExperimente online: Demonstração
Realmente uma tarefa tediosa em Pyth.
Explicação:
fonte
05AB1E , 18 bytes
Código:
Explicação:
Experimente online!
Usa a codificação CP-1252 .
fonte
MATL ,
1817 bytesExperimente online!
fonte
zsh,
676355 bytesNão sei por que, mas isso não funciona no Bash.
Agradecimentos a Dennis por 8 bytes!
fonte
for
sintaxe. ... espera, nãofor
é?for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i]
.PHP,
Vista expandida171168162160158121120131124118116113112 bytesUse
d(int)
e pronto, a saída é umaecho
sequência ed deint
s separada por um espaço.Edições:
-3:
$b
definição movida para astrlen()
chamada.-6: Instanciação removida
$c
.-2: finalmente foi corrigido o problema de concatenação.
-2: sem colchetes para linha única
for()
.-37: Revisão total. Indo com
Array
chunklets em vez de repetidasArray
->String
->Array
chamadas.-1:
$c
Redefinição sorrateira .+11: Correção de bugs. Faltava parte final. Não mais.
-7: Não precisa instanciar
$d
nada? Agradável.-6:
return
->echo
.-2: Trituração
$c
.-3:Ternário, meu primeiro amor.
-1: sorrateira sorrateira
$u
.fonte
function d($i){for(;$d<$l=strlen($b=decbin($i));print$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"")$c.=$u=$b[$d];}
.0.2 convexo, 25 bytes
Convexo é uma nova linguagem que estou desenvolvendo que é fortemente baseada em CJam e Golfscript. O intérprete e o IDE podem ser encontrados aqui . A entrada é um número inteiro nos argumentos da linha de comandos. Isso usa a codificação CP-1252 .
Explicação:
fonte
Java 8,
127119 bytesProvavelmente existe uma expressão regular melhor por aí para dividir a string. Não sou proficiente em regex, mas continuarei experimentando.
-8 bytes graças a @FryAmTheEggman
fonte
APL (APL) ,
2125 bytesAgora lida com 0 também.
Experimente online!
2⊥⍣¯1⊢
converter para base-2, usando quantos bits forem necessários (conversão inversa a partir da base-2){
…}
Aplique a seguinte função anônima0::
se ocorrer algum erro:0
retornar 0⋄
agora tente:2=/⍵
igualdade entre pares do argumento (falhará na representação binária de 0 e comprimento 0)1,
anexar 1⍵⊂⍨
use isso para particionar o argumento (inicia uma nova seção em cada 1)2⊥¨
converter cada um da base-2fonte
⊂
é realmente útil aqui. Eu deveria acrescentar isso ao Jelly.R←X⊂Y
: Com⎕ML<3
(por exemplo, estilo Dyalog), uma nova partição é iniciada no resultado correspondente a cada 1 em X até a posição antes que o próximo 1 em X (ou o último elemento de X) se torne os itens sucessivos de R. Com⎕ML=3
(isto é, estilo IBM), uma nova partição é iniciada no resultado sempre que o elemento correspondente em X for maior que o anterior. Os itens em Y correspondentes a 0s em X não são incluídos no resultado. Assim,⎕ML←1 ⋄ 1 0 0 1 0 1 1 ⊂ ⍳7
é equivalente a⎕ML←3
⋄ 4 3 2 4 4 5 7 ⊂ ⍳7`Japonês , 7 bytes
Teste-o
Explicação
fonte
Python 3, 115 bytes
Explicação
Resultados
solução anterior (118 bytes)
fonte
Haskell,
147, 145 bytesmap(sum.zipWith((*).(2^))[0..]).([]%).b
é uma função sem nome que calcula a lista.Menos golfe:
fonte
Perl, 53 bytes
Inclui +1 para
-p
Corra com o número em STDIN
alterbits.pl
:fonte
PowerShell, 103 bytes
Como sou péssimo em regex, estou usando a mesma expressão da resposta de edc65 .
Absolutamente destruído pelas chamadas longas do .NET para fazer a conversão de / para o binário e a chamada .NET para obter as correspondências de expressão regular. Caso contrário, bem direto. Leva a entrada
$args[0]
,convert
s para binária, alimentaMatches
, pega os.Value
s resultantes , canaliza-os através de um loop|%{...}
econvert
s esses valores de volta paraint
. A saída é deixada no pipeline e implicitamente impressa com novas linhas.Para crédito extra - uma versão não regex (principalmente) a 126 bytes
Mais uma vez, consideramos a entrada
$args[0]
econvert
a binária. Relançamos como um conjunto de caracteres, armazenando o primeiro caractere$l
e os caracteres restantes$r
. Em seguida, enviamos$r
através de um loop|%{...}
onde todas as iterações que selecionamos do caractere precedido de um espaço ou apenas do caractere, dependendo do resultado de um xor binário com$l
e, em seguida, definimos$l
para o caractere. Isso efetivamente garante que, se tivermos o mesmo caractere duas vezes seguidas, colocaremos um espaço entre eles.A saída do loop é
-join
editada em conjunto e anexada ao primeiro caractere$l
, depois-split
nos espaços (o que é tecnicamente um regex, mas não vou contar). Em seguida, fazemos o mesmo loop que o regex respondeconvert
e gera números inteiros.fonte
Java 345 bytes
Teste
Saída
fonte
package
eclass
, e removendo espaços em branco desnecessários. Deixe-me saber se você tiver alguma dúvida!Julia,
7057 bytesEsta é uma função anônima que aceita um número inteiro e retorna uma matriz inteira. Para chamá-lo, atribua-o a uma variável.
A abordagem aqui é semelhante à boa resposta Python da DenkerAffe . Obtemos a representação binária do
n
usobin(n)
e dividimos a sequência resultante em todas as correspondências da expressão regular(?<=(.))(?=\1)
. Na verdade, é uma partida de comprimento zero;(?<=(.))
é uma aparência positiva que encontra qualquer caractere único e(?=\1)
uma aparência positiva que encontra o caractere correspondente na aparência. Isso localiza os lugares onde um número é seguido por ele próprio na representação binária. Apenasparse
cada um como um número inteiro na base 2 usandomap
e pronto!fonte
C,
137129 bytesEntrada e saída estão nos fluxos padrão.
fonte
puts
, mesmo que seja desagradável de usar, a especificação não exige uma nova linha à direita.J , 16 bytes
Experimente online!
Explicação
fonte
q / kdb +, 52 bytes
Solução:
Exemplos:
Explicação:
q
é interpretado da direita para a esquerda.Converta a entrada em binário, apare os zeros à esquerda, encontre os índices onde forem diferentes, inverta para obter os índices nos mesmos, divida a lista nesses índices e converta de volta à base 10. Parece um pouco pesado em comparação com a solução APL embora ...
fonte
PHP, 147
Precisa colocar espaço extra no final da saída, pois não há restrição. As notificações são exibidas para codificação curta.
Versão ungolfed
fonte
Retina, 60
Experimente online! Ou tente uma versão ligeiramente modificada para todos os casos de teste (com E / S decimal).
Infelizmente, correspondências de comprimento zero parecem ter dois "lados", causando duplicação quando usadas com a regex do terceiro estágio. Custa apenas um byte.
Pega a entrada como unária, e a saída como unária. Não tenho certeza sobre o uso de valores unários diferentes de entrada / saída, mas isso economizaria 4 bytes.
fonte
Geléia , 9 bytes (não competindo?)
Experimente online!
fonte