Сумма всегда 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.

Формат ввода и вывода является необязательным. Что бы ни было лучше на вашем языке.

Самый короткий код в байтах побеждает.


Leaderboard

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

## 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
Это определенно должно заменить тест
FizzBuzz

Ответы:

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 в первую очередь! Пожалуйста, оставьте свои комментарии ниже :)

csga5000
источник
2
Остальное было недавно изменено на .?вместо E, но я забыл обновить документы. Прости за это.
Исаак
@isaacg Спасибо, Исаак! Я должен сделать это сейчас. Хотя он сохраняет только 1 байт, так как остальное теперь составляет 2 символа.
csga5000
1
Исправление, как мы говорим.
Исаак
3
Пара других предложений: =Z+ZNи =+ZNтакие же. Это немного похоже на Python +=. Likewiese, =Z-ZK-> =-ZK. Кроме того, вам не нужно )в конце - он заполняется автоматически. Наконец-то FNQи VQтакие же.
Исаак
1
Вы можете сохранить еще 2 байта, заменив I>Z0на IZ- Zне может быть отрицательным, так что вы на самом деле просто проверяете, не Zявляется ли ноль, а ноль - ложь, в то время как все остальные числа верны.
Исаак
16

Ява - 229 200 192 181 172 170 168 байт

Уже началось, не для победы, а для удовольствия :)
Любое предложение приветствуется.

Сохранено 8 байтов благодаря @ThomasKwa.
Сохранено 20 байтов благодаря @corsiKa.
Сохранено 2 байта благодаря @Ypnypn.
Сохранено 2 байта благодаря @ 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 байт

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-программе.
Волшебная Осьминог Урна
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)

Редактировать 5 Действительно игра в гольф благодаря @poke * удаленным разрывам строк и т. Д.

Отредактируйте 4 печати с псевдонимами и замените a = на - =, чтобы сохранить байт. Благодаря @poke и @elzell. Также перемещен входной eval в цикл for, чтобы сохранить 2 байта из назначения

Редактировать 3 Найденные сбережения в разных OO в секунду, если

Редактировать 2 Исправлена ​​ошибка

Редактировать 1 Изменил ввод в форме «[1,2,3,4,5 ...]» и реализовал первые два комментария, большое спасибо @Morgan Thrapp

Первый раз постер здесь. Ввод - это командная строка с записями, разделенными пробелами, вывод - запись в каждой строке, с новой строкой между группами

Адам Мартин
источник
3
Вы можете уменьшить его до 122, назначив 15 переменной и используя только один пробел для отступа.
Морган Трепп
Кроме того, вы проваливаете второй контрольный пример, я получаю 2 3 5, но это должно быть 5 2 3 5.
Морган Трепп
1
@AdamMartin Вас может заинтересовать моя версия
Pyth
1
Так как вы используете printтак часто, вы должны сохранить его в качестве переменной: p=print. Спасает вас еще 14 символов.
тыкай
2
Текущее число равно 132, но вы можете уменьшить его до 113, если уберете некоторые разрывы строк. Вы можете объединить каждый if в одну строку, например, if s>i:s-=i;p(e-s);p();e=sдля второй. Это спасает вас от разрывов строк и символов отступов.
тыкай
7

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

Изменить: @ Стиви Гриффин помог мне сэкономить 19 байтов. Благодарность!

Ними
источник
4

CJam, 39 байт

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

Проверьте это здесь.

Это кажется очень неоптимальным, но до сих пор все мои попытки найти более короткое решение были сорваны присутствием нулей на входе.

Мартин Эндер
источник
4

Python2 работает от RegEx : 158 155 байт

Сделано на питоне с любовью и почти без математики.
Или Regex Math, если хотите, унарная математика.
«Настоящая» математика используется только для «исправления» последнего требования:

Если сумма итогового вектора меньше 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 используется для создания чисел снова, все хорошо упаковано в понимании списка.

Ungolfed:

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

Примечание: для нулей не было достаточно магии, поэтому эта запись дисквалифицирует

нули должны быть включены. Смотрите второй пример

CSᵠ
источник
Все эти имена функций довольно дороги. Делает использование чего-то вроде регулярных выражений практически невозможным в коде гольфа. Тем не менее, ваш размер байта не плохой, учитывая
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.
quintopia
источник
Если используются кодовые точки Unicode, то считаются ли эти символы по 2 байта каждый? : P
Дан
Я использую Юникод в изображенном источнике, чтобы его можно было прочитать так, как он должен выглядеть. В противном случае это выглядело бы как случайный мусор, полный непечатных. Официальный источник - шестнадцатеричный дамп.
Quintopia
Это должен был быть юмористический вопрос
Дэн
1
Это был также разумный вопрос, о котором может спросить другой читатель, поэтому я ответил на него с юмором.
Quintopia
@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

Лист регистраций изменений:

03.12.2015 00:02 - Спасибо user81655 (+1 ему в комментариях) за 10 байтное улучшение

02.12.2015 21:44 - Переключен на использование функционального стиля для уменьшения размера.

csga5000
источник
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: неожиданный токен 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

Считая Шебанг как три, ввод берется из стандартного ввода, разделенного пробелом.


Образец использования

$ 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
plannapus
источник
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]
TFeld
источник
1

Perl, 76 байт

Включает +3 для -p(обычно +1, но +3, чтобы играть честно с другим решением Perl)

Запустить с вводом по 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

Смотри, ма, никаких расчетов ...

Тон Хоспел
источник
Лучше поздно, чем никогда! Очень хорошее решение, хотя :)
Дада
0s довольно сложны в этом решении (представлены дополнительными пробелами), и я должен быть очень осторожным, чтобы правильно обрабатывать пробелы, чтобы сохранить число 0s правильным. В частности, рассмотрим входные данные, где частичная сумма равна 15, как 1 14 2 13. Попробуйте их без `?` И посмотрите, что получится
Тон Хоспел
Да, я попробовал это и увидел, что 0 были добавлены в начале некоторых строк, как вы говорите (поэтому я удалил свой комментарий через 30 секунд после публикации). Спасибо
Дада
0

Java - 158 155 байт

Лямбда-версия https://codegolf.stackexchange.com/a/65590/46866 от yassin-hajaj , Не уверен, что это правильное представление, но у него недостаточно представителей, чтобы добавить комментарий к связанному ответу. Подсчитано с использованием 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);}

Ungolfed

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}));
The_Lone_Devil
источник