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


'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 :)


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

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.


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!


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.


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


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.

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.


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

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

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

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]

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


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}));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.