彼がN単位の作業を完了するまでに最低何日かかりますか?


10

人はN作業単位を完了しなければなりません。仕事の性質は同じです。

仕事のこつを得るために、彼は初日に1つの作業単位のみを完了します。

彼は作業の完了を祝うことを望んでいるので、最終日に1つの作業単位を完了することにします。

彼は唯一完了させることができxx+1またはx-1日中の仕事の単位x前日に完了した作業の単位です。

あなたの仕事は、彼が作業単位を完了するのにかかる最小日数を計算するプログラムまたは関数を作成することNです。

サンプル入力と出力:

input -> output (corresponding work_per_day table)
-1    -> 0      []
0     -> 0      []
2     -> 2      [1,1]
3     -> 3      [1,1,1]
5     -> 4      [1,1,2,1] or [1,2,1,1]
9     -> 5      [1,2,3,2,1]
13    -> 7      [1,2,2,2,3,2,1]

入力はSTDIN、関数の引数として、または関数の引数として、または適切な方法で取得できます。

出力は、印刷したり、関数の結果として、または適切な方法で出力したりできます。

これはです。最短のソリューションが優先されます。


1
ヒント:この整数リストが役立つ可能性があります。
Leaky Nun

1
では、ケニーは負の作業数を達成することが可能であることを示したので、入力は正の整数に制限されていますか?または、1日あたりの作業は最低0に制限されていますか?
mbomb007

1
なぜあなたはピスの答えを受け入れましたか?私のゼリーの答えは3バイト短い...
デニス

こんにちは、@デニス私はアプローチを理解する必要があり、@ケニーラウはそれを理解するのに役立ちます。
HarshGiri 2016

私はCodeGolfを初めて使用するので、ここですべてのものを完全に理解するには少し時間がかかります。
HarshGiri

回答:


3

ゼリー、5バイト

×4’½Ḟ

これは、@ LeakyNunのアプローチの閉じた形式を使用します。

オンラインでお試しください!

幸運偶然の一致のためには、として過負荷になっているfloor/ real実数/複素数のため。これは、ジェリーで3つだけオーバーロードされた原子の1つです。

使い方

×4’½Ḟ  Main link. Argument: n (integer)

×4     Compute 4n.
  ’    Decrement; yield 4n - 1.
   ½   Square root; yield sqrt(4n - 1).
       If n < 2, this produces an imaginary number.
    Ḟ  If sqrt(4n - 1) is real, round it down to the nearest integer.
       If sqrt(4n - 1) is complex, compute its real part (0).

1
1つだけではありません...
Leaky Nun

1
「ラッキー偶然」
Arcturus

4

Pyth、8バイト

tfg/*TT4

使い方:

tfg/*TT4   Q is implicitly assigned to the input.
 f         test for T=1,2,3,... returning the first successful case
   /*TT4   whether T * T / 4
  g     Q  is greater than or equal to the input (second argument implied)
t          and subtract 1 from the first successful case

オンラインでお試しください!

疑似コード:

for(int T=1;;T++)
    if(T*T/4 >= Q)
        return T-1;

ボーナス、22バイト

「-1の場合は7を返す必要があります」

+tfg/*TT4?>Q0Q-2Q1*4g1

オンラインでお試しください!


3

JavaScript(ES2016)、24バイト

@Florent指数演算子のおかげで、以下のES6バリアントの短縮バージョン(現在はFirefoxのナイトリービルドまたはトランスパイラーのみ)。

n=>(n-1)**.5+(n+1)**.5|0

JavaScript(ES6)、30バイト

n=>(s=Math.sqrt)(n-1)+s(n+1)|0

このシーケンスに基づいています

f=n=>(s=Math.sqrt)(n-1)+s(n+1)|0

units.oninput = () => output.value = f(+units.value||0);
<label>Units: <input id="units" type="number" value="0" /></label>
<label>Days: <input id="output" type="number" value="0" disabled /></label>


ES2016(26文字)でさえ短い:f=n=>(n-1)**.5+(n+1)**.5|0
フロラン

@Florent Wowありがとう、次の累乗演算子を認識していませんでした。
ジョージリース2016

2

JavaScript、 32 31バイト

f=(q,t=1)=>q>t*t/4?f(q,t+1):t-1

Ungolfedコード:

function f(q, t = 1) {
  return q > t * t / 4
    ? f(q, t + 1)
    : t - 1
}

ケニーラウのアンサーと同じアルゴリズムを使用しますが、いくつかのバイトを節約するために再帰的なクロージャーとして実装されています。

使用法:

f(-1)  // 0
f(0)   // 0
f(2)   // 2
f(3)   // 3
f(5)   // 4
f(9)   // 5
f(13)  // 7

REPLソリューション、23バイト

for(t=1;t*t++/4<q;);t-2

前に追加q=してスニペットを実行します。

q=-1;for(t=1;t*t++/4<q;);t-2 // 0
q=9;for(t=1;t*t++/4<q;);t-2  // 5
q=13;for(t=1;t*t++/4<q;);t-2 // 7

それも私のものと同じ変数名を使用しています:)
Leaky Nun '22

回して1つのバイトを保存することができます>=<D:
漏れ修道女

@KennyLauありがとう!ゴルフをしていないので久しぶりです。私は少し錆びているx)
フローレント

for(t=1;;)if(t*t++/4>=q)return t-1;は36バイトのみです:)
Nun

1
@KennyLau 23バイトのソリューションを追加しました:)
Florent

2

Python、28バイト

lambda n:max(4*n-1,0)**.5//1

floatを出力します。これmaxは、負の平方根のエラーを回避する0ために提供するものn<=0です。


2

UGL30 25バイト

i$+$+dc^l_u^^$*%/%_c=:_do

オンラインでお試しください!

負の入力には機能しません。

使い方:

i$+$+dc^l_u^^$*%/%_c=:_do
i$+$+d                     #n = 4*input-1
      c                    #i=0
       ^l_     %/%_c=:_    #while      > n:
           ^^$*            #      i**2
          u                #                i = i+1
                       do  #print(i)

以前の30バイトのソリューション:

iuc^l_u^^$*cuuuu/%_u%/%_c=:_do

こちらのオンライン通訳。

負の入力には機能しません。

使い方:

iuc^l_u^^$*cuuuu/%_u%/%_c=:_do
iuc                             #push input; inc; i=0;
   ^l_u             %/%_c=:_    #while        > input:
       ^^$*cuuuu/%_             #      i**2/4
                   u            #                      i = i+1
                            do  #print(i)

1

MATL、11バイト

E:t*4/G<f0)

@KennyLauと同様のアルゴリズムですが、無期限にループするのではなく、1 ... 2nからループしてバイトを節約します。

オンラインでお試しください!

説明

    % Implicitly grab the input
E   % Double the input
:   % Create an array from 1...2n
t*  % Square each element
4/  % Divide each element by 4
G<  % Test if each element is less than G
f   % Get the indices of the TRUE elements in the array from the previous operation
0)  % Get the last index (the first index where T*T/4 >= n)
    % Implicitly display the result.

@LuisMendoそれを指摘してくれてありがとう。更新しました!
Suever


0

Python、43バイト

f=lambda n,i=1:i-1if i*i>=n*4 else f(n,i+1)

1
> =の代わりに<を使用してバイトを節約できます
Leaky Nun


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