El reto
Implemente la tetración (también conocida como Power Tower o Hyperexponentiation) con la menor cantidad de caracteres.
Las condiciones
- No utilice el operador 'poder' o sus equivalentes (como por ejemplo
pow(x,y)
,x^y
,x**y
, etc.) - Entrada dada como:
x y
(separada por un espacio) x
se expone por sí mismoy
veces.- Su método debe poder calcular al menos
4 3
(4 exponenciado por sí mismo 3 veces)
La puntuación
- La puntuación más baja gana: (# de caracteres)
- Deducción de bonificación si no utiliza el operador de multiplicación (-5 puntos).
- No hay requisitos de velocidad / memoria. Tome todo el tiempo que sea necesario.
Ejemplos
x, 0 -> 1
2, 2 -> 2^2 = 4
2, 4 -> 2^(2^(2^2)) = 65536
4, 3 -> 4^(4^4) = 4^256 = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
Abierto a sugerencias / alteraciones / preguntas
*
es la multiplicación en algunos contextos, pero también es la sencilla bucle operador:{block}N*
es equivalente a C-estilofor(i=0;i<N;i++){block}
. El caso difícil es la multiplicación de cadenas / matrices ('a'3*
da'aaa'
), pero es poco probable que sea un problema dado que una matriz de4***3
elementos desbordará la RAM.x 0
=> 1. Mi solución original no manejó ese caso.Respuestas:
J, el puntaje es 7 (12 caracteres - 5 puntos por evitar la multiplicación)
+/@$/@$~/@$~
uso:
Solo algunos pliegues anidados:
*/@$~/@$~
^/@$~
donde$~
crea una matriz,/
es una función de plegado.fuente
pad
qué significa aquí? Lo siento, el inglés no es mi lengua materna.@$~
en la conjunción?/
, pero sí. simplemente dobla tantas veces como sea necesario sobre la función de plegado anidado.Haskell
8785 - 5 == 8082No utiliza exponenciación, multiplicación o suma (!), Solo enumera las operaciones. Demostración:
...
ahm ... no dijiste nada sobre rendimiento o memoria, ¿verdad? Pero dados suficientes miles de millones de años y algunos petabytes de RAM, esto aún arrojaría el resultado correcto (genericLength puede usar un bigInt para contar la longitud de la lista).
fuente
GolfScript,
1518 caracteresSí, uno de los
*
s es un operador de multiplicación (ejercicio: ¿cuál?), Así que no califico para el bono de 5 char. Aún así, es apenas más corto que la solución de Peter .Esta versión anterior de 15 caracteres es igual, pero no produce resultados cuando el segundo argumento es 0. Gracias a res por detectar el error.
fuente
"2 3" ~])*{[]+*{*}*}*
.;
para eliminar la cadena de entrada real que el intérprete coloca en la pila al inicio. O simplemente anteponga[
a al código: ambos;"2 3" ~])*{[]+*{*}*}*
y"2 3" [~])*{[]+*{*}*}*
funcionan bien para mí.ruby golfscript.rb my_script.gs
en la línea de comando, sin saber que causa que algo ("", aparentemente) esté en la pila antes de que se ejecute el script, lo que a veces funciona, a veces no. (También, conecho 2 3 | ruby golfscript.rb my_script.gs
, el programa hace el trabajo como-da.)J,
161912 caractereso como verbo (17 caracteres):
uso:
o tomando la entrada del teclado (
242720 caracteres):Gracias a FUZxxl por señalar mi estupidez. :-)
Explicación:
J se lee de derecha a izquierda, así que usa
2 4
:/
se usa para insertar el verbo$~
entre cada par de elementos en la lista.$~
toma el elemento izquierdo y lo forma$
usando el elemento correcto (~
invierte los argumentos), por lo que esto sería equivalente a lo4 $ 2
que le da una lista de2
s que tiene cuatro elementos de largo2 2 2 2
.Ahora agregamos 1 a la lista
1,~
y luego hacemos lo mismo nuevamente;/
inserte un verbo*/@$~
entre cada par de elementos en la lista. Este verbo comienza de la misma manera,$~
pero esta vez/
inserta un*
entre cada elemento de la lista recién generada. El@
solo se asegura de que*/@$~
funcione como un verbo en lugar de dos. Esto da2
multiplicado por sí mismo suficientes veces para ser equivalente a2^4
.Página de vocabulario de J : encuentro que resolver problemas con J es divertido solo por la forma diferente en que a veces hace las cosas.
Agregar una iteración adicional para eliminar el
*
operador tiene 2 problemasSale con 17 caracteres (+/@$~/,@$~/1,~$~/
) que, incluso con el bonus de -5, es demasiado largo4 3
fuente
^/]$[
que crea la lista2 2 2 2
y pega el operador de exponenciación entre ellos. Lo que esto está haciendo es ir un paso más allá y hacer la exponenciación por multiplicación repetida.GolfScript (24 caracteres - 5 = 19 puntos)
es increíblemente lento
(o 20 caracteres)
Es mucho más rápido.
fuente
Python, 70
Esto usa
eval
llamadas anidadas , y finalmente produce una cadena"a*a*a*a...*a"
que se evalúa. Casi la mitad del puntaje se desperdicia en obtener los argumentos ... aunque he notado que algunas otras soluciones no se molestan con eso.fuente
input()
o usareval(raw_input())
Cheersexec"eval('a*'*"*b+'1'+"+'1')"*b
Scala: 110
sin golf:
explicación:
plus, mul, high (: = pow), tetration, todos funcionan de la misma manera. El patrón común se puede extraer como método recursivo, que requiere dos BigInts y una función básica:
Los subrayados son marcadores de posición para algo que se llama en esta secuencia, por ejemplo, la suma más (a, b) = (a + b); por lo tanto ( + ) es una función que toma dos argumentos y los agrega (a + b).
desafortunadamente, tengo problemas con el tamaño de la pila. Funciona para valores pequeños para 4 (por ejemplo: 2) o si reduzco la profundidad en un paso:
El código original tiene 112 caracteres y, si es válido, su puntaje sería 107. Quizás descubra cómo aumentar la pila.
El algoritmo expandido se puede transformar en llamadas recursivas de cola:
La llamada tailrecursive es más larga que el método original, pero no aumentó el flujo de stackover en la versión larga; sin embargo, no produce un resultado en un tiempo razonable. t (2,4) está bien, pero t (3,3) ya fue detenido por mí después de 5 min. Sin embargo, es muy elegante, ¿no?
Y ahora lo mismo que antes: use una multiplicación apestosa (incluso nos beneficiamos al rechazar la bonificación de 5, porque ahorramos 7 caracteres: win = 4 caracteres :)
invocación:
Tiempo de ejecución: 1 ms.
fuente
Br ** nfuck, 128-5 = 123 bytes
La entrada es en forma de caracteres con puntos de código de los números deseados como entradas. La salida es la misma.
Viene una explicación
cuando tengo el tiempo acontinuación. ¿Recibo puntos de bonificación por no usar exponenciación, multiplicación O incluso suma?Estos trabajos (pruebas) para
x 0
,0 x
,x 1
,1 x
,x 2
,2 3
, y2 4
. Lo intenté3 3
, pero funcionó durante varias horas sin terminar (en mi implementación de Java, probablemente no sea óptima) (EDITAR: en @ Timwi EsotericIDE [¡Es genial! Todos deberían intentarlo] también. Sin suerte). En teoría, esto funciona hasta el tamaño de celda de la implementación específica.fuente
Python, 161-5 (sin * operador) = 156
invocar:
fuente
4***3
?m
función conm=lambda x,y:sum(x for _ in r(y))
Perl, 61 caracteres
aquí hay una extraña
uso:
fuente
Mathematica ,
4033Esto no se ajusta a las reglas, pero de todos modos no está en disputa por el código más corto, y espero que sea de interés para alguien.
Esto crea una función de "tetración" cuando se ejecuta, pero los argumentos deben darse en orden inverso. Ejemplo:
fuente
Fold[g, 1, #2~Table~{#}] &[3, 4]
eso producirá,g[g[g[1, 4], 4], 4]
por ejemplo.m[Times]
produceFold[Times, 1, Table[#2, {#1}]] &
, que es una función de potencia:m[Times][5, x]
--->x^5
; Se utiliza el mismo método para esta nueva función de potencia para producir una función de tetración. Lógicamente, uno podría comenzar,Plus
pero eso falla casi de inmediato.t[h_, n_] := Sum[h, {i, n}]
. Entonces correm[m@t][3, 4]
.Sum[h, n]
).Haskell
5851 caracteres, con o sin multiplicación.Sin golf:
La definición más corta proviene de la inclusión de "bump" y de la definición de una versión personalizada de "iterate". Desafortunadamente, el resultado es imposiblemente ineficiente, pero comenzar con (*) en lugar de (+) da una velocidad decente. En
ghci
:fuente
Ruby
6659 caracteresfuente
1
) cuando el segundo número de entrada es0
; más bien,e(x,0)
devuelve el valor dex
.Python, 112 caracteres
Los números deben ser el primer y segundo argumento:
python this.py 4 3
**
operador no utilizado.*
usado. Es bastante trivial de implementar, exactamente igual**
, pero cuesta más de 5 caracteres.fuente
*
implementación, creo que la profundidad de recursión sería demasiado grande4 3
.C,
11710599 caracteresEDITAR: se ha unido las dos funciones
p
yr
en uno, ahorrando algunos caracteres.De 99 caracteres, 52 hacen el cálculo real (incluidas las definiciones de variables). Los otros 47 son para manejar entradas y salidas.
ERROR: Maneja mal las potencias de 0 (por ejemploEsto no es un error, olvidé que0 2
). Debería encontrar una solución de costo mínimo.0 2
no está definido.Maneja con éxito
4 3
, e incluso da un resultado exacto. Sin embargo, puede ser inexacto para algunos números más pequeños.Imprime el número con un final
.000000
.fuente
Factor, 187 caracteres
Antes del golf:
No eliminé el operador de multiplicación
*
. Si lo hiciera, necesitaría agregar algo de lógica que exprese que la suma de una secuencia vacía es 0, no 1. Esta lógica adicional costaría más que la bonificación de -5.Rompe reglas, 124 + 10 = 134 caracteres
Este programa tiene una puntuación más baja, pero el operador de exponenciación
^
rompe las reglas. Las reglas dicen "(# de caracteres) + (10 * (# de operadores 'poderosos'))", así que apliqué la penalización +10. Sin embargo, las reglas también dicen "No use el operador 'poderoso' ', por lo que cualquier programa que tome esta penalidad infringe las reglas. Por lo tanto, este programa de 134 caracteres no es una respuesta correcta, y debo presentar mi programa más largo de 187 caracteres como respuesta.fuente
Haskell 110 - 5 = 105
Tetración Estilo Peano. Esta es la solución más lenta posible, solo una advertencia, pero también evita incluso la adición.
Esto depende de que tengas paciencia para escribir números de Peano (y no mostrará la respuesta, si realmente quieres ejecutarlo, agrega estas pocas líneas (90 caracteres):
fuente
Rubí,
47 4645t=->x,n{r=x;2.upto(n){r=([x]*r).inject :*};r}
fuente
Lua: 133 caracteres, sin multiplicación
Originalmente iba a usar hacks de repetición de cuerdas para hacer una multiplicación falsa, pero le gusta fallar en valores grandes. Posiblemente podría usar la compilación dinámica y la cadena de carga para hacerlo más pequeño, pero se está haciendo tarde aquí ... Necesito dormir.
Ingresando "4 3" en salidas stdin:
fuente
VBA, 90 caracteres
* Quizás el bono sin multiplicación no sea lo suficientemente bueno. Creo que la respuesta sin multiplicación es mucho más interesante, pero este es el código de golf, por lo que no es el mejor. Aquí hay una respuesta sin ella
*
, y una mejor (más corta y mejor puntuación) con ella:90 caracteres, sin operadores de potencia, usa multiplicación = 90
116 caracteres, sin operadores de potencia, sin bonificación de multiplicación (-5) = 111
NOTA: VBA tiene problemas para imprimir el número cuando el resultado es muy grande (es decir
4, 3
), pero se calcula correctamente, por lo que si, por ejemplo, quisiera USAR ese número, estaría listo. Además, incluso los números MÁS GRANDES se desbordan (es decir3, 4
).fuente
Perl 6 , 32 bytes
Pruébalo en línea!
(1, { [*] a xx $_ } ... *)
es una secuencia perezosa que genera la torre de energía, cada elemento es una lista que consiste en el primer parámetro de entradaa
replicado (xx
) varias veces igual al elemento anterior ($_
), esa lista luego se reduce con multiplicación ([*]
). De esa secuencia simplemente sacamos elb
elemento -th.fuente
Cálculo lambda, 10-5
(usando la codificación de Church y De Bruijn indeces )
λλ(1λ13)λ1
Explicación
Sin De Bruijn indeces
λa,b.(b λc.ca)λc.c
::Si define
exp_a(x)=a^x
este programa, definea↑↑b=exp_a^b(1)
dónde^b
denota la función iteración.No estoy seguro de si esto está permitido porque
ca
es técnicamente equivalente a laa^c
forma en que no es un verdadero incorporado y solo un efecto secundario de la forma en que los enteros se codifican en el cálculo lambda.fuente
Javascript: 116 caracteres
t ('4 3') Salidas:
fuente
Python
(111)(113) no *6 *** 3 - 36k dígitos))
Upd: tiene que agregar valor inicial, para ajustar t (X, 0) = 1
fuente
Haskell: 88-5 caracteres sin multiplicación, 59 caracteres con multiplicación
Sin multiplicación:
Probablemente hay maneras en que podría jugar golf un poco más abajo.
Con multiplicación:
Y finalmente, el programa sin golf:
Esta es probablemente la forma más simple de resolver este problema, que es definir la multiplicación como suma repetida, la exponenciación como multiplicación repetida y la tetración como exponenciación repetida.
fuente
Raqueta 58 (no *)
fuente
Lisp común, 85 caracteres
Intenté hacer las multiplicaciones mediante la suma repetida, pero tenía más de 5 caracteres. Lo mismo con los macrolets, las declaraciones no valían las ganancias.
Otra solución, inspirada en la solución de pitón de boothby. Es 1 carácter menos que la solución anterior.
fuente
Python 3 - 68
(incluida la penalización de 10 puntos para el operador eléctrico)
fuente
Yabasic , 71 bytes
Una función que toma entrada
a
yb
como una cadena delimitada por espacios.Pruébalo en línea!
fuente
R , 71 - 5 = 66 bytes
Pruébalo en línea!
-5 por evitar *, que fue más difícil de lo que esperaba. Explota muy rápido y no funcionará (a menos que tenga más memoria) pero satisface todos los criterios necesarios.
fuente