Дано целое число и некоторая функция черного ящика найти фиксированную точку в последовательности, определенной .x1
f: ℤ → ℤ
f
xk+1 := f(xk)
Детали
Значение
x
называется фиксированной точкойf
ifx = f(x)
.Например , если
f(x) := round(x/pi)
и мы отправная точка , то мы получаем , то , то , и , наконец , это означает , что представление должно вернуться .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
- Вы можете предположить, что сгенерированная последовательность фактически содержит фиксированную точку.
- Вы можете использовать нативный тип для целых чисел вместо
ℤ
. - Вы можете использовать любой язык, для которого есть значения по умолчанию для функций черного ящика, вводимых в стандартную метапост IO . Если для вашего языка нет такого значения по умолчанию, не стесняйтесь добавлять его в смысле определения функций черного ящика и обязательно связывайте ваши предложения в этом определении. Также не забудьте проголосовать за них.
Примеры
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ƭ⁻Ç$¿
, что-то вроде (псевдокод)for x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x);
. Это может стоить еще одной проблемы.Ответы:
На самом деле , 1 байт
Попробуйте онлайн!
Y
является функцией фиксированной точки на самом деле. В примере TIO функция показана в виде строки и£
используется для преобразования ее в функцию в стеке. Также можно просто поместить функцию в стек, как показано ниже . Это только два способа получить вход функции в действительности.источник
Y
для нескольких задач. Я , видимо , очень precognizant : PAPL (Дьялог) , 2 байта
Попробуйте онлайн!
NB: Я определяю
O←⍣=
в разделе ввода из-за ошибки в том, что производные монадические операторы не могут быть определены так, как TIO любит определять вещи.⍣
Является ли оператор, который может быть использован как(function⍣condition) ⍵
Он применяется
function
,f
к⍵
до(f ⍵) condition ⍵
возвращения верно.⍣=
является производным монадическим оператором, который принимает монадическую функцию вf
качестве левого аргумента и применяет ее к правому аргументу⍵
доf ⍵ = ⍵
источник
⍣=
это производный монадический оператор, который принимает функцию в качестве левого операнда и находит точку фиксации для данного начального значения. Я хотел бы использовать другую букву для⍣=
чем ,f
как это о perator, а не е помазание.f
в своем описании, но затем на TIO,f
ваш оператор решения. Вы также можете переместить стрелкуO←⍣=
вверх в поле «Код», чтобы подсчитать его и указать, что это фактическое решение, а остальное (вход) просто его тестирует.Haskell, 17 байт
Попробуйте онлайн!
источник
until=<<((==)=<<)
находит точку привязки для данной функции.MATLAB , 41 байт
Существует также эта красота , которая не нуждается в функциональных файлах. К сожалению, это немного дольше:
Попробуйте онлайн!
источник
;
с. Попробуйте онлайн! ,@()
beforex
для 50 байтов. Слава также за то, как вы оборачиваете свою вспомогательную функцию (g(g)
в конце), мне удалось сделать только 51 байт@(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x)
. Мне интересно, есть ли комбинация обоих подходов, которая еще короче.Стандартный ML (MLton) , 30 байтов
Попробуйте онлайн! Использовать как
& n blackbox
.Функции черного ящика определены следующим образом:
Безголовая версия:
источник
R ,
3635 байтспасибо JayCe за игру в гольф
Попробуйте онлайн!
Проверьте пример функций!
R порт решения проблемы.
источник
function(f,x){while(x-(x=f(x)))0;x}
экономит один байт.0
, хорошо. Спасибо большое!Mathematica, 11 байт
Попробуйте онлайн!
Mathematica, 10 байт
Попробуйте онлайн!
источник
Python 2 ,
393733 байтаспасибо @ Mr.Xcoder за -2 байта
Попробуйте онлайн!
предполагает, что функция черного ящика будет названа f
источник
f
, разве это не форма предположения, что входные данные находятся в переменной? (редактировать: ninja'd от mbomb)JavaScript (Node.js) ,
252221 байтспасибо Герману Лауэнштейну за то, что он показал мне это согласие
благодаря @ l4m2 за -1 байт
Предполагается, что функция черного ящика будет названа
f
.Попробуйте онлайн!
источник
Желе , 3 байта
Попробуйте онлайн!
Принимает левый аргумент в виде строки, представляющей ссылку Jelly (
2_
например), а правый аргумент как целое числоКак это работает
источник
Brain-Flak , 24 байта
Попробуйте онлайн!
(для функции черного ящика
x -> 2-x
в примере ниже)Предоставленная функция черного ящика должна быть программой, которая задана
x
на вершине стека, popx
и pushf(x)
- другими словами, она должна оценивать функциюf
по значению на вершине стека.Эквивалентный мини-флак составляет 26 байтов (спасибо Wheat Wizard за сохранение 2 байта):
(не считая комментариев и пробелов)
Возьмите функцию (внутри
<>
) и число от ввода. (обратите внимание, что Brain-Flak является эзотерическим языком и не может принимать функциональные аргументы в качестве входных данных)x0
Пример функций черного ящика:
x -> 2-x
: Попробуйте онлайн!Объяснение:
источник
Swift ,
4742 байтаНаивный подход, предполагает, что функция черного ящика названа
f
источник
{...}as(<parameter types>)-><return type>
. Если вы не укажете тип возвращаемого значения, он выдаст ошибки времени сборки, поэтому я не думаю, что он действителен на данный момент (обратите внимание, что приведение должно быть включено в число байтов). Впрочем, ваше первое представление в порядке.C (gcc) , 40 байт
Попробуйте онлайн! Обратите внимание, что флаги не нужны, они есть, чтобы помочь с тестированием функции Fixpoint, определенной выше.
Это функция, которая принимает int
n
и указатель на функциюb : int → int
. Злоупотребление фактом, что запись в первый аргумент переменной устанавливаетeax
регистр, который эквивалентен возвращению † . В остальном, это довольно стандартно для C Golf.n^b(n)
проверяет на неравенствоn
и черный ящик применяется кn
. Когда неравенство, он вызывает функцию Fixpointf
снова рекурсивно с приложением и черным ящиком в качестве аргументов. В противном случае он возвращает точку фиксации.† Требуется цитирование, я смутно помню, что где-то читал это, и Google, кажется, подтверждает мои подозрения
Он объявляет ввод с набором параметров в стиле K & R:
Тайный бит во второй строке выше объявляется
b
как указатель на функцию, который принимает целочисленный параметр - тип по умолчанию_
для целого числа. Аналогично,n
предполагается, что это целое число, иf
предполагается, что оно возвращает целое число. Ура для неявной типизации?источник
Чисто , 46 байт
Предполагается, что функция определяется как
f :: !Int -> Int
Это занимает голову бесконечного списка приложений,
f f f ... x
отфильтрованных для тех элементов, гдеf el == el
.Попробуйте онлайн!
Если вы хотите изменить функцию в TIO, лямбда-синтаксис Clean:
\argument = expression
(на самом деле это гораздо сложнее, но, к счастью, нам нужны только унарные функции)
источник
APL (Dyalog Unicode) , 14 байтов
Попробуйте онлайн!
Функция в заголовке эквивалентна
f(x) = floor(sqrt(abs(x)))
Спасибо @ Adám за указание на то, что первоначальный ответ был недействительным в соответствии с консенсусом PPCG.
Как это работает:
источник
f
это предварительно назначено, что, я думаю, запрещено консенсусом PPCG.{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}
будет действительным операторским решением.Октава , 37 байт
Попробуйте онлайн!
У Octave есть встроенное назначение, но у MATLAB нет, так что это лучшее решение Octave для игры в гольф .
Он также порты красиво в R .
источник
Котлин , 50 байтов
Попробуйте онлайн!
источник
Forth (gforth), 36 байтов
Эта версия предполагает, что
f
она предопределена. Это не так круто, как решение под ним. Обе программы выходят с переполнением стека, если не найдено, или с переполнением стека, если найдено (после печати результата).Попробуйте онлайн
Forth (gforth), 52 байта
Это позволяет передавать маркер выполнения функции в качестве параметра и, безусловно, является более подходящим решением.
Попробуйте онлайн
Объяснение:
источник
Рубин ,
3128 байтПопробуйте онлайн!
источник
тинилисп репл , 28 байт
Предполагается, что функция
f
предопределена.Попробуйте онлайн! (Пример функции
f(x) = (x*2) mod 10
.)Ungolfed
Если
f(x)
равноx
, тоx
является фиксированной точкой; верни это. В противном случае, рекурсивно искать неподвижную точку , начиная сf(x)
вместоx
.источник
APL NARS 65 символов
Оператор v будет возвращать ∞ (или, возможно, -oo или Nan) для ошибки, иначе одно значение x с x = f (x). В тесте f = floor (sqrt (abs (x))), f1 = 2-x, f2 = c (c (c (x))) с c = x% 2 == 0? X / 2: 3 * x +1
источник
Clojure,
4543 байтаНу, это самое короткое и самое уродливое
+
есть вместо числа, так что оно не равно ни одному значениюx0
.55 байт и функционал:
Пример:
источник
код операции x86, 8 байт
Взять входные данные:
ecx
(значение ), (адрес функции, получить входные данные , записать результат без изменения значения и )x0
edx
ecx
eax
ecx
edx
8086 код операции, 7 байт (но медленно)
Если существует фиксированная точка, то ее повторяют в цикле 65536 раз.
Взять входные данные:
ax
(начальное значение ), (адрес функции, получить входные данные , записать выходные данные без изменения значения и ). Вывести фиксированную точку в регистр .x0
dx
ax
ax
cx
dx
ax
источник
Perl 5, 18 + 1 (
-p
)попробуйте это онлайн
источник
Java 8, 42 байта
Это берет
Function<Integer, Integer>
или илиIntFunction<Integer>
иint
илиInteger
(карри) и возвращает фиксированную точку.Попробуйте онлайн
Использует тот факт, что Java оценивает подвыражения слева направо (поэтому старое
i
сравнивается с новым), свойство, о котором я не знал, когда писал это!источник