Die Summe ist immer 15

36

Schreiben Sie ein Programm oder eine Funktion, die ein Array nicht negativer Ganzzahlen als Eingabe verwendet und eine Reihe von Vektoren / Arrays mit den Elementen des Eingabearrays in der angegebenen Reihenfolge ausgibt. Teilen Sie diese so auf, dass jeder Vektor bis zu 15 summiert N Elemente "treffen 15" nicht, dann muss die Zahl, die 15 passiert hat, abgeschnitten werden, und der Rest ist das erste Element des nächsten Vektors. Dies geht so lange weiter, bis Sie das Ende des Eingabearrays erreicht haben. Wenn die Summe des Endvektors kleiner als 15 ist, muss am Ende eine Zahl hinzugefügt werden, damit die Summe steigt.

Ich denke, die Regeln sind leichter zu verstehen, wenn man sich die Beispiele ansieht:

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.

Sowohl das Eingabe- als auch das Ausgabeformat ist optional. Was auch immer am besten in Ihrer Sprache ist.

Der kürzeste Code in Bytes gewinnt.


Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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

Stewie Griffin
quelle
'Ausgabeformat ist optional'. Bedeutet das, [[3, 7, 5], [10, 5]]dass dies eine gültige Ausgabe für den ersten Testfall ist?
Morgan Thrapp
@ MorganThrapp, ja. das ist gültig.
Stewie Griffin
1
@FlagAsSpam, ich habe dem Beispiel, nach dem Sie fragen, weitere Erklärungen hinzugefügt.
Stewie Griffin
3
Guter Testfall:Input: 100 Output: 15; 15; 15; 15; 15; 15; 10 5
Randomra
3
Dies sollte definitiv den FizzBuzz-Test ersetzen
CSᵠ

Antworten:

8

Pyth, 37 Bytes

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

Erklärt

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)

Dies war mein erster Pyth, also zögern Sie nicht, Verbesserungen vorzuschlagen.

Beispiel:

Eingang

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

Ausgabe

1
3
4
5
2


7
8

Hinweis: Vielen Dank an Isaacg für einige Ratschläge zur Größenreduzierung und zur ersten Erstellung von Pyth! Bitte stimmen Sie seine Kommentare unten :)

csga5000
quelle
2
Else wurde kürzlich geändert, um .?anstelle von zu sein E, aber ich vergaß, die Dokumente zu aktualisieren. Das tut mir leid.
isaacg
@isaacg Danke isaacg! Das sollte jetzt funktionieren. Es wird jedoch nur 1 Byte gespeichert, da der übrige Wert jetzt 2 Zeichen umfasst.
csga5000
1
Behebung beim Sprechen.
isaacg
3
Ein paar andere Vorschläge: =Z+ZNund =+ZNsind die gleichen. Es ist ein bisschen wie bei Python +=. Likewiese, =Z-ZK-> =-ZK. Außerdem brauchen Sie das )am Ende nicht - es wird automatisch ausgefüllt. Schließlich FNQund VQsind die gleichen.
isaacg
1
Sie können weitere 2 Byte einsparen, indem Sie I>Z0durch IZ- ersetzen. Dies Zkann nicht negativ sein. Sie überprüfen also nur, ob Znicht Null und Null falsch ist, während alle anderen Zahlen der Wahrheit entsprechen.
Isaacg
16

Java - 229 200 192 181 172 170 168 Bytes

Hatte schon begonnen, nicht um zu gewinnen, sondern um Spaß zu haben :)
Jeder Vorschlag ist willkommen.

8 Bytes dank @ThomasKwa
gespeichert 20 Bytes dank @corsiKa
gespeichert 2 Bytes dank @Ypnypn
gespeichert 2 Bytes dank @ user902383 gespeichert

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
quelle
1
Wow, hatte bis jetzt noch nicht gesehen, wie es tatsächlich in einem Java-Programm weiterging.
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)

Edit 5 Wirklich golfen dank @poke * entfernter Zeilenumbrüche etc

Bearbeiten Sie 4 Alias-Druck und ersetzen Sie ein = durch ein - =, um ein Byte zu speichern. Danke an @poke und @elzell. Außerdem wurde die Eingabeauswertung in die for-Schleife verschoben, um 2 Byte von der Zuweisung zu sparen

Edit 3 Gefundene Einsparungen in verschiedenen OO innerhalb von Sekunden, wenn

Edit 2 Fehler behoben

Bearbeiten 1 Die Eingabe wurde in die Form '[1,2,3,4,5 ...]' geändert und die ersten beiden Kommentare wurden implementiert, ein großes Dankeschön an @Morgan Thrapp

Zum ersten Mal Poster hier. Die Eingabe ist eine Befehlszeile mit durch Leerzeichen getrennten Einträgen, die Ausgabe erfolgt zeilenweise mit einer neuen Zeile zwischen den Gruppierungen.

Adam Martin
quelle
3
Sie können es auf 122 bringen, indem Sie einer Variablen 15 zuweisen und nur ein Leerzeichen für den Einzug verwenden.
Morgan Thrapp
Auch wenn Sie den zweiten Testfall nicht bestehen, erhalte ich 2 3 5, aber es sollte 5 2 3 5 sein.
Morgan Thrapp
1
@AdamMartin Sie könnten an meiner Pyth-Version Ihres Codes interessiert sein
csga5000
1
Da Sie verwenden printso oft, sollten Sie es als Variable speichern: p=print. Speichert weitere 14 Zeichen.
Poke
2
Die aktuelle Anzahl ist 132, aber Sie können sie auf 113 senken, wenn Sie einige der Zeilenumbrüche entfernen. Sie können jedes Wenn zu einer einzigen Zeile zusammenfassen, z. B. if s>i:s-=i;p(e-s);p();e=sfür die zweite. Das erspart Ihnen Zeilenumbrüche und Einrückungszeichen.
Poke
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])

Anwendungsbeispiel: (#[]).(++[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 hat mir geholfen, 19 Bytes zu sparen. Vielen Dank!

nimi
quelle
4

CJam, 39 Bytes

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

Teste es hier.

Das fühlt sich sehr suboptimal an, aber bisher wurden alle meine Versuche einer kürzeren Lösung durch das Vorhandensein von Nullen in der Eingabe vereitelt.

Martin Ender
quelle
4

Python2 powered by RegEx : 158 bis 155 Bytes

Mit Liebe und fast ohne Mathe in Python gemacht.
Oder Regex Math, wenn Sie so wollen, unäre Mathematik.
"Echte" Mathematik dient nur dazu, die letzte Anforderung zu "reparieren":

Wenn die Summe des Endvektors kleiner als 15 ist, muss am Ende eine Zahl hinzugefügt werden, damit die Summe steigt.

Codegolf:

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

Die Art und Weise, wie dies funktioniert, besteht darin, jede Zahl N in eine Zeichenfolge der Länge N ( x als Zeichen zum Auffüllen der Zeichenfolge ausgewählt) umzuwandeln und sie alle in einem Leerzeichen zu verbinden string. Die resultierende Zeichenfolge wird über RegEx BLACK MAGIC in Folgendes aufgeteilt:

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

für eine Eingabe wie: f([1, 2, 3, 4, 5, 6, 7, 8, 10])
Das ist dann wieder geteilt, und die Länge aufeinanderfolgender xes wird verwendet, um die Zahlen erneut zu erstellen, alles schön in einem Listenverständnis gepackt.

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

Ausgabe:

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

Hinweis: Es gab nicht genug Magie für die Nullen, daher wird dieser Eintrag disqualifiziert

Nullen müssen enthalten sein. Siehe das zweite Beispiel

CSᵠ
quelle
Alle diese Funktionsnamen sind ziemlich teuer. Macht die Verwendung von so etwas wie Regex im Codegolf fast unmöglich. Trotzdem ist Ihre
Bytegröße
4

Im Ernst, 88 Bytes

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

Probieren Sie es online aus

Es ist meine erste ernsthafte Antwort! Jetzt kenne ich alle Mängel der Sprache genau!

Hex Dump:

2c6027212a2730604d27206a30bb603b3b3b277cee33352a2827213dbd2b3bbb252827203d7c2827303d7c49
29604dee6a277c407360936c60bc609427304073be4d604d643be433352a2d3b60586060407160499f40712e

Erläuterung:

,`'!*'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.
Quintopie
quelle
Wenn Unicode-Codepunkte verwendet werden, zählen diese Zeichen dann jeweils als 2 Byte? : P
Dan
Ich verwende den Unicode in der abgebildeten Quelle, damit er so gelesen werden kann, wie er aussehen soll. Andernfalls würde es wie zufälliger Müll voller nicht druckbarer Dateien aussehen. Die offizielle Quelle ist der Hex-Dump.
Quintopia
Es sollte eine humorvolle Frage sein
Dan
1
Es war auch eine vernünftige Frage, über die sich ein anderer Leser wundern könnte, deshalb beantwortete ich sie humorlos.
Quintopia
@quintopia +1 Für das Ausprobieren einer neuen Golfsprache! Neue Sprachen machen Spaß;) Auch bei dieser Frage habe ich Pyth zum ersten Mal ausprobiert.
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")

Mit Leerzeichen:

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

Beispiel:

Weisen Sie die Funktion einer Variablen zu

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

Dann bewerte wie folgt:

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

1 4 10
1 4 5 5

Versionsgeschichte:

03.12.2015 00:02 - Vielen Dank an user81655 (+1 in den Kommentaren) für die 10-Byte-Verbesserung

02.12.2015 21:44 - Umgestellt, um den funktionalen Stil zu verwenden, um die Größe zu reduzieren.

csga5000
quelle
3
Man könnte dies mit diesen verbessern: f=nicht erforderlich ist , nach Aufstellungsortrichtlinien, entfernen Sie die Klammern aus (i), Surround mit , evalso dass Sie nicht brauchen returnoder die Klammern und ersetzen die ifmit einem ternären so dass ozurückgegeben und Änderung '\n'zu `\n`, merge t+=...mit t>=mentfernen Loop-Klammern. Hier ist Ihre Lösung in 127 Bytes mit all diesen Verbesserungen: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 Ich werde einige dieser Änderungen implementieren! Wenn ich deins versuche, erhalte ich ein SytaxError: Unerwartetes Token ILLEGAL (...). Beachten Sie, um die Funktion zu testen, habe ich f =
csga5000
1
SO fügt nach o+dem Zeilenende einige Symbole hinzu . Löschen o+=zund schreiben Sie es erneut und es wird funktionieren. : P
user81655
@ user81655 Ich sehe \nkeinen Unterschied
csga5000
1
Du meinst das `\n`? Ohne geht es nicht, weil der Code "..."wegen der eval.
User81655
2

Python 3: 139 Bytes

Etwas anderer Ansatz als die andere Antwort. Produziert die tatsächliche Ausgabe der Frage, da ich anfangs davon ausgegangen bin, dass dies eine Anforderung war.

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

Anwendungsbeispiel:

>>> 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
Sack
quelle
2

Perl, 86 Bytes

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

Wenn Sie den Shebang als drei zählen, wird die Eingabe von stdin übernommen, wobei das Leerzeichen getrennt ist.


Beispielnutzung

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

Mit Einrückungen und Zeilenumbrüchen:

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

Verwendung:

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

Übernimmt die Eingabe als Liste:

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

Perl, 76 Bytes

Beinhaltet +3 für -p(normalerweise +1, aber +3, um fair mit der anderen Perl-Lösung zu spielen)

Mit der Eingabe auf STDIN ausführen (der letzte Zeilenumbruch bei der Eingabe ist optional, MUSS jedoch für die leere Eingabe fehlen)

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

Schau ma, überhaupt keine Berechnungen ...

Tonne Hospel
quelle
Besser spät als nie! Sehr schöne Lösung :)
Dada
0s sind in dieser Lösung ziemlich knifflig (dargestellt durch zusätzliche Leerzeichen), und ich muss sehr vorsichtig mit Leerzeichen umgehen, um die 0korrekte Anzahl von s beizubehalten. Betrachten Sie insbesondere Eingaben, bei denen eine Teilsumme genau 15 ist, wie 1 14 2 13. Probieren Sie sie ohne das "?" Und sehen Sie, was passiert
Ton Hospel
Ja, ich habe es ausprobiert und gesehen, dass am Anfang einiger Zeilen, wie Sie sagen, Nullen hinzugefügt wurden (deshalb habe ich meinen Kommentar 30 Sekunden nach dem Posten gelöscht). Danke
Dada
0

Java - 158 155 Bytes

Lambda-Version von https://codegolf.stackexchange.com/a/65590/46866 von yassin-hajaj , Ich bin nicht sicher, ob eine gültige Einsendung vorliegt , habe aber nicht genügend Mitarbeiter, um einen Kommentar zu der verknüpften Antwort hinzuzufügen. Mit http://meta.codegolf.stackexchange.com/questions/4944/byte-counter-snippet gezählt

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

kann gerne verwendet werden

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
quelle