Com base na notação "binária, mas com dois" mencionada neste vídeo numérico , escreva uma função que aceite um único número como entrada e produza todas as variações desse número em um sistema "binário", onde dois são permitidos.
Regras
- O código deve ser apenas uma função / método, não um programa completo
- Entrada é um número inteiro passado como único parâmetro para a função
- Saída é todas as variações válidas do número de entrada convertido para a notação "binária, mas com dois"
- Saída é o valor de retorno da função, mas pode estar em qualquer formato que seja conveniente, desde que seja óbvio (por exemplo, 3 polegadas, 3 cordas, string delimitada por vírgula / espaço, matriz de entradas, etc.), a ordem não é importante
- No caso improvável de um idioma conter uma função interna para obter o resultado, não é permitido
- O código mais curto em bytes é o vencedor
Explicação da saída
Por exemplo, se você passou o número 9
, pode convertê-lo em binário como 1001
, mas se você permitir 2
s em cada posição, também poderá escrevê-lo como 201
(ie 2*4 + 0*2 + 1*1
) ou 121
(ie 1*4 + 2*2 + 1*1
), conforme mostrado nesta tabela:
+----+----+----+----+
| 8s | 4s | 2s | 1s |
+----+----+----+----+
| 1 | 0 | 0 | 1 |
| 0 | 2 | 0 | 1 |
| 0 | 1 | 2 | 1 |
+----+----+----+----+
Então, se aprovada 9
, sua função seria necessário para retornar os três números, 1001
, 201
e 121
.
Formato e ordem são irrelevantes, contanto que é óbvio (ou seja [121,201,1001]
, "0201 0121 1001"
, ("1001","121","201")
são resultados válidos quando dado uma entrada de 9
).
Exemplos
2
=>10, 2
9
=>1001, 201, 121
10
=>1010, 210, 202, 1002, 122
23
=>2111, 10111
37
=>100101, 20101, 100021, 20021, 12101, 12021, 11221
code-golf
binary
base-conversion
Alconja
fonte
fonte
Respostas:
GolfScript (25 bytes) / CJam (
1917 bytes)GolfScript:
Isso cria uma função anônima (consulte a meta-discussão sobre permissibilidade de funções anônimas ).
Demonstração online
Uma tradução direta para o CJam é (com agradecimentos a Martin Büttner por raspar alguns caracteres)
Dissecação
A razão para a operação quadrática é que precisamos iterar até o maior valor possível cuja representação ternária, interpretada em binário, seja igual a
^
. Desde então2 = 10
, a representação binária "normal" de^
é a que importa. Se convertermos isso em ternário, descobriremos que os "piores" casos são potências de 2. Uma abordagem ideal seria levar o argumento ao poder deln 3/ln 2 ~= 1.585
, mas a quadratura é muito menor.fonte
Python 2 (59 bytes)
(Muito obrigado a @grc, @xnor e @PeterTaylor por ajudarem no bate-papo)
Recursão simples, chamada com
S(23)
ou similar.Explicação
A idéia geral é que, se
n
a expansão binária de um arquivo terminar em a1
, qualquer expansão pseudo-binária ("binária, mas com dois") também deverá terminar com a1
. Caso contrário, pode terminar com0
ou2
.Portanto, olhamos para o último pedaço de
n
, dividimos e ramificamos de acordo.Dissecação
Variáveis:
n
: O número que queremos encontrar expansões pseudo-binárias deB
: Uma sequência pseudo-binária sendo criada da direita para a esquerdafonte
Bash + coreutils, 77
(Esse é um TABcaractere na expressão grep.)
Isso está dobrando um pouco esta regra:
"No caso improvável de que um idioma contenha uma função interna para alcançar o resultado, isso não é permitido"
Acontece que
dc
tem o inverso do que precisamos incorporar. Por exemplo, se definirmos a base de entrada como 2 e inserirmos um número binário com dois, ele será analisado corretamente. (Da mesma forma, se o modo de entrada for a base 10, AF será analisado como "dígitos" decimais 10-15).seq
cria uma lista de todos os números decimais até a representação binária padrão de n, analisada como decimal. Todos os números que contêm algo diferente de {0,1,2} são filtrados. Em seguida,dc
analisa os números restantes como binários para ver qual avaliar de volta para n.As funções bash podem apenas "retornar" números inteiros escalares de 0 a 255. Então, estou tomando a liberdade de imprimir a lista para STDOUT como minha maneira de "retornar". Isso é idiomático para scripts de shell.
Saída:
fonte
Haskell, 82
isso é apenas uma solução de força bruta. é muito ineficiente, porque é esperado analisar três possibilidades.
fonte
Geléia , 10 bytes, desafio pós-datas de idiomas
Experimente online!
Uma solução bruteforce com até um número de hiperbits igual à entrada (esse formato é conhecido como "hiperbinário"). Como tal, é incrivelmente ineficiente, rodando em O (3 n ).
Explicação
fonte
PHP, 138 bytes
Demolir
fonte
C ++, 159 bytes
Teste aqui
fonte
k, 21 bytes
Usa o mesmo método da resposta Golfscript de Peter Taylor
Exemplos:
fonte