Dados dois números inteiros maiores que um, A e B, produzem quatro expressões matemáticas nesta ordem:
A expressão simples A ^ B (A à potência B). por exemplo, se A = 2 e B = 3
2^3
,.A expansão de A ^ B em termos de multiplicações repetidas de A. eg
2*2*2
.A expansão de A ^ B em termos de adições repetidas de A. eg
2+2+2+2
.A expansão de A ^ B em termos de adições repetidas de 1. eg
1+1+1+1+1+1+1+1
.
As quatro expressões podem ser produzidas de qualquer maneira razoável, desde que estejam em ordem e claramente distintas. Por exemplo, você pode colocá-los em uma lista ou imprimi-los em linhas separadas
2^3
2*2*2
2+2+2+2
1+1+1+1+1+1+1+1
ou talvez em uma linha separada por sinais de igual:
2^3=2*2*2=2+2+2+2=1+1+1+1+1+1+1+1
Os espaços podem ser inseridos ao lado dos operadores matemáticos para que
2^3 = 2 * 2 * 2 = 2 + 2 + 2 + 2 = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
seria uma saída igualmente válida quando A = 2 e B = 3.
Você pode usar símbolos alternativos para ^
, *
e +
, mas somente se os novos símbolos são mais idiomática para o seu idioma (por exemplo, **
em vez de ^
em Python).
Você pode supor que A e B são suficientemente pequenos para que A ^ B não ultrapasse o tipo inteiro padrão do seu idioma (dado que esse tipo tem um máximo razoável, 255 pelo menos).
O código mais curto em bytes vence.
Casos de teste
Uma saída por linha. A entrada pode ser inferida, pois a primeira expressão é sempre A ^ B.
2^2 = 2*2 = 2+2 = 1+1+1+1
2^3 = 2*2*2 = 2+2+2+2 = 1+1+1+1+1+1+1+1
2^4 = 2*2*2*2 = 2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
2^5 = 2*2*2*2*2 = 2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^2 = 3*3 = 3+3+3 = 1+1+1+1+1+1+1+1+1
3^3 = 3*3*3 = 3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^4 = 3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^5 = 3*3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^2 = 4*4 = 4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^3 = 4*4*4 = 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
10^2 = 10*10 = 10+10+10+10+10+10+10+10+10+10 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
13^2 = 13*13 = 13+13+13+13+13+13+13+13+13+13+13+13+13 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
fonte
=
à esquerda de nenhum3
.2^3
um formato de entrada válido? Ou precisa ser separado por espaço / vírgula / avanço de linha ou algo assim?Respostas:
Python 3.6 ,
8874 bytes-2 bytes graças ao Dada (uso
~
)-5 bytes graças ao Erwan (use strings f do Python 3.6)
ide online alguém?
Quão?
Esta é uma função sem nome que recebe as duas entradas inteiras
a
eb
cada uma é maior que0
(mesmo que a especificação seja apenas para aquelas maiores que1
).No Python 3.6, um novo recurso está disponível, a saber, literais de string formatados ou "f-strings". Isso permite a construção de cadeias avaliadas em tempo de execução. Um líder
f
(ouF
) cria essa construção, por exemplo,f"blah"
ouf'blah'
. Dentro de uma string F, qualquer coisa entre um par de chaves,,{...}
é uma expressão a ser avaliada.Como tal,
f"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"
avalia cada uma
,b
,a
,f'*{a}'*~-b
,a
, ef'+{a}'*~-a**~-b}
como expressões, mantendo o^
,=
,=
, e=1
como cordas, todos os quais se concatenadas.As expressões
a
eb
avaliam as representações dea
eb
respectivamente.O
f'*{a}'
ef'+{a}'
por sua vez também são strings f dentro dessas expressões, que avaliama
com um líder'*'
e um líder'+'
respectivamentePara criar o número necessário de se
a
operações para as partes*
e,+
observe que serãob
a
multiplicados ea**(b-1)
a
adicionados. Cada caso requer um sinal de operador a menos que o número dea
s. Assim, podemos repetir as f-cordasf'*{a}
ef'+{a}'
(usando*
) tantas vezes quantas existem operadores e preceder cada um com um únicoa
.(b-1)
é~-b
e(a**(b-1))-1
é~-a**~-b
.O mesmo é feito para os que estão
1
usando(a**b)-1
~-**b
, mas nós não precisamos a sobrecarga de f-cordas desde1
é constante, por isso, uma cadeia de caracteres padrão repetido é concatenado com+
.Versões anteriores do Python, 81:
Experimente online!
fonte
(b-1)
com~-b
?lambda a,b:f"{a}^{b}={(f'*{a}'*b)[1:]}={(f'+{a}'*a**~-b)[1:]}=1"+'+1'*~-a**b
Cubix,
238 234 217 151 110100 bytesEconomizou 14 bytes graças ao ETHProductions
Expandido:
Experimente online!
Experimente aqui
Explicação
O código consiste em 8 etapas, com dois loops. Vou revisar o código parte por parte.
Etapa 1 (A ^ B)
Este é o cubo com as partes que são irrelevantes para a primeira etapa removida. O ponto de interrogação mostra as no-ops que o IP visitará, para tornar seu caminho mais claro.
Agora, a pilha fica assim:
A, B, A, B
Etapa 2 (preparar para o loop de impressão)
O ciclo de impressão leva 3 argumentos (os 3 principais elementos na pilha):
P
,Q
eR
.P
é a quantidade de repetições,Q
é o separador (código de caractere) eR
é o número a repetir. Felizmente, o loop também cuida da exigência de que a sequência resultante termineR
, nãoQ
.Queremos repetir
A*
exatamente osB
tempos, então o separador é*
. Observe que a pilha começa comoA, B, A, B
. Mais uma vez, removi todas as instruções irrelevantes. O IP começa no sentidoS
norte.A pilha está agora
A, B, B, *, A
.Etapa 3/6/8 (o loop de impressão)
Conceito
O IP entra no loop
S
, apontando para o norte, e sai do loop emE
, apontando para o norte novamente. Para esta explicação, a pilha está definida como[..., A, B, C]
. As seguintes instruções são executadas. Observe que o IP não pode deixar o loop antes do ponto de interrogação; portanto, as quatro primeiras instruções sempre serão executadas.Implementação
Aqui está o cubo novamente, com as partes irrelevantes removidas. O IP começa em
S
, apontando para o leste.Como você pode ver, o IP encontra quatro instruções antes de entrar no loop. Como o código do caractere é removido novamente, alcançamos o loop exatamente com a mesma pilha em que entramos nesta parte.
Dentro do loop, a explicação acima é válida.
Etapa 4 (diferenciando os IPs)
Como usamos o loop acima várias vezes e todos eles fazem com que o IP termine no mesmo local, precisamos diferenciar entre várias execuções. Primeiro, podemos distinguir entre o separador (a primeira execução tem a
*
, enquanto as duas e três têm uma+
como separador). Podemos diferenciar entre as execuções 2 e 3 verificando o valor do número que é repetido. Se for esse o caso, o programa deve terminar.Primeira comparação
Aqui está o que parece no cubo. O IP começa em S e aponta para o norte. A pilha contém
[..., * or +, A or 1, 0]
. O número 1 mostra onde o IP terminará se este for o primeiro loop (apontando para o norte) e o número 2 mostra onde o IP terminará se esse for o segundo (ou terceiro) loop (apontando para o leste).Se o IP agora estiver em
1
, a pilha estará[A, *, +, -1]
. Caso contrário, a pilha é[A or 1, +, +, 0]
. Como você pode ver, ainda há um desconhecido na pilha do segundo caso, então temos que fazer outra comparação.Segunda comparação
Porque o IP passou por etapa 5, os olhares pilha como este:
[A^(B-1) or nothing, A or 1, +, +, 0]
. Se o primeiro elemento fornothing
, o segundo elemento será1
e o inverso também será válido. O cubo fica assim, com o IP começando em S e apontando para leste. Se esse for o segundo loop, o IP terminará emE
, apontando para oeste. Caso contrário, o programa acessa@
e termina.As instruções executadas que não fazem nada no fluxo de controle estão listadas abaixo.
A pilha está agora
[A^B, +, A^(B-1), A-1]
, desde que o programa não tenha terminado.Etapa 5 (preparando para "A +" (repita A ^ (B-1)))
Infelizmente, o Cubix não tem um operador de energia, então precisamos de outro loop. No entanto, precisamos limpar a pilha primeiro, que agora contém
[B, A, *, +, -1]
.Limpando
Aqui está o cubo novamente. Como de costume, o IP começa em S (apontando para o norte) e termina em E, apontando para o oeste.
Cálculo de A ^ (B-1)
Outro loop que funciona aproximadamente o mesmo que o loop de impressão, mas é um pouco mais compacto. O IP começa em
S
, apontando para o oeste, com a pilha[B, A, *]
. O IP saiE
apontando para o norte.O corpo do loop é o seguinte.
A pilha resultante é
[A, A^(B-1), 0]
.Limpando a pilha (novamente)
Agora precisamos voltar ao loop de impressão novamente, com a parte superior da pilha
[..., A^(B-1), +, A]
. Para fazer isso, executamos o seguinte. Aqui está o cubo novamente,Etapa 7 (preparando para o último loop)
A pilha está agora
[A^B, +, A^(B-1), A-1]
, o IP começa emS
, indo para o oeste, e termina emE
, indo para a direita.As instruções executadas:
A pilha agora parece
[A^B, +, 1]
e o IP está prestes a entrar no loop de impressão, então terminamos.fonte
MATL , 46 bytes
Experimente online!
Esticando os limites da "maneira razoável" aqui, mas as expressões são separadas.
Explicação
Primeira expressão:
Segunda expressão:
Terceira expressão:
Quarta expressão:
fonte
JavaScript (ES7), 78 bytes
Recebe entrada na sintaxe de currying
(a)(b)
. Produz uma string.Casos de teste
Mostrar snippet de código
fonte
Ruby, 52 bytes
fonte
05AB1E , 30 bytes
Explicação:
Experimente online!
fonte
¹²'^ý ¹'*¹«²<׫¹²m¹÷¹s×S'+ý 1¹²m×S'+ý»
, por que você me venceu por 5 bytes :(?¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,
está mais próxima ;). Você está ganhando apenas 1 agora;).C (gcc) ,
156149 bytes-2 bytes se pudermos ignorar 0 potências;
y=!!i
pode se tornary=1
Experimente online!
fonte
Java 7, 170 bytes
Ungolfed:
Código do teste:
Experimente aqui.
Saída:
fonte
Pip ,
383534 bytes33 bytes de código, +1 para
-n
sinalizador.Leva A e B como argumentos de linha de comando; imprime uma expressão por linha. Experimente online!
Explicação
Ya**b
é o código de instalação: puxea**b
ay
variável. Depois disso, temos uma lista (in[]
) contendo nossas quatro expressões:gJ'^
: pegue umag
lista completa (aqui, uma lista contendoa
eb
) eJ
coloque-a no^
aRLbJ'*
: useR
epeatL
ist para criar uma lista comb
cópias ea
, em seguidaJ
,*
aRLy/aJ'+
: useRL
para criar uma lista comy/a
(ou sejaa**(b-1)
) cópias de ea
, em seguidaJ
,+
1XyJ'+
:1
, sequência de caracteres multiplicada pory
,J
repetida em+
A lista é impressa com nova linha como separador, graças à
-n
bandeira.fonte
Javascript
115113104 bytesObrigado a @Neil e @TuukkaX por jogarem um byte cada e @ETHproductions e Luke por jogarem 9 bytes
Experimente Online
fonte
a=>b=>
.'=1'+'+1'.repeat
?.join
:a=>b=>[a+'^'+b,(a+'*').repeat(b-1)+a,(a+'+').repeat(Math.pow(a,b-1)-1)+a,1+'+1'.repeat(Math.pow(a,b)-1)].join`=`
.join()
...Gelatina , 29 bytes
Experimente online!
Quão?
fonte
repl do tinylisp ,
178186 bytesO uso da repl salva 8 bytes entre parênteses de fechamento implícitos no final das linhas. Define uma função
X
que recebe dois números e retorna uma lista de expressões. Cada expressão está entre parênteses, com espaços ao redor dos operadores (na verdade, é uma lista de números e símbolos do operador):Espero que este formato de saída seja aceitável. Experimente online! (com vários casos de teste).
Explicação
Precisamos de duas funções da biblioteca padrão:
list
e*
.Defina uma função
W
(abreviação de "tecer") que recebe um acumulador_
, um númeroN
, um símboloS
e uma contagem#
. Usaremos essa função para gerar a maioria de nossas expressões: por exemplo,(W () 2 (q +) 3)
resultará em(2 + 2 + 2)
.Se a contagem for 1
(e # 1)
, considere o número na frente do acumulador(c N _)
e devolva-o. Caso contrário, recorra:(c S(c N _))
: o símbolo e o número consitados na frente do acumulador anterior;N
eS
são iguais;(s # 1)
: contagem - 1.O idioma do acumulador é necessário para obter uma recursão adequada da cauda , evitando um erro de profundidade da recursão. (Essa alteração é responsável pela contagem de +8 para bytes. O
13^2
caso não funcionou na versão anterior.)Infelizmente, a biblioteca não possui função de exponenciação no momento, portanto, precisamos definir uma.
^
levax
ey
. Sey
for verdade (diferente de zero), repetimos comy-1
((s y 1)
) e multiplicamos o resultado porx
. Caso contrário,y
é zero e retornamos1
.(Nota: Essa função não usa recursão de cauda adequada. Suponho que os expoentes serão pequenos o suficiente para que não importem. Algumas experiências com o TIO indicaram um expoente máximo de 325, o que eu argumentaria que deveria ser suficiente para esta pergunta. Se o OP discordar, eu o mudarei.)
Finalmente, a função que nos interessa,
X
, levaA
eB
e retorna uma lista de quatro itens:(list A(q ^)B)
: uma lista contendoA
, um literal^
eB
;(W()A(q *)B)
: ligueW
para obter uma lista deB
cópiasA
entrelaçadas com literal*
;(W()A(q +)(^ A(s B 1)))
: ligueW
para obter uma lista deA^(B-1)
cópiasA
entrelaçadas com literal+
;(W()1(q +)(^ A B))
: ligueW
para obter uma lista deA^B
cópias1
entrelaçadas com literal+
.fonte
Brainfuck , 372 bytes
Experimente online!
Notas
A**B
não exceder255
. Isso ocorre porque o brainfuck só pode armazenar valores de um byte.10
torna-se:
,11
torna-se;
etc. Isso ocorre porque o Brainfuck pode receber apenas entradas de um byte.Explicação
Aqui está o meu código comentado. Vou expandir isso mais tarde.
fonte
Pitão,
3231 bytesToma entrada como
[2,10]
, sai como["2^10", "2*2*2*2*2*2*2*2*2*2", "2+2+...
Explicação:
Experimente aqui.
fonte
Perl , 81 bytes
78 bytes de código +
-n
sinalizador (contados como 3 bytes desde que o código contenha$'
).Experimente online!
fonte
R, 147 bytes
Função anônima que gera as saídas necessárias, bem, linha por linha. Esta solução faz uso extensivo da
switch
função.A
switch
função pega uma expressão (aquis
) que é avaliada como um número ou sequência de caracteres (consulte?switch
), seguida pelas alernativas correspondentes as
. Se uma alternativa estiver ausente (por exemploswitch(s, a=, b= "PPCG")
, a próxima alternativa não ausente será avaliada (no exemplo, ass="a"
saídas"PPCG"
).As
rep
funções repetem (na verdade replicam) seu primeiro argumento o número de vezes indicado no segundo argumento.cat
, para finalizar, concatenar e imprimir os objetos, com um separador que pode ser escolhido com osep =
argumento A segundacat
função está aqui para a quebra de linha.Ungolfed:
fonte
CJam , 42 bytes
Experimente online!
fonte
k, 44 bytes
Casos de teste.
fonte
Cardinal 202 bytes
Funcionará apenas para números em que o valor calculado <256 devido a limitações nos valores que podem ser mantidos por ponteiros no Cardinal
Experimente Online
Explicação:
Passo 1
Recebe dois números aeb como entrada e saída como "a ^ b ="
Passa um ponteiro com o valor ativo a e o valor inativo b
Passo 2
Recebe um ponteiro com valor ativo ae valor inativo b imprimindo "a" + ("* a") (b-1) vezes
Passa um ponteiro com valor ativo a ^ (b-1) para a próxima parte
etapa 3
Recebe um ponteiro com o valor de a ^ (b-1) e gera "= a" + ("+ a") repetido (a ^ (b-1) -1) vezes + "="
Passa um ponteiro com o valor a ^ b para a próxima parte
Passo 4
Recebe um ponteiro com o valor a ^ b e imprime "1" + ("+ 1") repetido a ^ b-1 vezes
fonte
Retina,
8988 bytesA entrada é números unários separados por vírgula.
Experimente online!
fonte