Considere os dígitos de qualquer base integral acima de uma, listados em ordem. Subdividi-los exatamente ao meio repetidamente até que cada pedaço de dígitos tenha um comprimento ímpar:
Base Digits Subdivided Digit Chunks
2 01 0 1
3 012 012
4 0123 0 1 2 3
5 01234 01234
6 012345 012 345
7 0123456 0123456
8 01234567 0 1 2 3 4 5 6 7
9 012345678 012345678
10 0123456789 01234 56789
11 0123456789A 0123456789A
12 0123456789AB 012 345 678 9AB
...
16 0123456789ABCDEF 0 1 2 3 4 5 6 7 8 9 A B C D E F
...
Agora, para qualquer linha nesta tabela, leia os blocos de dígitos subdivididos como números na base dessa linha e some-os. Dê o resultado na base 10 por conveniência.
Por exemplo...
- para a base 3, existe apenas um número para somar: 012 3 = 12 3 = 5 10
- para a base 4, existem 4 números para somar: 0 4 + 1 4 + 2 4 + 3 4 = 12 4 = 6 10
- base 6: 012 6 + 345 6 = 401 6 = 145 10
- base 11: 0123456789A 11 = 2853116705 10
Desafio
Escreva um programa que utilize um número inteiro maior que um como base e execute esse procedimento de soma subdividida, produzindo a soma final na base 10 . (Portanto, se a entrada é 3
a saída 5
, se a entrada é 6
a saída 145
, etc.)
Escreva uma função que pegue e retorne um número inteiro (ou string, pois os números podem ficar muito grandes) ou use stdin / stdout para inserir e gerar valores.
O código mais curto em bytes vence.
Notas
- Você pode usar qualquer função de conversão básica incorporada ou importada.
- Não há limite superior para o valor de entrada (além de um razoável
Int.Max
). Os valores de entrada não param em 36 apenas porque "Z" para aí .
Respostas:
CJam,
1715Funciona se houver uma nova linha à direita na entrada.
Uma versão mais óbvia para quem não sabe
x & -x
:Como funciona
fonte
x & -x
é realmente inteligente.Pitão,
8278Hã?
O número de grupos de dígitos que a subdivisão gera, G , é simplesmente a maior potência de dois que divide o número de dígitos (ou seja, a base), b . É dado por G = b ^ (b & (b - 1)) , onde ^ é bit a bit-XOR. Se você está familiarizado com o fato de que n é uma potência de dois iff n & (n - 1) = 0 , deve ser bem fácil entender o porquê. Caso contrário, elabore alguns casos (em binário) e isso ficará claro.
O número de dígitos por grupo, g , é simplesmente b / L .
O primeiro grupo de dígitos, 012 ... (g-1) , como um número na base b , é .
O próximo grupo, g (g + 1) ... (2g-1) , como um número na base b , é a soma .
De maneira mais geral, o n- ésimo grupo (com base em zero), como um número na base b , a n , é .
Lembre-se de que existem grupos G , portanto, a soma de todos os grupos é o
que o programa calcula.
fonte
~
:b/G-i-1
podeb/g+~i
e(G-1)*b/2
pode ser~-G*b/2
CJam (instantâneo), 19 bytes
Observe que a versão estável mais recente (0.6.2) possui um bug que pode causar o
mf
retorno de números inteiros em vez de longos. Paradoxalmente, isso pode ser contornado ao converter para inteiro (:i
).Para executar isso com o CJam 0.6.2 (por exemplo, com o intérprete online ), você deve usar o seguinte código:
Como alternativa, você pode fazer o download e criar a captura instantânea mais recente executando os seguintes comandos:
Casos de teste
Como funciona
fonte
Haskell,
746955exemplos:
fonte
CJam, 41 bytes
Esta é basicamente a solução de Ell no CJam:
Experimente online aqui
Minha submissão original:
Não funciona corretamente para a base 11 e superior
Tentarei ver se consigo fazê-lo funcionar na base 11 e acima, sem aumentar muito o tamanho.
fonte
Mathematica, 114 bytes (ou 72 bytes)
Hm, isso ficou mais longo do que eu pensava:
E não destruído:
Como alternativa, se eu apenas portar a fórmula bacana de Ell, serão 72 bytes:
fonte
J - 22 char
Função com um único argumento (chame-o
y
para os fins deste golfe) à direita.Primeiro, usamos
1&q:
para obter o número de vezes quey
é divisível por 2 e, em seguida, dividimos-y
por 2 tantas vezes. Isso nos dá o negativo da largura em que precisamos dividir as coisas, o que é perfeito, porque]\
terá partes sobrepostas se o argumento for positivo e não sobrepostas se for negativo.Então, dividimos
i.y
- os números inteiros de 0 ay-1
- em vetores dessas larguras e usamos#.
para convertê-los da basey
para a base 10. Finalmente,+/
faz a soma e terminamos.Exemplos: (a entrada no J REPL é recuada, a saída fica nivelada à esquerda)
fonte
JavaScript,
9989 bytesou
A segunda função é semelhante à de Ell. O primeiro usa uma abordagem mais tradicional. Ambos têm 89 caracteres.
Tente aqui: http://jsfiddle.net/wndv1zz8/1/
fonte
Geléia ,
109 bytesExperimente online!
Essencialmente, apenas uma tradução da resposta CJam de jimmy23013, exceto usando
n & -n
diretamente como o número de pedaços para dividir.(
ð
Isso não tem nada a ver com mapeamento:ḅ
apenas vetoriza sobre seu argumento esquerdo eð
existe para se separarḅS
como uma nova cadeia diádica que leva o resultadoḶœsÇ
como argumento esquerdo e o argumento para o link principal como argumento correto.)fonte