Relacionado: Función phi (n) iterada .
Su desafío es calcular la función phi iterada:
f(n) = number of iterations of φ for n to reach 1.
Dónde φ
está la función totient de Euler ?
Relacionado OEIS .
Aquí está el gráfico de la misma:
Reglas:
Su objetivo es salir f(n)
den=2
a n=100
.
Este es el código de golf, por lo que gana el código más corto.
Aquí están los valores con los que puede verificar:
1, 2, 2, 3, 2, 3, 3, 3, 3, 4, 3, 4, 3, 4, 4, 5, 3, 4, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 4, 5, 5, 5, 5, 5, 4, 5, 4, 5, 5, 6, 4, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 4, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 5, 6, 7, 5, 7, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 7, 5, 6, 6
code-golf
math
sequence
kolmogorov-complexity
number-theory
Simplemente hermoso arte
fuente
fuente
x
tales comophi(x)
un número fijo particular.f(n)
, en lugar de ejecutarla en un rango de números fijos. Esto también hace una diferencia entre los idiomas con la capacidad de aplicar funciones en rangos con menos bytes (¿desafío de camaleón en parte?)Respuestas:
Haskell ,
5352 bytesGracias nimi por guardar 1 byte!
Pruébalo en línea!
sum[1|1<-gcd n<$>[1..n]]
daφ(n)
(tomado de flawr , ¡gracias!)f
es una función recursiva que calcula1+φ(n)
si n no es1
, y genera0
sin
es1
, ya que no hay más iteraciones para alcanzar1
Finalmente
f<$>[2..100]
crea una lista def
aplicados a cada elemento de[2..100]
fuente
Haskell ,
70 6968 bytesLa función
(\n->sum[1|1<-gcd n<$>[1..n]])
es la función totient, que aplicamos repetidamente en la función anónima. Gracias @laikoni por -1 byte!EDITAR: Acabo de descubrir que @xnor usó esta función totient exacta en un desafío anterior .
Pruébalo en línea!
fuente
MATL ,
1615 bytesPruébalo en línea!
Explicación
Versión anterior, 16 bytes
Pruébalo en línea!
Explicación
fuente
2 3 3 4 3
, cuando el desafío dice que deberían ser1 2 2 3 2
Jalea ,
1211109 bytesPruébalo en línea!
-1 byte gracias a HyperNeutrino!
-1 byte gracias al Sr. Xcoder!
-1 byte gracias a Dennis
Cómo funciona
Como esto fue hecho por Dennis, yo (comprensiblemente) no tengo idea de por qué esto funciona, solo que lo hace.
fuente
f(n)
desde2
a100
, y la pregunta no menciona la entrada, así que creo que esta es la versión correctaf
paran=2
quen=100
, no sólo un valor.#
en este caso? Algo parecido a esto (que claramente no funciona pero escrito por alguien que entienda claramente la sintaxis!)€
generalmente es mejor que#
.APL (Dyalog) ,
502925 bytes¡Mira, no hay un paciente incorporado!
4 bytes guardados gracias a @ H.PWiz
Pruébalo en línea!
¿Cómo?
Aparentemente fui por la fórmula totient más larga (y más difícil) primero. Ver historial de revisiones.
⍳⍵
-1
an
⍵∨
- mcd conn
1=
- igual a 1?+/
- suma todosEste es el totient. Todo lo demás es envoltorio para contar (
1+∇
) y aplicar en el rango2..100
(¨1+⍳99
).fuente
Mathematica, 44 bytes
-10 bytes de @Misha Lavrov
-2 bytes de @ user202729
Pruébalo en línea!
fuente
J REPL, 23 bytes
No lo he comprobado, pero esto probablemente funciona en J normal si lo define como un sustantivo (jugué golf en mi teléfono en el REPL).
Empotrados, yo.
Yo diría que hay al menos 2-3 bytes para eliminar (off-by-one debido a la forma en que
a:
funciona, tener que usar|
como noop, etc.).fuente
+/*<:5&p:^:a:2+i.99
por 19 bytes ¡ Pruébelo en línea!"+
lugar de"0
, por lo que igualmente podría convertirse<:#@(5&p:^:a:)"+i.99
+/1<a:5&p:2+i.99
a:
en su código? ¿Cómo funciona en lugar de^:
?(5&p:)^:a: m
se puede hacera: 5&p: m
usando la otra definición de&
cuándo una diada se une con un sustantivo y luego se llama diádica.JavaScript (ES6),
115...10499 bytesLa codificación rígida puede ser más corta, pero intentemos un enfoque puramente matemático.
fuente
Python 2 , 80 bytes
Pruébalo en línea!
fuente
Python 2 , 82 bytes
Pruébalo en línea!
Esto utiliza las observaciones que:
f(a*b) = f(a) + f(b) - 1
, excepto que-1
se omite sia
yb
son ambos paresf(p) = f(p-1) + 1
cuandop
es primo, conf(2)=1
Esto implica que si
n
tiene factorización priman = 2**a * 3**b * 5**c * 7**d * 11**e * ...
, entoncesf(n) = max(a,1) + b + 2*c + 2*d + 3*e + ...
, donde cada unop>2
en la factorización contribuyef(p-1)
.No estoy seguro de si estos continúan reteniendo el pasado
n=100
, pero si lo hacen, dan una forma de definir y calcularf
sin usarφ
.fuente
Chicle , 49 bytes
Pruébalo en línea!
fuente
PowerShell , 110 bytes
Pruébalo en línea!
Enfoque matemático.
En realidad, al mirarlo, es muy similar a la respuesta C , pero se desarrolló de forma independiente. Crea una matriz de
0
s, bucles desde2
hasta100
, luego calculaphi
utilizandogcd
formulación. La parte en parens al final guarda el resultado en$a
la siguiente ronda y coloca una copia en la tubería, lo que resulta en la salida implícita.PowerShell, 112 bytes
Pruébalo en línea!
Codificado duro. Ho-hum
Más corto de lo que podría obtener un enfoque matemático de aproximadamente 10-15 bytes.fuente
Python 2 , 83 bytes
Pruébalo en línea!
Combina una estimación heurística con una constante codificada que corrige cada estimación como
-0
o-1
.fuente
Casco ,
1017 bytesPruébalo en línea!
Editar : +7 bytes para mapear realmente la función en el rango que se solicitó, antes de que fuera solo la función que computaba A003434 .
Explicación
Lo siguiente calcula A003434 :
La
m(....)ḣ100
parte solo asigna esa función en el rango [2..100], no estoy seguro de cómo me perdí esa parte antes: Sfuente
PHP, 98 bytes
Pruébalo en línea!
Empaqué todos los dígitos en una cadena binaria. Después de desempacarlo, convertirlo en una matriz y luego fusionar la matriz nuevamente, solo tuve que anteponer el 1,2 y agregar el 6 ya que no encajarían o provocarían que apareciera un código de control.
fuente
Perl 6 , 47 bytes
Pruébalo en línea!
fuente
05AB1E , 11 bytes
Pruébalo en línea!
Explicación
fuente
C, 112 bytes
Sin golf:
Pruébalo en línea!
fuente
Aluminio , 87 bytes
Pruébalo en línea!
Explicación
fuente
Pyth, 38 bytes (no competitivo)
Pruébelo en Pyth Herokuapp , porque no funciona en TIO por el motivo que sea.
No tengo dudas de que la solución explícita de Pyth es más pequeña, pero quería ver qué tan pequeño podría obtener el código al comprimir la secuencia y aprender Pyth, supongo. Esto utiliza el hecho de que un límite superior de la secuencia es
log2(n)+1
.Explicación
Obtuve la cadena comprimida a través
Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3
, que es justo lo contrario del código anterior con algunas conversiones de tipo.fuente
Ohm v2 , 41 bytes
Pruébalo en línea!
Literalmente completamente codificado ... De hecho, tomé la secuencia anterior, eliminé todo lo que no era un número, lo interpreté como base 8, luego lo convertí en la representación de número 255 de Ohm incorporada. Eso es lo que hacen las citas. Luego, el programa simplemente convierte eso en base 8 nuevamente.
fuente