Я хочу, чтобы моя книга была далеко от этой таблицы


21

История

Итак, у меня есть книга, которую я хочу отделить от своего стола только с другими книгами. Я хочу знать, сколько книг мне нужно, чтобы достичь этого, с длинами книг.n

Вот визуализация, которую мой друг из Wolfram нарисовал для меня:

визуализация от Вольфрама

Больше информации о теме в Вольфраме и Википедии .

Вызов

Учитывая целочисленный ввод , выведите, сколько книг необходимо, чтобы верхняя книга была на расстоянии книг от стола по горизонтали. или Найти наименьшее целочисленное значение для ввода в следующем неравенстве. \ sum_ {i = 1} ^ {m} \ frac {1} {2i} \ geq nnn

mn

i=1m12in

Редактировать: для дробей используйте по крайней мере IEEE с плавающей запятой одинарной точности. извините за редактирование задачи после публикации

( OEIS A014537 )

Контрольные примеры

 1          4
 2         31
 3        227
 5      12367
10  272400600


Нужно ли использовать именно это расположение книг, которое IIRC не является оптимальным?
user253751

Ответы:


13

Октава , 41 40 33 байта

1 байт сохранен благодаря @Dennis

@(n)find(cumsum(.5./(1:9^n))>n,1)

Попробуйте онлайн!

объяснение

При этом используется тот факт, что гармонические числа могут быть ограничены снизу логарифмической функцией.

Кроме того, >=сравнение можно заменить на то, >что номера гармоник не могут быть даже целыми числами (спасибо, @Dennis!).

@(n)                                   % Anonymous function of n
                     1:9^n             % Range [1 2 ... 9^n]
                .5./(     )            % Divide .5 by each entry
         cumsum(           )           % Cumulative sum
                            >n         % Is each entry greater than n?
    find(                     ,1)      % Index of first true entry


10

Шелуха , 8 байт

V≥⁰∫m\İ0

Попробуйте онлайн!

Так как Husk использует рациональные числа, когда это возможно, это не имеет проблем с плавающей запятой

объяснение

      İ0    The infinite list of positive even numbers
    m\      Reciprocate each
   ∫        Get the cumulative sum
V           Find the index of the first element
 ≥⁰         that is greater than or equal to the input

8 байтов, но в какой кодировке?
john16384

3
@ john16384 Husk имеет свою собственную кодовую страницу, где каждый символ соответствует одному байту. Вот соответствующая
hexdump





3

Javascript (ES6), 34 байта

n=>eval("for(i=0;n>0;n-=.5/i)++i")

Ungolfed

n => {
    for(i = 0; n > 0; ++i)
        n -= .5 / i
    return i;
}

Тестовые случаи


Придумали аналогичное решение с использованием рекурсии на 30 байт. Не знаю, опубликовать ли это или нет, увидев ваши.
Лохматый

1
Возможно, я что-то упускаю, но зачем вам заключать это в evalутверждение?
января 18

1
@cairdcoinherigaahing, без переменной необходимо будет эд в конце концов, за счет несколько более байтов. evalireturn
Лохматый




2

TI-BASIC, 27 байтов

Запрашивает у пользователя ввод и выводит вывод по окончании. Примечание: ⁻¹это токен -1 (обратный).

Input N
1
Repeat 2N≤Σ(I⁻¹,I,1,Ans
Ans+1
End
Ans

2
Если вы собираетесь сохранить Ansв Nсразу, то Input Nили Prompt Nметод ввода, который сохраняет вас на один байт Ans→N. И Mможет быть заменен Ans, так что 1→Mстановится 1и M+1→Mстановится Ans+1. (Но я скептически отношусь к выводу Ans, который не отображается - посмотрите на это, так что, возможно, окончание :Ansбудет уместным: тогда вместо «Готово» будет показано значение.)
Миша Лавров

Спасибо! Я знал, Ans→Nчувствовал себя смешно. Хорошие оптимизации. Также принял ваш совет на выходе, чтобы быть в безопасности. По-прежнему выходит с чистыми -3 байта: D
kamoroso94



1

Japt , 12 байт

Та же самая длина, но немного более эффективная, чем у рекурсивного варианта.

@T¨(Uµ½÷X}a1

Попытайся


объяснение

@T¨(Uµ½÷X}a1
                 :Implicit input of integer U
@        }a1     :Return the first number X >=1 that returns truthy when passed through the following function
 T               :Zero
  ¨              :Greater than or equal to
    Uµ           :Decrement U by...
      ½÷X        :0.5 divided by X

1

J, 22 байта

-6 байт благодаря хмурой лягушке

I.~0+/\@,1%2*1+[:i.9&^

Попробуйте онлайн!

оригинальный ответ

Ответ Луиса в J:

1+]i.~[:<.[:+/\1%2*1+[:i.9&^

Ungolfed

1 + ] i.~ [: <. [: +/\ 1 % 2 * 1 + [: i. 9&^

В основном любопытно посмотреть, может ли это быть радикально улучшено ( мили от кашля )

объяснение

1 +      NB. 1 plus... 
] i.~    NB. find the index of the arg in...
[: <.    NB. the floor of...
[: +/\   NB. the sumscan of...
1 %      NB. the reciprical of...
2 *      NB. two times...
1 +      NB. 1 plus...
[: i.    NB.  the integers up to 
9&^      NB. 9 raised to the power of the arg

Попробуйте онлайн!


1+]i.~[:<.-> 1+]I.~->I.~0,
FrownyFrog

OFC! спасибо frownyfrog
Иона

А потомI.~0+/\@,
FrownyFrog

Если вы отредактируете, вы
победите

@FrownyFrog, готово. Если у вас есть время, я бы хотел, чтобы вы решили эту проблему: codegolf.stackexchange.com/questions/154345/bracket-expansion . все решения, которые я могу придумать, слишком многословны, чтобы
Иона

0

PHP, 35 байт

while($argv[1]>$s+=.5/++$i);echo$i;

Запустите его, используя CLI:

$ php -d error_reporting=0 -r 'while($argv[1]>$s+=.5/++$i);echo$i;' 5


0

Java 8, 49 байт

n->{float r=0,s=0;for(;s<n;)s+=.5f/++r;return r;}

Объяснение:

Попробуйте онлайн. (Тайм-аут для тестовых случаев выше n=7.)

n->{             // Method with integer parameter and float return-type
  float r=0,     //  Result-float, starting at 0
        s=0;     //  Sum-float, starting at 0
  for(;s<n;)     //  Loop as long as the sum is smaller than the input
    s+=.5f/++r;  //   Increase the sum by `0.5/(r+1)`,
                 //   by first increasing `r` by 1 with `r++`
  return r;}     //  Return the result-float

0

тинилисп , 98 байт

(load library
(d _(q((k # N D)(i(l N(* D # 2))(_(inc k)#(+(* N k)D)(* D k))(dec k
(q((#)(_ 1 # 0 1

Последняя строка - это безымянная лямбда-функция, которая принимает количество длин книг и возвращает необходимое количество книг. Попробуйте онлайн!

объяснение

Единственный числовой тип данных, который имеет 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.