Jumlahnya selalu 15

36

Tulis program atau fungsi yang mengambil array bilangan bulat non-negatif sebagai input dan output satu set vektor / array dengan elemen-elemen dari array input secara berurutan, dibagi sehingga setiap vektor berjumlah hingga 15. Jika jumlah pertama Elemen N tidak "menekan 15", maka angka yang berhasil melewati 15 harus terpotong, dan sisanya akan menjadi elemen pertama dari vektor berikutnya. Ini berlangsung hingga Anda mencapai akhir array input. Jika jumlah vektor final kurang dari 15, maka angka harus ditambahkan di akhir untuk membuat jumlah naik.

Saya pikir aturannya lebih mudah dipahami dengan melihat contoh-contohnya:

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.

Baik input dan format output adalah opsional. Apapun yang terbaik dalam bahasa Anda.

Kode terpendek dalam byte menang.


Papan peringkat

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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

Stewie Griffin
sumber
'Format output adalah opsional'. Apakah itu berarti [[3, 7, 5], [10, 5]]output yang valid untuk kasus uji pertama?
Morgan Thrapp
@MorganThrapp, ya. itu valid
Stewie Griffin
1
@ FlagAsSpam, saya telah menambahkan lebih banyak penjelasan dalam contoh yang Anda tanyakan.
Stewie Griffin
3
Test case bagus:Input: 100 Output: 15; 15; 15; 15; 15; 15; 10 5
random
3
Ini pasti harus menggantikan tes FizzBuzz
CSᵠ

Jawaban:

8

Pyth, 37 byte

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

Dijelaskan

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)

Ini adalah omong kosong pertama saya, jadi silakan menyarankan perbaikan.

Contoh:

Memasukkan

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

Keluaran

1
3
4
5
2


7
8

Catatan: Terima kasih banyak kepada Isaacg untuk beberapa saran pengurangan ukuran dan menciptakan pyth di tempat pertama! Harap beri komentar di bawah :)

csga5000
sumber
2
Lain-lain berubah menjadi .?bukan E, tapi saya lupa memperbarui dokumen. Maaf soal itu.
isaacg
@isaacg Terima kasih isaacg! Seharusnya aku yang bekerja sekarang. Meskipun hanya menghemat 1 byte karena yang lain adalah 2 karakter sekarang.
csga5000
1
Memperbaikinya saat kita bicara.
isaacg
3
Beberapa saran lain: =Z+ZNdan =+ZNsama. Ini sedikit seperti Python +=. Likewiese, =Z-ZK-> =-ZK. Juga, Anda tidak perlu )pada akhirnya - itu diisi secara otomatis. Akhirnya, FNQdan VQsama saja.
isaacg
1
Anda dapat menyimpan 2 byte lainnya dengan mengganti I>Z0dengan IZ- Ztidak boleh negatif, jadi Anda benar-benar hanya memeriksa jika Ztidak nol, dan nol adalah palsu, sementara semua angka lainnya adalah benar.
isaacg
16

Java - 229 200 192 181 172 170 168 byte

Sudah dimulai, bukan untuk menang tapi untuk bersenang-senang :)
Setiap saran dipersilahkan.

Disimpan 8 byte berkat @ThomasKwa
Disimpan 20 byte berkat @corsiKa
Disimpan 2 byte berkat @Ypnypn
Disimpan 2 byte berkat @ 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);
}
Yassin Hajaj
sumber
1
Wow, belum pernah melihat terus benar-benar digunakan dalam program Java sampai sekarang.
Magic Gurita Guci
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)

Sunting 5 Benar-benar golf berkat @poke * baris yang dihapus dll

Edit 4 Cetak alias, dan ganti a = dengan a - = untuk menghemat satu byte. Terima kasih untuk @poke dan @elzell. Juga memindahkan eval input ke dalam untuk loop untuk menyimpan 2 byte dari tugas

Sunting 3 Ditemukan penghematan dalam OO berbeda di dalam detik jika

Edit 2 Bug yang diperbaiki

Sunting 1 Mengubah input menjadi dalam bentuk '[1,2,3,4,5 ...]', dan menerapkan dua komentar pertama, terima kasih banyak kepada @Morgan Thrapp

Poster pertama kali di sini. Input adalah baris perintah dengan entri yang dipisahkan oleh spasi, output adalah entri per baris, dengan baris baru di antara pengelompokan.

Adam Martin
sumber
3
Anda bisa menurunkannya ke 122 dengan menugaskan 15 ke variabel dan hanya menggunakan satu ruang untuk lekukan.
Morgan Thrapp
Juga, Anda gagal dalam test case kedua, saya dapat 2 3 5, tetapi seharusnya 5 2 3 5.
Morgan Thrapp
1
@AdamMartin Anda mungkin tertarik pada versi Pyth saya dari kode Anda
csga5000
1
Karena Anda menggunakan printbegitu sering, Anda harus menyimpannya sebagai variabel: p=print. Menghemat 14 karakter lagi.
colok
2
Hitungan saat ini adalah 132, tetapi Anda bisa turun ke 113 jika Anda menghapus beberapa jeda baris. Anda dapat menggabungkan setiap jika menjadi satu baris, misalnya if s>i:s-=i;p(e-s);p();e=suntuk yang kedua. Itu menghemat Anda baris istirahat dan karakter lekukan.
colek
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])

Contoh penggunaan: (#[]).(++[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]]

Sunting: @Stewie Griffin membantu saya menghemat 19 byte. Terima kasih!

nimi
sumber
4

CJam, 39 byte

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

Uji di sini.

Ini terasa sangat suboptimal, tetapi sejauh ini semua upaya saya pada solusi yang lebih pendek telah digagalkan oleh adanya nol di input.

Martin Ender
sumber
4

Python2 didukung oleh RegEx : 158 155 byte

Dibuat dengan python dengan cinta dan hampir tanpa matematika.
Atau Matematika Regex jika Anda mau, matematika unary.
Matematika 'nyata' hanya digunakan untuk 'memperbaiki' persyaratan terakhir:

Jika jumlah vektor final kurang dari 15, maka angka harus ditambahkan di akhir untuk membuat jumlah naik.

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

Cara ini bekerja adalah dengan mengubah setiap angka N menjadi string dengan panjang N ( x dipilih sebagai karakter untuk mengisi string) dan menggabungkan mereka semua ke dalam ruang yang terpisah string. String yang dihasilkan dibagi melalui RegEx BLACK MAGIC menjadi sesuatu seperti:

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

untuk input seperti: f([1, 2, 3, 4, 5, 6, 7, 8, 10])
Itu kemudian dipecah lagi, dan panjang berturut-turut xdigunakan untuk membuat angka lagi, semuanya dikemas dengan baik dalam pemahaman daftar.

Tidak Disatukan:

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

Keluaran:

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

Catatan: tidak ada cukup sihir untuk 0s sehingga entri ini didiskualifikasi

nol harus dimasukkan. Lihat contoh kedua

CSᵠ
sumber
Semua nama fungsi itu agak mahal. Membuat menggunakan sesuatu seperti regex hampir tidak mungkin dalam kode golf. Namun, ukuran byte Anda tidak buruk mengingat
csga5000
4

Serius, 88 byte

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

Cobalah online

Ini jawaban serius pertamaku! Sekarang saya sangat akrab dengan semua kekurangan bahasa!

Hex Dump:

2c6027212a2730604d27206a30bb603b3b3b277cee33352a2827213dbd2b3bbb252827203d7c2827303d7c49
29604dee6a277c407360936c60bc609427304073be4d604d643be433352a2d3b60586060407160499f40712e

Penjelasan:

,`'!*'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.
kuintopia
sumber
Jika titik kode Unicode digunakan, lalu apakah masing-masing karakter tersebut dihitung sebagai 2 byte? : P
Dan
Saya menggunakan unicode di sumber yang digambarkan sehingga dapat dibaca dengan cara yang seharusnya terlihat. Kalau tidak, itu akan terlihat seperti sampah acak yang penuh dengan barang yang tidak dapat dijual. Sumber resmi adalah hex dump.
kuintopia
Itu dimaksudkan untuk menjadi pertanyaan lucu
Dan
1
Itu juga pertanyaan yang masuk akal yang mungkin ditanyakan pembaca lain, jadi saya menjawabnya tanpa humor.
kuintopia
@quintopia +1 Untuk mencoba bahasa golf baru! Bahasa baru itu menyenangkan;) Saya mencoba pyth untuk pertama kalinya pada pertanyaan ini juga.
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")

Dengan spasi putih:

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

Contoh:

Tetapkan fungsi ke variabel

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

Kemudian evaluasi seperti ini:

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

1 4 10
1 4 5 5

Riwayat revisi:

12/3/2015 00:02 - Terima kasih kepada user81655 (beri +1 pada komentar) untuk peningkatan 10 byte

12/2/2015 21:44 - Beralih untuk menggunakan gaya fungsional agar mengurangi ukuran.

csga5000
sumber
3
Anda dapat meningkatkan ini dengan ini: f=tidak diperlukan sesuai dengan aturan situs, menghapus tanda kurung dari (i), dikelilingi dengan evalsehingga Anda tidak perlu returnatau tanda kurung dan ganti ifdengan ternary sehingga odikembalikan dan diubah '\n'menjadi `\n`, gabung t+=...dengan t>=muntuk menghapus untuk kurung loop. Inilah solusi Anda dalam 127 byte dengan semua peningkatan ini: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 Saya akan menerapkan beberapa perubahan itu! Ketika saya mencoba milik Anda, saya mendapatkan SytaxError: Token tak terduga ILLEGAL (...). Catatan, untuk menguji fungsi saya menambahkan f =
csga5000
1
SO menambahkan beberapa simbol setelah o+di akhir baris. Hapus o+=zdan tulis lagi dan itu akan berhasil. : P
user81655
@ user81655 Saya tidak melihat bagaimana \nmembuat perbedaan
csga5000
1
Maksudmu `\n`? Ini tidak akan berfungsi tanpanya karena kode di dalam "..."karena eval.
user81655
2

Python 3: 139 byte

Pendekatan yang sedikit berbeda dari jawaban yang lain. Menghasilkan keluaran aktual dari pertanyaan karena saya awalnya berasumsi bahwa itu adalah persyaratan.

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

Contoh penggunaan:

>>> 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
menyodok
sumber
2

Perl, 86 byte

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

Menghitung shebang sebagai tiga, input diambil dari stdin, spasi dipisahkan.


Contoh Penggunaan

$ 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
primo
sumber
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}}

Dengan indent dan linebreak:

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

Pemakaian:

> 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
plannapus
sumber
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

Mengambil input sebagai daftar:

>>[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]
TFeld
sumber
1

Perl, 76 byte

Termasuk +3 untuk -p (biasanya +1, tetapi +3 untuk bermain adil dengan solusi perl lainnya)

Jalankan dengan input pada STDIN (baris akhir baru pada input adalah opsional, tetapi HARUS absen untuk input kosong)

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

Lihat bu, tidak ada perhitungan apa pun ...

Ton Hospel
sumber
Lebih baik terlambat daripada tidak sama sekali! Solusi yang sangat bagus :)
Dada
0s agak rumit dalam solusi ini (diwakili oleh ruang ekstra) dan saya harus sangat berhati-hati untuk menangani ruang dengan benar agar jumlah 0s benar. Secara khusus pertimbangkan input di mana jumlah parsial persis 15, seperti 1 14 2 13. Cobalah mereka tanpa `?` Dan lihat apa yang terjadi
Ton Hospel
Ya, saya mencobanya dan melihat 0 di mana ditambahkan pada awal beberapa baris seperti yang Anda katakan (itu sebabnya saya menghapus komentar saya 30 detik setelah mempostingnya). Terima kasih
Dada
0

Jawa - 158 155 byte

Versi Lambda dari https://codegolf.stackexchange.com/a/65590/46866 oleh yassin-hajaj , Tidak yakin apakah pengiriman yang valid, tetapi tidak memiliki cukup perwakilan untuk menambahkan komentar pada jawaban yang ditautkan. Dihitung menggunakan 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 Bytes

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

Tidak disatukan

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

dapat digunakan seperti

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