Étant donné un entier et une fonction de boîte noire, trouvez un point fixe de dans la séquence définie par .x1
f: ℤ → ℤ
f
xk+1 := f(xk)
Détails
On
x
dit qu'une valeur est un point fixe def
ifx = f(x)
.Par exemple, si
f(x) := round(x/pi)
et nous avons un point de départ, nous obtenons alors , puis , et enfin, ce qui signifie que la soumission doit revenir .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
- Vous pouvez supposer que la séquence générée contient en fait un point fixe.
- Vous pouvez utiliser le type natif pour les entiers à la place de
ℤ
. - Vous pouvez utiliser n'importe quelle langue pour laquelle il existe des valeurs par défaut pour les fonctions de boîte noire entrées dans la méta-publication IO standard . S'il n'y a pas de défaut par défaut pour votre langue, n'hésitez pas à en ajouter un dans le sens de la définition des fonctions de boîte noire , et assurez-vous de lier vos propositions dans cette définition. N'oubliez pas non plus de voter sur eux.
Exemples
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ƭ⁻Ç$¿
, qui est quelque chose comme, (pseudo code)for x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x);
. Cela peut valoir un autre défi.Réponses:
En fait , 1 octet
Essayez-le en ligne!
Y
est la fonction de point fixe en fait. Dans l'exemple TIO, la fonction est représentée comme étant une chaîne et£
est utilisée pour la transformer en fonction sur la pile. Il est également possible de simplement pousser la fonction dans la pile comme ceci . Ce sont les deux seules façons d'obtenir une entrée de fonction dans Actually.la source
Y
plusieurs défis. Je suis apparemment extrêmement précognitif : PAPL (Dyalog) , 2 octets
Essayez-le en ligne!
NB: Je définis
O←⍣=
dans la section d'entrée en raison d'un bug dans lequel les opérateurs monadiques dérivés ne peuvent pas être définis de la manière dont TIO aime définir les choses.⍣
Est un opérateur qui peut être utilisé comme(function⍣condition) ⍵
Elle applique la
function
,f
pour⍵
que le(f ⍵) condition ⍵
rendement vrai.⍣=
est un opérateur monadique dérivé qui prend une fonction monadiquef
comme argument de gauche et l'applique à son argument de droite⍵
jusqu'à ce quef ⍵ = ⍵
la source
⍣=
s'agit d'un opérateur monadique dérivé qui prend une fonction comme opérande gauche et trouve le point fixe sur la valeur initiale donnée. J'utiliser une autre lettre pour⍣=
quef
comme il est un o pérateur, pas f Onction.f
dans votre description, mais sur TIO,f
c'est votre opérateur de solution. Vous pouvez également déplacer leO←⍣=
haut dans le champ Code pour qu'il soit compté et pour signaler que c'est la solution réelle, et que le reste (Input) est juste en train de le tester.Haskell, 17 octets
Essayez-le en ligne!
la source
until=<<((==)=<<)
trouve un point fixe d'une fonction donnée.MATLAB , 41 octets
Il y a aussi cette beauté qui n'a pas besoin de fichiers de fonction. Malheureusement, c'est un peu plus long:
Essayez-le en ligne!
la source
;
s. Essayez-le en ligne! .@()
avantx
pour 50 octets. Bravo aussi pour la façon dont vous encapsulez votre fonction d'aide (avec leg(g)
à la fin), je n'ai réussi qu'à faire 51 octets@(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x)
. Je me demande s'il existe une combinaison des deux approches qui est encore plus courte.ML standard (MLton) , 30 octets
Essayez-le en ligne! Utiliser comme
& n blackbox
.Les fonctions de la boîte noire sont définies comme suit:
Version non golfée:
la source
R ,
3635 octetsmerci à JayCe pour avoir parcouru un octet
Essayez-le en ligne!
Vérifiez les fonctions d'exemple!
Port R de la solution de flawr.
la source
function(f,x){while(x-(x=f(x)))0;x}
économise un octet.0
, chouette. Merci beaucoup!Mathematica, 11 octets
Essayez-le en ligne!
Mathematica, 10 octets
Essayez-le en ligne!
la source
Python 2 ,
393733 octetsmerci à @ Mr.Xcoder pour -2 octets
Essayez-le en ligne!
suppose que la fonction de boîte noire sera nommée f
la source
f
, n'est-ce pas une forme de supposer que l'entrée est dans une variable? (modifier: ninja'd par mbomb)JavaScript (Node.js) ,
252221 octetsmerci Herman Lauenstein de m'avoir montré ce consensus
grâce à @ l4m2 pour -1 octet
Suppose que la fonction de boîte noire doit être nommée
f
.Essayez-le en ligne!
la source
Gelée , 3 octets
Essayez-le en ligne!
Prend l'argument de gauche comme une chaîne représentant un lien Jelly (
2_
par exemple) et l'argument de droite comme un entierComment ça marche
la source
Brain-Flak , 24 octets
Essayez-le en ligne!
(pour la fonction boîte noire
x -> 2-x
dans l'exemple ci-dessous)La fonction de boîte noire fournie doit être un programme, celui donné
x
en haut de la pile, popx
et pushf(x)
- en d'autres termes, elle doit évaluer la fonctionf
sur la valeur en haut de la pile.Mini-Flak équivalent est de 26 octets (merci à Wheat Wizard pour avoir économisé 2 octets):
(sans compter les commentaires et les espaces)
Prenez la fonction (à l'intérieur du
<>
) et un nombre en entrée. (notez que Brain-Flak est un langage ésotérique et ne peut pas prendre d'argument fonctionnel en entrée)x0
Exemples de fonctions de boîte noire:
x -> 2-x
: Essayez-le en ligne!Explication:
la source
Swift ,
4742 octetsApproche naïve, suppose que la fonction de boîte noire est nommée
f
la source
{...}as(<parameter types>)-><return type>
. Si vous ne spécifiez pas son type de retour, il générera des erreurs au moment de la construction, donc je ne pense pas qu'il soit valide pour l'instant (notez que le transtypage doit être inclus dans le nombre d'octets). Votre première soumission est très bien, cependant.C (gcc) , 40 octets
Essayez-le en ligne!Notez que les drapeaux ne sont pas nécessaires, ils sont là pour vous aider à tester la fonction fixpoint définie ci-dessus.
Il s'agit d'une fonction qui prend un int
n
et un pointeur de fonctionb : int → int
. Abuser du fait que l'écriture dans le premier argument de variable définit leeax
registre, ce qui équivaut à retourner † . Sinon, c'est assez standard en ce qui concerne le golf C.n^b(n)
vérifie l'inégalité den
et la boîte noire appliquéen
. Lorsqu'elle est inégale, elle appelle àf
nouveau la fonction fixpoint de manière récursive avec l'application et la boîte noire comme arguments. Sinon, il renvoie le point fixe.† Une citation était nécessaire, je me souviens vaguement d'avoir lu ceci quelque part et google semble confirmer mes soupçons
Il déclare l'entrée avec le typage des paramètres de style K & R:
Le bit arcanique sur la deuxième ligne ci-dessus déclare
b
être un pointeur de fonction qui prend un paramètre entier - le type par défaut de_
est supposé être un entier. De même,n
est supposé être un entier etf
est supposé renvoyer un entier. Hourra pour la frappe implicite?la source
Nettoyer , 46 octets
Suppose que la fonction est définie comme
f :: !Int -> Int
Il prend la tête de la liste infinie d'applications
f f f ... x
filtrées pour les éléments oùf el == el
.Essayez-le en ligne!
Si vous souhaitez modifier la fonction dans le TIO, la syntaxe lambda de Clean est:
\argument = expression
(en fait, c'est beaucoup plus compliqué, mais heureusement, nous n'avons besoin que de fonctions unaires)
la source
APL (Dyalog Unicode) , 14 octets
Essayez-le en ligne!
La fonction à l'en-tête est équivalente à
f(x) = floor(sqrt(abs(x)))
Merci @ Adám d'avoir souligné que la réponse originale n'était pas valide selon le consensus du PPCG.
Comment ça marche:
la source
f
est préaffecté, ce qui, à mon avis, est interdit par le consensus du PPCG.{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}
serait une solution opérateur valide.Octave , 37 octets
Essayez-le en ligne!
Octave a une affectation en ligne, mais pas MATLAB, il s'agit donc d'un port Octave de golfier de la solution de flawr .
Il a également des ports bien à R .
la source
Kotlin , 50 octets
Essayez-le en ligne!
la source
Forth (gforth), 36 octets
Cette version suppose simplement qu'elle
f
est prédéfinie. Ce n'est pas aussi cool que la solution en dessous. Les deux programmes se terminent avec un débordement de pile s'il n'est pas trouvé, ou un débordement de pile s'il est trouvé (après l'impression du résultat).Essayez-le en ligne
Forth (gforth), 52 octets
Cela permet de passer un jeton d'exécution d'une fonction en tant que paramètre, et c'est certainement la solution la plus cool.
Essayez-le en ligne
Explication:
la source
Rubis ,
3128 octetsEssayez-le en ligne!
la source
tinylisp repl , 28 octets
Suppose que la fonction
f
est prédéfinie.Essayez-le en ligne! (L'exemple de fonction est
f(x) = (x*2) mod 10
.)Non golfé
Si
f(x)
égalx
, alorsx
est un point fixe; rends le. Sinon, recherchez récursivement un point fixe à partir def(x)
au lieu dex
.la source
APL NARS 65 caractères
L'opérateur v retournerait ∞ (ou éventuellement -oo ou Nan) pour erreur, sinon une valeur x avec x = f (x). Dans le test f = sol (sqrt (abs (x))), f1 = 2-x, f2 = c (c (c (x))) avec c = x% 2 == 0? X / 2: 3 * x +1
la source
Clojure,
4543 octetsEh bien, c'est le plus court et le plus laid:
+
est là au lieu d'un nombre de sorte qu'il n'est égal à aucune valeur dex0
.55 octets et fonctionnel:
Exemple:
la source
opcode x86, 8 octets
Prendre l'entrée:
ecx
(valeur ), (adresse de fonction, prendre l'entrée de , écrire le résultat dans sans modifier la valeur de etx0
edx
ecx
eax
ecx
edx
)8086 opcode, 7 octets (mais lent)
S'il existe un point fixe, une boucle 65536 fois le conduit toujours là.
Prendre l'entrée:
ax
(valeur initiale ), (adresse de la fonction, prendre l'entrée de , écrire la sortie dans sans modifier la valeur de etx0
dx
ax
ax
cx
dx
).Sortie du point fixe dans le registre
ax
.la source
Perl 5, 18 + 1 (
-p
)essayez-le en ligne
la source
Java 8, 42 octets
Cela prend un
Function<Integer, Integer>
ouIntFunction<Integer>
et unint
ouInteger
(curry) et renvoie le point fixe.Essayez-le en ligne
Profite du fait que Java évalue les sous-expressions de gauche à droite (donc l'ancien
i
est comparé au nouveau), une propriété que je ne connaissais pas en écrivant ceci!la source