合計がその数に等しい値を可能な限り等しい値のリストに分配します


15

おそらく単純なコードゴルフの挑戦。2つの正の整数mとが与えられた場合、合計が数値に等しい正の整数である値のnリストを作成しnますm。出力のすべての値が同じ値であるか、差が正確に1のいずれかです。

例えば

  • m=6n=3なるだろう2, 2, 2
  • m=7そして、n=3なる2, 2, 3か、2, 3, 2または 3, 2, 2
  • m=7そして、n=2なります3, 44, 3
  • m=7n=1なるだろう7
  • m=7そしてn=88つの正の整数の合計は7ことができないため、エラーが生成されます。
  • m=10そして、n=4なる3, 3, 2, 2か、他の順列

ルール

  • 入力と出力はどちらも正の整数のみです。
  • 出力のすべての値が同じ値であるか、差が正確に1のいずれかです。
  • リスト内の値の順序は重要ではありません。
  • リスト内の値の合計はに等しくなりmます。
  • 解決できない場合は、エラーまたは偽の値を生成します(たとえば、m = 7およびn = 8の場合)。
  • 他のルールの結果m=8n=3の順列のいずれかを生成する3, 3, 2(しません2, 2, 4

勝者

これはコードゴルフであるため、バイト単位で測定された最短の有効な答えが勝ちです。


私はゼロが正ではないと仮定していますか?
TheLethalCoder


1
@aras私は数学者ではありませんが、私が読んだことから通常は文脈に依存します。署名なし、肯定的と否定的、肯定的などと言う人もいます
。– TheLethalCoder

1
一方、@ TheLethalCoderは、java(および一般的な浮動小数点)では、float a = -0f, b = 0f; System.out.println(a == b); System.out.println(a + "," + b);...とを生成true-0.0,0.0ます。正の0と負の0は明らかに2つの異なる数字です...実装はそう言っています!
ソクラティックフェニックス

回答:


2

ガイア、4 バイト

…÷l¦

これにはほとんど組み込みのものがあります...

説明

…     Get the range [0 .. m-1].
 ÷    Split into n roughly even length chunks. Throws an error if the number of chunks if 
       more than the list's length.
  l¦  Get the length of each chunk.

05AB1Eでも4バイトのソリューションがあると思いました。なくなったので、判断しやすくなりました。おめでとうございます!
クリスチャンウェスターベーク


5

Mathematica、33バイト

#>#2&&Last@IntegerPartitions@##1&

入力

[63、11]

出力

{6、6、6、6、6、6、6、6、6、5、5、5}

解けない場合にFalseを出力します


5

MATL、7バイト

:gie!Xs

解決策がない場合、出力は少なくとも1つのゼロを含む配列になります。これはMATLでは偽です。

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

説明

入力m = 10とを検討してくださいn = 4

:      % Implicitly input m. Push [1 2 ... m]
       % STACK: [1 2 3 4 5 6 7 8 9 10]
g      % Logical: convert nonzeros to 1
       % STACK: [1 1 1 1 1 1 1 1 1 1]
i      % Input n
       % STACK: [1 1 1 1 1 1 1 1 1 1], 4
e      % Reshape into matrix with n rows, padding with zeros
       % STACK: [1 1 1;
                 1 1 1;
                 1 1 0;
                 1 1 0]
!      % Transpose
       % STACK: [1 1 1 1;
                 1 1 1 1;
                 1 1 0 0]
Xs     % Sum of each column. Implicitly display
       % STACK: [3 3 2 2]


4

チャコール、NDD 1を適用した後の15バイト

¿÷NNIEIη÷⁺IθιIη

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

解決策がない場合は何も出力しません。詳細バージョンへのリンク。

1 NDD =ニール駆動型開発。

私の前の答え:

32 27 24 20バイト

NμNν¿÷μνIEν⁺÷μν‹ι﹪μν

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

解決策がない場合は何も出力しません。詳細バージョンへのリンク。

もちろん、ニールの助けがなければ、ゴルフをすることはできませんでした。


Cast何らかの理由で演算子を削除しても機能しますが、これは理想的なアルゴリズムではありません... 16バイトのソリューションがあります。
ニール

@Neilチャレンジが受け入れられました!
チャーリー

事前定義された変数がCast好きですが、11バイトまでのリストで機能することが
ニール

@Neilそして、私はまだ使用できませんMap、地球上でどのように機能しますか?
チャーリー

Mapfor、同じループ変数の使用に至るまでの式バージョンのようなものです。したがって、あなたの例では、毎回式をリストにプッシュするのではなく、Mapそれらを自動的に収集し、結果のリストに評価します。
ニール

3

R、33バイト

function(m,n)diff(trunc(0:n*m/n))

ルイスメンドーのオクターブ回答のポート。これが以前の回答よりもほぼ50%短いことは非常に悲しいことです。

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

前の回答、63バイト:

function(m,n,o=rep(m%/%n,n),d=m-sum(o))o+c(rep(0,n-d),rep(1,d))

2つの(必須の)引数mn、およびゴルフを目的とする2つのオプションの引数を取る匿名関数。ベクトルを昇順で返します。失敗した場合、最初の値は0。これはRで偽です。これはif、ベクトルの最初の値のみを使用するためです(警告付き)。

これは、基本的に次の関数と同等です。

function(m,n){o=rep(m%/%n,n)
d=m-sum(o)
o+c(rep(0,n-d),rep(1,d))}

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


pryr::f(diff(trunc(0:n*m/n)))動作し、短くなっています!
JAD

2

ゼリー 7 6バイト

:ȧœsL€

オンラインでお試しください!偽の場合は何も出力しません。

使い方

:ȧœsL€    Main link. Arguments: m (integer), n (integer)
:         Integer division. Yields 0 if m < n; a positive integer otherwise.
 ȧ        Logical AND. Yields 0 if m < n; m otherwise.
  œs      Split into n roughly equal groups. Since the left argument is an integer,
          this implicitly converts it to [1..m] (or [] for 0) before splitting.
    L€    Length of €ach. If the inputs were 7 and 3, the previous result would be
          [[1,2,3],[4,5],[6,7]], so this would give [3,2,2].

2

TI-Basic、23バイト

:Prompt M,N
:N(M≥N
:int(Ans⁻¹randIntNoRep(M,M+N-1

エラー時にERR:DIVIDE BY 0を返します


2

オクターブ、24バイト

@(m,n)diff(fix(0:m/n:m))

コードは匿名関数を定義します。出力は数値配列(行ベクトル)です。この配列が存在しない場合、少なくとも1つのゼロが含まれます。これは偽です Octaveです。

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

説明

0:m/n:mstepでn+1から0までの値の配列を生成します。各エントリを次の方向に丸めますmm/nfix0て、diff連続する差異計算します。

例として、ここのためのすべての中間結果はm = 7n = 3

>> 0:m/n:m
ans =
         0    2.3333    4.6667    7.0000

>> fix(0:m/n:m)
ans =
     0     2     4     7

>> diff(fix(0:m/n:m))
ans =
     2     2     3

ゼロを含む配列は偽です。それはストレッチのように思えますが、私もオクターブを知りません。Javascriptとその強制から来る、私はなぜ地獄ではないのかと言うでしょう。私から+1。
クリスティアン・ウェスターベーク

@ChristiaanWesterbeekありがとう!他の言語を使用している場合は奇妙に聞こえます、MATLAB / Octaveの場合はそうです
ルイスメンドー

2

Haskell93 89 88 87 86 71バイト

m!n|n<=m=e$m:(0<$[2..n])
e(a:b:x)|b<a=e$a-1:e(b+1:x)
e(a:x)=a:e x
e x=x

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

説明

ここでの主な機能はeです。 eリストを取得し、基本的に左から右にローリングピンを実行します。リストには右隣の要素より大きい要素がありますが、その要素を右に移動します。

今やらなければならないのは、この関数に十分に偏ったリストを与え、魔法をかけることです。選択するリストの直後mn-1ゼロが続きます。それは作るのが簡単だからです。

最後に行う必要があるのは、エラーが処理されたことを確認することです。このため、Non-exhaustive patterns in functionエラーが発生する限りエラーをスローしますm>n


error[]代わりに、網羅的でないパターンで失敗することで、あなたは取り除くことができると思いますm!n|m>n=e$m:replicate(n-1)0
ライコニ

(0<$[1..n-1])より短いですreplicate(n-1)0
ライコニ

2

C#(.NET Core)86 82 71バイト

using System.Linq;a=>b=>new int[b].Select((x,i)=>(i<a%b?1:0/(a/b))+a/b)

無効な入力に対してエラーをスローします。

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

-4バイトのおかげで TheLethalCoderの

OlivierGrégoireのおかげで-11バイト


1
これは現時点ではコードスニペットです。匿名関数またはa=>b=>開始時にラップするだけです。
TheLethalCoder

@TheLethalCoderうーん、本当ですか?using System.Collections.Genericを返す場合、を追加する必要はありませんIEnumerable<int>か?
-LiefdeWen

あなたは配列を返しているので、私はとにかく間違っています(三項の最初の部分を誤解しています)。しかし、それがあなたのコードに表示さIEnumerable<int>れ、関数定義にあるように見える場合にのみ、を含める必要はありませんusing
TheLethalCoder

いいえ、.ToArray()を使用しないコードはまだコンパイルされているため、ヒントは引き続き有効です。
-LiefdeWen

1
@OlivierGrégoireあなたは正しい、ごめんなさい、ありがとう。
-LiefdeWen

2

Haskell、48バイト

m#n|m>=n=iterate(\(a:b)->b++[a+1])(0<$[1..n])!!m

nゼロのリストから始めます。繰り返すm回数:最初の要素を取得して追加し、リストの最後に配置します。

もしパターンマッチエラーで失敗しますn < m

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



1

バッチ、71バイト

@if %1 geq %2 for /l %%i in (1,1,%2)do @cmd/cset/an=(%1+%%i-1)/%2&echo(

cmd/cset/aは区切り文字を出力しないので、使用する必要がありますecho((印刷を避けますECHO is on.


1

PHP> = 7.1、62バイト

for([,$s,$n]=$argv;$n;)$s-=$r[]=$s/$n--^0;$r[0]?print_r($r):0;

PHPサンドボックスオンライン


Sandboxへのリンクをクリックし、[コードの実行]をクリックすると、解析エラーが発生しました。
クリスティアンウェスターベーク

@ChristiaanWesterbeekサンドボックスのデフォルトはPHP 7.0.3です。
ニール

1
OctaveやMATLなどの他の言語では、配列のゼロは偽と見なされますが、phpの場合はそうではないと思います。出力は、プログラムが記述されている言語の規則の範囲内で偽である必要があると思います。
Christiaan Westerbeek

1
@ChristiaanWesterbeek修正
ヨルクヒュルサーマン


1

Javascript(ES6)、57 56 53 41バイト

m=>n=>m>=n&&[...Array(n)].map(_=>m++/n|0)

回答には、値を作成するよりスマートな方法が含まれています。ありがとう@Neil

使用法

f=m=>n=>m>=n&&[...Array(n)].map(_=>m++/n|0)

f(6)(3) // [2, 2, 2]
f(7)(3) // [3, 2, 2]
f(7)(2) // [4, 3]
f(7)(1) // [7]
f(7)(8) // false
f(8)(3) // [3, 3, 2]

歴史

最初の鉱山

(m,n)=>m>=n&&Array(n).fill(~~(m/n)).map((v,i)=>v+(i<m%n))

(m,n)=>m>=n&&Array(n).fill().map((v,i)=>~~(m/n)+(i<m%n))

次に、@ Arnauldが提供するスプレッド演算子とカリー化構文を追加しました

m=>n=>m>=n&&[...Array(n)].map((v,i)=>~~(m/n)+(i<m%n))

1
_=>m++/n|0大量のバイトを節約します。
ニール



0

Pyth、13バイト

KE?>KQ0lMcK*d

オンラインでお試しください!0エラー時に出力します。

不正行為、6バイト

lMcE*d

オンラインでお試しください!配列0にエラーが含まれています。悲しいことに、これはPythでは偽りではありません。

説明

KE?>KQ0lMcK*dQ    # Implicit input Q for m
KE                # Store n in K
           *d     # Generate a string of length Q containing only spaces
         cK       # Chop this string in K pieces of equal sizes, initial piece longer if necessary
       lM         # For each string, compute the length. Here we already have our result. However if the array contain a zero, we must output a falsy value
  ?>KQ            # If K > Q...
      0           # Then display zero, otherwise display the array

0

CJam13 12バイト

{_2$>/,/z:,}

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

これは、入力を次のように取る匿名ブロックです n m、スタック上の。それは良い答えだっただろうが、エラー処理の要件はそれを完全に殺した。

解決できない場合のゼロ除算のエラー。

説明

{   e# Stack:                | 3 10
 _  e# Duplicate:            | 3 10 10
 2$ e# Copy from back:       | 3 10 10 3
 >  e# Greater than:         | 3 10 1 (true)
 /  e# Divide:               | 3 10
    e# This will cause an error on invalid input.
 ,  e# Range:                | 3 [0 1 2 3 4 5 6 7 8 9]
 /  e# Split on nth element: | [[0 1 2] [3 4 5] [6 7 8] [9]]
 z  e# Transpose array:      | [[0 3 4 9] [1 4 7] [2 5 8]]
 :, e# Length of each:       | [4 3 3]
}

エラー処理要件が解除された場合、これは7バイトに短縮でき、40%以上減少します。

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