Вызов
Если задано число (с плавающей запятой / десятичное число), вернуть его обратное значение, т. Е. 1, деленное на число. Выходными данными должно быть число с плавающей запятой / десятичное число, а не просто целое число.
Детальная спецификация
- Вы должны получить ввод в виде числа с плавающей запятой / десятичного числа ...
- ... который имеет не менее 4 значащих цифр точности (при необходимости).
- Чем больше, тем лучше, но не считается в счете.
- Вы должны вывести с любым приемлемым методом вывода ...
- ... обратный номер.
- Это можно определить как 1 / x, x⁻¹.
- Вы должны вывести с точностью не менее 4 значащих цифр (при необходимости).
Вход будет положительным или отрицательным, с абсолютным значением в диапазоне [0,0001, 9999] включительно. Вам никогда не будет дано больше 4 цифр после десятичной точки и больше 4, начиная с первой ненулевой цифры. Вывод должен быть точным с точностью до 4-й цифры от первой ненулевой.
(Спасибо @MartinEnder)
Вот несколько примеров входных данных:
0.5134
0.5
2
2.0
0.2
51.2
113.7
1.337
-2.533
-244.1
-0.1
-5
Обратите внимание, что вам никогда не будут предоставлены входные данные, которые имеют точность выше 4 цифр.
Вот пример функции в Ruby:
def reciprocal(i)
return 1.0 / i
end
правила
- Все принятые формы вывода разрешены
- Стандартные лазейки запрещены
- Это код-гольф , самый короткий ответ в байтах выигрывает, но не будет выбран.
Разъяснения
- Вы никогда не получите вход
0
.
щедроты
Эта задача, очевидно, тривиальна на большинстве языков, но она может предложить интересную задачу на более эзотерических и необычных языках, поэтому некоторые пользователи готовы начислять баллы за это на необычно сложных языках.
@DJMcMayhem присудит премию в +150 баллов за самый короткий ответ «мозговая шутка», поскольку «мозговая шутка» общеизвестно трудна для чисел с плавающей запятой@ L3viathan присуждает премию +150 баллов за самый короткий ответ НЕФТЬ . НЕФТЬ не имеет собственного типа с плавающей запятой и не имеет деления.
@Riley присудит +100 баллов за самый короткий ответ.
@EriktheOutgolfer присудит +100 баллов за самый короткий ответ Sesos. Деление в производных мозгового траха, таких как Sesos, очень сложно, не говоря уже о делении с плавающей точкой.
Я ( @Mendeleev ) наградит +100 баллов за самый короткий ответ Retina.
Если есть язык, который, по вашему мнению, было бы интересно увидеть ответ, и вы готовы платить за него, не стесняйтесь добавлять свое имя в этот список (отсортировано по сумме вознаграждения)
Leaderboard
Вот фрагмент стека, чтобы составить обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
# Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
источник
1/x
.Ответы:
Brain-Flak ,
772536530482480 + 1 = 481 байтПоскольку Brain-Flak не поддерживает числа с плавающей запятой, мне пришлось использовать
-c
флаг для ввода и вывода порядка со строками, следовательно, +1.Попробуйте онлайн!
объяснение
Первое, о чем мы должны позаботиться, это отрицательный случай. Поскольку обратная величина отрицательного числа всегда отрицательна, мы можем просто удерживать отрицательный знак до конца. Мы начнем с того, что сделаем копию вершины стека и вычтем
-
из нее 45 (значение ASCII ). Если это один, мы ставим ноль на вершине стека, если нет, мы ничего не делаем. Затем мы подбираем верхнюю часть стека, которую нужно положить в конце программы. Если ввод начался с a, то-
это все равно a.-
Если это не так, мы заканчиваем тем, что взяли тот ноль, который мы поместили.Теперь, когда это не так, мы должны преобразовать реализации ASCII каждой цифры в реальные значения (0-9). Мы также собираемся удалить десятичную точку,
.
чтобы сделать вычисления проще. Так как нам нужно знать, где начинается десятичная точка, когда мы позже вставим ее, мы сохраняем число, чтобы отследить, сколько цифр было перед.
входом в стек.Вот как код делает это:
Мы начинаем с вычитания 46 (значение ASCII
.
) из каждого элемента в стеке (одновременно перемещая их все в стек). Это сделает каждую цифру на два больше, чем должно быть, но сделает.
ровно ноль.Теперь мы перемещаем все в левый стек, пока не достигнем нуля (вычитая два из каждой цифры, пока мы идем):
Записываем высоту стека
Переместите все остальное в левый стек (еще раз вычитая последние два из каждой цифры по мере их перемещения)
И поместите высоту стека, которую мы записали
Теперь мы хотим объединить цифры в один базовый номер 10. Мы также хотим сделать число 10 с двойными цифрами в качестве этого числа для использования в расчете.
Мы начнем с установки 1 на вершине стека, чтобы получить степень 10, и толкания высоты стека минус один к стеку для использования в цикле.
Теперь мы зациклили высоту стека минус 1 раз,
Каждый раз мы умножаем верхний элемент на 100, а под ним умножаем следующий элемент на 10 и добавляем его к числу ниже.
Мы заканчиваем наш цикл
Теперь мы, наконец, закончили с настройкой и можем начать фактический расчет.
Это было это ...
Разделим мощность 10 с помощью модифицированного варианта ввода , используя 0 ' алгоритм деления целого числа «s , как найти на вики . Это имитирует деление 1 на вход только так, как умеет Brain-Flak.
Наконец, мы должны отформатировать наш вывод в соответствующий ASCII.
Теперь, когда мы нашли,
ne
нам нужно убратьe
. Первым шагом к этому является преобразование его в список цифр. Этот код представляет собой модифицированную версию 0 ' «s алгоритм divmod .Теперь мы берем число и добавляем к нему десятичную точку. Одно только размышление об этой части кода вызывает головную боль, поэтому пока я оставлю читателю в качестве упражнения выяснить, как и почему он работает.
Положите отрицательный знак или нулевой символ, если нет отрицательного знака.
источник
I don't know what this does or why I need it, but I promise it's important.
1.0
или10
-c
флаг запускался с входом и выходом ASCII. Поскольку Brain-Flak не поддерживает плавающие числа, мне нужно взять IO в качестве строки.Python 2 , 10 байт
Попробуйте онлайн!
источник
Retina ,
9991 байтПопробуйте онлайн!
Woohoo, суб-100! Это удивительно эффективно, учитывая, что он создает (а затем сопоставляет) строку с более чем 10 7 символами в одной точке. Я уверен, что это еще не оптимально, но сейчас я доволен счетом.
Результаты с абсолютным значением меньше 1 будут напечатаны без начального нуля, например,
.123
или-.456
.объяснение
Основная идея заключается в использовании целочисленного деления (потому что это довольно легко с регулярным выражением и унарной арифметикой). Чтобы получить достаточное количество значащих цифр, мы делим ввод на 10 7 . Таким образом, любой ввод до 9999 по- прежнему приводит к 4-значному числу. По сути, это означает, что мы умножаем результат на 10 7, поэтому нам нужно отслеживать это, когда позже снова вставлять десятичную точку.
Мы начинаем с замены десятичной точки или конца строки, если десятичной точки не существует, используя 8 точек с запятой. Первый из них, по сути, является самой десятичной точкой (но я использую точки с запятой, потому что их не нужно экранировать), остальные 7 указывают, что значение было умножено на 10 7 (это еще не так, но мы знаем, что сделаем это позже).
Сначала мы превращаем ввод в целое число. До тех пор, пока после запятой остаются цифры, мы перемещаем одну цифру вперед и удаляем одну из точек с запятой. Это потому, что перемещение десятичной запятой вправо умножает ввод на 10 , и, следовательно, делит результат на 10 . Из-за ограничений ввода мы знаем, что это будет происходить не более четырех раз, поэтому всегда достаточно точек с запятой для удаления.
Теперь, когда входные данные являются целыми числами, мы конвертируем их в унарные и добавляем 10 7
1
с (разделенные символом a,
).Разобьем целое число на 10 7 , посчитав, сколько обратных ссылок на него помещается (
$#2
). Это стандартное унарное целочисленное делениеa,b
->b/a
. Теперь нам просто нужно исправить положение десятичной точки.Это в основном обратное второй стадии. Если у нас еще есть несколько точек с запятой, это означает, что нам все равно нужно разделить результат на 10 . Мы делаем это, перемещая точки с запятой на одну позицию влево и опуская одну точку с запятой до тех пор, пока мы не достигнем левого конца числа или не останемся только с одной точкой с запятой (которая является самой десятичной точкой).
Сейчас хорошее время, чтобы превратить первый (и, возможно, единственный)
;
обратно в.
.Если еще остались точки с запятой, мы достигли левого конца числа, поэтому при делении на 10 снова вставляются нули за десятичной точкой. Это легко сделать, заменив все оставшиеся
;
на a0
, так как они в любом случае сразу после десятичной точки.источник
\B;
с ,^;
чтобы сохранить 1 байт?-
перед;
.да , 5 байт
Попробуйте онлайн! Это берет ввод с вершины стека и оставляет вывод на вершине стека. Ссылка TIO получает данные из аргументов командной строки, которые могут принимать только целочисленные данные.
объяснение
у да есть только несколько операторов. Используемые в этом ответе ln (x) (представлены
|
), 0 () (константа, возвращающая нулевую функцию0
), - (вычитание) и exp (x) (представленыe
).~
переключает два верхних элемента в стеке.Это использует личность
что подразумевает, что
источник
LOLCODE ,
63, 56 байтов7 байтов сохранено благодаря @devRicher!
Это определяет функцию 'r', которую можно вызывать с помощью:
или любой другой
NUMBAR
.Попробуйте онлайн!
источник
ITZ A NUMBAR
в назначенииI
?HOW DUZ I r YR n VISIBLE QUOSHUNT OF 1 AN n IF U SAY SO
(добавить символы новой строки) на несколько байтов короче и может вызываться с помощьюr d
, гдеd
это возможноNUMBAR
.IZ
вместоDUZ
из-за правила интерпретатораsed , 575 + 1 (
-r
флаг) =723718594588576 байтПопробуйте онлайн!
Примечание: значения с плавающей запятой, для которых абсолютное значение меньше 1, должны быть записаны без начального 0, как
.5
вместо0.5
. Кроме того, число десятичных разрядов равно , гдеn
число десятичных разрядов в числе (таким образом, предоставление в13.0
качестве ввода даст больше десятичных разрядов, чем предоставление в13
качестве ввода)Это моя первая публикация в формате PPCG. Идеи для преобразования десятичных в унарные были взяты из этого удивительного ответа . Спасибо @seshoumara за то, что он провел меня через sed!
Этот код выполняет повторное длинное деление, чтобы получить результат. Деление занимает всего ~ 150 байт. Унарно-десятичные преобразования занимают больше всего байтов, а несколько других байтов идут на поддержку отрицательных чисел и входных данных с плавающей запятой.
объяснение
Объяснение по TIO
Правки
s:s/(.)/(.)/g:y/\1/\2/g:g
сохранить 1 байт при каждой замене (всего 5)\n
вместо;
разделителя, я смог сократить подстановки «умножить на 10», чтобы сэкономить 12 байт (спасибо @Riley и @seshoumara за то, что показали мне это)источник
JSFuck , 3320 байт
JSFuck - это эзотерический и образовательный стиль программирования, основанный на атомарных частях JavaScript. Он использует только шесть разных символов
()[]+!
для написания и выполнения кода.Попробуйте онлайн!
источник
return 1/this
будет примерно на 76 байтов больше, чемreturn+1/this
.[].fill.constructor('alert(1/prompt())')
2929 байт paste.ubuntu.com/p/5vGTqw4TQQ add()
2931НЕФТЬ ,
14281420 байтНу что ж. Я подумал, что могу попробовать это, и в конце концов мне это удалось. Есть только один недостаток: для запуска требуется почти столько же времени, сколько для написания.
Программа разделена на несколько файлов, которые имеют все 1-байтовые имена файлов (и учитываются для одного дополнительного байта в моем расчете байтов). Некоторые из этих файлов являются частью файлов примеров языка OIL, но нет реального способа их последовательного вызова (в OIL пока нет пути поиска или чего-то подобного, поэтому я не считаю их стандартной библиотекой), но это также означает, что (на момент публикации) некоторые файлы более многословны, чем необязательны, но обычно всего на несколько байтов.
Точность вычислений - до 4 цифр, но вычисление даже простой обратной величины (такой как ввод
3
) занимает очень много времени (более 5 минут). В целях тестирования я также сделал небольшой вариант, который точен до двух цифр, что занимает всего несколько секунд, чтобы доказать, что он работает.Я прошу прощения за огромный ответ, я хотел бы использовать какой-то тег спойлера. Я мог бы также разместить большую часть этого на gist.github.com или что-то подобное, если это необходимо.
Здесь мы идем:,
main
217 байт (имя файла не учитывается в байтах):a
(проверяет, находится ли данная строка в данной другой строке), 74 + 1 = 75 байт:b
(объединяет две заданные строки), 20 + 1 = 21 байт:c
(учитывая символ, разделяет данную строку при первом появлении), 143 + 1 = 144 байта (этот, очевидно, еще пригоден для игры в гольф):d
(заданная строка, получает первые 4 символа), 22 + 1 = 23 байта:e
(деление высокого уровня (но с нулевой опасностью деления)), 138 + 1 = 139 байт:f
(перемещает точку на 4 позиции вправо; «делит» на 10000), 146 + 1 = 147 байт:g
(проверяет, начинается ли строка с данного символа), 113 + 1 = 114 байт:h
(возвращает все, кроме первого символа заданной строки), 41 + 1 = 42 байта:i
(вычитает два числа), 34 + 1 = 35 байтов:j
(низкоуровневое деление, которое работает не во всех случаях), 134 + 1 = 135 байт:k
(умножение), 158 + 1 = 159 байт:l
(вернуть абсолютное значение), 58 + 1 = 59 байт:m
(сложение) 109 + 1 = 110 байт:источник
J, 1 байт
%
является функцией, дающей обратную величину входных данных Вы можете запустить это такисточник
Такси , 467 байтов
Попробуйте онлайн!
Ungolfed:
источник
Vim,
108 байт / нажатий клавишПоскольку V имеет обратную совместимость, вы можете попробовать это онлайн!
источник
=
. Исключительно полагаясь на другие макросы, регистры для хранения памяти и клавиши для навигации и изменения данных. Было бы намного сложнее, но я думаю, что это было бы так здорово! Я думаю,f
будет играть огромную роль в качестве условного теста.6431.0
чтобы он воспринимался как число с плавающей запятойМашинный язык Linux x86_64, 5 байт
Чтобы проверить это, вы можете скомпилировать и запустить следующую программу на C
Попробуйте онлайн!
источник
rcpss
вычисляет только приблизительную обратную величину (около 12 бит). +1C,
1512 байтПопробуйте онлайн!
1613 байт, если он должен обрабатывать также целочисленный ввод:Таким образом, вы можете позвонить с помощью
f(3)
вместоf(3.0)
.Попробуйте онлайн!
Спасибо @hvd за игру в гольф 3 байта!
источник
f(x)
на1/x
. Когда «функция» выполняется, что может произойти уже во время выполнения или когда ваш компилятор чувствует (и может оказаться правильным), технически это не шаг препроцессора.2
и в-5
качестве входных данных. Обе2
и-5
десятичные дроби, содержащие цифры в диапазоне от 0 до 9.#define f 1./
тоже работает.MATLAB / Octave, 4 байта
Создает дескриптор функции (именованный
ans
) для встроенногоinv
функцииОнлайн демо
источник
05AB1E , 1 байт
Попробуйте онлайн!
источник
GNU sed ,
377362 + 1 (флаг r) = 363 байтаПредупреждение: программа съедает всю системную память, пытающуюся запустить, и требует больше времени для завершения, чем вы готовы ждать! Ниже приведено объяснение и быстрая, но менее точная версия.
Это основано на ответе Retina Мартина Эндера. Я считаю
\t
из строки 2 буквальной табуляцией (1 байт).Мой основной вклад заключается в методе преобразования из десятичного в обычный унарный (строка 2) и наоборот (строка 5). Мне удалось значительно уменьшить размер кода, необходимого для этого (на ~ 40 байт), по сравнению с методами, показанными в предыдущем совете . Я создал отдельный совет ответ с подробным , где я предоставляю готовые фрагменты. Поскольку 0 не допускается в качестве входных данных, было сохранено еще несколько байтов.
Объяснение: чтобы лучше понять алгоритм деления, сначала прочитайте ответ Retina
Программа теоретически верна, причина, по которой она потребляет так много вычислительных ресурсов, состоит в том, что шаг деления выполняется сотни тысяч раз, более или менее в зависимости от входных данных, и используемое регулярное выражение вызывает кошмар возврата. Быстрая версия снижает точность (отсюда и количество шагов деления) и изменяет регулярное выражение для уменьшения возврата.
К сожалению, у sed нет метода прямого подсчета того, сколько раз обратная ссылка вписывается в шаблон, как в Retina.
Для быстрой и безопасной версии программы, но менее точной, вы можете попробовать это онлайн .
источник
Japt , 2 байта
Очевидное решение будет
что в буквальном смысле слова
1 / input
. Тем не менее, мы можем сделать один лучше:Это эквивалентно
input ** J
, иJ
по умолчанию установлено -1.Попробуйте онлайн!
Интересный факт: как
p
степенная функция, такq
и корневая функция (p2
=**2
,q2
=**(1/2)
); это значит, чтоqJ
будет работать так же, как-1 == 1/-1
и, следовательноx**(-1) == x**(1/-1)
.источник
Javascript ES6, 6 байтов
Попробуйте онлайн!
Javascript по умолчанию использует деление с плавающей точкой.
источник
APL, 1 байт
÷
Вычисляет взаимность при использовании в качестве монадической функции. Попробуйте онлайн!Использует набор символов Dyalog Classic.
источник
Чеддер , 5 байт
Попробуйте онлайн!
Это использует
&
, который связывает аргумент с функцией. В этом случае1
привязывается к левой части/
, что дает нам1/x
аргументx
. Это короче каноническогоx->1/x
на 1 байт.Кроме того, в более новых версиях:
источник
(1:/)
для того же количества байтовJava 8, 6 байт
Почти так же, как ответ JavaScript .
источник
MATL , 3 байта
Попробуйте это на MATL Online
объяснение
источник
Python, 12 байт
Один на 13 байтов:
Один на 14 байтов:
источник
Mathematica, 4 байта
Предоставляет вам точное рациональное значение, если вы даете ему точное рациональное значение, и результат с плавающей запятой, если вы даете ему результат с плавающей запятой.
источник
ZX Spectrum BASIC, 13 байтов
Заметки:
SGN PI
вместо литерала1
.Версия ZX81 для 17 байтов:
источник
LET A=17
и рефакторизовать ваше приложение в одну строку1 PRINT SGN PI/A
, хотя вам нужно будет менять значение A, вводя больше символов при каждом запуске программы.Haskell , 4 байта
Попробуйте онлайн!
источник
R, 8 байт
Довольно просто. Непосредственно выводит обратный вход.
Другое, но более длинное решение на 1 байт может быть:
scan()^-1
или дажеscan()**-1
для дополнительного байта. Оба^
и**
символ власти.источник
TI-Basic (TI-84 Plus CE),
652 байта-1 байт благодаря Timtech .
-3 байта с
Ans
благодарностью Григорию Перельман .Ans
и⁻¹
являются однобайтовыми токенами .TI-Basic неявно возвращает последнее оцененное значение (
Ans⁻¹
).источник
Ans
, поэтому вы можете заменить это наAns⁻¹
Желе , 1 байт
Попробуйте онлайн!
источник
Jelly programs consist of up to 257 different Unicode characters
.¶
и символ перевода строки могут использоваться взаимозаменяемо , поэтому, хотя режим Unicode «понимает» 257 различных символов, они сопоставляются с 256 токенами.C, 30 байтов
источник
0
чтобы сохранить один байт. При этом1.
он все равно будет скомпилирован как двойной.1.
до сих пор рассматривается как целое число.echo -e "#include <stdio.h>\nfloat f(x){return 1./x;}main(){printf(\"%f\\\\n\",f(5));}" | gcc -o test -xc -
Вывод./test
is0.200000
float f(float x){return 1/x;}
будет работать правильно..
- C удовольствием неявно преобразовать(int)1
в(float)1
силу типаx
.