Tổng luôn là 15


36

Viết chương trình hoặc hàm lấy một mảng các số nguyên không âm làm đầu vào và xuất ra một tập các vectơ / mảng với các phần tử của mảng đầu vào theo thứ tự, chia sao cho mỗi vectơ tổng hợp thành 15. Nếu tổng của đầu tiên N phần tử không "đánh 15", sau đó số bị vượt qua 15 phải bị cắt và phần còn lại sẽ là phần tử đầu tiên của vectơ tiếp theo. Điều này diễn ra cho đến khi bạn đạt đến cuối của mảng đầu vào. Nếu tổng của vectơ cuối cùng nhỏ hơn 15, thì một số phải được thêm vào cuối để làm cho tổng tăng lên.

Tôi nghĩ rằng các quy tắc dễ hiểu hơn bằng cách xem xét các ví dụ:

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.

Cả định dạng đầu vào và đầu ra là tùy chọn. Bất cứ điều gì là tốt nhất trong ngôn ngữ của bạn.

Mã ngắn nhất tính bằng byte thắng.


Bảng xếp hạng

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


'Định dạng đầu ra là tùy chọn'. Điều đó có nghĩa [[3, 7, 5], [10, 5]]là một đầu ra hợp lệ cho trường hợp thử nghiệm đầu tiên?
Morgan Thrapp

@MorganThrapp, vâng. Điều đó hợp lệ.
Stewie Griffin

1
@FlagAsSpam, tôi đã thêm nhiều giải thích trong ví dụ bạn đang hỏi về.
Stewie Griffin

3
Trường hợp kiểm tra tốt:Input: 100 Output: 15; 15; 15; 15; 15; 15; 10 5
Randomra

3
Điều này chắc chắn sẽ thay thế thử nghiệm FizzBuzz
CSᵠ

Câu trả lời:


8

Bình thường, 37 byte

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

Giải thích

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)

Đây là lần đầu tiên của tôi, vì vậy hãy đề nghị cải tiến.

Thí dụ:

Đầu vào

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

Đầu ra

1
3
4
5
2


7
8

Lưu ý: Rất cám ơn Isaacg về một vài byte lời khuyên giảm kích thước và tạo pyth ngay từ đầu! Hãy nêu lên ý kiến ​​của anh ấy bên dưới :)


2
Khác gần đây đã được thay đổi để .?thay thế E, nhưng tôi quên cập nhật các tài liệu. Xin lỗi vì điều đó.
isaacg

@isaacg Cảm ơn isaacg! Tôi nên làm việc đó ngay bây giờ. Mặc dù nó chỉ tiết kiệm được 1 byte vì hiện tại có 2 ký tự.
csga5000

1
Sửa chữa nó như chúng ta nói.
isaacg

3
Một vài gợi ý khác: =Z+ZN=+ZNgiống nhau. Nó hơi giống Python +=. Likewiese, =Z-ZK-> =-ZK. Ngoài ra, bạn không cần )đến cuối - nó được điền tự động. Cuối cùng, FNQVQgiống nhau.
isaacg

1
Bạn có thể lưu thêm 2 byte bằng cách thay thế I>Z0bằng IZ- Zkhông thể âm, vì vậy bạn thực sự chỉ cần kiểm tra nếu Zkhông phải là 0 và 0 là sai, trong khi tất cả các số khác là đúng.
isaacg

16

Java - 229 200 192 181 172 170 168 byte

Đã bắt đầu, không phải vì chiến thắng mà vì niềm vui :)
Mọi đề nghị đều được chào đón.

Đã lưu 8 byte nhờ @ThomasKwa
Đã lưu 20 byte nhờ @corsiKa
Đã lưu 2 byte nhờ @Ypnypn
Lưu 2 byte nhờ @ user902383

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 byte

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 byte

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 byte

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 byte

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 byte

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 byte

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
Wow, đã không thấy tiếp tục thực sự được sử dụng trong một chương trình Java cho đến bây giờ.
Bạch tuộc ma thuật Urn

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)

Chỉnh sửa 5 Đã thực sự chơi golf nhờ @poke * xóa dòng ngắt, v.v.

Chỉnh sửa 4 In bí danh và thay thế a = bằng a - = để lưu một byte. Cảm ơn @poke và @elzell. Đồng thời chuyển eval đầu vào vào vòng lặp for để lưu 2 byte từ gán

Chỉnh sửa 3 Tiết kiệm được tìm thấy trong OO khác nhau trong giây nếu

Chỉnh sửa 2 Đã sửa lỗi

Chỉnh sửa 1 Đã thay đổi đầu vào ở dạng '[1,2,3,4,5 ...]' và thực hiện hai nhận xét đầu tiên, cảm ơn rất nhiều đến @Morgan Thrapp

Lần đầu tiên poster ở đây. Đầu vào là dòng lệnh với các mục được phân tách bằng dấu cách, đầu ra là mục nhập trên mỗi dòng, với một dòng mới giữa các nhóm.


3
Bạn có thể giảm xuống 122 bằng cách gán 15 cho một biến và chỉ sử dụng một khoảng trắng để thụt lề.
Morgan Thrapp

Ngoài ra, bạn thất bại trong trường hợp thử nghiệm thứ hai, tôi nhận được 2 3 5, nhưng nó phải là 5 2 3 5.
Morgan Thrapp

1
@AdamMartin Bạn có thể quan tâm đến phiên bản Pyth của mã của bạn
csga5000

1
Vì bạn đang sử dụng printthường xuyên, bạn nên lưu nó dưới dạng một biến : p=print. Tiết kiệm cho bạn 14 ký tự khác.
chọc

2
Số lượng hiện tại là 132, nhưng bạn có thể giảm xuống còn 113 nếu bạn loại bỏ một số ngắt dòng. Bạn có thể kết hợp mọi thứ nếu thành một dòng duy nhất, ví dụ if s>i:s-=i;p(e-s);p();e=scho dòng thứ hai. Điều đó giúp bạn tiết kiệm ngắt dòng và ký tự thụt.
chọc

7

Haskell, 126 107 102 100 byte

[]#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])

Ví dụ sử dụng: (#[]).(++[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]]

Chỉnh sửa: @Stewie Griffin đã giúp tôi tiết kiệm 19 byte. Cảm ơn!


4

CJam, 39 byte

q~0af*Sf*N*30/{S-N/:,F1$:+-+0+e`W<e~p}/

Kiểm tra nó ở đây.

Điều này cảm thấy rất tối ưu, nhưng cho đến nay, tất cả những nỗ lực của tôi đối với một giải pháp ngắn hơn đã bị hủy hoại bởi sự hiện diện của các số không trong đầu vào.


4

Python2 được cung cấp bởi RegEx : 158 155 byte

Làm trong trăn với tình yêu và hầu như không có toán học.
Hoặc Regex Math nếu bạn muốn, toán đơn phương.
Toán học 'thực' chỉ được sử dụng để 'sửa chữa' yêu cầu cuối cùng:

Nếu tổng của vectơ cuối cùng nhỏ hơn 15, thì một số phải được thêm vào cuối để làm cho tổng tăng lên.

Mật mã:

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

Cách thức hoạt động này là bằng cách chuyển đổi mỗi số N thành một chuỗi có độ dài N ( x được chọn làm char để điền vào chuỗi) và nối tất cả chúng vào một khoảng cách string. Chuỗi kết quả được phân tách thông qua RegEx BLACK MAGIC thành một cái gì đó như:

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

cho một đầu vào như: f([1, 2, 3, 4, 5, 6, 7, 8, 10])
Sau đó phân tách lại và độ dài của xes liên tiếp được sử dụng để tạo lại các số, mọi thứ được đóng gói độc đáo trong một sự hiểu biết danh sách.

Ung dung:

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

Đầu ra:

>>> 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]]

Lưu ý: không có đủ phép thuật cho số 0 nên mục này không đủ tiêu chuẩn

số không phải được bao gồm. Xem ví dụ thứ hai


Tất cả những tên chức năng là khá đắt. Làm cho việc sử dụng một cái gì đó như regex gần như không thể trong mã golf. Tuy nhiên, kích thước byte của bạn không tệ khi xem xét
csga5000

4

Nghiêm túc, 88 byte

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

Dùng thử trực tuyến

Đây là câu trả lời nghiêm túc đầu tiên của tôi! Bây giờ tôi đã quen thuộc với tất cả các thiếu sót của ngôn ngữ!

Bãi rác Hex:

2c6027212a2730604d27206a30bb603b3b3b277cee33352a2827213dbd2b3bbb252827203d7c2827303d7c49
29604dee6a277c407360936c60bc609427304073be4d604d643be433352a2d3b60586060407160499f40712e

Giải trình:

,`'!*'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.

Nếu các điểm mã Unicode được sử dụng, thì các ký tự đó có được tính là 2 byte không? : P
Dan

Tôi đang sử dụng unicode trong nguồn được mô tả để nó có thể được đọc theo cách nó có nghĩa. Nếu không, nó sẽ trông giống như rác ngẫu nhiên đầy không thể in được. Nguồn chính thức là bãi chứa hex.
quintopia

Đó có nghĩa là một câu hỏi hài hước
Dan

1
Đó cũng là một câu hỏi hợp lý mà một độc giả khác có thể thắc mắc, vì vậy tôi đã trả lời nó một cách hài hước.
quintopia

@quintopia +1 Để thử một ngôn ngữ chơi gôn mới! Ngôn ngữ mới rất thú vị;) Tôi cũng đã thử dùng pyth lần đầu tiên cho câu hỏi này.
csga5000

3

Javascript, 138 128 byte

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")

Với khoảng trắng:

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
")

Thí dụ:

Gán hàm cho một biến

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")

Sau đó đánh giá như vậy:

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

1 4 10
1 4 5 5

Lịch sử sửa đổi:

12/3/2015 00:02 - Cảm ơn người dùng81655 (+1 anh ấy trong phần bình luận) để cải thiện 10 byte

12/2/2015 21:44 - Chuyển sang sử dụng kiểu chức năng theo thứ tự để giảm kích thước.


3
Bạn có thể cải thiện điều này với những: f=là không cần thiết theo quy định tại chỗ, loại bỏ các dấu ngoặc đơn từ (i), vòm với eval, do đó bạn không cần returnhoặc khung và thay thế ifvới một ternary để ođược trả lại và thay đổi '\n'để `\n`, kết hợp t+=...với t>=mđể loại bỏ cho dấu ngoặc tròn. Đây là giải pháp của bạn với 127 byte với tất cả những cải tiến sau: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 Tôi sẽ thực hiện một số thay đổi đó! Khi tôi dùng thử, tôi nhận được SytaxError: Mã thông báo bất ngờ (...). Lưu ý, để kiểm tra chức năng, tôi đã thêm f =
csga5000

1
SO thêm một số ký hiệu sau khi o+ở cuối dòng. Xóa o+=zvà viết lại và nó sẽ hoạt động. : P
user81655

@ user81655 Tôi không thấy làm thế nào để \ntạo ra sự khác biệt
csga5000

1
Ý bạn là `\n`sao? Nó sẽ không hoạt động mà không có nó bởi vì mã bên trong là "..."eval.
dùng81655

2

Python 3: 139 byte

Cách tiếp cận hơi khác so với câu trả lời khác. Tạo đầu ra thực tế từ câu hỏi vì ban đầu tôi cho rằng đó là một yêu cầu.

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

Ví dụ sử dụng:

>>> 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 byte

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

Đếm shebang là ba, đầu vào được lấy từ stdin, không gian được phân tách.


Sử dụng mẫu

$ 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 byte

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}}

Với thụt lề và ngắt dòng:

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
             }
      }

Sử dụng:

> 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 byte

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

Lấy đầu vào là danh sách:

>>[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 byte

Bao gồm +3 cho -p (thường là +1, nhưng +3 để chơi công bằng với giải pháp perl khác)

Chạy với đầu vào trên STDIN (dòng mới cuối cùng về đầu vào là tùy chọn, nhưng PHẢI vắng mặt cho đầu vào trống)

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

Nhìn này, không có tính toán gì cả ...


Muộn còn hơn không! Giải pháp rất hay mặc dù :)
Dada

0s khá khó khăn trong giải pháp này (được biểu thị bằng khoảng trắng thừa) và tôi phải rất cẩn thận để xử lý đúng các khoảng trống để giữ cho số 0s chính xác. Cụ thể, hãy xem xét các đầu vào trong đó một phần chính xác là 15, như thế nào 1 14 2 13. Hãy thử chúng mà không có `?` Và xem điều gì sẽ xảy ra
TonMedel

Có, tôi đã thử nó và thấy rằng 0 là nơi được thêm vào lúc bắt đầu một số dòng như bạn nói (đó là lý do tại sao tôi đã xóa nhận xét của mình 30 giây sau khi đăng nó). Cảm ơn
Dada

0

Java - 158 155 byte

Phiên bản Lambda của https://codegolf.stackexchange.com/a/65590/46866 của yassin-hajaj , Không chắc chắn nếu một bài nộp hợp lệ, nhưng không có đủ đại diện để thêm nhận xét về câu trả lời được liên kết. Được tính bằng cách sử dụng http://meta.codegolf.stackexchange.com/questions/4944/byte-c gặp-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 byte

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);}

Ung dung

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);
    }

có thể được sử dụng như

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}));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.