Considere a seguinte sequência numérica:
Enumera todas as frações binárias no intervalo de unidades .
(Para facilitar esse desafio, o primeiro elemento é opcional: você pode ignorá-lo e considerar que a sequência começa com 1/2.)
Tarefa
Escreva um programa (programa completo ou função) que ...
Escolha um destes comportamentos:
- Entrada n, elemento de saída enésimo da sequência (indexado 0 ou indexado 1);
- Entrada n, gera os primeiros n elementos da sequência;
- Não introduza nada, produza a sequência numérica infinita que pode ser tirada uma a uma;
Regra
- Seu programa deve pelo menos suportar os primeiros 1000 itens;
- Você pode optar por imprimir decimais ou frações (interno, par inteiro, seqüências de caracteres) como desejar;
- Entrada / Saída como dígitos binários não é permitida nesta pergunta;
- Este é o código-golfe , os códigos mais curtos vencem;
- Falhas padrão não permitidas.
Casos de teste
input output
1 1/2 0.5
2 1/4 0.25
3 3/4 0.75
4 1/8 0.125
10 5/16 0.3125
100 73/128 0.5703125
511 511/512 0.998046875
512 1/1024 0.0009765625
Esses exemplos são baseados na sequência indexada em 0, com o 0 inicial incluído. Você precisaria ajustar a entrada para ajustar sua solução.
consulte Mais informação
- OEIS A006257
- Problema de Josefo: . (Anteriormente M2216)
- 0, 1, 1, 3, 1, 3, 5, 7, 1, 3, 5, 7, 9, 11, 13, 15, 1, 3, 5, ...
- OEIS A062383
- : para , ou .
- 1, 2, 4, 4, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 32, 32, 32, ...
A006257 (n) / A062383 (n) = (0, 0,1, 0,01, 0,11, 0,001, ...) enumera todas as frações binárias no intervalo de unidade [0, 1). - Fredrik Johansson, 14 de agosto de 2006
"1/2" "1/4" "1/8"...
take
n elementos dela mais tarde.int
s, ou adouble
em uma linguagem / implementação em quedouble
use o formato IEEE binary64 ? Espero que você não queira dizer que foi necessário analisar uma seqüência de caracteres ASCII se quisermos obter uma entrada inteira? Tipos inteiros normais são binários em idiomas como C. Ou você quer dizer que a entrada / saída não pode ser uma matriz ou sequência de números inteiros ou zeros / uns ASCII?Respostas:
Haskell , 25 bytes
Experimente online!
Gera decimais, um indexado sem o termo zero inicial.
Adiciona 0,5 à entrada e, em seguida, reduz pela metade até que os resultados estejam abaixo de 2 e subtrai 1. O uso de uma expressão sem pontos salva 1 bytes sobre
fonte
Java 10,
6864 bytesPrimeira tentativa no código de golfe!
Opção 1: encontre o n- ésimo elemento (indexado 1)
-4 bytes graças a @Kevin Cruijssen
Este é um método anônimo que encontra o n- ésimo termo removendo o bit mais significativo de n , dobrando-o e adicionando um, depois dividindo pela próxima potência mais alta de 2.
Experimente online!
Passo a passo do código:
Editará se for necessário imprimir o valor final em vez de retorná-lo.
fonte
{}
depois do loop pode ser um;
; você pode remover o espaço após oreturn
;2.0
pode ser2.
; E mudando on>>x!=1;x++
,1<<x
e1<<x+1
paran>>x++!=1;
,1<<x-1
,1<<x
respectivamente, também guarda um byte. Experimente online: 64 bytes . Aproveite sua estadia!MathGolf ,
54 bytesExperimente online!
Como seria o funcionamento correto do operador
Experimente online!
Explicação
Tirei minha inspiração desta questão para resolver o problema, minha solução "própria" era de 10 a 12 bytes, eu acho.
Eu pretendia que o arredondamento até a potência mais próxima de 2 retornasse o número em si, se fosse um número de dois, mas, devido a um erro, ele arredonda para a próxima potência de dois (por exemplo, 4 -> 8 em vez de 4 -> 4 ) Isso terá que ser corrigido mais tarde, mas agora me salva um byte.
fonte
]
objetivo não for outro senão formatar a saída, eu diria que você não precisa incluí-la na sua contagem de bytes.Java 10,
8985706968 bytesPorto de @Emigma resposta 05AB1E 's , por isso saídas decimais indefinidamente também.
-15 bytes graças a @Arnauld .
Experimente online.
Explicação:
fonte
Perl 6 , 19 bytes
Experimente online!
fonte
Python 3 , 33 bytes
Experimente online!
Gera decimais, um indexado sem o termo zero inicial.
fonte
Java (JDK 10) , 30 bytes
Experimente online!
Retorna o enésimo item na sequência.
Esta resposta é originalmente uma sucessão de campos de golfe da resposta Java do TCFP . No final, os campos não pareciam mais a resposta original (embora a matemática usada seja a mesma), então eu decidi postar os campos como uma resposta separada, em vez de simplesmente comentar a resposta do TCFP. Portanto, se você gosta desta resposta, suba também à resposta do TCFP ! ;-)
Os golfe intermediários foram:
fonte
05AB1E ,
118 bytesEconomizou 3 bytes graças a Kevin Cruijssen .
Experimente online!
Explicação
fonte
∞
(lista infinita começando em 1):∞oεDÅÉs/}˜
[1,2,4,4,8,8,8,8,16,16,...,2**n]
e preceder o primo indexado correto seguido por um/
... Mas isso não estava funcionando tão bem. Bem, mas não8-bytes
bem. Algo como9LoDÅP)ζ
.Geléia , 9 bytes
Experimente online!
fonte
PowerShell , 40 bytes
Experimente online!
Produz a sequência infinita como valores decimais. Dadas as limitações de idioma, eventualmente ocorrerá problemas de precisão, mas lida facilmente com as primeiras 1000 entradas.
Inicia definindo
$i=2
e entra em umfor
loop. A cada iteração, construímos um intervalo1..$i
e extraímos os valores ímpares com|?{$_%2}
. Esses são alimentados em seu próprio loop interno, onde dividimos cada um para obter o decimal|%{$_/$i}
. Elas são deixadas no pipeline e produzidas quando o pipeline é liberado após cadafor
iteração. Cada iteração estamos simplesmente incrementar$i
por$i*=2
para obter o próximo go-round.fonte
Haskell,
3532 bytesEdit: -3 bytes graças a @ Delfad0r.
Esta é uma lista infinita de pares inteiros.
Experimente online!
fonte
Haskell , 40 bytes
Experimente online!
Sequência infinita como pares de números inteiros (a partir de
(1,2)
).Um pouco mais do que a resposta de @ nimi , mas a abordagem é completamente diferente, então decidi publicá-la de qualquer maneira.
Esta solução é baseada na seguinte observação.
Considere a sequência infinita{ 12, 14, 34, 18, 38, 58, 78, 116, 316, … }
e aplique as etapas a seguir.
Observe como você volta à sequência em que começou!
A solução explora esse fato (junto com a preguiça de Haskell) para calcular a sequência
s
.fonte
Python
2-6866 bytes-2 bytes graças a Kevin
Experimente Online!
fonte
return 2*(n-a)
parareturn(n-a)*2
. E você pode salvar um byte adicional usando Python 2 em vez de 3, assimreturn
pode serprint
(com parênteses).len
e embin
vez delog
.Python 3 ,
5351 bytesn
.Experimente online!
fonte
def f(m=2,n=1):n<m and print(n/m)&f(m,n+2)or f(m+m)
R , 42 bytes
Experimente online!
Retorna um parN= 2 ∗ ( n - 2⌊ log2( N ) ⌋) +1 da sequência Josephus e D = 2⌊ log2( n ) ⌋ + 1 da outra sequência. Felizmente, podemos reutilizar o denominador, pois as duas fórmulas têm muito em comum!
Denominator,Numerator
. Usa a fórmulafonte
Raquete ,
9291 bytesExperimente online!
fonte
MATL , 8 bytes
Experimente online!
Retorna Numerador e Denominador. Usa o mesmo método da minha resposta R , embora seja um pouco mais eficiente.
Explicação, com entrada
5
:fonte
Linguagem de programação de Shakespeare , 426 bytes
Experimente online!
Produz a sequência infinitamente como os dois números separados por um espaço, com cada item sendo separado por uma nova linha.
fonte
You be twice the sum of a cat
Python 2 , 44 bytes
Experimente online!
A função retorna uma tupla de (numerador, denominador). Uma entrada de 0 não é manipulada (era opcional).
fonte
return 2*n-m+1,m
pode serprint-~n+n-m,m
para salvar 2 bytes.Excel
4828 BytesEconomizou 20 bytes (!) Graças a tsh
= MOD (A1 + 0,5,2 ^ (INT (LOG (A1,2)))) / 2 ^ INT (LOG (A1,2))Assume o valor em A1, a saída é decimal. Se você deseja que a saída esteja na fração, é possível criar um formato personalizado para a célula de saída como "0 / ### 0" e ela será exibida como fração.
Explicação: Difícil de explicar, pois existe um atalho para chegar a essa fórmula. Basicamente, o numerador fica um deslocamento à esquerda da entrada e o denominador é a próxima potência 2 maior que a entrada numérica.
Inicialmente, comecei com as funções incorporadas do Excel para BITLSHIFT e BITRSHIFT, mas elas deslocam os 48 bits inteiros, o que não é o que você deseja. As funções DEC2BIN (e BIN2DEC) têm um limite de -512 a 511 (10 bits), portanto, isso não funcionaria. Em vez disso, tive que reconstruir o número com um módulo do número original, depois duas vezes e depois adicionar 1 (já que o dígito esquerdo sempre seria 1 antes de um turno).
Exemplos:
fonte
=(A1+0.5)/2^INT(LOG(A1,2))-1
?C ++,
977571 bytes-26 bytes graças a tsh, ceilingcat, Zacharý
Código de teste:
fonte
if(!i)return 0;
já que 0 não é necessário no desafio.while
mas tentefor
.for(;exp;)
é o mesmo,while(exp)
mas você pode escrever mais duas declarações nele. Prefira em?:
vez deif else
, o que seria mais curto na maioria dos casos.(...)
entornod-n-1
.C (gcc) , 63 bytes
Sem entrada, imprime sequência infinita:
Experimente online!
fonte
JavaScript (ES6), 44 bytes
Retorna on terceiro termo, indexado em 1.
Experimente online!
fonte
Ruby , 42 bytes
Experimente online!
Imprime pares inteiros infinitamente, iniciando em 1/2.
fonte
JavaScript (Node.js) , 30 bytes
Experimente online! Indexado a 0. Começou como uma porta da minha resposta do Lote, mas consegui calcular em múltiplos de12 que salvou vários bytes.
fonte
Ruby , 31 bytes
Experimente online!
fonte
> <> ,
1918 bytesUsando a idéia do xnor , corrigida por Jo King, -1 byte, fazendo melhor uso dos espelhos e outros -2 bytes por Jo King, porque
!
era supérfluo e;
não é necessário.Experimente online!
fonte
-0.25
. Fixar para a mesma quantidade de bytesWolfram Language (Mathematica) , 22 bytes
Experimente online!
fonte
APL (Dyalog Unicode) , 15 bytes
Experimente online!
Prefixo anônimo lambda.
Agradecimentos a Adám por 4 bytes e a Vacas charlatão por 2 bytes.
Quão:
fonte
C # (.NET Core) , 69 bytes
Experimente online!
Ungolfed:
fonte