Bei einer gegebenen Ganzzahl und einer gewissen Black-Box-Funktion finden Sie einen festen Punkt in der durch definierten Reihenfolge .x1
f: ℤ → ℤ
f
xk+1 := f(xk)
Einzelheiten
Ein Wert
x
ist ein Fixpunkt vonf
ifx = f(x)
.Zum Beispiel, wenn
f(x) := round(x/pi)
und wir einen Ausgangspunkt haben, dann bekommen wir , dann , dann und schließlich, was bedeutet, dass die Einreichung zurückkehren sollte .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
- Sie können davon ausgehen, dass die generierte Sequenz tatsächlich einen festen Punkt enthält.
- Sie können den nativen Typ für Ganzzahlen anstelle von verwenden
ℤ
. - Sie können jede Sprache verwenden, für die Standardeinstellungen für Black-Box-Funktionen in der Standard-E / A-Metapost eingegeben wurden . Wenn es für Ihre Sprache keine solche Standardeinstellung gibt, können Sie eine im Sinne der Definition von Black-Box-Funktionen hinzufügen und Ihre Vorschläge in dieser Definition verknüpfen. Vergiss auch nicht, darüber abzustimmen.
Beispiele
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ƭ⁻Ç$¿
, das ist so etwas wie (Pseudocode)for x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x);
. Das könnte eine weitere Herausforderung wert sein.Antworten:
Eigentlich 1 Byte
Probieren Sie es online!
Y
ist die Fixpunktfunktion in Tatsächlich. Im TIO-Beispiel wird die Funktion als Zeichenfolge dargestellt und£
verwendet, um sie in eine Funktion auf dem Stapel umzuwandeln. Es ist auch möglich, die Funktion einfach so auf den Stack zu schieben . Dies sind die einzigen beiden Möglichkeiten, um eine Funktionseingabe in Actually zu erhalten.quelle
Y
für mehrere Herausforderungen genutzt. Ich bin anscheinend äußerst ahnungslos : PAPL (Dyalog) , 2 Bytes
Probieren Sie es online!
NB: Ich definiere
O←⍣=
im Eingabeabschnitt, weil es einen Fehler gibt, dass abgeleitete monadische Operatoren nicht so definiert werden können, wie TIO es mag, Dinge zu definieren.⍣
Ist ein Operator, der gerne verwendet werden kann(function⍣condition) ⍵
Es gilt das
function
,f
auf⍵
bis(f ⍵) condition ⍵
true zurück.⍣=
ist ein abgeleiteter monadischer Operator, der eine monadische Funktionf
als linkes Argument übernimmt und auf das rechte Argument anwendet⍵
, bisf ⍵ = ⍵
quelle
⍣=
es sich um einen abgeleiteten monadischen Operator handelt, der eine Funktion als linken Operanden übernimmt und den Fixpunkt auf dem angegebenen Anfangswert findet. Ich würde einen anderen Buchstaben verwendet für⍣=
als ,f
wie es ist ein o perator, keine f Salbung.f
in Ihrer Beschreibung aufrufen , aber dann bei TIOf
Ihr Lösungsbetreiber ist. Sie können auch dasO←⍣=
Feld Code nach oben bewegen, um es zählen zu lassen und darauf hinzuweisen, dass dies die eigentliche Lösung ist und dass der Rest (Eingabe) sie nur testet.Haskell, 17 Bytes
Probieren Sie es online!
quelle
until=<<((==)=<<)
ein Fixpunkt für eine bestimmte Funktion gefunden wurde.MATLAB , 41 Bytes
Es gibt auch diese Schönheit , die keine Funktionsdateien benötigt. Leider ist es etwas länger:
Probieren Sie es online!
quelle
;
s entfernen . Probieren Sie es online! .@()
Vorherx
für 50 Bytes entfernen . Ein großes Lob auch für die Art und Weise, wie Sie Ihre Helferfunktion (mit derg(g)
am Ende) umschließen , habe ich nur 51 Bytes geschafft@(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x)
. Ich frage mich, ob es eine Kombination beider Ansätze gibt, die noch kürzer ist.Standard-ML (MLton) , 30 Bytes
Probieren Sie es online! Verwenden Sie als
& n blackbox
.Die Black-Box-Funktionen sind wie folgt definiert:
Ungolfed-Version:
quelle
R ,
36-35BytesVielen Dank an JayCe für das Abschlagen eines Bytes
Probieren Sie es online!
Überprüfen Sie die Beispielfunktionen!
R port der Lösung von flawr.
quelle
function(f,x){while(x-(x=f(x)))0;x}
spart ein Byte.0
, schön. Vielen Dank!Mathematica, 11 Bytes
Probieren Sie es online!
Mathematica, 10 Bytes
Probieren Sie es online!
quelle
Python 2 ,
393733 Bytesdanke an @ Mr.Xcoder für -2 bytes
Probieren Sie es online!
nimmt an, dass die Black-Box-Funktion f heißt
quelle
f
eine Funktion ist . (edit: ninja'd by mbomb)JavaScript (Node.js) ,
252221 BytesDank Herman Lauen für mich zeigt dieser Konsens
dank @ l4m2 für -1 Byte
Übernimmt die zu benennende Black-Box-Funktion
f
.Probieren Sie es online!
quelle
Gelee , 3 Bytes
Probieren Sie es online!
Nimmt das linke Argument als Zeichenfolge, die beispielsweise eine Jelly-Verknüpfung darstellt
2_
, und das rechte Argument als GanzzahlWie es funktioniert
quelle
Brain-Flak , 24 Bytes
Probieren Sie es online!
(für die Black-Box-Funktion
x -> 2-x
im folgenden Beispiel)Die bereitgestellte Black-Box-Funktion sollte ein Programm sein,
x
das oben auf dem Stapel angegeben ist, popx
und pushf(x)
- mit anderen Worten, es sollte die Funktionf
auf den Wert oben auf dem Stapel auswerten .Der äquivalente Mini-Flak-Wert beträgt 26 Byte (dank des Weizen-Assistenten zum Speichern von 2 Byte):
(ohne Kommentare und Leerzeichen)
Nimm die Funktion (innerhalb der
<>
) und eine Zahl aus der Eingabe. (Beachten Sie, dass Brain-Flak eine esoterische Sprache ist und kein funktionales Argument als Eingabe verwenden kann.)x0
Beispiel Blackbox-Funktionen:
x -> 2-x
: Online ausprobieren!Erläuterung:
quelle
Schnell ,
4742 BytesNaiver Ansatz, setzt voraus, dass die Black-Box-Funktion benannt ist
f
quelle
{...}as(<parameter types>)-><return type>
. Wenn Sie den Rückgabetyp nicht angeben, werden Build-Zeit-Fehler ausgegeben, sodass ich glaube, dass er ab sofort nicht mehr gültig ist (beachten Sie, dass die Umwandlung in die Byteanzahl einbezogen werden muss). Ihre erste Einreichung ist jedoch in Ordnung.C (gcc) , 40 Bytes
Probieren Sie es online! Beachten Sie, dass die Flags nicht erforderlich sind. Sie dienen dazu, die oben definierte Fixpoint-Funktion zu testen.
Dies ist eine Funktion, die einen int
n
und einen Funktionszeiger benötigtb : int → int
. Wird die Tatsache missbraucht, dass das Schreiben in das erste Variablenargument daseax
Register setzt, was der Rückgabe von † entspricht . Ansonsten ist dies ziemlich normal, was C-Golf angeht.n^b(n)
prüft auf die Ungleichung vonn
und die Blackbox, auf die angewendet wirdn
. Bei Ungleichheit wird die Fixpoint-Funktionf
erneut rekursiv mit der Anwendung und der Blackbox als Argumente aufgerufen . Andernfalls wird der Fixpunkt zurückgegeben.† Zitat erforderlich, ich erinnere mich vage daran, dies irgendwo gelesen zu haben, und Google scheint meinen Verdacht zu bestätigen
Es deklariert die Eingabe mit der Parametertypisierung nach K & R:
Das arkane Bit in der zweiten Zeile oben gibt an
b
, dass es sich um einen Funktionszeiger handelt, der einen ganzzahligen Parameter akzeptiert. Der Standardtyp von_
wird als Ganzzahl angenommen. Ebenson
wird angenommen, dass es sich um eine Ganzzahl handelt, und esf
wird angenommen, dass eine Ganzzahl zurückgegeben wird. Hurra für implizites Tippen?quelle
Sauber , 46 Bytes
Angenommen, die Funktion ist definiert als
f :: !Int -> Int
Es nimmt den Kopf der unendlichen Liste der Anwendungen von
f f f ... x
gefilterten für diejenigen Elemente, wof el == el
.Probieren Sie es online!
Wenn Sie die Funktion im TIO ändern möchten, lautet die Lambda-Syntax von Clean:
\argument = expression
(Eigentlich ist es viel komplizierter, aber zum Glück brauchen wir nur unäre Funktionen)
quelle
APL (Dyalog Unicode) , 14 Byte
Probieren Sie es online!
Die Funktion am Header entspricht
f(x) = floor(sqrt(abs(x)))
Vielen Dank an @ Adám für den Hinweis, dass die ursprüngliche Antwort laut PPCG-Konsens nicht gültig war.
Wie es funktioniert:
quelle
f
vorbelegt ist, was meines Erachtens im PPCG-Konsens verboten ist.{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}
wäre eine gültige Betreiberlösung.Oktave , 37 Bytes
Probieren Sie es online!
Octave verfügt über eine Inline-Zuweisung, MATLAB jedoch nicht. Dies ist eine Golf-Octave-Portierung der Lösung von flawr .
Es ist auch Häfen schön zu R .
quelle
Kotlin , 50 Bytes
Probieren Sie es online!
quelle
Forth (gforth), 36 Bytes
Diese Version setzt lediglich voraus, dass sie
f
vordefiniert ist. Es ist nicht so cool wie die Lösung darunter. Beide Programme werden mit einem Stapelüberlauf beendet, wenn sie nicht gefunden wurden, oder mit einem Stapelunterlauf, wenn sie gefunden wurden (nach dem Drucken des Ergebnisses).Probieren Sie es online aus
Viertens (gviertens), 52 Bytes
Dadurch kann das Ausführungstoken einer Funktion als Parameter übergeben werden und ist definitiv die bessere Lösung.
Probieren Sie es online aus
Erläuterung:
quelle
Ruby ,
3128 BytesProbieren Sie es online!
quelle
tinylisp repl, 28 bytes
Angenommen, die Funktion
f
ist vordefiniert.Probieren Sie es online! (Die Beispielfunktion ist
f(x) = (x*2) mod 10
.)Ungolfed
Wenn
f(x)
gleich istx
,x
ist dies ein fester Punkt. Gib es zurück. Suchen Sie andernfalls rekursiv nach einem festen Punkt, der vonf(x)
anstatt von beginntx
.quelle
APL NARS 65 Zeichen
v Der Operator würde ∞ (oder möglicherweise -oo oder Nan) als Fehler zurückgeben, andernfalls einen Wert x mit x = f (x). Im Test f = Boden (Quadrat (abs (x))) ist f1 = 2-x, f2 = c (c (c (x))) mit c = x% 2 == 0 × x / 2: 3 × x +1
quelle
Clojure,
4543 BytesNun, das ist die kürzeste und hässlichste:
+
Gibt es anstelle einer Zahl, so dass sie keinem Wert von entsprichtx0
.55 Bytes und funktional:
Beispiel:
quelle
x86-Opcode, 8 Bytes
Eingaben übernehmen:
ecx
(Wert ), (Funktionsadresse, Eingaben übernehmen von , Ergebnis schreiben an, ohne den Wert von und zu ändern )x0
edx
ecx
eax
ecx
edx
8086 Opcode, 7 Bytes (aber langsam)
Wenn ein fester Punkt vorhanden ist, fahren Sie ihn immer 65536-mal in einer Schleife dorthin.
Eingaben übernehmen:
ax
(Anfangswert ), (Funktionsadresse, Eingabe von übernehmen , Ausgabe auf schreiben, ohne den Wert von und zu ändern ). Den Fixpunkt im Register ausgeben .x0
dx
ax
ax
cx
dx
ax
quelle
Perl 5, 18 + 1 (
-p
)versuche es online
quelle
Java 8, 42 Bytes
Dies nimmt ein
Function<Integer, Integer>
oderIntFunction<Integer>
und einint
oderInteger
(Curry) und gibt den Fixpunkt zurück.Probieren Sie es online
Nutzt die Tatsache aus, dass Java Unterausdrücke von links nach rechts auswertet (also wird der alte
i
mit dem neuen verglichen), eine Eigenschaft, die mir beim Schreiben dieses Dokuments unbekannt war!quelle