私は自分の本をこのテーブルから遠ざけたい


21

ストーリー

だから私は、他の本だけで私のテーブルから分離したい本を持っています。これを本の長さで達成するために必要な本の数を知りたい。n

以下は、Wolframの友人が描いた視覚化です。

a visualization from Wolfram

WolframおよびWikipediaのトピックに関する詳細情報。

チャレンジ

整数の入力与えられると、最上部の本がテーブルから水平方向にn本の長さだけ離れるのに必要な本のを出力します。または次の不等式で入力nmの最小整数値を見つけます。 m i = 1 1nn

mn

i=1m12in

編集:分数の場合、少なくともIEEE単精度浮動小数点を使用します。投稿後にチャレンジを編集して申し訳ありません

OEIS A014537

テストケース

 1          4
 2         31
 3        227
 5      12367
10  272400600


この特定の本の配置を使用する必要がありますが、IIRCは最適ではありませんか?
user253751

回答:


13

オクターブ41 40 33バイト

@Dennisのおかげで1バイト節約

@(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には、各シンボルが1バイトに対応する独自のコードページがあります。ここで、対応する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声明で包む必要があるのですか?
27:03にコメアリンガーをケアします。

1
@cairdcoinherigaahingではevali変数を最後に追加する必要がありreturnますが、さらに数バイトのコストがかかります。
シャギー




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あなたの上で1つのバイトを節約する入力方法がありますAns→N。とMに置き換えることができるAnsようになる、1→Mとなり1M+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バイト

frownyfrogのおかげで-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

ofc!ありがとうfrownyfrog-
ジョナ

そしてI.~0+/\@,
FrownyFrog

編集すると、ジュリアを破ります:)
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

tinylisp、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ます。

部分的な合計が#必要な本の長さ以上になると、再帰は停止します。この時点で、1冊の本をやりすぎているので、に戻りk-1ます。条件は次のとおりです1/2 * N/D < #。分母を乗算すると、を取得しますN < D*#*2。これは、最もゴルフを書く方法です。

再帰ヘルパー関数_はこれらすべての計算を行います。主な機能は、単にその呼び出しラッパー一引数で_の正しい開始値を持つkND

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.