Twoim zadaniem jest obliczenie pierwiastka kwadratowego z 2 za pomocą Metody Newtona - z lekkim zwrotem akcji. Twój program ma obliczyć iterację za pomocą metody Newtona i wygenerować kod źródłowy dla następnej iteracji (która musi być w stanie zrobić to samo).
Metoda Newtona jest dość wyczerpująco opisana na Wikipedii
Aby obliczyć pierwiastek kwadratowy 2 przy użyciu metody Newtona, należy:
- Definiować
f(x) = x^2 - 2
- Definiować
f'(x) = 2x
- Zdefiniuj
x[0]
(początkowe przypuszczenie)= 1
- Definiować
x[n+1] = x[n] - (f[n] / f'[n])
Każda iteracja przesunie się x [n] bliżej pierwiastka kwadratowego z dwóch. Więc -
x[0] = 1
x[1] = x[0] - f(x[0])/f'(x[0]) = 1 - (1 ^ 2 - 2) / (2 * 1) = 1.5
x[2] = x[1] - f(x[1])/f'(x[1]) = 1.5 - (1.5 ^ 2 - 2) / (2 * 1.5) = 1.416666667
x[3] = x[2] - f(x[2])/f'(x[1]) = 1.416666667 - (1.416666667 ^ 2 - 2) / (2 * 1.416666667) = 1.414215686
- i tak dalej
Twój program będzie:
- Oblicz,
x[n]
gdzien
jest liczba uruchomień programu - Wyślij kod źródłowy do poprawnego programu w tym samym języku, który musi obliczyć
x[n+1]
i spełnić te same kryteria tego pytania. - Pierwszym wierszem kodu źródłowego musi być wynik obliczenia, odpowiednio skomentowany. Jeśli źródło wymaga czegoś konkretnego (np. Shebang) w pierwszym wierszu, wynik może zostać umieszczony w drugim wierszu.
Zauważ, że
- Twój program musi wstępnie zgadywać
x[0] = 1
- Te standardowe Luki zastosowanie
- Wszelkie wbudowane funkcje zasilania, pierwiastek kwadratowy lub xroot są zabronione
- Twój program nie może akceptować żadnych danych wejściowych. Musi być całkowicie samodzielny.
Twój wynik to rozmiar początkowego programu w bajtach UTF-8. Najniższy wynik wygrywa.
x = x-(x*x-2)/(2*x)
?Odpowiedzi:
Common Lisp,
223956866Teraz, gdy uważniej przeczytałem oświadczenie o problemie (dzięki, primo !), Zauważyłem, że pierwsza linia musi być wynikiem obliczeń, a nie, że musi zawierać wynik. Dlatego myślę, że moje wcześniejsze próby nie były zgodne z zasadami. Ten powinien.
Przykładowe zastosowanie (SBCL 1.1.15):
źródło
Python 60 bajtów
Lekko uprościłem formułę, stosując następujące podstawienia:
Mam nadzieję, że to nie problem.
Program działa w następujący sposób:
itp.
źródło
g="x=%s;o=%r;print o%%(x/2+1/x,o)";print g%(1.5,g)
@ 50 znaków.CJam, 20 bajtów
Wypróbuj online.
Wydajność
Jak to działa
źródło
ECMAScript 6,
3836JavaScript, 51
Jest to to samo co powyżej, w przypadku starszych przeglądarek.
źródło
print
,putstr
,console.log
itd.)Lua 129
Prawdopodobnie zbyt długo, ale Quine Lua jest do bani, ponieważ zagnieżdżenie
[[ ]]
jest przestarzałą funkcją. Ale działa niezależnie:Nieco przyjemniej jest sprawdzić, czy dodajesz znaki nowej linii zamiast dwukropków:
źródło
J -
10288 bajtówJest to tak okropne, jak przy tworzeniu quinesów (prawdopodobnie poprawię to, gdy będę miał lepsze pomysły). Liczba zmiennoprzecinkowa J jest ograniczona do 5 miejsc po przecinku, ale zastąpienie jej pierwszą linią
x=:1x
byłoby ułamkiem z nieskończoną precyzją.Kilka pierwszych iteracji:
Wyjaśnienie
źródło
1%x
jest taki sam jak%x
. Zamiast tego(x%2)+1%x
możesz zrobić(%&2+%)x
.Ruby, 65
Jak to często bywa, jest to prawie prosty port rozwiązania Python.
źródło