Я хочу, щоб моя книга була подалі від цієї таблиці


21

Історія

Тож у мене є книга, яку я хочу відокремити від свого столу, окрім інших книг. Я хочу знати, скільки книг мені потрібно, щоб досягти цього за допомогою книжок.н

Ось візуалізація, яку мій друг у Вольфрамі намалював для мене:

візуалізація від Wolfram

Детальніше про тему у Вольфрам та Вікіпедія .

Виклик

З огляду на ціле число , виведіть, скільки книг потрібно, щоб головна книга була на n довжиною книги горизонтально. або Знайдіть найменше ціле значення m для введення n у наступній нерівності. m i = 1 1нн

мн

i=1м12iн

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

( OEIS A014537 )

Тестові кейси

 1          4
 2         31
 3        227
 5      12367
10  272400600


Чи потрібно використовувати саме цю композицію книг, яка IIRC не є оптимальною?
користувач253751

Відповіді:


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

Спробуйте в Інтернеті!

Оскільки Хуск використовує раціональні числа, коли це може, це не має проблем з плаваючою точкою

Пояснення

      İ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
H.PWiz





3

Javascript (ES6), 34 байти

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

Безумовно

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

Випробування


Придумали подібний розчин, використовуючи рекурсію на 30 байт. Не знаю, публікувати його чи ні, після того, як побачив своє.
Кудлатий

1
Можливо, мені чогось не вистачає, але навіщо вам це обгортати у evalвиписці?
caird coinheringaahing

1
@cairdcoinherigaahing, без змінної необхідно буде ед врешті-решт, за рахунок дещо байтів. evalireturn
Кудлатий


2

Haskell, 71 49 48 байт

f x=length.fst.span(<x).scanl(+)0$(0.5/)<$>[1..]

@BMO врятував мене колосальних 22 байтів!



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&^

Безумовно

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

оф! дякую нахабний жаба
Йона

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

Якщо ви редагуєте, ви поб'єте Джулію :)
FrownyFrog

@FrownyFrog, готово. якщо у вас є деякий час, я б хотів бачити, як ви вирішите це: codegolf.stackexchange.com/questions/154345/bracket-expansion . всі рішення, на які я можу придумати, є занадто багатослівними, щоб розміщувати їх з доброю совістю ...
Jonah

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

Останній рядок - це неназвана лямбда-функція, яка приймає кількість книжок і повертає кількість потрібних книг. Спробуйте в Інтернеті!

Пояснення

Єдиним числовим типом даних тинілісп є цілі числа, тому ми обчислюємо гармонічний ряд у вигляді дробу, відстежуючи чисельник та знаменник. На кожному кроці 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.