Dado un número entero y alguna función de recuadro negro, encuentre un punto fijo en la secuencia definida por .x1
f: ℤ → ℤ
f
xk+1 := f(xk)
Detalles
Se
x
dice que un valor es un punto fijo def
ifx = f(x)
.Por ejemplo, si
f(x) := round(x/pi)
y tenemos un punto de partida después conseguimos , entonces , a continuación , y, finalmente, lo que significa que la presentación debe devolver .x1 = 10
x2 = f(x1) = f(10) = 3
x3 = f(x2) = f(3) = 1
x4 = f(x3) = f(1) = 0
x5 = f(x4) = f(0) = 0
0
- Puede suponer que la secuencia generada en realidad contiene un punto fijo.
- Puede usar el tipo nativo para enteros en lugar de
ℤ
. - Puede usar cualquier idioma para el que haya valores predeterminados para la entrada de funciones de recuadro negro en la meta publicación de E / S estándar . Si no existe dicho valor predeterminado para su idioma, siéntase libre de agregar uno en el sentido de la definición de funciones de recuadro negro , y asegúrese de vincular sus propuestas en esa definición. Tampoco olvides votar sobre ellos.
Ejemplos
f(x) = floor(sqrt(abs(x)))
0 -> 0, all other numbers -> 1
f(x) = c(c(c(x))) where c(x) = x/2 if x is even; 3*x+1 otherwise
all positive numbers should result in 1,2 or 4 (Collatz conjecture)
f(x) = -42
all numbers -> -42
f(x) = 2 - x
1 -> 1
~Nƭ⁻Ç$¿
, que es algo así como (pseudocódigo)for x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x);
. Eso puede valer otro desafío.Respuestas:
En realidad , 1 byte
Pruébalo en línea!
Y
es la función de punto fijo en realidad. En el ejemplo de TIO, la función se muestra como una cadena y£
se usa para transformarla en una función en la pila. También es posible simplemente empujar la función a la pila de esta manera . Estas son las dos únicas formas de obtener una entrada de función en realidad.fuente
Y
para varios desafíos. Aparentemente soy extremadamente precognitante : PAPL (Dyalog) , 2 bytes
Pruébalo en línea!
NB: defino
O←⍣=
en la sección de entrada debido a un error en que los operadores monádicos derivados no se pueden definir de la manera en que a TIO le gusta definir las cosas.⍣
Es un operador que puede usarse como(function⍣condition) ⍵
Se aplica el
function
,f
, de⍵
hasta(f ⍵) condition ⍵
vuelve verdadera.⍣=
es un operador monádico derivado que toma una función monádicaf
, como argumento izquierdo y la aplica a su argumento derecho⍵
, hastaf ⍵ = ⍵
fuente
⍣=
es un operador monádico derivado que toma una función como operando izquierdo y encuentra el punto fijo en el valor inicial dado. Me gustaría utilizar una letra diferente para⍣=
quef
, ya que es una o perator, no una f unción.f
en su descripción, pero luego, en TIO,f
es su operador de solución. También puede moverloO←⍣=
hacia arriba en el campo Código para permitir que se cuente y señalar que esa es la solución real, y que el resto (Entrada) solo lo está probando.Haskell, 17 bytes
Pruébalo en línea!
fuente
until=<<((==)=<<)
encuentra un punto fijo de una función determinada.MATLAB , 41 bytes
También existe esta belleza que no necesita archivos de funciones. Lamentablemente es un poco más largo:
Pruébalo en línea!
fuente
;
s. Pruébalo en línea! .@()
antesx
por 50 bytes. Felicitaciones también por la forma en que ajusta su función de ayuda (cong(g)
el final), solo logré hacer 51 bytes@(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x)
. Me pregunto si hay alguna combinación de ambos enfoques que sea aún más corta.ML estándar (MLton) , 30 bytes
Pruébalo en línea! Usar como
& n blackbox
.Las funciones del cuadro negro se definen de la siguiente manera:
Versión sin golf:
fuente
R ,
3635 bytesgracias a JayCe por jugar golf por un byte
Pruébalo en línea!
¡Verifique las funciones de ejemplo!
R puerto de la solución de flawr.
fuente
function(f,x){while(x-(x=f(x)))0;x}
ahorra un byte.0
, bien ¡Muchas gracias!Mathematica, 11 bytes
Pruébalo en línea!
Mathematica, 10 bytes
Pruébalo en línea!
fuente
Python 2 ,
393733 bytesgracias a @ Mr.Xcoder por -2 bytes
Pruébalo en línea!
asume que la función de caja negra se llamará f
fuente
f
, ¿no es una forma de asumir que la entrada está en una variable? (editar: ninja'd por mbomb)JavaScript (Node.js) ,
252221 bytesgracias Herman Lauenstein por mostrarme este consenso
gracias a @ l4m2 por -1 byte
Asume que se nombrará la función de caja negra
f
.Pruébalo en línea!
fuente
Jalea , 3 bytes
Pruébalo en línea!
Toma el argumento izquierdo como una cadena que representa un enlace Jelly (
2_
por ejemplo), y el argumento derecho como un enteroCómo funciona
fuente
Brain-Flak , 24 bytes
Pruébalo en línea!
(para la función de recuadro negro
x -> 2-x
en el ejemplo a continuación)La función de recuadro negro que se proporciona debe ser un programa, que aparece
x
en la parte superior de la pilax
y empujaf(x)
; en otras palabras, debe evaluar la funciónf
en el valor en la parte superior de la pila.Mini-Flak equivalente es de 26 bytes (gracias a Wheat Wizard por guardar 2 bytes):
(sin contar los comentarios y espacios)
Tome la función (dentro de
<>
) y un númerox0
de entrada. (tenga en cuenta que Brain-Flak es un lenguaje esotérico y no puede tomar argumentos funcionales como entrada)Ejemplo de funciones de blackbox:
x -> 2-x
: ¡ Pruébelo en línea!Explicación:
fuente
Swift ,
4742 bytesEnfoque ingenuo, supone que la función de cuadro negro se llama
f
fuente
{...}as(<parameter types>)-><return type>
. Si no especifica su tipo de retorno, arrojará errores de tiempo de construcción, por lo que no creo que sea válido a partir de ahora (tenga en cuenta que el reparto debe incluirse en el recuento de bytes). Sin embargo, su primera presentación está bien.C (gcc) , 40 bytes
Pruébalo en línea! Tenga en cuenta que los indicadores no son necesarios, están allí para ayudar a probar la función de punto de fijación definida anteriormente.
Esta es una función que toma un int
n
y un puntero de funciónb : int → int
. Abusar del hecho de que escribir en el primer argumento variable establece eleax
registro, que es equivalente a devolver † . De lo contrario, esto es bastante estándar en lo que respecta al golf C.n^b(n)
comprueba la desigualdad den
y el cuadro negro aplicado an
. Cuando es desigual, vuelve a llamar a la función de punto fijo de formaf
recursiva con la aplicación y el cuadro negro como argumentos. De lo contrario, devuelve el punto de fijación.† Cita necesaria, recuerdo vagamente haber leído esto en algún lugar y Google parece confirmar mis sospechas
Declara la entrada con la escritura de parámetros de estilo K y R:
El bit arcano en la segunda línea de arriba declara
b
ser un puntero de función que toma un parámetro entero;_
se supone que el tipo predeterminado de es un entero. Del mismo modo,n
se supone que es un número entero yf
se supone que devuelve un número entero. ¿Hurra por escribir implícitamente?fuente
Limpio , 46 bytes
Asume que la función se define como
f :: !Int -> Int
Toma la cabecera de la infinita lista de aplicaciones de
f f f ... x
filtrado para aquellos elementos dondef el == el
.Pruébalo en línea!
Si desea cambiar la función en el TIO, la sintaxis lambda de Clean es:
\argument = expression
(en realidad es mucho más complicado, pero afortunadamente solo necesitamos funciones unarias)
fuente
APL (Dyalog Unicode) , 14 bytes
Pruébalo en línea!
La función en el encabezado es equivalente a
f(x) = floor(sqrt(abs(x)))
Gracias @ Adám por señalar que la respuesta original no era válida de acuerdo con el consenso de PPCG.
Cómo funciona:
fuente
f
está preasignado, lo que creo que está prohibido por el consenso de PPCG.{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}
Sería una solución válida para el operador.Octava , 37 bytes
Pruébalo en línea!
Octave tiene una asignación en línea, pero MATLAB no, por lo que este es un puerto de golf de Octave de la solución de flawr .
También puertos muy bien a R .
fuente
Kotlin , 50 bytes
Pruébalo en línea!
fuente
Adelante (gforth), 36 bytes
Esta versión solo asume que
f
está predefinida. No es tan genial como la solución que se encuentra debajo. Ambos programas salen con un desbordamiento de pila si no se encuentra, o un desbordamiento de pila si se encuentra (después de imprimir el resultado).Pruébalo en línea
Adelante (gforth), 52 bytes
Esto permite que el token de ejecución de una función se pase como un parámetro, y definitivamente es la solución más genial.
Pruébalo en línea
Explicación:
fuente
Ruby ,
3128 bytesPruébalo en línea!
fuente
pequeña respuesta , 28 bytes
Asume que la función
f
está predefinida.Pruébalo en línea! (La función de ejemplo es
f(x) = (x*2) mod 10
).Sin golf
Si
f(x)
es igualx
, entoncesx
es un punto fijo; devolverlo. De lo contrario, busque recursivamente un punto fijo a partir de enf(x)
lugar dex
.fuente
APL NARS 65 caracteres
v operador devolvería ∞ (o posiblemente -oo o Nan) por error, de lo contrario, un valor x con x = f (x). En la prueba f = floor (sqrt (abs (x))), f1 = 2-x, f2 = c (c (c (x))) con c = x% 2 == 0? X / 2: 3 * x +1
fuente
Clojure,
4543 bytesBueno, este es el más corto y feo:
+
está allí en lugar de un número para que no sea igual a ningún valor dex0
.55 bytes y funcional:
Ejemplo:
fuente
código de operación x86, 8 bytes
Tomar entrada:
ecx
(valor ), (dirección de función, tomar entrada de , escribir resultado a sin modificar el valor de yx0
edx
ecx
eax
ecx
edx
)8086 código de operación, 7 bytes (pero lento)
Si existe un punto fijo, el bucle 65536 veces siempre lo conduce allí.
Tomar entrada:
ax
(valor inicial ), (dirección de función, tomar entrada desde , escribir salida a sin modificar el valor de y ). Salida del punto fijo en el registro .x0
dx
ax
ax
cx
dx
ax
fuente
Perl 5, 18 + 1 (
-p
)pruébalo en línea
fuente
Java 8, 42 bytes
Esto toma un
Function<Integer, Integer>
oIntFunction<Integer>
y unint
oInteger
(curry) y devuelve el punto fijo.Pruébalo en línea
Aprovecha el hecho de que Java evalúa las subexpresiones de izquierda a derecha (por lo que lo antiguo
i
se compara con lo nuevo), una propiedad que desconocía al escribir esto.fuente