Сума завжди 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.

Як введення, так і вихідний формат необов’язковий. Те, що є найкращим у вашій мові.

Виграє найкоротший код у байтах.


Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## 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
випадкова

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

Примітка: Велике спасибі Ісаакгу за кілька байтів щодо зменшення розміру та створення піту в першу чергу! Будь ласка, підсиліть його коментарі нижче :)


2
Ще недавно був змінений , щоб бути .?замістьE , але я забув оновити документацію. Вибач за це.
isaacg

@isaacg Спасибі isaacg! Я мав би це працювати зараз. Хоча це економить лише 1 байт, оскільки зараз це 2 символи.
csga5000

1
Виправлення це, як ми говоримо.
isaacg

3
Пара інших пропозицій: =Z+ZNі =+ZNте саме. Це трохи схоже на Python's +=. Likewiese, =Z-ZK-> =-ZK. Крім того, вам не потрібен )кінець - він заповнюється автоматично. Нарешті, FNQіVQ те саме.
isaacg

1
Ви можете зберегти ще 2 байти, замінивши I>Z0на IZ- Zне може бути негативним, тому ви дійсно просто перевіряєте, чи Zне нуль, а нуль - хибний, а всі інші числа - правдиві.
isaacg

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

Пітон 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 Aliased print та замініть a = на - =, щоб зберегти байт. Завдяки @poke та @elzell. Також переміщено вхідний eval в цикл для збереження 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 версія вашого коду
csga5000

1
Так як ви використовуєте printтак часто, ви повинні зберегти його в якості змінної: p=print. Економить вам ще 14 символів.
ткнути

2
Поточний підрахунок становить 132, але ви можете зменшити його до 113, якщо видалити деякі розриви рядків. Ви можете об'єднати кожен, якщо в один рядок, наприклад, 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]]

Редагувати: @Stewie Griffin допоміг мені зберегти 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, то в кінці потрібно додати число, щоб збільшити суму.

Кодгольф:

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, тому цей запис дискваліфікується

нулі повинні бути включені. Дивіться другий приклад


Усі ці назви функцій досить дорогі. Використовувати щось на кшталт regex майже неможливо в коді гольфу. І все-таки ваш розмір байтів не поганий, враховуючи
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
Dan

Я використовую unicode у зображеному джерелі, щоб його можна було прочитати так, як це має виглядати. Інакше це виглядатиме як випадкове сміття, повне недрукованих матеріалів. Офіційним джерелом є шістнадцятковий відвал.
Кінтопія

Це повинно було бути гумористичне питання
Dan

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

Історія редагування:

03.12.2015 00:02 - Завдяки користувачеві81655 (поставив йому +1 у коментарях) за 10 байт

02.12.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: Несподіваний маркер НЕЗАКОННИЙ (...). Зауважте, щоб перевірити функцію, я додав f =
csga5000

1
SO додає деякі символи після o+в кінці рядка. Видаліть o+=zі напишіть ще раз, і воно спрацює. : P
user81655

@ user81655 Я не бачу, як це \nмає значення
csga5000

1
Ви маєте в виду `\n`? Він не буде працювати без нього , тому що код знаходиться всередині "..."через eval.
user81655

2

Пітон 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

Підрахувавши шебанг як три, вхід береться від 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, але +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

Подивися ма, ніяких розрахунків ні до чого ...


Краще пізно, ніж ніколи! Дуже приємне рішення, хоча :)
Dada

0s досить складні в цьому рішенні (представлені додатковими пробілами), і я повинен бути дуже обережним, щоб правильно обробляти пробіли, щоб число 0s було правильним. Зокрема, розглянемо вхідні дані, де часткова сума становить рівно 15, як 1 14 2 13. Спробуйте їх без "?" І подивіться, що станеться
Тон Євангелія

Так, я спробував це і побачив, що 0 додається на початку деяких рядків, як ти кажеш (тому я видалив свій коментар через 30 секунд після публікації). Спасибі
Дада

0

Ява - 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);}

Безумовно

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}));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.