合計がnになる個別の整数の最大数を見つける


18

タスク

入力の正の整数n(1から使用言語の制限まで)が与えられると、合計がである個別の正の整数の最大数を返すか出力しnます。

テストケース

fタスクに従って有効な関数を定義しましょう。

f1から始まるのシーケンス

1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, ...

より大きなテストケースとして:

>>> f(1000000000) // Might not be feasible with brute-forcers
44720

テストコード

明示的に指定されていないテストケースの場合、コードの出力は次の結果と一致する必要があります。

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        System.out.println((int) Math.floor(Math.sqrt(2*x + 1./4) - 1./2));
    }
}

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


0インデックスを付けることはできますか?
完全に人間の

1
@totallyhuman「それ」が答えですか?これはリストに関するものではありませんので...
アディソンCrumpの

3
@totallyhumanいいえ。これは、特定の数値の個別のパーティションに関するものです。
アディソンクランプ


4
codegolfスタックに出くわすたびに、私はほとんど取るに足りないと感じます。答えとコメントは謙虚なこと以上のものです。質問も通常は興味深いものですが、彼のコメントでは、@ JeppeStigNielsenはまだフロアエリアを検討しているときに完成した設計図を投げ入れています。
-KalleMP

回答:


9

05AB1E、4バイト

ÅTg<

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

仕事に最適なツール。

ÅT収率のリストオングストロームちゃうTにriangular番号をアップを含むNは(残念ながら、それ以外の場合は3バイトとなり、あまりにも0を含む)、g<LEN取得G thを、それをデクリメントします。


8

ゼリー6 5バイト

R+\»ċ

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

やや効率的。このシーケンスは三角形の数で増加するため、これはnより小さい三角形の数を数えるだけです。

説明:

        # Main link
R       # Range, generate [1..n]
 +\     # Cumulative sum (returns the first n triangular numbers)
   »    # For each element, return the maximum of that element and 'n'
    ċ   # How many elements are 'n'? (implicit right argument is n)

説明では、あなたはきっと平均「どのように多くの数字よりも小さいか等しい N
ルイスMendo

@LuisMendo新しい説明をご覧ください。
DJMcMayhem




3

Brain-Flak、82バイト

「読みやすさ」のために空白が追加されました

(())

{
    {}

    ((({})[[]]))

    ([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

}{}{}{}

([]<>)

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



1
読み取り不可能な2つの言語、WhitespaceとBrain-Flakを組み合わせることを「読み取り可能」と見なすことができると誰が思ったでしょう!
コイナーリンガーアーイング


3

R、28バイト

function(n)rep(1:n,1:n+1)[n]

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

1繰り返し2時間、2繰り返し3時間、...、n繰り返しn+1時間のベクトルを作成し、nth要素を取ります。これ1:nは、大きすぎるか、n*(n+1)/2 - 1要素を含む繰り返しリストが大きすぎるためにエラーを記憶します。

R、29バイト

function(n)((8*n+1)^.5-1)%/%2

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

alephalphaのanswerにある式を使用して、値を直接計算します。これは、おそらく数値の精度を除き、問題なく実行されるはずです。

R、30バイト

function(n)sum(cumsum(1:n)<=n)

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

以下の三角数をカウントしnます。これは1:n、十分な大きさの場合(たとえば、1e9throwsの場合)にメモリエラーになる可能性がありますError: cannot allocate vector of size 3.7 Gb




2

これは常に正しいですか?floor((sqrt(8x+4)-1)/2)(あなたの式)とfloor((sqrt(8x+1)-1)/2)(正しい式)がすべてのに対して同じ結果を与えるかどうかはわかりませんx
ETHproductions

@ETHproductions私はブラフして「はい」と言うことができますが、より正直な答えは、あなたがあなた自身の仮説を立てて、それが同じ式を反映するかどうか/なぜそれを理解することを試みるべきだと思います。私は自分でこのアプローチを思いつきませんでした(別のサイトから学びました)が、少し試してみました。これは非常に興味深いアプローチであり、私はそんなに早くカエルを解剖したくありません。
面体

うーん。私はそれを直接証明する方法がわからないが、1億未満の失敗を見つけないブルートフォーサーを書いた。
-ETHproductions

2

Japt、8バイト

閉じた数式ソリューション。

*8Ä ¬É z

それを試してみてください


説明

8倍し、1を加算します(Ĭ 1(É)を加算し、平方根()を取得し、1()を減算し、結果を2(z)で除算します。


代替、8バイト

DJMcMayhemのJellyソリューションのポート

õ å+ è§U

それを試してみてください

õ1から入力までの整数の配列()を生成し、å加算(+)によって累積的に削減()し、入力()è以下の要素をカウント()します。§U



2

Brain-Flak70 56 48バイト

{([(({}[({}())()])[()])]<>){<>({}())}{}<>{}}<>{}

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

説明

この主な部分は、私が書いた次のスニペットです。

([(({})[()])]<>){<>({}())}{}<>{}

TOSが正の場合、これは何もせず、そうでない場合はスタックを切り替えます。これは、あるスーパースタック汚れが、それは動作します。現在、プログラムの主要部分は、入力が非正になるまで、入力からますます大きな数を引きます。入力からアキュムレータより1を引くたびに、1でアキュムレータを開始します。

({}[({}())()])

上記のスニペットの中に入れます

([(({}[({}())()])[()])]<>){<>({}())}{}<>{}

これはループに入れられ、スタックを切り替えるまで実行されます。ループが終了したら、スタックを切り替えてジャンクを削除してアキュムレータを取得します。



2

Pyth、7バイト

lh{I#./

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

I重複排除に対してnvariantである整数パーティションをフィルターキープし、headを取得して取得しますlます。

有効性証明

それほど厳密でも言葉遣いもない。

ましょAを= 1個の + 2 + ... + N及びB = B 1 + B 2 + ... + Bのmは同じ整数の二つの別個の区画であるNA最長の一意のパーティションであると仮定します。Bを重複排除した後、つまり、同じ整数の複数のオカレンスをそのうちの1つだけに置き換えた後、Bの合計がNより小さいことがわかります。しかし、関数の結果が(厳密にではなく)増加していることもわかっているため、最長の一意のパーティション A 他のパーティションの一意のアイテムの数と少なくとも同じ量の要素が常にあります。


2

三角度、49バイト

....)....
...2)2...
..)1/)8..
.)1/)IE/.
@^)1_+/i.

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

使い方

三角法では、コードがドットの三角形分布を持つ必要があります。つまり、各行の長さは、行数に2を掛けて減らし、等しくする必要があり、各行には(両側に)プログラム内の位置と同じ数のドットが必要です(一番下の行は行0、上の行は行1などです)。コマンドは2、3だけで、「Wiki /コマンド」ページにリストされている文字以外の文字はノーオペレーションとして扱われます(全体の形状が異なる限り、余分なドットがプログラムに影響を与えることはありませんプログラムの長方形のままです)。

引数が2つのコマンドの場合、説明全体でabを使用していることに注意してください。それを念頭に置いて、パディングを構成する余分な文字をすべて削除した後、実際のプログラムが何をするのか見てみましょう:

)2)2)1/)8)1/)IE/@^)1_+/i | Input from STDIN and output to STDOUT.

)                        | Push a 0 onto the stack. Must precede integer literals.
 2                       | Push ToS * 10 + 2 (the literal 2, basically).
  )2                     | Again, push a 2 onto the stack. This can be replaced by D
                         | (duplicate), but then the padding would discard the saving.
    )1                   | Literal 1.
      /                  | Division. Push b / a (1 / 2).
       )8)1              | The literal 8 and the literal 1 (lots of these!).
           /             | Division. Push b / a (1 / 8).
            )IE          | Get the 0th input from STDIN and evaluate it.
               /         | Divide it by 1 / 8 (multiply by 8, but there isn't any
                         | operand for multiplication, and I'm not willing to add one).
                @        | Add 1 to the result.
                 ^       | Exponentiation. Here, it serves as a square too.
                  )1_+   | Decrement (add literal -1).
                      /  | Divide (by 2).
                       i | Cast to an integer.

代替ソリューション、およびパディングが必要ない場合はより短い:

....)....
...2)1...
../DD)I..
.E/)4)1/.
+^s_+i...

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


2

PowerShell 3.0、45バイト

[math]::Sqrt(2*$args[0]+.25)-.5-replace'\..*'

数学の呼び出しは傷つき、PSの銀行家の丸めは実際の悪魔です(したがって、バイトを保存するために正規表現を切り捨てる必要があります)が、これはかなり大丈夫のようです。



1

ゼリー、7バイト

ŒPfŒṗṪL

おおよそO(2 n時間で実行されます。

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

使い方

ŒPfŒṗṪL  Main link. Argument: n

ŒP       Powerset; yield all subarrays of [1, ..., n], sorted by length.
   Œṗ    Yield all integer partitions of n.
  f      Filter; keep subarrays that are partitions.
     Ṫ   Tail; extract the last result.
      L  Compute its length.

1

JavaScript(ES7)、22 19バイト

n=>(8*n+1)**.5-1>>1

ETHproductionsに感謝します。


それを試してみてください

o.innerText=(f=
n=>(8*n+1)**.5-1>>1
)(i.value=1000000000);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


説明

入力に8を掛けて1を足し、0.5のべき乗で平方根を求め、1を引いて結果を1だけビットシフトします。


説明を含めることができますか?私はしばらくJavaScriptをやっていません
-FantaC

n=>(8*n+1)**.5-1>>13バイトを節約する方法 (テストしていない)
-ETHproductions

私はこれをJSでアウトゴルフしました:codegolf.stackexchange.com/a/152558/21830
Unihedron

@ETHproductions-そのように見える、ありがとう。
シャギー

@tfbninja、私はかなり自明だと思っていたが、説明が追加された。
シャギー

1

Python 2 / 3、32バイト

閉形式のPython実装

lambda n:int((sqrt(1+8*n)-1)//2)

整数の除算は//2ゼロに向かって丸めfloor( )られるため、必要ありません


1
PPCGへようこそ!これは動作する必要がありfrom math import sqrtますか?その場合は、バイトカウントに含める必要があります。(その場合lambda n:int((math.sqrt(1+8*n)-1)//2) import math は少し短くなります。
Steadybox


はい、インポートが機能する必要があるため、バイトカウントに含める必要があります。
mbomb007

1

Haskell、28バイト

ちょっと退屈ですが、他のHaskellソリューションよりもかなり短く、とてもポイントフリーな表現です。残念ながら、型システムが邪魔をしない限り短くすることはできませんでした:

g x=floor$sqrt(2*x+0.25)-0.5

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

ポイントフリー、33バイト

ceiling.(-0.5+).sqrt.(0.25+).(2*)

または、33バイト

ポイントフリーバージョンと同じ長さですが、もっと面白いです。

g n=sum[1|x<-scanl1(+)[1..n],n>x]

いくつかの愚かな間違いを修正することで、なんとか式を結び付けました
完全に人間の

@totallyhuman:いいですね、今はあなたの方もずっといいです:)
1

1

天の川、12バイト

'8*1+g1-2/v!

説明

code         explanation       value

'            push input        n          
 8*          push 8, multiply  8n
   1+        add 1             8n+1
     g       square root       sqrt(8n+1)
      1-     subtract 1        sqrt(8n+1)-1
        2/   divide by 2       (sqrt(8n+1)-1)/2
          v  floor             floor((sqrt(8n+1)-1)/2)
           ! output

1

Pyt7 5 バイト

Đř△>Ʃ

説明:

                      Implicit input
Đř△                   Gets a list of the first N triangle numbers
   >                  Is N greater than each element in the list? (returns an array of True/False)
    Ʃ                 Sums the list (autoconverts booleans to ints)



より速く、しかしより長い方法

Pyt11 9 バイト

Đ2*√⌈ř△>Ʃ

説明:

Đ2*√⌈ř△           Gets a list of triangle numbers up to the ceiling(sqrt(2*N))-th
       >          Is N greater than each element of the list? (returns an array of True/False)
        Ʃ         Sums the array



代替方法- シャギーの答えのポート

Pyt8 7 バイト

8*⁺√⁻2÷


1

空白、111バイト

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_integer_from_STDIN][T T   T   _Retrieve_input][S S S T    S S S N
_Push_8][T  S S N
_Multiply][S S S T  N
_Push_1][T  S S S _Add][S S T   T   N
_Push_n=-1][N
S S N
_Create_Label_SQRT_LOOP][S S S T    N
_Push_1][T  S S S _Add][S N
S _Duplicate_n][S N
S _Duplicate_n][T   S S N
Multiply][S T   S S T   S N
_Copy_0-based_2nd_(the_input)][S S S T  N
_Push_1][T  S S S _Add][T   S S T   _Subtract][N
T   T   N
_If_negative_jump_to_Label_SQRT_LOOP][S S S T   S N
_Push_2][T  S S T   _Subtract][S S S T  S N
_Push_2][T  S T S _Integer_divide][T    N
S T _Print_integer]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

オンラインで試す(未加工のスペース、タブ、改行のみ)。

擬似コードの説明:

次の式を使用します。

fn=8n+112

注:空白には平方根が組み込まれていないため、これを手動で行う必要があります。

Integer i = read STDIN as integer
i = i * 8 + 1
Integer n = -1
Start SQRT_LOOP:
  n = n + 1
  If(n*n < i+1):
    Go to next iteration of SQRT_LOOP
n = (n - 2) integer-divided by 2
Print n as integer to STDOUT


0

Oasis、14バイト

n8*1+1tm1%_b+0

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

どうやって?

n8*1+           8n + 1
     1tm        sqrt
        1%_     integer?
           b+   add f(n-1)

             0  f(0) is 0

これは、入力0の0から始まる三角インデックスに遭遇したときに結果をインクリメントする再帰的なソリューションです。



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