Ваша задача - вычислить квадратный корень из 2, используя метод Ньютона - с легким поворотом. Ваша программа должна рассчитать итерацию, используя метод Ньютона, и вывести исходный код для следующей итерации (которая должна быть в состоянии сделать то же самое).
Метод Ньютона довольно исчерпывающе описан в Википедии
Чтобы вычислить квадратный корень 2, используя метод Ньютона, вы:
- определять
f(x) = x^2 - 2
- определять
f'(x) = 2x
- Определить
x[0]
(начальная догадка)= 1
- определять
x[n+1] = x[n] - (f[n] / f'[n])
Каждая итерация будет перемещать x [n] ближе к квадратному корню из двух. Так -
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
- и так далее
Ваша программа будет:
- Рассчитать,
x[n]
гдеn
количество раз программа была запущена - Выведите исходный код действительной программы на том же языке, который должен рассчитывать
x[n+1]
и удовлетворять тем же критериям этого вопроса. - В первой строке исходного кода должен быть результат вычисления, правильно закомментированный. Если источнику требуется что-то конкретное (например, шебанг) в первой строке, результат может быть помещен во вторую строку.
Обратите внимание, что
- Ваша программа должна использовать первоначальное предположение
x[0] = 1
- В стандартных лазейки применяются
- Любые встроенные функции power, square root или xroot запрещены
- Ваша программа не должна принимать какие-либо данные. Он должен быть полностью автономным.
Ваша оценка - это размер вашей начальной программы в байтах UTF-8. Самый низкий балл побеждает.
x = x-(x*x-2)/(2*x)
?Ответы:
Common Lisp,
223956866Теперь, когда я прочитал формулировку проблемы более внимательно (спасибо, primo !), Я заметил, что первая строка должна быть результатом вычисления, а не должна содержать результат. Таким образом, я думаю, что мои предыдущие попытки не совсем соответствовали правилам. Этот должен.
Пример использования (SBCL 1.1.15):
источник
Python 60 байт
Я немного упростил формулу, используя следующие подстановки:
Я надеюсь, что это не проблема.
Программа действует следующим образом:
и т.п.
источник
g="x=%s;o=%r;print o%%(x/2+1/x,o)";print g%(1.5,g)
@ 50 символов.CJam, 20 байтов
Попробуйте онлайн.
Выход
Как это работает
источник
ECMAScript 6,
3836JavaScript, 51
Это то же самое, что и выше, для старых браузеров.
источник
print
,putstr
,console.log
и т.д.).Луа 129
Возможно, это слишком долго, но Lua quine - отстой, потому что вложенная
[[ ]]
функция устарела. Но это работает независимоНемного приятнее посмотреть, добавляете ли вы новые строки вместо двоеточий:
источник
J -
10288 байтЭто так же ужасно, как я готовлю кваи (я, возможно, пересмотрю это, когда получу лучшие идеи). Плавания J ограничены 5 десятичными разрядами, но если заменить первую строку на
x=:1x
нее, получится дробь с бесконечной точностью.Первые несколько итераций:
объяснение
источник
1%x
так же, как%x
. Вместо(x%2)+1%x
вы можете сделать(%&2+%)x
.Руби, 65
Как это часто бывает, это почти прямой порт решения Python.
источник