A soma é sempre 15

36

Escreva um programa ou função que use uma matriz de números inteiros não negativos como entrada e produza um conjunto de vetores / matrizes com os elementos da matriz de entrada em ordem, divida para que cada vetor totalize até 15. Se a soma do primeiro N elementos não "atingem 15", então o número que fez passar 15 deve ser cortado e o restante será o primeiro elemento do próximo vetor. Isso continua até você chegar ao final da matriz de entrada. Se a soma do vetor final for menor que 15, um número deverá ser adicionado no final para aumentar a soma.

Eu acho que as regras são mais facilmente entendidas olhando os exemplos:

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.

O formato de entrada e saída é opcional. O que há de melhor no seu idioma.

O código mais curto em bytes vence.


Entre os melhores

O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet:

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

Stewie Griffin
fonte
'Formato de saída é opcional'. Isso significa que [[3, 7, 5], [10, 5]]seria uma saída válida para o primeiro caso de teste?
Morgan Thrapp 02/12/2015
@MorganThrapp, sim. isso é válido.
Stewie Griffin
1
@FlagAsSpam, adicionei mais explicações no exemplo que você está perguntando.
Stewie Griffin
3
Bom caso de teste:Input: 100 Output: 15; 15; 15; 15; 15; 15; 10 5
randomra
3
Definitivamente, isso deve substituir o teste do FizzBuzz
CSᵠ

Respostas:

8

Pitão, 37 bytes

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

Explicado

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)

Esta foi a minha primeira vez, então fique à vontade para sugerir melhorias.

Exemplo:

Entrada

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

Saída

1
3
4
5
2


7
8

Nota: Muito obrigado a Isaacg por vários bytes de conselhos sobre redução de tamanho e criação de pyth em primeiro lugar! Voto por favor seus comentários abaixo :)

csga5000
fonte
2
Outra coisa foi alterada recentemente para ser em .?vez de E, mas eu esqueci de atualizar os documentos. Me desculpe por isso.
Isaacg
@isaacg Thanks isaacg! Eu deveria ter isso trabalhando agora. Embora ele economize apenas 1 byte, já que o resto tem 2 caracteres agora.
csga5000
1
Consertando enquanto falamos.
Isaacg 03/12
3
Algumas outras sugestões: =Z+ZNe =+ZNsão as mesmas. É um pouco como o Python +=. Likewiese, =Z-ZK-> =-ZK. Além disso, você não precisa )do final - ele é preenchido automaticamente. Finalmente, FNQe VQsão os mesmos.
Isaacg 03/12
1
Você pode salvar outro byte de 2 substituindo I>Z0por IZ- Znão pode ser negativo; portanto, você está apenas verificando se Znão é zero e zero é falso, enquanto todos os outros números são verdadeiros.
Isaacg
16

Java - 229 200 192 181 172 170 168 bytes

Já havia começado, não pela vitória, mas pela diversão :)
Qualquer sugestão é bem-vinda.

Economizou 8 bytes graças a @ThomasKwa
Economizou 20 bytes graças a @corsiKa
Economizou 2 bytes graças a @Ypnypn
Economizou 2 bytes graças a @ 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 bytes

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 bytes

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 bytes

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 bytes

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 bytes

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 bytes

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
fonte
1
Uau, não tinha visto continuar realmente usado em um programa Java até agora.
Magic Octopus 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)

Editar 5 Verdadeiramente jogado graças a @poke * quebras de linha removidas etc.

Editar 4 Impressão com alias e substituiu a = por a - = para salvar um byte. Graças a @poke e @elzell. Também moveu eval de entrada para o loop for para economizar 2 bytes da atribuição

Edit 3 Economias encontradas em diferentes OO dentro de segundos se

Edit 2 Fixed bug

Edit 1 Alterou a entrada para o formato '[1,2,3,4,5 ...]' e implementou os dois primeiros comentários, muito obrigado a @Morgan Thrapp

Pôster da primeira vez aqui. Entrada é linha de comando com entradas separadas por espaços, saída é entrada por linha, com uma nova linha entre agrupamentos.

Adam Martin
fonte
3
Você pode reduzi-lo a 122 atribuindo 15 a uma variável e usando apenas um espaço para indentação.
Morgan Thrapp
Além disso, você deixar o segundo caso de teste, eu recebo 2 3 5, mas deve ser 5 2 3 5.
Morgan Thrapp
1
@AdamMartin Você pode estar interessado na minha versão do Pyth do seu código
csga5000
1
Desde que você está usando printcom tanta frequência, você deve salvá-lo como uma variável: p=print. Economiza mais 14 caracteres.
cutuca
2
A contagem atual é 132, mas você pode reduzi-la para 113 se remover algumas quebras de linha. Você pode combinar todos os if em uma única linha, por exemplo, if s>i:s-=i;p(e-s);p();e=spara a segunda. Isso economiza quebras de linha e caracteres de indentação.
cutuca
7

Haskell, 126 107 102 100 bytes

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

Exemplo de uso: (#[]).(++[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]]

Edit: @Stewie Griffin me ajudou a economizar 19 bytes. Obrigado!

nimi
fonte
4

CJam, 39 bytes

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

Teste aqui.

Isso parece muito abaixo do ideal, mas até agora todas as minhas tentativas de uma solução mais curta foram frustradas pela presença de zeros na entrada.

Martin Ender
fonte
4

Python2 desenvolvido com RegEx : 158 155 bytes

Feito em python com amor e quase sem matemática.
Ou Regex Math, se preferir, matemática unária.
A matemática 'real' usada apenas para 'corrigir' o último requisito:

Se a soma do vetor final for menor que 15, um número deverá ser adicionado no final para aumentar a soma.

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

A maneira como isso funciona é convertendo cada número N em uma sequência de comprimento N ( x escolhido como o caractere para preencher a sequência) e juntando todos eles em um espaço separado string. A sequência resultante é dividida via RegEx BLACK MAGIC em algo como:

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

para uma entrada como: f([1, 2, 3, 4, 5, 6, 7, 8, 10])
Isso é dividido novamente, e o comprimento de xes consecutivos é usado para criar os números novamente, tudo bem embalado em uma compreensão de lista.

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

Saída:

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

Nota: não havia mágica suficiente para os 0s, então esta entrada desqualifica

zeros devem ser incluídos. Veja o segundo exemplo

CSᵠ
fonte
Todos esses nomes de função são bastante caros. Torna o uso de algo como regex quase impossível no código de golfe. Ainda assim, o seu tamanho byte não é ruim, considerando
csga5000
4

Sério, 88 bytes

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

Experimente online

É a minha primeira resposta a sério! Agora estou intimamente familiarizado com todas as deficiências da linguagem!

Hex Dump:

2c6027212a2730604d27206a30bb603b3b3b277cee33352a2827213dbd2b3bbb252827203d7c2827303d7c49
29604dee6a277c407360936c60bc609427304073be4d604d643be433352a2d3b60586060407160499f40712e

Explicação:

,`'!*'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
fonte
Se forem usados ​​pontos de código Unicode, esses caracteres contam como 2 bytes cada? : P
Dan
Estou usando o unicode na fonte representada para que possa ser lido da maneira como deve ser. Caso contrário, pareceria lixo aleatório cheio de imprimíveis. A fonte oficial é o despejo hexadecimal.
quintopia 04/12/2015
Era para ser uma pergunta bem-humorada.
Dan
1
Também era uma pergunta razoável sobre a qual outro leitor poderia se perguntar, então eu respondi sem humor.
quintopia 5/12/2015
@quintopia +1 Por experimentar uma nova linguagem de golfe! Novas linguagens são divertidas;) Tentei pela primeira vez também sobre essa questão.
csga5000
3

Javascript, 138 128 bytes

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

Com espaço em branco:

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

Exemplo:

Atribua a função a uma variável

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

Então avalie da seguinte maneira:

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

1 4 10
1 4 5 5

Histórico de Revisão:

03/12/2015 00:02 - Graças ao usuário81655 (+1 nos comentários) pela melhoria de 10 bytes

02/12/2015 21:44 - Comutado para usar o estilo funcional para reduzir o tamanho.

csga5000
fonte
3
Você pode melhorar isso com estes: f=não é necessário de acordo com as regras do site, remova os parênteses de (i), envolva com evalpara que você não precise returnou entre parênteses e substitua-o ifpor um ternário para que oseja retornado e mude '\n'para `\n`, fundir t+=...com t>=mpara remover para colchetes. Aqui está sua solução em 127 bytes com todas essas melhorias: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 3/15/15
@ user81655 Vou implementar algumas dessas mudanças! Quando tento o seu, recebo um SytaxError: token inesperado ILLEGAL (...). Observe que, para testar a função, eu adicionei f =
csga5000
1
SO adiciona alguns símbolos depois o+no final da linha. Exclua o+=ze escreva novamente e funcionará. : P
user81655 03/12/2015
@ user81655 eu não vejo como \nfaz qualquer diferença
csga5000
1
Você quer dizer o `\n`? Não funcionará sem ele porque o código está dentro "..."por causa do eval.
user81655
2

Python 3: 139 bytes

Abordagem ligeiramente diferente da outra resposta. Produz a saída real da pergunta, porque eu assumi inicialmente que era um requisito.

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

Exemplo de uso:

>>> 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
cutucar
fonte
2

Perl, 86 bytes

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

Contando o shebang como três, a entrada é retirada de stdin, com espaço separado.


Uso da amostra

$ 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
fonte
2

R, 155 bytes

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

Com recuos e quebras de linha:

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

Uso:

> 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
fonte
2

Python 2, 117 bytes

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

Toma entrada como lista:

>>[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
fonte
1

Perl, 76 bytes

Inclui +3 para -p(normalmente +1, mas +3 para jogar limpo com a outra solução perl)

Execute com a entrada STDIN (a nova linha final na entrada é opcional, mas DEVE estar ausente para a entrada vazia)

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

Olha ma, sem cálculos ...

Ton Hospel
fonte
Antes tarde do que nunca! Solução muito agradável embora :) #
22416 Dada
0s são bastante complicados nesta solução (representada por espaços extras) e eu tenho que ter muito cuidado para lidar adequadamente com espaços para manter o número de 0s correto. Em particular, considere entradas onde uma soma parcial é exatamente 15, como 1 14 2 13. Julgá-los sem a `` e ver o que acontece?
Ton Hospel
Sim, eu tentei e vi que 0s foram adicionados no início de algumas linhas, como você diz (foi por isso que excluí meu comentário 30 segundos depois de publicá-lo). Obrigado
Dada
0

Java - 158 155 bytes

Versão lambda de https://codegolf.stackexchange.com/a/65590/46866 por yassin-hajaj , Não tenho certeza se um envio válido, mas não possui representante suficiente para adicionar um comentário à resposta vinculada. Contado usando 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);}

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

pode ser usado como

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
fonte