合計は常に15です


36

入力として負でない整数の配列を受け取り、入力配列の要素を含むベクトル/配列のセットを順番に出力するプログラムまたは関数を作成します。各ベクトルが合計15になるように分割します。 N個の要素は「15をヒット」せず、15をパスした数を切り捨てる必要があり、残りは次のベクトルの最初の要素になります。これは、入力配列の最後に到達するまで続きます。最終ベクトルの合計が15未満の場合、合計を増やすために最後に数値を追加する必要があります。

例を見れば、ルールがより簡単に理解できると思います。

Input: 3 7 5 10
Output:
3 7 5           <- Sum is 15
10 5            <- 5 is added to make the sum 15

Input: 2 4 5 9 2 3 5 0 2 4 5 0 3
Output:
2 4 5 4          <- Sum 15. 9 is split in two. 
5 2 3 5          <- The first 5 is the remainder of 9
0 2 4 5 0 3 1    <- The last number is added to make the sum 15

Input: 1 1 1            
Output:
1 1 1 12         <- The number 12 is added to make the sum 15

Input: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Output:
1 2 3 4 5
6 7 2           <- 2 is the first part of 8
6 9             <- 6 is the remainder of 8
10 5            <- 5 is first part of 11
6 9             <- 6 is remainder of 11. 9 is first part of 12
3 12            <- 3 is remainder of 12. 12 is first part of 13
1 14            <- 1 is remainder of 13. 14 is 14
15
15              <- 15 is first part of 16
1 14            <- 1 is remainder of 16. 14 is first part of 17
3 12            <- 3 is remainder of 17. 12 is added to make the sum 15

Input: 20 20
Output:
15
5 10           <- 5 is remainder from the first 20
10 5           <- 10 is remainder from second 20. 5 is added to make the sum = 15.

入力と出力の両方の形式はオプションです。あなたの言語で最高のものは何でも。

バイト単位の最短コードが優先されます。


リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

## Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、スニペットに表示することもできます。

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


「出力形式はオプションです」。それは[[3, 7, 5], [10, 5]]、最初のテストケースの有効な出力になるということですか?
モーガンスラップ

@MorganThrapp、はい。それは有効です。
スティービーグリフィン

1
@FlagAsSpam、あなたが尋ねている例にもっと説明を加えました。
スティーヴィーグリフィン

3
良いテストケース:Input: 100 Output: 15; 15; 15; 15; 15; 15; 10 5
randomra

3
これは間違いなくFizzBu​​zzテスト交換する必要があります
CSᵠ

回答:


8

Pyth、37バイト

K15VQ=+ZNIgZK=-ZK-NZbIZZ)).?N;I>KZ-KZ

説明した

K15              Store 15 in K (the max) (K is Autoinitializing, no = needed here)
VQ              For N in the evaluated input
  =+ZN           Set Z(Which in pyth defaults to 0) to Z+N
  IgZK           If Z(row total) is greater than or equal to K (row max)
    =-ZK         Set Z to Z-K (How much the max was exceeded)
    -NZ          Implicitly print N-Z
    b            Implicitly print b (in pyth defaults to a newline)
    IZ         If Z > 0 (There was excess to carry to the next row)
      Z          Implicitly print Z (the excess)
  .?N            Else(the current row count is < the max(15)) output the current number
;                Use infinite )'s in place of )) (to save 1 character)
I>KZ             If K > Z (The max is greater than the current row count)
  -KZ           Implicitly print K-Z (The amount needed for the row to equal 15)

これは私の最初の目標だったので、改善を提案してください。

例:

入力

[1, 3, 4, 5, 9, 8]

出力

1
3
4
5
2


7
8

注:数バイトのサイズ削減のアドバイスと、最初にpythを作成してくれたIsaacgに感謝します!下の彼のコメントに賛成してください:)


2
それ以外の場合、最近では.?なくに変更されましたがE、ドキュメントを更新するのを忘れていました。ごめんなさい
isaacg

@isaacgありがとう、isaacg!これで動作するはずです。elseは2文字なので、1バイトしか節約できませんが。
csga5000

1
私たちが話すようにそれを修正します。
isaacg

3
他のいくつかの提案:=Z+ZN=+ZN同じです。Pythonに似てい+=ます。Likewiese、=Z-ZK-> =-ZK。また、)最後に必要はありません-それは自動的に入力されます。最後に、FNQそしてVQ同じです。
isaacg

1
あなたは交換することにより、他の2バイトを保存することができI>Z0IZ- Z場合は、実際にはチェックしているので、負にすることはできませんZゼロではなく、他のすべての数字がtruthyている間、ゼロは、falsyです。
isaacg

16

ジャワ- 229 200 192 181 172 170 168バイト

勝利のためではなく、楽しみのために、すでに始まっていました:)
どんな提案でも歓迎です。

@ThomasKwaのおかげで8バイト保存@corsiKaのおかげで
20バイト
保存@Ypnypnの
おかげで2バイト保存@ user902383のおかげで2バイト保存

String p(int[]a){int c=0,j;String s="";f:for(int i:a){for(j=i;j-->0;)if(++c>14){s+=(i-j)+"\n";c=0;if(j<15){if(j>0)s+=j+" ";c+=j;continue f;}}s+=i+" ";}return s+(15-c);}

170バイト

String p(int[]a){int c=0,j;String s="";f:for(int i:a){for(j=i;j-->0;){if(++c>14){s+=(i-j)+"\n";c=0;if(j<15){if(j>0)s+=j+" ";c+=j;continue f;}}}s+=i+" ";}return s+(15-c);}

172バイト

String p(int[]a){int c=0,j;String s="";f:for(int i:a){for(j=i;j>0;){j--;if(++c>14){s+=(i-j)+"\n";c=0;if(j<15){if(j>0)s+=j+" ";c+=j;continue f;}}}s+=i+" ";}return s+(15-c);}

181バイト

void p(int[]a){int c=0,j;String s="";f:for(int i:a){for(j=i;j>0;){j--;if(++c>14){s+=(i-j)+"\n";c=0;if(j<15){if(j>0)s+=j+" ";c+=j;continue f;}}}s+=i+" ";}System.out.print(s+(15-c));}

192バイト

void p(int[]a){int c=0,j;String s="";f:for(int i:a){for(j=i;j>0;){j--;c++;if(c==15){s+=(i-j)+"\n";c=0;if(j>=15)continue;if(j>0)s+=j+" ";c+=j;continue f;}}s+=i+" ";}System.out.print(s+(15-c));}

200バイト

void p(int[]a){int c=0,j;String s="";f:for(int i:a){j=i;while(j>0){j--;c++;if(c==15){s+=(i-j)+"\n";c=0;if(j>=15)continue;else{if(j!=0)s+=j+" ";c+=j;continue f;}}}s+=i+" ";}System.out.print(s+(15-c));}

229バイト

void p(int[]a){int c=0,j;f:for(int i:a){j=i;while(j>0){j--;c++;if(c==15){System.out.print(i-j+"\n");c=0;if(j>=15){continue;}else{if(j!=0)System.out.print(j+" ");c+=j;continue f;}}}System.out.print(i+" ");}System.out.print(15-c);}

String p(int[] a) {
    int c = 0, j;
    String s = "";
    f: for (int i: a) {
        for (j = i; j-- > 0;)
            if (++c > 14) {
                s += (i - j) + "\n";
                c = 0;
                if (j < 15) {
                    if (j > 0) s += j + " ";
                    c += j;
                    continue f;
                }
            }
        s += i + " ";
    }
    return s + (15 - c);
}

1
うわー、今までJavaプログラムで実際に使用され続けているのを見たことはありませんでした。
魔法のタコUr

7

Python 3-1̶7̶7̶1̶3̶8̶1̶6̶6̶1̶3̶3̶113

s=0
i=15
p=print
for e in eval(input()):
 if s>=i:p()
 s=s%i+e
 if s>i:s-=i;p(e-s);p();e=s
 p(e)
if s!=i:p(i-s%i)

@pokeのおかげで真にゴルフ5を編集 *改行などを削除

4エイリアス印刷を編集し、バイトを保存するために=を-=に置き換えました。@pokeと@elzellに感謝します。また、入力evalをforループに移動して、割り当てから2バイトを節約しました

編集3秒以内に異なるオブジェクト指向で見つかった節約

編集2修正されたバグ

編集1入力を「[1,2,3,4,5 ...]」の形式に変更し、最初の2つのコメントを実装しました。@ Morgan Thrappに大きな感謝

初めてのポスターはこちら。入力はスペースで区切られたエントリを含むコマンドラインで、出力はグループ化の間に改行がある行ごとのエントリです。


3
変数に15を割り当て、インデントに1つのスペースのみを使用することで、122まで下げることができます。
モーガンスラップ

また、2番目のテストケースに失敗すると、2 3 5になりますが、5 2 3 5になります。
MorganThrapp

1
あなたはあなたのコードの私のPythバージョンに興味がある可能性があり@AdamMartin
csga5000

1
print頻繁に使用するため、変数として保存する必要がありますp=print。さらに14文字節約できます。
突く

2
現在のカウントは132ですが、改行の一部を削除すると、113まで減らすことができます。たとえばif s>i:s-=i;p(e-s);p();e=s、2番目の行のように、すべてのifを単一の行に結合できます。これにより、改行とインデント文字が節約されます。
ポーク

7

ハスケル、126の 107 102 100バイト

[]#c=[]
(h:t)#c|s<0=t#u|s<1=u:t#[]|1<2=(c++[h-s]):(s:t)#[]where s=sum c+h-15;u=c++[h]
(#[]).(++[14])

使用例:(#[]).(++[14]) $ [1..17]->[[1,2,3,4,5],[6,7,2],[6,9],[10,5],[6,9],[3,12],[1,14],[15],[15],[1,14],[3,12]]

編集:@Stewie Griffinは19バイトの節約に役立ちました。ありがとう!



4

RegExを搭載したPython2158 155バイト

愛とほとんど数学なしでパイソンで作られました。
または、必要に応じて正規表現数学、単項数学。
最後の要件を「修正」するためだけに使用される「実際の」数学:

最終ベクトルの合計が15未満の場合、合計を増やすために最後に数値を追加する必要があります。

Codegolfed:

import re
def f(i):o=[map(len,p.split())for p in re.findall('((?:x *){15}|.+)',' '.join(['x'*c for c in i]))];l=sum(o[-1]);o[-1]+=([],[15-l])[l<15];print o

これが機能する方法は、各数値Nを長さNの文字列(文字列を埋める文字としてxを選択)に変換し、それらをすべてスペースで区切って結合することstringです。結果の文字列は、RegEx BLACK MAGICを介して次のように分割されます。

['x xx xxx xxxx xxxxx ', 'xxxxxx xxxxxxx xx', 'xxxxxx xxxxxxxxx', 'x']

次のような入力の場合:f([1, 2, 3, 4, 5, 6, 7, 8, 10])
それは再び分割され、連続したxes の長さが番号を再度作成するために使用され、すべてがリスト内包でうまくまとめられます。

ゴルフをしていない:

import re
o = [map(len, p.split()) for p in re.findall('((?:x *){15}|.+)', ' '.join(['x'*c for c in i]))]
l = sum(o[-1])
o[-1] += ([], [15-l])[l<15]
print o

出力:

>>> f([30, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16])
[[15], [15], [1, 2, 3, 4, 5], [6, 7, 2], [6, 9], [15], [1, 14]]

注:0には十分な魔法がなかったため、このエントリは失格となります

ゼロを含める必要があります。2番目の例を参照してください


これらの関数名はすべてかなり高価です。コードゴルフでは正規表現のようなものを使用することはほとんど不可能です。それでも、あなたのバイトサイズは考慮悪いことではありません
csga5000

4

真剣に、88バイト

,`'!*'0`M' j0╗`;;;'|ε35*('!=╜+;╗%(' =|('0=|I)`Mεj'|@s`ôl`╝`ö'0@s╛M`Md;Σ35*-;`X``@q`Iƒ@q.

オンラインで試す

それは私の最初の真剣な答えです!今、私はすべての言語の欠点に精通しています!

六角ダンプ:

2c6027212a2730604d27206a30bb603b3b3b277cee33352a2827213dbd2b3bbb252827203d7c2827303d7c49
29604dee6a277c407360936c60bc609427304073be4d604d643be433352a2d3b60586060407160499f40712e

説明:

,`'!*'0`M' j         Replace all the numbers by "0"+"!"*n, separated by " "
0╗                   Initialize an accumulator in register 0
` ... `M             Map the string with the following function:
   ;;;'|ε                Put three extra copies of the character, a pipe, an empty string
   35*                   and a 15 on the stack.
   ('!=                  Move one copy of the character to the top and push 1 if it's a !
   ╜+                    Load the accumulator, add the 1 or 0 from the preceding test
   ;╗                    Make a copy, and save it back to register 0
   %                     Modulo the sum by 15
   (' =|                 Or the result with whether the dug-up character is " "
   ('0=|                 Or the result with whether the dug-up character is "0"
   I                     If we're at " " or "0" or the current sum is not divisible by 15,
                         push empty string, else push "|"
   )                     Bury the new character under the original character.
εj                   Join the list that resulted from the map into a single string.
'|@s                 Resplit the string on occurrences of "|" (after every 15 "!"s)
`ôl`╝                Store a function in register 1 which trims whitespace
                     and returns the length of the remaining string
` ... `M             Map the list with the following function:
   ö                     Trim leading spaces.
   '0@s                  Split the string on occurrence of "0"
   ╛M                    Map the resulting list with the function stored in register 1
d;                   Push the last sublist from the resulting list and make a copy.
Σ                    Find the sum of the list.
35*-                 Subtract it from 15
;`X``@q`Iƒ           Duplicate it, drop it if it's zero, put it in the list otherwise.
@q.                  Put the list back in the big list and print it.

Unicodeコードポイントが使用されている場合、それらの文字はそれぞれ2バイトとしてカウントされますか?:P
ダン・

描かれているソースでユニコードを使用しているので、意図したとおりに読むことができます。そうしないと、印刷できないものでいっぱいのランダムなゴミのように見えます。公式ソースは16進ダンプです。
キントピア

それはユーモラスな質問であることを意味しました
ダン

1
他の読者が疑問に思うかもしれない合理的な質問でもあったので、私はユーモラスに答えました。
キントピア

@quintopia +1新しいゴルフ言語を試してみてください!新しい言語は楽しいです;)私もこの質問で初めてpythを試しました。
csga5000

3

Javascript、138 128バイト

i=>eval("for(o=z=n='',m=15,t=q=0;q<i.length;q++)(t+=c=+i[q])>=m?(t-=m,z+=c-t,o+=z+`\n`,z=t>0?t+' ':n):z+=c+' ';t<m?o+z+(m-t):o")

空白あり:

i => eval("
  for(o=z=n='', m=15, t=q=0; q < i.length; q++)
    (t+=c=+i[q])>=m
      ?(
        t-=m,
        z+=c-t,
        o+=z+`\n`,
        z=t>0?t+' ':n)
      :
        z+=c+' '
    ;
  t<m ? o+z+(m-t) : o
")

例:

関数を変数に割り当てる

sumFifteen=i=>eval("for(o=z=n='',m=15,t=q=0;q<i.length;q++)(t+=c=+i[q])>=m?(t-=m,z+=c-t,o+=z+`\n`,z=t>0?t+' ':n):z+=c+' ';t<m?o+z+(m-t):o")

次に、次のように評価します。

console.log(sumFifteen([1,4,11,4,5]))

1 4 10
1 4 5 5

改訂履歴:

12/3/2015 00:02-10バイト改善されたuser81655(コメントで彼を+1)に感謝

12/2/2015 21:44-機能的なスタイルを順番に使用してサイズを縮小するように切り替えました。


3
:あなたはこれらを使用してこの改善できるf=サイトの規則に従って必要とされていない、からかっこを削除(i)してサラウンド、evalあなたが必要としませんので、returnまたはブラケットと交換するifように三元にo返され、変更'\n'`\n`、マージt+=...t>=mするために削除するにループブラケット。ここでは、すべてのこれらの改善と127のバイト単位でのソリューションがあります:i=>eval("for(o=z=n='',m=15,t=q=0;q<i.length;q++)(t+=c=+i[q])>=m?(t-=m,z+=c-t,o+=z+`\n`,z=t>0?t+' ':n):z+=c+' ';t<m?o+z+(m-t):o")
user81655は

@ user81655これらの変更のいくつかを実装します!私があなたのものを試すと、SytaxError:Unexpected token ILLEGAL(...)を受け取ります。関数をテストするために、f =
csga5000

1
SOはo+、行の最後にいくつかの記号を追加します。削除o+=zして再度書き込みます。動作します。:P
user81655

@ user81655私はどのように表示されていない\n任意の違いは
csga5000

1
あなたは`\n`?が原因でコードが内部に"..."あるため、それなしでは機能しませんeval
user81655

2

Python 3:139バイト

他の答えとは少し異なるアプローチ。最初にそれが要件であると仮定したため、質問から実際の出力を生成します。

def f(l):
 m=15;r,s=sum(l)%m,0
 if r:l+=[m-r]
 while l:
  x=l.pop(0)
  if s+x>m:y=m-s;l[0:0]=[x-y];x=y
  s+=x;print(x,end=' \n'[s==m]);s%=m

使用例:

>>> f([2, 4, 5, 9, 2, 3, 5, 0, 2, 4, 5, 0, 3])
2 4 5 4
5 2 3 5
0 2 4 5 0 3 1

2

Perl、86バイト

#!perl -p
s|\d+( ?)|($i+=$&)<15?$&:($a=$&-($i%=15)).$/.($&>$a&&$&-$a.$1)|ge;$\=$".(15-$i)if$i

シバングを3としてカウントすると、入力はstdinから取得され、スペースで区切られます。


サンプルの使用法

$ echo -n 2 4 5 9 2 3 5 0 2 4 5 0 3 | perl sum15.pl
2 4 5 4
5 2 3 5
0 2 4 5 0 3 1

2

R、155バイト

n=scan();while(S<-sum(n)){C=cumsum(n);if(S>14){w=which(C>14)[1];N=n[1:w];n=n[-(1:w)];r=C[w]-15;N[w]=N[w]-r;if(r)n=c(r,n);cat(N,"\n")}else{cat(n,15-S);n=0}}

インデントと改行あり:

n=scan()
while(S<-sum(n)){
     C=cumsum(n)
     if(S>14){
         w=which(C>14)[1]
         N=n[1:w]
         n=n[-(1:w)]
         r=C[w]-15
         N[w]=N[w]-r
         if(r) n=c(r,n)
         cat(N,"\n")
         }else{
            cat(n,15-S)
             n=0
             }
      }

使用法:

> n=scan();while(S<-sum(n)){C=cumsum(n);if(S>14){w=which(C>14)[1];N=n[1:w];n=n[-(1:w)];r=C[w]-15;N[w]=N[w]-r;if(r)n=c(r,n);cat(N,"\n")}else{cat(n,15-S);n=0}}
1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18: 
Read 17 items
1 2 3 4 5 
6 7 2 
6 9 
10 5 
6 9 
3 12 
1 14 
15 
15 
1 14 
3 12
> n=scan();while(S<-sum(n)){C=cumsum(n);if(S>14){w=which(C>14)[1];N=n[1:w];n=n[-(1:w)];r=C[w]-15;N[w]=N[w]-r;if(r)n=c(r,n);cat(N,"\n")}else{cat(n,15-S);n=0}}
1: 20 20
3: 
Read 2 items
15 
5 10 
10 5
> n=scan();while(S<-sum(n)){C=cumsum(n);if(S>14){w=which(C>14)[1];N=n[1:w];n=n[-(1:w)];r=C[w]-15;N[w]=N[w]-r;if(r)n=c(r,n);cat(N,"\n")}else{cat(n,15-S);n=0}}
1: 10 5
3: 
Read 2 items
10 5 
> n=scan();while(S<-sum(n)){C=cumsum(n);if(S>14){w=which(C>14)[1];N=n[1:w];n=n[-(1:w)];r=C[w]-15;N[w]=N[w]-r;if(r)n=c(r,n);cat(N,"\n")}else{cat(n,15-S);n=0}}
1: 2 4 5 9 2 3 5 0 2 4 5 0 3
14: 
Read 13 items
2 4 5 4 
5 2 3 5 
0 2 4 5 0 3 1

2

Python 2、117バイト

i=input()
while i:
 s=15;r=[]
 while s>0:n=i.pop(0)if i else s;s-=n;r+=[n]if s>=0 else[n+s]
 if s<0:i=[-s]+i
 print r

リストとして入力を受け取ります。

>>[2,4,5,9,2,3,5,0,2,4,5,0,3]
[2, 4, 5, 4]
[5, 2, 3, 5]
[0, 2, 4, 5, 0, 3, 1]

1

Perl、76バイト

+3を含みます-p(通常は+1ですが、他のperlソリューションで公平にプレイするには+3)

STDINに入力して実行(入力上の最後の改行は任意であるが、しなければならない空の入力のために存在しなくても)

sum15.pl <<< "1 2 3"

sum15.pl

#!/usr/bin/perl -p
s/$/ 15/;s/\d+/1x$&/eg;s/( *1){15}\K ?/
/g;s/
1*
*$//;s/1+|\B/length$&/eg

まあ、計算は一切ありません...


絶対に遅刻しない 非常に良い解決策:)
ダダ

0このソリューションではsはかなり余分です(余分なスペースで表されます)。sの数を0正しく保つためにスペースを適切に処理するように非常に注意する必要があります。特に、のように部分和が正確に15である入力を考慮してください1 14 2 13。「?」なしで試してみて、何が起こるか見てみましょう
トンホスペル

はい、私はそれを試してみて、あなたが言うようないくつかの行の先頭に0が追加されているのを見ました(それが投稿後30秒でコメントを削除した理由です)。ありがとう
ダダ

0

Java- 158155バイト

yassin-hajajによるhttps://codegolf.stackexchange.com/a/65590/46866の Lambdaバージョン、有効な送信かどうかはわかりませんが、リンクされた回答にコメントを追加するのに十分な担当者がいません。http://meta.codegolf.stackexchange.com/questions/4944/byte-counter-snippetを使用してカウント

a->{int c=0,j;String s="";f:for(int i:a){for(j=i;j-->0;)if(++c>14){s+=(i-j)+"\n";c=0;if(j<15){if(j>0)s+=j+" ";c+=j;continue f;}}s+=i+" ";}return s+(15-c);}

158バイト

a->{int c=0,j;String s="";f:for(int i:a){for (j=i;j-->0;)if(++c>14){s+=(i-j)+ "\n";c=0;if(j<15){if(j>0)s+=j+" ";c+=j;continue f;}}s+=i+ " ";}return s+(15-c);}

非ゴルフ

a ->
    {
        int c=0, j;
        String s = "";
        f:
        for (int i : a) {
            for (j = i; j-- > 0; )
                if (++c > 14) {
                    s += (i - j) + "\n";
                    c = 0;
                    if (j < 15) {
                        if (j > 0) s += j + " ";
                        c += j;
                        continue f;
                    }
                }
            s += i + " ";
        }
        return s + (15 - c);
    }

のように使用できます

Function<int[], String> func =a->{int c=0,j;String s="";f:for(int i:a){for (j=i;j-->0;)if(++c>14){s+=(i-j)+ "\n";c=0;if(j<15){if(j>0)s+=j+" ";c+=j;continue f;}}s+=i+ " ";}return s+(15-c);};
System.out.println(func.apply(new int[]{2, 4, 5, 9, 2, 3, 5, 0, 2, 4, 5 ,0 ,3}));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.