Uma lenda indiana conta a história do suposto inventor do jogo de xadrez, que impressionou tanto o imperador da Índia com seu jogo que ele seria recompensado com qualquer coisa que fosse solicitada.
O homem disse que queria ser pago em arroz. Ele queria um grão de arroz para o primeiro quadrado do tabuleiro de xadrez, dois para o segundo, quatro para o terceiro, oito para o quarto e assim por diante, até o 64º quadrado.
O imperador ficou surpreso que o homem pedisse uma recompensa tão pequena, mas quando seus matemáticos começaram a contar, ele acabou perdendo uma de suas províncias.
Tarefa
Dado o comprimento do lado de um tabuleiro de xadrez hipotético (que é 8 em um tabuleiro de xadrez padrão) e o multiplicador entre quadrados (que é 2 na legenda), calcule o número de grãos de arroz que o imperador deve pagar ao homem.
Notas
O comprimento do lado sempre será um número inteiro positivo. O multiplicador poderia ser qualquer tipo de número racional.
Se o seu idioma de escolha não puder exibir números muito grandes, tudo bem, desde que o seu programa possa processar corretamente entradas menores.
Além disso, se o seu idioma de escolha arredondar valores maiores (com notações exponenciais), tudo bem se esses valores estiverem aproximadamente corretos.
Casos de teste
Input (side length, multiplier) => Output
8, 2 => 18446744073709551615
3, 6 => 2015539
7, 1.5 => 850161998.2854
5, -3 => 211822152361
256, 1 => 65536
2, 2 => 15
2, -2 => -5
Observe que a fórmula explícita
result = (multiplier ^ (side ^ 2) - 1) / (multiplier - 1)
Executa errado multiplier = 1
, como
1 ^ (side ^ 2) - 1 = 0
1 - 1 = 0
0 / 0 != side ^ 2 (as it should be)
Pontuação
Isso é código-golfe. A resposta mais curta em bytes vence.
If your language of choose can't display too large numbers, it's ok as long as your program can correctly process smaller inputs
Cuidado, isso causou problemas no passado. meta.codegolf.stackexchange.com/a/8245/31716Respostas:
Gelatina , 4 bytes
Isso usa a abordagem da resposta inteligente do @ APLDude em APL .
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
MATL , 6 bytes
Experimente online!
fonte
APL, 10 bytes
⎕
é usado para ler a entrada do usuário duas vezes. Se armazenarmos o comprimento lateral em s e o multiplicador em m , obteremos o código a seguir.E aqui está como a APL analisa esse código:
fonte
⊣⊥1⍴⍨⊢×⊢
(8 bytes) Como um comando REPL interativo,⎕⊥×⍳⎕*2
(7 bytes) também funciona.Python, 40 bytes
Gera e avalia uma sequência como
que codifica a soma como um polinômio Hornerizado com
n*n
termos.Muitos métodos diferentes deram contagens de bytes muito semelhantes:
fonte
Pitão, 6 bytes
1 byte salvo graças a @FryAmTheEggman .
Experimente online!
Suíte de teste.
fonte
Haskell, 25 bytes
Soma a lista
[m^0, m^1, ..., m^(n*n-1)]
.fonte
JavaScript (ES2016 / ES7),
312928 bytesApenas o @Bassdrop Cumberwubwubwub e a versão ES6 do @ Kaizo, mas com o operador de exponenciação. :) (Eu não tinha reputação suficiente para comentar.)
Editar:
/+(b-1)
alterado para/--b
(obrigado @ Neil).Edit: agora usa currying (obrigado @MamaFunRoll).
fonte
+
operador foi um teste Esqueci para editar, para que possa raspar 1 byte por omiti-lo :)/--b
economizaria um byte ou dois?Gelatina, 6 bytes
Experimente online!
fonte
MATLAB, 23 bytes
Teste aqui !
fonte
Javascript ES6,
59373534 bytesGraças a @Kaizo por eliminar 19 bytes, @Neil por mais 2 e @gcampbell por mais 1!
Experimente aqui
Mostrar snippet de código
Versões quebradas alternativas
32 bytes
Causas
NaN
parab==1
.30 bytes
Causas
Infinity
parab==1.5
.28 bytes
Saídas
1
para alguns casos de teste válidos.Versão antiga para 59 bytes
(a,b)=>Array(a*a).fill``.reduce((c,d,i)=>c+Math.pow(b,i),0)
fonte
/~-b
obviamente não é bom para fracionáriob
, mas/--b
deve funcionar, não?(a,b)=>[...Array(a*a-1)].reduce(s=>s+=p*=b,p=1)
Java, 132 bytes
Ungolfed
Notas
Saídas
fonte
R, 18 bytes
Explicação:
fonte
05AB1E , 5 bytes
Código:
Explicação:
Experimente online! .
fonte
Haskell, 30 bytes
ou igualmente longo
A primeira versão começa com
1
multiplica-se repetidamente comm
. Em seguida, soma os primeirosn^2
números dessa sequência. A segunda versão é a fórmula explícita, como visto em outras respostas.fonte
n#m=sum$(m^)<$>[0..n*n-1]
?J, 10 bytes
Uso
Eu marco alguns números inteiros com o
x
sufixo para usar números inteiros estendidos para obter resultados exatos.Explicação
fonte
#.*:$*
conforme o APL Dude.Mathcad, [tbd] bytes (~ 11)
Usa o operador de soma incorporado do Mathcad. Também demonstra a simplificação simbólica do processador para gerar a fórmula exata.
O Mathcad efetivamente executa dois mecanismos de processamento em paralelo - um um ponto flutuante padrão IEEE de 64/80 bits e o outro um processo simbólico arbitrário de comprimento de número (MuPad). A avaliação numérica padrão é indicada pelo sinal de igual (=), enquanto uma seta para a direita indica avaliação simbólica.
Esquema de contagem do Mathcad ainda a ser determinado, portanto, nenhuma contagem de bytes fornecida.
ctl- $ entra no operador de soma (Sigma), incluindo espaços reservados vazios para colocar a variável de soma, valor inicial, valor final e expressão. Contagem aproximada de equivalentes em bytes = 11.
fonte
PostgreSQL,
6766 bytesSqlFiddleDemo
Entrada:
VALUES(side, multiplier)
EDITAR:
Entrada movida para a tabela, todos os casos de uma vez:
SqlFiddleDemo
Saída:
fonte
TI-Basic, 19 bytes
S
é o comprimento lateral eM
é o multiplicador.fonte
Python, 40 bytes
fonte
lambda l,m:(m**(l*l)-1)/(m-1)
Ruby: 39 bytes
Teste:
fonte
sum
função ??? Isso está mudando o jogoPython, 41 bytes
Totalmente novo nessa coisa do golfe, críticas bem-vindas!
fonte
l**l
invés do que eu fiz?l*l
na verdade, que é mais curto quel**2
.Jolf,
181510 bytesObrigado a Cᴏɴᴏʀ O'Bᴏɴᴏʀ por salvar 3 bytes e me indicar o mapeamento
Experimente aqui!
fonte
CJam , 9 bytes
As entradas estão na ordem inversa, separadas por uma nova linha ou um espaço.
Experimente online!
fonte
PHP,
5854 bytesIsso apenas usa a fórmula de soma para mostrar o valor, depois de verificar se o multiplicador é 1 (que retorna NAN na fórmula).
fonte
Mathematica, 22 bytes
Cria um intervalo de
{1, 2, ... s^2}
, subtrai 1 sobre ele para criar{0, 1, ..., s^2-1}
. Em seguida, eleve cada um ao poder dem
fazer{m^0, m^1, ..., m^(s^2-1)}
e devolva a soma.Como alternativa, o Mathematica pode usar a fórmula explícita tomando seu limite. Isso requer 29 bytes.
fonte
Tr[#^Range[#2^2]/#]&
PARI / GP , 25 bytes
Mais longo, mas mais rápido (35 bytes):
Bonito (30 bytes):
fonte
C #, 56 bytes
fonte
256, 1
?(Math.Pow(1, 256 * 256) - 1) / --1
= 0/0.Lua,
5447 bytesExecute da linha de comando com o comprimento do lado do quadro como o primeiro argumento e o multiplicador como o segundo.
Agradecemos a user6245072 por salvar 6 bytes e a Katenkyo por salvar 1 adicional.
Versão original de 54 bytes:
fonte
l,m=...r=0 for i=0,l^2 do r=r+m^i end print(r)
c=1 d=1
=>a,b=...c=1g=1 for i=2,a^2 do c=c*b g=g+c end print(g)
. if @ 's obras sugestão user6245072, você poderia salvar um byte no mesmo princípio =>r=0l,m=...for i=0,l^2 do r=r+m^i end print(r)
r=0
el,m=...
é obrigatório de qualquer maneira, para que não mude. Também o loop deve ser,for i=0,l^2-1
mas isso é culpa minha lol.11, 11 caracteres / 14 bytes
Try it here (Firefox/WebKit Nightly only).
Sim, agora funciona no WebKit Nightly! O suporte ao Chrome é o próximo.
Explicação
fonte
RETURN , 32 bytes
Try it here.
Lambda anônima que deixa o resultado no Stack2. Uso:
Explicação
fonte