История
Итак, у меня есть книга, которую я хочу отделить от своего стола только с другими книгами. Я хочу знать, сколько книг мне нужно, чтобы достичь этого, с длинами книг.
Вот визуализация, которую мой друг из Wolfram нарисовал для меня:
Больше информации о теме в Вольфраме и Википедии .
Вызов
Учитывая целочисленный ввод , выведите, сколько книг необходимо, чтобы верхняя книга была на расстоянии книг от стола по горизонтали. или
Найти наименьшее целочисленное значение для ввода в следующем неравенстве.
\ sum_ {i = 1} ^ {m} \ frac {1} {2i} \ geq n
Редактировать: для дробей используйте по крайней мере IEEE с плавающей запятой одинарной точности. извините за редактирование задачи после публикации
( OEIS A014537 )
Контрольные примеры
1 4
2 31
3 227
5 12367
10 272400600
Ответы:
Октава ,
414033 байта1 байт сохранен благодаря @Dennis
Попробуйте онлайн!
объяснение
При этом используется тот факт, что гармонические числа могут быть ограничены снизу логарифмической функцией.
Кроме того,
>=
сравнение можно заменить на то,>
что номера гармоник не могут быть даже целыми числами (спасибо, @Dennis!).источник
Python 3 , 35 байт
Попробуйте онлайн!
источник
Шелуха , 8 байт
Попробуйте онлайн!
Так как Husk использует рациональные числа, когда это возможно, это не имеет проблем с плавающей запятой
объяснение
источник
JavaScript, 30 байт
Рекурсивная функция, так что она выпадет довольно рано.
Попробуйте онлайн
источник
Haskell, 38 байт
источник
Swift , 65 байт
Попробуйте онлайн!
Ungolfed
источник
R , 39 байт
Попробуйте онлайн!
Грубая сила!
источник
Javascript (ES6), 34 байта
Ungolfed
Тестовые случаи
Показать фрагмент кода
источник
eval
утверждение?eval
i
return
Желе , 8 байт
Это очень медленно.
Попробуйте онлайн!
источник
Haskell,
714948 байт@BMO спас мне колоссальные 22 байта!
источник
Юлия 0,6 ,
3027 байтПопробуйте онлайн!
Работает только до
n = 6
, потому что у Юлии нет оптимизации хвостового вызова.-3 байта благодаря Денису .
источник
TI-BASIC, 27 байтов
Запрашивает у пользователя ввод и выводит вывод по окончании. Примечание:
⁻¹
это токен -1 (обратный).источник
Ans
вN
сразу, тоInput N
илиPrompt N
метод ввода, который сохраняет вас на один байтAns→N
. ИM
может быть замененAns
, так что1→M
становится1
иM+1→M
становитсяAns+1
. (Но я скептически отношусь к выводуAns
, который не отображается - посмотрите на это, так что, возможно, окончание:Ans
будет уместным: тогда вместо «Готово» будет показано значение.)Ans→N
чувствовал себя смешно. Хорошие оптимизации. Также принял ваш совет на выходе, чтобы быть в безопасности. По-прежнему выходит с чистыми -3 байта: D05AB1E , 11 байт
Попробуйте онлайн!
объяснение
источник
Pyth , 10 байт
Попробуйте онлайн!
Очень медленно.
Pyth , 10 байт
Попробуйте онлайн!
источник
Japt , 12 байт
Та же самая длина, но немного более эффективная, чем у рекурсивного варианта.
Попытайся
объяснение
источник
J, 22 байта
-6 байт благодаря хмурой лягушке
Попробуйте онлайн!
оригинальный ответ
Ответ Луиса в J:
Ungolfed
В основном любопытно посмотреть, может ли это быть радикально улучшено ( мили от кашля )
объяснение
Попробуйте онлайн!
источник
1+]i.~[:<.
->1+]I.~
->I.~0,
I.~0+/\@,
PHP, 35 байт
Запустите его, используя CLI:
источник
Wolfram Language (Mathematica) , 40 байт
Попробуйте онлайн!
источник
Java 8, 49 байт
Объяснение:
Попробуйте онлайн. (Тайм-аут для тестовых случаев выше
n=7
.)источник
тинилисп , 98 байт
Последняя строка - это безымянная лямбда-функция, которая принимает количество длин книг и возвращает необходимое количество книг. Попробуйте онлайн!
объяснение
Единственный числовой тип данных, который имеет tinylisp, это целые числа, поэтому мы вычисляем ряд гармоник в виде дроби, отслеживая числитель и знаменатель. На каждом шаге
N
- числитель,D
знаменатель иk
индекс суммы. Мы хотим, чтобы новая частичная сумма былаN/D + 1/k
или(N*k + D)/(D*k)
. Таким образом, мы возвращаемся с новым числителемN*K + D
, новым знаменателемD*k
и новым индексомk+1
.Рекурсия должна быть остановлена, как только частичная сумма будет больше или равна
#
желаемому количеству книг. На данный момент мы зашли на одну книгу слишком далеко, поэтому мы возвращаемсяk-1
. Состояние есть1/2 * N/D < #
; умножая знаменатель, мы получаемN < D*#*2
, что является самым лучшим способом написать это.Рекурсивная вспомогательная функция
_
выполняет все эти вычисления; основная функция является лишь одним аргументом обертки , который вызывает_
с правильными исходными значениямиk
,N
иD
.источник