Por favor, desculpe o título punny.
Esta é uma pergunta inspirada em Uma propriedade curiosa de 82000 . Nele, o autor aponta que o número 82000 é binário nas bases 2, 3, 4 e 5. A publicação então coloca a questão "existe um número que é binário nas bases 2, 3, 4, 5 e 6? "? (Para aqueles curiosos, verifiquei valores de até 10 ^ 1.000.000 e até agora a resposta é não.)
Isso me fez pensar: dado um número, em que bases ele é binário?
Nosso número curioso, 82000, é realmente binário em seis bases:
Base 2 = 10100000001010000
Base 3 = 11011111001
Base 4 = 110001100
Base 5 = 10111000
Base 81999 = 11
Base 82000 = 10
Nem todos os números terão bases binárias que são seqüenciais. Considere o número 83521. É binário nas bases 2, 17, 289, 83520 e 83521.
Seu desafio é determinar e exibir em que bases um número é binário.
Regras
- Um número é considerado "binário" em uma determinada base se sua representação nessa base consistir apenas em zeros e uns.
110110
é um valor binário, enquanto12345
nãoA380F
é , definitivamente não é. - Seu número será fornecido na entrada padrão. Será um valor inteiro entre 2 e 2 ^ 32-1, inclusive, e será fornecido no formato base 10.
- Em ordem crescente, exiba cada base maior que aquela em que o número é binário. Cada base deve estar em sua própria linha. Se você incluir o valor binário nessa base (veja a pontuação de bônus abaixo), separe a base e o valor binário com um espaço. Somente a saída para saída padrão será julgada, o erro padrão e outras fontes serão ignoradas.
Pontuação
Sua pontuação é o tamanho do seu programa em bytes. Quanto menor a pontuação, melhor.
Bônus :
Se o seu programa também exibir os valores binários nas bases encontradas, multiplique sua pontuação por 0,75. O
valor binário exibido não deve ter pontuação extra, zeros estranhos, ponto decimal, apenas zeros e uns.
Exemplos
Entrada:
82000
Saída (recebe bônus):
2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10
Entrada:
1234321
Saída (sem bônus):
2
1111
1234320
1234321
fonte
n
é sempre pelo menos em binário bases1
(não contadas),2
,n-1
, en
.[1, 0, 1, 1, 0]
bom, ou os números precisam ser unidos como10110
?Respostas:
Pitão,
1413Obrigado a Jakube por apontar a nova
S
função.Experimente aqui.
A versão online é muito lenta para fazer
1234321
. Isso simplesmente converte a entrada em cada base de 2 para si mesma e descarta os resultados que contêm valores diferentes de 0 e 1.Explicação:
Além disso, esta é uma versão bônus (
não muito bemagora, bem agora, novamente graças a Jakube) (20 * 0,75 = 15):Experimente aqui
fonte
VQI!-JjQK+2NU2pdKjkJ
Às vezes, a programação funcional não é a melhor abordagem.Julia,
7270 bytesNa verdade, é mais longo com o bônus, então não há bônus aqui.
Isso lê uma linha de STDIN, converte-a em um número inteiro e imprime o resultado. Apesar de ser um método de força bruta, a entrada 1234321 levou menos de 1 segundo para mim.
Ungolfed + explicação:
Exemplos:
NOTA : Se a entrada puder ser tomada como argumento de função e não a partir de STDIN (aguardando confirmação do OP), a solução será 55 bytes.
fonte
CJam, 20 bytes (ou 27 bytes * 0,75 = 20,25)
Aqui está a versão sem bônus, 20 bytes:
Tente isso aqui.
Apenas por diversão, aqui está a versão bônus, 27 bytes:
Experimente online aqui
fonte
ri_,f{2+S@2$bN}4/{2=2,-!},
(19,5 bytes)Mathematica, 59 bytes
Ugh ...
IntegerDigits
D:Não há realmente muito a explicar sobre o código ... 12 bytes são desperdiçados pelo requisito para usar STDIN e STDOUT.
Acho que não posso reivindicar o bônus. O melhor que eu tenho são 84 bytes (o que gera uma pontuação acima de 60):
fonte
Python 2,
88 8680Bastante simples, sem bônus. Python é agradável e branda com variáveis globais.
O melhor que consegui obter para o bônus é 118 * .75 = 87,75 :
fonte
g(N)
vez den=N
.g(N,b)
assim a vírgula tornava os dois iguais), mas como assim eu não precisaria de uma variável para N?g(n/b)
para(g(n/b)+'n%b')
onde 'representa um backtick?Python 2, 90 * 0,75 = 67,5
Abordagem iterativa bastante direta.
Sem o bônus, são 73 bytes:
fonte
SQL (PostgreSQL),
247,5255230,25 (307 * .75)Como o SQL é conhecido por ser maravilhoso nesses tipos de desafios, achei melhor montar um :) O bônus realmente valeu a pena.
Ele deve estar em conformidade com as especificações, mas não tenho uma maneira fácil de testar o COPY I FROM STDIN .
Editar ordem fixa. Mudou a maneira como a coluna R é manipulada para usar uma matriz.
Como teste, usei pastilhas retas na
I
mesa. A execução do teste foi expandida e comentada.fonte
order by
. Agora, para ver se eu posso obter esses personagens de voltaHaskell 109 * 0,75 = 81,75 bytes
Exemplo de uso (nota: os valores binários são lsb primeiro):
Sem restrições de entrada / saída, ou seja, entrada via argumento da função, saída em formato nativo via REPL):
Haskell, 67 * 0,75 = 50,25 bytes
Retorna uma lista de pares (base, valor). Os valores são lsb primeiro, por exemplo (novas linhas / espaços adicionados para melhor exibição):
fonte
R, 111
Provavelmente há muito espaço para melhorar isso no momento
Executa com avisos
fonte
I%/%b
a uma lógica naany()
cláusula. `Java,
181155,25 (207 * .75)151,5 (202 * .75) bytesExpandido com explicação:
Original (sem bônus):
3,75 bytes graças a Ypnypn :)
fonte
R,
948379Uso:
O núcleo da função é
!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})
que, para cada base x de 2 a n, mantém o quociente n / x desde que o restante seja 0 e 1. Em seguida, gera o resultado (que é 0 se todos os restantes forem 1 ou 0) e nega (0 nega para VERDADEIRO, todo o resto nega para FALSO). Graças ao escopo da função, não há necessidade de criar uma variável dummy para n. O vetor resultante de booleanos é então usado para indexar2:n
e, portanto, gera apenas as bases para as quais ele trabalhou.fonte
TI-Basic, 45 bytes
Explicação
A parte complicada
A segunda linha funciona da seguinte maneira:
Nota
O programa executa significativamente mais rápido se um parêntese de fechamento
)
for colocado no final da segunda linha. Veja aqui mais sobre isso.fonte
TI-BASIC,
3129Provavelmente, isso é ideal para o TI-BASIC.
Explicação:
randIntNoRep(1,32)
retorna uma permutação aleatória dos números de 1 a 32 (tudo o que precisamos é desses números em alguma ordem; o TI-BASIC não tem nada parecido com o comando iota da APL). 32 elementos é suficiente porque a menor base possível é 2 e o maior número é 2 ^ 32-1.B^randIntNoRep(1,31)
eleva essa lista ao poder B, o que resulta na lista que contém todosB^1,B^2,...,B^32
(em alguma ordem).Em seguida, a entrada (na
Ans
variável wer, que é inserida no formulário[number]:[program name]
) é dividida por esse número. Se sua entrada for 42 e a base for 2, o resultado será a lista21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2]
, novamente em alguma ordem.Tomando a parte fracionária e multiplicando o número pela sua base, obtém o dígito nessa posição na representação da base-b. Se todos os dígitos forem menores que 2, o maior dígito será menor que 2.
Como Ypnypn afirmou, um parêntese de fechamento na
For
instrução acelera isso devido a um erro do analisador.31-> 31: Salva um byte, mas corrige erros de arredondamento que adicionam o byte novamente.
31-> 29: salvou dois bytes usando em
RandIntNoRep()
vez decumSum(binomcdf())
.fonte
seq(expression, variable, start, end[, step])
. Se nenhum passo for dado, o padrão será 1. No entanto,cumSum(binomcdf(31,0
são 8 bytesseq(X,X,1,32
e 9 bytes.Geléia , 9 bytes
Experimente online!
Feito ao lado de caird coinheringaahing no chat .
Como funciona
fonte
Javascript, ES6,
118 * .75 = 88,5110 * .75 = 82,5Versão anterior:
Verifica:
fonte
JavaScript ( ES6 ) 65
68 bytes para uma função com um parâmetro e saída do console.
65 bytes com E / S via pop-up
Reivindicando o bônus: 88 * 0,75 => 66
fonte
Mathematica, 76 * 0,75 = 57
Inicialmente esqueci os requisitos de entrada ... Felizmente, eles não adicionaram muito mais.
fonte
Ruby , 44 bytes
Experimente online!
fonte
Perl 5 , 63 bytes
Experimente online!
Não há bônus nisso, porque a pontuação é um pouco melhor que a minha versão com o bônus:
Perl 5 , 85 bytes * 0,75 = 63,75
Experimente online!
fonte