Dados dos enteros mayores que uno, A y B, generan cuatro expresiones matemáticas en este orden:
La expresión simple A ^ B (A a la potencia B). por ejemplo, si A = 2 y B = 3,
2^3
.La expansión de A ^ B en términos de multiplicaciones repetidas de A. ej
2*2*2
.La expansión de A ^ B en términos de adiciones repetidas de A. ej
2+2+2+2
.La expansión de A ^ B en términos de adiciones repetidas de 1. ej
1+1+1+1+1+1+1+1
.
Las cuatro expresiones pueden salir de cualquier manera razonable siempre que estén en orden y claramente distintas. Por ejemplo, puede ponerlos en una lista o imprimirlos en líneas separadas
2^3
2*2*2
2+2+2+2
1+1+1+1+1+1+1+1
o tal vez en una línea separada por signos iguales:
2^3=2*2*2=2+2+2+2=1+1+1+1+1+1+1+1
Se pueden insertar espacios al lado de los operadores matemáticos para
2^3 = 2 * 2 * 2 = 2 + 2 + 2 + 2 = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
sería una salida igualmente válida cuando A = 2 y B = 3.
Puede usar símbolos alternativos a ^
, *
y +
, pero solo si los nuevos símbolos son más idiomáticos para su idioma (por ejemplo, en **
lugar de ^
en Python).
Puede suponer que A y B son lo suficientemente pequeños como para que A ^ B no desborde el tipo entero predeterminado de su idioma (dado que ese tipo tiene un máximo razonable, 255 al menos).
El código más corto en bytes gana.
Casos de prueba
Una salida por línea. La entrada se puede inferir ya que la primera expresión es siempre 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
fuente
=
a la izquierda de ninguno3
.2^3
un formato de entrada válido? ¿O tiene que estar separado por espacio / coma / salto de línea o algo así?Respuestas:
Python 3.6 ,
8874 bytes-2 bytes gracias a Dada (use
~
)-5 bytes gracias a Erwan (use f-strings de Python 3.6)
en línea ide alguien?
¿Cómo?
Esta es una función sin nombre que toma las dos entradas enteras
a
yb
cada una mayor que0
(aunque la especificación es solo para aquellas mayores que1
).En Python 3.6 hay disponible una nueva característica, a saber, literales de cadena formateados o "cadenas f". Permiten la construcción de cadenas evaluadas en tiempo de ejecución. Un líder
f
(oF
) crea tal construcción, por ejemplo,f"blah"
of'blah'
. Dentro de una cadena f, cualquier cosa entre un par de llaves{...}
, es una expresión a evaluar.Como tales
f"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"
evalúa cada uno dea
,b
,a
,f'*{a}'*~-b
,a
, yf'+{a}'*~-a**~-b}
como expresiones, manteniendo el^
,=
,=
y=1
como cadenas, todos los cuales obtiene concatenan juntos.Las expresiones
a
yb
evalúan las representaciones dea
yb
respectivamente.El
f'*{a}'
yf'+{a}'
a su vez también son cadenas f dentro de estas expresiones, que se evalúana
con un líder'*'
y un líder'+'
respectivamentePara crear el número requerido de
a
sy operaciones para las porciones*
y+
tenga en cuenta que seb
a
multiplicarán y sea**(b-1)
a
sumarán. Cada caso requiere un signo de operador menos que el número dea
s. Entonces podemos repetir las cadenas ff'*{a}
yf'+{a}'
(usar*
) tantas veces como haya operadores y anteponer cada una con un soloa
.(b-1)
es~-b
y(a**(b-1))-1
es~-a**~-b
.Lo mismo se hace para los
1
s que usan(a**b)-1
being~-**b
, pero no necesitamos la sobrecarga de las cadenas f ya que1
es constante, por lo que una cadena estándar repetida se concatena con+
.Versiones anteriores de Python, 81:
Pruébalo en línea!
fuente
(b-1)
con~-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 bytesAhorró 14 bytes gracias a ETHProductions
Expandido:
Pruébalo en línea!
Pruébalo aquí
Explicación
El código consta de 8 pasos, con dos bucles. Revisaré el código parte por parte.
Paso 1 (A ^ B)
Este es el cubo con las partes que son irrelevantes para el primer paso eliminado. El signo de interrogación muestra los no-ops que visitará el IP, para dejar su camino más claro.
Ahora, la pila se ve así:
A, B, A, B
Paso 2 (prepárese para el ciclo de impresión)
El bucle de impresión toma 3 argumentos (los 3 primeros elementos en la pila):
P
,Q
yR
.P
es la cantidad de repeticiones,Q
es el separador (código de caracteres) yR
es el número a repetir. Por suerte, el bucle también se encarga de la exigencia de que la cadena resultante debe terminar enR
, noQ
.Queremos repetir tiempos
A*
exactosB
, entonces el separador es*
. Tenga en cuenta que la pila comienza comoA, B, A, B
. Una vez más, eliminé todas las instrucciones irrelevantes. La IP comienza en elS
norte.La pila es ahora
A, B, B, *, A
.Paso 3/6/8 (el bucle de impresión)
Concepto
La IP ingresa al bucle
S
, apunta hacia el norte, y sale del bucle haciaE
, apuntando hacia el norte nuevamente. Para esta explicación, la pila se establece en[..., A, B, C]
. Se ejecutan las siguientes instrucciones. Tenga en cuenta que la IP no puede abandonar el bucle antes del signo de interrogación, por lo que las primeras cuatro instrucciones siempre se ejecutarán.Implementación
Aquí está el cubo nuevamente, con las partes irrelevantes eliminadas. La IP comienza en
S
, apuntando hacia el este.Como puede ver, la IP se encuentra con cuatro instrucciones antes de ingresar al bucle. Dado que el código de caracteres se elimina nuevamente, llegamos al bucle con exactamente la misma pila que ingresamos en esta parte.
Dentro del bucle, la explicación anterior es válida.
Paso 4 (diferenciando las IP)
Dado que usamos el bucle anterior varias veces, y todos hacen que la IP termine en el mismo lugar, tenemos que diferenciar entre múltiples ejecuciones. Primero, podemos distinguir entre el separador (la primera ejecución tiene un
*
, mientras que las ejecuciones dos y tres tienen un+
separador). Podemos diferenciar entre las ejecuciones 2 y 3 comprobando el valor del número que se repite. Si ese es uno, el programa debería finalizar.Primera comparación
Así es como se ve en el cubo. La IP comienza en S y apunta al norte. La pila contiene
[..., * or +, A or 1, 0]
. El número 1 muestra dónde terminará la IP si este es el primer bucle (apuntando hacia el norte) y el número 2 muestra dónde terminará la IP si este es el segundo (o tercer) bucle (apuntando hacia el este).Si la IP ahora está en
1
, la pila está[A, *, +, -1]
. De lo contrario, la pila es[A or 1, +, +, 0]
. Como puede ver, todavía hay una incógnita en la pila del segundo caso, por lo que tenemos que hacer otra comparación.Segunda comparación
Debido a que la IP ha pasado por el paso 5, las miradas de pila de este tipo:
[A^(B-1) or nothing, A or 1, +, +, 0]
. Si el primer elemento esnothing
, el segundo elemento es1
, y lo contrario también se cumple. El cubo se ve así, con la IP comenzando en S y apuntando hacia el este. Si este es el segundo bucle, la IP termina enE
, apuntando hacia el oeste. De lo contrario, el programa golpea@
y finaliza.Las instrucciones ejecutadas que no hacen nada al flujo de control se enumeran a continuación.
La pila está ahora
[A^B, +, A^(B-1), A-1]
, siempre que el programa no haya terminado.Paso 5 (preparación para "A +" (repita A ^ (B-1)))
Lamentablemente, Cubix no tiene un operador de potencia, por lo que necesitamos otro bucle. Sin embargo, primero debemos limpiar la pila, que ahora contiene
[B, A, *, +, -1]
.Limpiar
Aquí está el cubo otra vez. Como de costumbre, la IP comienza en S (apuntando hacia el norte) y termina en E, apuntando hacia el oeste.
Calculando A ^ (B-1)
Otro bucle que funciona más o menos igual que el bucle de impresión, pero es un poco más compacto. La IP comienza en
S
, apuntando al oeste, con pila[B, A, *]
. La IP saleE
apuntando hacia el norte.El cuerpo del bucle es el siguiente.
La pila resultante es
[A, A^(B-1), 0]
.Limpiar la pila (de nuevo)
Ahora necesitamos volver al ciclo de impresión, con la parte superior de la pila conteniendo
[..., A^(B-1), +, A]
. Para hacer esto, ejecutamos lo siguiente. Aquí está el cubo otra vez,Paso 7 (preparación para el último bucle)
La pila es ahora
[A^B, +, A^(B-1), A-1]
, la IP comienza enS
, yendo hacia el oeste, y termina enE
, yendo hacia la derecha.Las instrucciones ejecutadas:
La pila ahora se ve
[A^B, +, 1]
y la IP está a punto de entrar en el ciclo de impresión, así que hemos terminado.fuente
MATL , 46 bytes
Pruébalo en línea!
Estirando los límites de "forma razonable" aquí, pero las expresiones están separadas.
Explicación
Primera expresion:
Segunda expresión:
Tercera expresión:
Cuarta expresión:
fuente
JavaScript (ES7), 78 bytes
Toma entrada en la sintaxis de curry
(a)(b)
. Emite una cadena.Casos de prueba
Mostrar fragmento de código
fuente
Ruby, 52 bytes
fuente
05AB1E , 30 bytes
Explicación:
Pruébalo en línea!
fuente
¹²'^ý ¹'*¹«²<׫¹²m¹÷¹s×S'+ý 1¹²m×S'+ý»
, ¿por qué me ganaste 5 bytes :(?¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,
está más cerca ;). Solo estás ganando por 1 ahora;).C (gcc) ,
156149 bytes-2 bytes si podemos ignorar 0 potencias;
y=!!i
podría convertirsey=1
Pruébalo en línea!
fuente
Java 7, 170 bytes
Sin golf:
Código de prueba:
Pruébalo aquí.
Salida:
fuente
Pip ,
383534 bytes33 bytes de código, +1 para
-n
bandera.Toma A y B como argumentos de línea de comandos; imprime una expresión por línea. Pruébalo en línea!
Explicación
Ya**b
es el código de configuración: tire dea**b
lay
variable. Después de eso, tenemos una lista (in[]
) que contiene nuestras cuatro expresiones:gJ'^
: tome lag
lista ar completa (aquí, una lista que contienea
yb
) yJ
compártala en^
aRLbJ'*
: useR
epeatL
ist para crear una lista conb
copias dea
, y luegoJ
en*
aRLy/aJ'+
: se usaRL
para crear una lista cony/a
(es decira**(b-1)
) copias dea
, y luegoJ
en+
1XyJ'+
:1
, cadena multiplicada pory
,J
alineada en+
La lista se imprime con nueva línea como separador gracias a la
-n
bandera.fuente
Javascript
115113104 bytesGracias a @Neil y @TuukkaX por jugar golf en un byte cada uno y @ETHproductions y Luke por jugar golf en 9 bytes
Pruébalo en línea
fuente
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()
...Jalea , 29 bytes
Pruébalo en línea!
¿Cómo?
fuente
tinylisp ,
178186 bytesEl uso de la respuesta ahorra 8 bytes entre paréntesis de cierre implícitos al final de las líneas. Define una función
X
que toma dos números y devuelve una lista de expresiones. Cada expresión está entre paréntesis, con espacios alrededor de los operadores (en realidad, es una lista de números y símbolos de operador):Esperemos que este formato de salida sea aceptable. Pruébalo en línea! (con varios casos de prueba).
Explicación
Necesitamos dos funciones de la biblioteca estándar:
list
y*
.Definir una función
W
(abreviatura de "tejido") que toma un acumulador_
, un númeroN
, un símboloS
y un conteo#
. Utilizaremos esta función para generar la mayoría de nuestras expresiones: por ejemplo,(W () 2 (q +) 3)
resultará en(2 + 2 + 2)
.Si el recuento es 1
(e # 1)
, entonces cons el número al frente del acumulador(c N _)
y devuélvalo. De lo contrario, recurse:(c S(c N _))
: el símbolo y el número cons'd al frente del acumulador anterior;N
yS
son lo mismo;(s # 1)
: cuenta - 1.El idioma del acumulador es necesario para lograr una recursión de cola adecuada , evitando un error de profundidad de recursión. (Este cambio es responsable del +8 al recuento de bytes. El
13^2
caso no funcionó en la versión anterior).Desafortunadamente, la biblioteca no tiene una función de exponenciación en este momento, por lo que tenemos que definir una.
^
tomax
yy
. Siy
es verdadero (distinto de cero), recurrimos cony-1
((s y 1)
) y multiplicamos el resultado porx
. De lo contrario,y
es cero y volvemos1
.(Nota: esta función no utiliza la recursión de la cola adecuada. Supongo que los exponentes serán lo suficientemente pequeños como para que no importe. Algunos experimentos en TIO indicaron un exponente máximo de 325, lo que diría que debería ser suficiente para esta pregunta. Si el OP no está de acuerdo, lo cambiaré).
Por último, la función que nos interesa,
X
, tomaA
yB
y devuelve una lista de cuatro elementos:(list A(q ^)B)
: una lista que contieneA
un literal^
yB
;(W()A(q *)B)
: llameW
para obtener una lista deB
copiasA
entrelazadas con literal*
;(W()A(q +)(^ A(s B 1)))
: llameW
para obtener una lista deA^(B-1)
copiasA
entrelazadas con literal+
;(W()1(q +)(^ A B))
: llameW
para obtener una lista deA^B
copias1
entrelazadas con literal+
.fuente
Brainfuck , 372 bytes
Pruébalo en línea!
Notas
A**B
no exceda255
. Esto se debe a que Brainfuck solo puede almacenar valores de un byte.10
se convierte:
, se11
convierte en;
etc. Esto se debe a que Brainfuck solo puede tomar entradas de un byte.Explicación
Aquí está mi código algo comentado. Ampliaré esto más tarde.
fuente
Pyth,
3231 bytesToma entrada como
[2,10]
, salidas como["2^10", "2*2*2*2*2*2*2*2*2*2", "2+2+...
Explicación:
Pruébalo aquí.
fuente
Perl , 81 bytes
78 bytes de código +
-n
bandera (contados como 3 bytes ya que el código contiene$'
).Pruébalo en línea!
fuente
R, 147 bytes
Función anónima que genera las salidas requeridas, bien, línea por línea. Esta solución hace un amplio uso de la
switch
función.La
switch
función toma una expresión (aquís
) que se evalúa como un número o una cadena de caracteres (ver?switch
), seguida de las alernativas correspondientes as
. Si falta una alternativa (por ejemploswitch(s, a=, b= "PPCG")
, se evalúa la siguiente alternativa que no falta) (en el ejemplo,s="a"
salidas"PPCG"
).Las
rep
funciones repiten (replican, en realidad) su primer argumento el número de veces indicado en el segundo argumento.cat
, para finalizar, concatenar e imprimir los objetos, con un separador que se puede elegir con elsep =
argumento. La segundacat
función está aquí para el salto de línea.Sin golf:
fuente
CJam , 42 bytes
Pruébalo en línea!
fuente
k, 44 bytes
Casos de prueba.
fuente
Cardenal 202 bytes
Solo funcionará para números donde el valor calculado <256 debido a limitaciones en los valores que pueden mantener los punteros en Cardinal
Pruébalo en línea
Explicación:
Paso 1
Recibe dos números a y b como entrada y salidas como "a ^ b ="
Pasa un puntero con valor activo ay valor inactivo b
Paso 2
Recibe un puntero con valor activo ay valor inactivo b imprimiendo "a" + ("* a") (b-1) veces
Pasa un puntero con valor activo a ^ (b-1) a la siguiente parte
Paso 3
Recibe un puntero con valor de a ^ (b-1) y genera "= a" + ("+ a") repetido (a ^ (b-1) -1) veces + "="
Pasa un puntero con valor a ^ b a la siguiente parte
Etapa 4
Recibe un puntero con valor a ^ b e imprime "1" + ("+ 1") repetido a ^ b-1 veces
fuente
Retina,
8988 bytesLa entrada es números unarios separados por comas.
Pruébalo en línea!
fuente