Seja n
e b
sejam inteiros positivos maiores que 1
.
Emita a distância n
até a próxima potência de b
.
Para n=5
e b=3
, a próxima potência de 3
from 5
é 9
( 3^2 = 9
), portanto a saída é9 - 5 = 4
.
Para n=8
e b=2
, a próxima potência de 2
from 8
é 16
( 2^4 = 16
), então a saída é 16 - 8 = 8
. Observe que n
é um poder 2
deste exemplo.
Casos de teste:
n b output
212 2 44
563 5 62
491 5 134
424 3 305
469 8 43
343 7 2058
592 7 1809
289 5 336
694 3 35
324 5 301
2 5 3
Isso é código-golfe . A resposta mais curta em bytes vence. Aplicam-se brechas padrão .
code-golf
arithmetic
Freira Furada
fonte
fonte
;)æċ
!" em vez de "uau, isso é tãããão difícil ..."æċ_⁸
Montagem x86-64 ( Convenção de chamada do Windows x64 ),
1413 bytesUma abordagem iterativa ineficiente (mas esbelta!) (Com crédito a @Neil pela inspiração):
A função acima pega dois parâmetros inteiros
n
(passados noECX
registrador) eb
(passados noEDX
registrador) e retorna um único resultado inteiro (noEAX
registrador). Para chamá-lo de C, você usaria o seguinte protótipo:Isso é limitado ao intervalo de um número inteiro de 32 bits. Ele pode ser facilmente modificado para oferecer suporte a números inteiros de 64 bits usando os registros longos completos, mas custaria mais bytes para codificar essas instruções. :-)
fonte
push 1
+pop rax
em apenas 3 bytes. Mas ... então você não precisaria pular a multiplicação, de modo que ainda seria uma economia razoável, porque você poderia largar ajmp
.C (gcc) ,
3935 bytesNovo comportamento indefinido graças a Erik
Experimente online!
fonte
f(n,b,i){for(i=b;b<n;b*=i);n=b-n;}
economiza 5 bytes, e é apoiado por gccb-=n
?b-=n
se você trocar a ordem deb
en
?Dyalog APL, 10 bytes
2 bytes salvos graças a @ZacharyT
Experimente online!
Toma
n
como argumento certo eb
como argumento esquerdo.Calcula .
b⌊logbn + 1⌋ - n
fonte
⊣-⍨⊢*1+∘⌊⍟⍨
.⊢-⍨⊣*1+∘⌊⍟
10 bytes, mas com argumentos trocados, de modo que essen
é o argumento correto eb
o argumento esquerdo. Eu usei o truque de ZacharyT1+∘⌊
para chegar até aqui.R ,
3834 bytesFunção anônima. Armazena todos os valores de b à potência de tudo no intervalo [0, n], subtrai n de cada um, subconta em valores positivos e retorna o mínimo.
O TIO possui uma versão não-pryr, chamada como
f(n,b)
; esta versão precisa ser chamada comof(b,n)
.Economizou 4 bytes graças a Jarko Dubbeldam, que então me superou.
Experimente online!
fonte
pryr::f({a=b^(0:n)-n;min(a[a>0])})
é alguns bytes mais curto.pryr::f
quando defino uma nova variável na função; parece que funciona aqui.sapply(x, sum)
ou algo assim , que isso acrescentasum
aos argumentos.Cubix ,
2420 bytes-4 bytes graças ao MickyT
Lê na entrada como
n,b
Se encaixa em um cubo 2x2x2:
Explicação:
I|I0
: leia a entrada, pressione 0 (contador) na pilha^w
coloca o IP no lugar certo para o loop:Pp-
: calcularb^(counter)
, movern
para o topo da pilha, calcularb^(counter) - n
?
: virar à esquerda se negativo, reto se 0, à direita se positivoO@
saída da parte superior da pilha (distância) e saída.|?
prossiga como se o topo da pilha fosse zero<;qu;)
: aponte o IP na direção certa, coloquen
a parte superior da pilha (número negativo / zero), vá para a parte inferior da pilha, faça inversão de marcha, coloque a parte superior da pilha (b^(counter)
) e aumente o contador^w
e o programa continua.Assista online!
Experimente online!
fonte
Pwp.I|-.;)^0@O?|uq;<
Haskell , 20 bytes
Experimente online!
until
salva o diafonte
05AB1E ,
98 bytesExperimente online!
Explicação
fonte
ć
vez de¬
.n
implicitamente, tanto na comparação de filtros quanto no cálculo da diferença absoluta.Java (OpenJDK 8) , 42 bytes
Com base na resposta C de @ GovindParmar .
Experimente online!
fonte
MATL ,
109 bytesExperimente online!
Explicação
Considere entradas
694
e3
como um exemplo.fonte
JavaScript (ES6), 29 bytes
Muito parecido com a abordagem de Rick, mas publicado com sua permissão (e alguma ajuda para salvar um byte).
Tente
fonte
Mathematica, 24 bytes
obrigado Martin
I / O
fonte
1/Log@##
ou#2~Log~#
. Ou ainda melhor, trocar a ordem das entradas e usarLog@##
.#^Floor[...]#
é mais curto que#^(Floor[...]+1)
. E também há operadores UnicodeFloor
.Log@##
! Na verdade, se você trocar a ordem dos argumentos,#^⌊Log@##⌋#-#2&
deve ser possível por -5 bytes (eu acho)!C,
4240 bytesObrigado ao comentarista @Steadybox pela dica
fonte
for
vez dewhile
salvar dois bytes:o;p(n,b){for(o=b;n>=b;)b*=o;return b-n;}
n/b
vez den>=b
R, 30 bytes
Avalia para a função
Qual leva a primeira potência maior ou igual a
n
e, em seguida, substratosn
desse valor.Alterado
ceiling(power)
parafloor(power+1)
garantir que, sen
for um poderb
, assumimos o poder seguinte.fonte
JavaScript (ES6), 31 bytes
Casos de teste:
Mostrar snippet de código
fonte
n
eb
apenasn
), porque isso evita que vocên
precise passar recursivamente.n=>g=(b,p=b)=>p>n?p-n:g(b,p*b)
en=>b=>(g=p=>p>n?p-n:g(p*b))(b)
.f=(n,i)=>g=(b=i)=>b>n?b-n:g(b*i)
trabalhar por 30 bytes? Teria de ser chamado assim:f(324,5)()
. EDIT: Ah, @ Nee me venceu.Oitava , 32 bytes
Experimente online!
fonte
Oitava, 26 bytes
Verifique todos os casos de teste!
fonte
Ruby , 38 bytes
Duas abordagens diferentes:
Experimente online!
Experimente online!
fonte
Haskell , 31 bytes
Experimente online!
fonte
Perl 6 ,
31 3029 bytesTeste (31)
Teste (30)
Teste (29)
Teste (29)
fonte
PARI / GP ,
2624 bytesfonte
Japonês , 9 bytes
Teste online!
Explicação
fonte
Python ,
4241 bytesUma função recursiva que, começando com
v=1
, multiplica-se repetidamenteb
até exceder estritamentea
e depois retorna a diferença.Experimente online!
Nota: O resultado nunca será zero; portanto,
a>=v and f(a,b,v*b)or v-a
pode ser substituído por(a<v)*(v-a)or f(a,b,v*b)
sem causar erros de recursão.Python 3, 37 bytes?
Usando uma idéia de rici's ...
que usa aritmética de ponto flutuante (portanto, os resultados podem se afastar da distância real),
tente isso aqui .
fonte
b-n
nunca ser zero ao mesmo tempo quen<b
é verdadeiro).Braquilog , 7 bytes
Experimente online!
Leva a entrada como uma lista
[b, n]
.fonte
PHP> = 7.1, 46 bytes
Sandbox do PHP Online
fonte
Lua,
7473 ByteUma solução direta, estou usando 10 bytes para garantir que os argumentos sejam tratados como números e não como seqüências de caracteres. Saídas para STDIN.
Editar: esqueceu de remover o espaço
w=1 n=n+0
, economiza um byteExplicado
Experimente online!
fonte
1
eend
necessário?1end
começarem a ser interpretados como o número e, em1e
seguida, gerarão um erro porque1en
não é um valor hexadecimal válido. Isso ocorre apenas quando a letra após o número é[abcdef]
como outras letras não pode ser interpretada como valor hexadecimal ->w=1while
não gera um erro.QBIC , 23 bytes
Toma
b
primeiro o parâmetro e depoisn
.Explicação
fonte
Python 2 ,
4841 bytesPrograma completo sem recursão ou manipulação de bits:
Experimente online!
Formato de entrada:
n, b
.fonte
Python 3 ,
5048 bytesObrigado ao EriktheOutgolfer por salvar 2 bytes!
Experimente online!
O Python não possui nenhum log sofisticado ou teto embutido, então eu apenas segui a abordagem óbvia com um pouco de talento para o golfe.
fonte
import math;lambda n,b:b**-~int(math.log(n,b))-n
salva dois bytes e é permitido por meta consenso.ceil
não funcionaria.ceil
porque não funciona para os poderes deb
, mas como @Uriel apontou a importação antes ainda salva um byte.import
após o lambda e adicionarf=
no cabeçalho.Lisp comum, 73 bytes
Experimente online!
fonte