Biorąc pod uwagę liczbę całkowitą i funkcję czarnej skrzynki, znajdź stały punkt w sekwencji zdefiniowanej przez .x1
f: ℤ → ℤ
f
xk+1 := f(xk)
Detale
x
Mówi się, że wartość jest stałym punktemf
ifx = f(x)
.Na przykład, jeśli
f(x) := round(x/pi)
mamy punkt początkowy , otrzymujemy wtedy , a następnie , co oznacza, że przesłanie powinno wrócić .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
- Możesz założyć, że wygenerowana sekwencja faktycznie zawiera stały punkt.
- Możesz użyć rodzimego typu dla liczb całkowitych zamiast
ℤ
. - Możesz użyć dowolnego języka, dla którego istnieją domyślne ustawienia funkcji czarnej skrzynki wprowadzane w standardowym wpisie meta we / wy . Jeśli nie ma takich domyślnych ustawień dla twojego języka, możesz dodać jeden w sensie definicji funkcji czarnej skrzynki i upewnij się, że łączysz swoje propozycje w tej definicji. Nie zapomnij także głosować na nich.
Przykłady
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ƭ⁻Ç$¿
, co jest jak (pseudo kod)for x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x);
. To może być warte kolejnego wyzwania.Odpowiedzi:
Właściwie 1 bajt
Wypróbuj online!
Y
jest funkcją punktu stałego w rzeczywistości. W przykładzie TIO funkcja pokazana jest jako ciąg i£
służy do przekształcenia jej w funkcję na stosie. Możliwe jest również, aby po prostu wcisnąć funkcję stosie jak tak . Są to jedyne dwa sposoby uzyskania wejścia funkcji w rzeczywistości.źródło
Y
kilku wyzwań. Jestem najwyraźniej wyjątkowo wcześnie rozpoznany : PAPL (Dyalog) , 2 bajty
Wypróbuj online!
NB: Definiuję
O←⍣=
w sekcji wprowadzania z powodu błędu w tym, że pochodnych operatorów monadycznych nie można zdefiniować w sposób, w jaki TIO lubi definiować rzeczy.⍣
Jest operatorem, z którego można korzystać jak(function⍣condition) ⍵
To zastosowanie
function
,f
do⍵
momentu(f ⍵) condition ⍵
zwrotu prawdziwe.⍣=
jest pochodnym operatorem monadycznym, który przyjmuje funkcję monadycznąf
jako lewy argument i stosuje ją do prawego argumentu⍵
, dopókif ⍵ = ⍵
źródło
⍣=
jest pochodnym operatorem monadycznym, który przyjmuje funkcję jako lewy operand i znajduje punkt stałej na podanej wartości początkowej. Chciałbym skorzystać z inną literę na⍣=
niżf
, jak to jest o perator, a nie f namaszczenie.f
w swoim opisie, ale następnie w TIOf
jest operatorem rozwiązania. Możesz także przesunąć pole wO←⍣=
górę w polu Kod, aby umożliwić policzenie i wskazać, że to jest rzeczywiste rozwiązanie, a reszta (dane wejściowe) po prostu go testuje.Haskell, 17 bajtów
Wypróbuj online!
źródło
until=<<((==)=<<)
znajduje punkt stały dla danej funkcji.MATLAB , 41 bajtów
Jest też to piękno, które nie potrzebuje plików funkcyjnych. Niestety jest trochę dłużej:
Wypróbuj online!
źródło
;
s. Wypróbuj online! .@()
wcześniejx
za 50 bajtów. Uznanie za sposób, w jaki zawijasz funkcję pomocnika (g(g)
na końcu), udało mi się zrobić tylko 51 bajtów@(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x)
. Zastanawiam się, czy istnieje jakakolwiek kombinacja obu podejść, która jest jeszcze krótsza.Standardowy ML (MLton) , 30 bajtów
Wypróbuj online! Użyj jako
& n blackbox
.Funkcje czarnej skrzynki są zdefiniowane następująco:
Wersja bez golfa:
źródło
R ,
3635 bajtówdzięki JayCe za grę w golfa
Wypróbuj online!
Sprawdź przykładowe funkcje!
Port R rozwiązania Flawr.
źródło
function(f,x){while(x-(x=f(x)))0;x}
oszczędza jeden bajt.0
, miło. Dzięki wielkie!Mathematica, 11 bajtów
Wypróbuj online!
Mathematica, 10 bajtów
Wypróbuj online!
źródło
Python 2 ,
393733 bajtówdzięki @ Mr.Xcoder za -2 bajty
Wypróbuj online!
zakłada, że funkcja czarnej skrzynki ma być nazwana f
źródło
f
, czy nie jest to forma zakładania, że dane wejściowe są w zmiennej? (edytuj: ninja'd autor: mbomb)JavaScript (Node.js) ,
252221 bajtówdziękuję Hermanowi Lauensteinowi za pokazanie mi tego konsensusu
dzięki @ l4m2 za -1 bajt
Przyjmuje nazwę funkcji czarnej skrzynki
f
.Wypróbuj online!
źródło
Galaretka , 3 bajty
Wypróbuj online!
Bierze lewy argument jako ciąg znaków reprezentujący odsyłacz Jelly (
2_
na przykład), a prawy argument jako liczbę całkowitąJak to działa
źródło
Brain-Flak , 24 bajty
Wypróbuj online!
(dla funkcji czarnej skrzynki
x -> 2-x
w poniższym przykładzie)Dostarczoną funkcją czarnej skrzynki powinien być program, który podany
x
na górze stosu, popx
i pushf(x)
- innymi słowy, powinien oceniać funkcjęf
na wartości na górze stosu.Odpowiednik Mini-Flak to 26 bajtów (dzięki Kreatorowi pszenicy za oszczędność 2 bajtów):
(nie licząc komentarzy i spacji)
Weź funkcję (wewnątrz
<>
) i liczbę z wejścia. (zauważ, że Brain-Flak jest językiem ezoterycznym i nie może przyjmować argumentów funkcjonalnych jako danych wejściowych)x0
Przykładowe funkcje czarnej skrzynki:
x -> 2-x
: Wypróbuj online!Wyjaśnienie:
źródło
Szybki ,
4742 bajtówNaiwne podejście zakłada, że funkcja czarnej skrzynki jest nazwana
f
źródło
{...}as(<parameter types>)-><return type>
. Jeśli nie określisz jego typu zwracania, spowoduje to wygenerowanie błędów podczas kompilacji, więc nie sądzę, aby był poprawny na chwilę obecną (zwróć uwagę, że rzutowanie musi być uwzględnione w liczbie bajtów). Twoje pierwsze zgłoszenie jest jednak w porządku.C (gcc) , 40 bajtów
Wypróbuj online! Zauważ, że flagi nie są konieczne, służą one pomocą w testowaniu funkcji punktu stałego zdefiniowanej powyżej.
Jest to funkcja, która pobiera int
n
i wskaźnik funkcjib : int → int
. Nadużywanie faktu, że zapis do pierwszego argumentu zmiennej ustawiaeax
rejestr, co jest równoważne zwracaniu † . W przeciwnym razie jest to dość standardowy, jeśli chodzi o C golf.n^b(n)
sprawdza nierównośćn
i stosuje się do czarnej skrzynkin
. Gdy jest nierówny, wywołuje funkcję punktu stałegof
rekurencyjnie z argumentami aplikacji i czarnej skrzynki. W przeciwnym razie zwraca punkt stały.† Potrzebne cytowanie, niejasno pamiętam gdzieś to przeczytałem, a Google wydaje się potwierdzać moje podejrzenia
Deklaruje dane wejściowe za pomocą typowania parametrów w stylu K&R:
Tajemny bit w drugim wierszu powyżej deklaruje,
b
że jest wskaźnikiem funkcji, który przyjmuje parametr liczby całkowitej - przyjmuje się, że domyślnym typem_
jest liczba całkowita. Podobnien
zakłada się, że jest liczbą całkowitą if
przyjmuje się, że zwraca liczbę całkowitą. Brawo dla niejawnego pisania?źródło
Czysty , 46 bajtów
Zakłada, że funkcja jest zdefiniowana jako
f :: !Int -> Int
Zajmuje on czoło nieskończonej listy aplikacji
f f f ... x
filtrowanych dla tych elementów, w którychf el == el
.Wypróbuj online!
Jeśli chcesz zmienić funkcję w TIO, składnia lambda Clean'a to:
\argument = expression
(w rzeczywistości jest to o wiele bardziej skomplikowane, ale na szczęście potrzebujemy tylko jednoargumentowych funkcji)
źródło
APL (Dyalog Unicode) , 14 bajtów
Wypróbuj online!
Funkcja w nagłówku jest równoważna z
f(x) = floor(sqrt(abs(x)))
Dzięki @ Adám za zwrócenie uwagi, że pierwotna odpowiedź była nieprawidłowa zgodnie z konsensusem PPCG.
Jak to działa:
źródło
f
jest to wstępnie przypisane, co moim zdaniem jest zabronione przez konsensus PPCG.{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}
byłoby poprawnym rozwiązaniem dla operatora.Oktawa , 37 bajtów
Wypróbuj online!
Oktawa ma przypisanie wbudowane, ale MATLAB nie, więc jest to golfowy port rozwiązania flawr .
To także porty ładnie do R .
źródło
Kotlin , 50 bajtów
Wypróbuj online!
źródło
Czwarty (gforth), 36 bajtów
Ta wersja zakłada, że
f
jest predefiniowana. To nie jest tak fajne, jak rozwiązanie poniżej. Oba programy wychodzą z przepełnieniem stosu, jeśli nie został znaleziony, lub niedopełnieniem stosu, jeśli został znaleziony (po wydrukowaniu wyniku).Wypróbuj online
Dalej (gforth), 52 bajty
Pozwala to na przekazanie tokena wykonania funkcji jako parametru i jest zdecydowanie lepszym rozwiązaniem.
Wypróbuj online
Wyjaśnienie:
źródło
Rubin ,
3128 bajtówWypróbuj online!
źródło
tinylisp repl, 28 bajtów
Zakłada, że funkcja
f
jest predefiniowana.Wypróbuj online!(Przykładowa funkcja to
f(x) = (x*2) mod 10
.)Bez golfa
Jeśli
f(x)
jest równyx
, tox
jest punktem stałym; zwróc to. W przeciwnym razie rekurencyjnie szukaj stałego punktu zaczynając odf(x)
zamiastx
.źródło
APL NARS 65 znaków
Operator v zwróciłby error (lub ewentualnie -oo lub Nan) za błąd, w przeciwnym razie jedna wartość x z x = f (x). W teście f = floor (sqrt (abs (x))), f1 = 2-x, f2 = c (c (c (x))) przy c = x% 2 == 0? X / 2: 3 * x +1
źródło
Clojure,
4543 bajtówTo jest najkrótszy i najbrzydszy:
+
jest tam zamiast liczby, więc nie jest równa żadnej wartościx0
.55 bajtów i funkcjonalne:
Przykład:
źródło
x86 opcode, 8 bajtów
Zapisz dane wejściowe:
ecx
(wartość ), (adres funkcji, pobierz dane wejściowe , zapisz wynik bez modyfikowania wartości ix0
edx
ecx
eax
ecx
edx
)8086 opcode, 7 bajtów (ale wolno)
Jeśli istnieje punkt stały, zapętlenie 65536 razy zawsze prowadzi go tam.
Weź dane wejściowe:
ax
(wartość początkowa ), (adres funkcji, pobierz dane wejściowe , zapisz dane wyjściowe bez modyfikowania wartości i ). Wypisuje stały punkt w rejestrze .x0
dx
ax
ax
cx
dx
ax
źródło
Perl 5, 18 + 1 (
-p
)spróbuj online
źródło
Java 8, 42 bajty
To wymaga
Function<Integer, Integer>
lubIntFunction<Integer>
iint
lubInteger
(zmiękczana) i zwraca do stałego punktu.Wypróbuj online
Wykorzystuje fakt, że Java ocenia podwyrażenia od lewej do prawej (więc stary
i
jest porównywany z nowym), właściwość, o której nie wiedziałem pisząc to!źródło