Suma wynosi zawsze 15

36

Napisz program lub funkcję, która pobiera tablicę liczb całkowitych nieujemnych jako dane wejściowe i generuje zestaw wektorów / tablic z elementami tablicy wejściowej w kolejności, podziel tak, aby każdy wektor sumował się do 15. Jeśli suma pierwszego N elementów nie „uderza w 15”, wówczas liczbę, która przeszła 15, należy odciąć, a reszta będzie pierwszym elementem następnego wektora. Trwa to do momentu dotarcia do końca tablicy wejściowej. Jeśli suma końcowego wektora jest mniejsza niż 15, to na końcu należy dodać liczbę, aby suma wzrosła.

Myślę, że zasady łatwiej zrozumieć, patrząc na przykłady:

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.

Zarówno format wejściowy, jak i wyjściowy są opcjonalne. Cokolwiek jest najlepsze w twoim języku.

Najkrótszy kod w bajtach wygrywa.


Tabela liderów

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

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

Stewie Griffin
źródło
„Format wyjściowy jest opcjonalny”. Czy to oznacza, że [[3, 7, 5], [10, 5]]byłby prawidłowy wynik dla pierwszego przypadku testowego?
Morgan Thrapp,
@MorganThrapp, tak. to jest ważne.
Stewie Griffin,
1
@ FlagAsSpam, dodałem więcej wyjaśnień w przykładzie, o który pytasz.
Stewie Griffin,
3
Dobry przypadek testowy:Input: 100 Output: 15; 15; 15; 15; 15; 15; 10 5
randomra
3
To zdecydowanie powinno zastąpić test
FizzBuzz

Odpowiedzi:

8

Pyth, 37 bajtów

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

Wyjaśnił

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)

To był mój pierwszy pyth, więc sugeruj ulepszenia.

Przykład:

Wkład

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

Wydajność

1
3
4
5
2


7
8

Uwaga: Ogromne podziękowania dla Isaacga za kilka bajtów porady na temat zmniejszania rozmiaru i tworzenia pyta w pierwszej kolejności! Głosuj poniżej jego komentarze :)

csga5000
źródło
2
W przeciwnym razie ostatnio zmieniono na .?zamiast E, ale zapomniałem zaktualizować dokumenty. Przepraszam za to.
isaacg,
@isaacg Dzięki isaacg! Powinienem mieć to teraz. Chociaż oszczędza to tylko 1 bajt, ponieważ pozostałe mają teraz 2 znaki.
csga5000,
1
Naprawianie tego, gdy mówimy.
isaacg,
3
Kilka innych sugestii: =Z+ZNi =+ZNsą takie same. To trochę jak Python +=. Podobnie, =Z-ZK-> =-ZK. Ponadto nie potrzebujesz )na końcu - jest wypełniany automatycznie. Wreszcie FNQi VQsą takie same.
isaacg,
1
Możesz zapisać kolejne 2 bajty, zastępując I>Z0je IZ- Znie może być ujemne, więc tak naprawdę sprawdzasz, czy Znie jest zero, a zero jest fałszem, podczas gdy wszystkie inne liczby są prawdziwe.
isaacg
16

Java - 229 200 192 181 172 170 168 bajtów

Już się zaczęło, nie dla wygranej, ale dla zabawy :)
Wszelkie sugestie są mile widziane.

Zapisano 8 bajtów dzięki @ThomasKwa
Zapisano 20 bajtów dzięki @corsiKa
Zapisano 2 bajty dzięki @Ypnypn
Zapisano 2 bajty dzięki @ 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 bajtów

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 bajty

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 bajtów

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 bajty

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 bajtów

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 bajtów

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
źródło
1
Wow, do tej pory nie widziałem dalszego używania w programie Java.
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)

Edytuj 5 Naprawdę gra w golfa dzięki @poke * usuniętym podziałom linii itp

Edytuj 4 Wydruk z aliasem i zastąpił znak a = - =, aby zapisać bajt. Dzięki @poke i @elzell. Przeniesiono również eval wejściowy do pętli for, aby zapisać 2 bajty z przydziału

Edytuj 3 Znaleziono oszczędności w różnych OO w ciągu sekundy if

Edytuj 2 Naprawiono błąd

Edycja 1 Zmieniono dane wejściowe w postaci „[1,2,3,4,5 ...]” i zaimplementowano pierwsze dwa komentarze, wielkie dzięki @Morgan Thrapp

Pierwszy plakat tutaj. Dane wejściowe to wiersz poleceń z wpisami oddzielonymi spacjami, dane wyjściowe to wpisy w wierszu, z nową linią między grupami.

Adam Martin
źródło
3
Możesz sprowadzić go do 122, przypisując 15 do zmiennej i używając tylko jednego miejsca na wcięcie.
Morgan Thrapp,
Nie zdajesz też drugiego przypadku testowego, dostaję 2 3 5, ale powinno to być 5 2 3 5.
Morgan Thrapp
1
@AdamMartin Możesz być zainteresowany moją wersją kodu w języku
Pyth
1
Ponieważ używasz printtak często, należy go zapisać jako zmienną: p=print. Oszczędza ci kolejne 14 znaków.
poke
2
Obecna liczba wynosi 132, ale możesz ją obniżyć do 113, jeśli usuniesz niektóre podziały linii. Możesz połączyć każdy jeśli w jedną linię, np. if s>i:s-=i;p(e-s);p();e=sDla drugiej. To oszczędza ci łamania linii i wcięć.
poke
7

Haskell, 126 107 102 100 bajtów

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

Przykład użycia: (#[]).(++[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]]

Edycja: @Stewie Griffin pomógł mi zaoszczędzić 19 bajtów. Dzięki!

nimi
źródło
4

CJam, 39 bajtów

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

Sprawdź to tutaj.

To wydaje się bardzo nieoptymalne, ale jak dotąd wszystkie moje próby znalezienia krótszego rozwiązania zostały udaremnione przez obecność zer na wejściu.

Martin Ender
źródło
4

Python2 powered by RegEx : 158 155 bajtów

Wykonane w pytonie z miłością i prawie bez matematyki.
Lub Regex Math, jeśli chcesz, jednoargumentowa matematyka.
„Prawdziwa” matematyka używana tylko do „naprawy” ostatniego wymagania:

Jeśli suma końcowego wektora jest mniejsza niż 15, to na końcu należy dodać liczbę, aby suma wzrosła.

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

Działa to poprzez konwersję każdej liczby N na ciąg długości N ( x wybrany jako znak do wypełnienia ciągu) i połączenie ich wszystkich w oddzielone spacje string. Otrzymany ciąg jest dzielony za pomocą RegEx BLACK MAGIC na coś takiego:

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

dla danych wejściowych takich jak: f([1, 2, 3, 4, 5, 6, 7, 8, 10])
To jest następnie dzielone ponownie, a długość kolejnych xes jest używana do ponownego tworzenia liczb, wszystko ładnie zapakowane w zrozumienie listy.

Nie golfowany:

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

Wydajność:

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

Uwaga: magii było za mało dla zer, więc ten wpis dyskwalifikuje

zera muszą być uwzględnione. Zobacz drugi przykład

CSᵠ
źródło
Wszystkie te nazwy funkcji są dość drogie. Sprawia, że ​​używanie czegoś takiego jak wyrażenie regularne jest prawie niemożliwe w golfowym kodzie. Mimo to rozmiar bajtów nie jest zły, biorąc pod uwagę
csga5000
4

Poważnie, 88 bajtów

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

Wypróbuj online

To moja pierwsza poważna odpowiedź! Teraz jestem dokładnie zaznajomiony ze wszystkimi niedociągnięciami języka!

Hex Dump:

2c6027212a2730604d27206a30bb603b3b3b277cee33352a2827213dbd2b3bbb252827203d7c2827303d7c49
29604dee6a277c407360936c60bc609427304073be4d604d643be433352a2d3b60586060407160499f40712e

Wyjaśnienie:

,`'!*'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.
kwintopia
źródło
Jeśli używane są punkty kodowe Unicode, to czy te znaki liczą się jako 2 bajty każdy? : P
Dan
Używam Unicode w przedstawionym źródle, aby można było odczytać tak, jak powinien wyglądać. W przeciwnym razie wyglądałoby to na losowe śmieci pełne materiałów niedrukowalnych. Oficjalnym źródłem jest zrzut heksowy.
kwintopia
To miało być humorystyczne pytanie
Dan
1
Było to również rozsądne pytanie, o którym mógłby zastanawiać się inny czytelnik, więc odpowiedziałem na to bez humoru.
kwintopia
@quintopia +1 Za wypróbowanie nowego języka golfa! Nowe języki są fajne;) Po raz pierwszy spróbowałem również pyth w tej kwestii.
csga5000,
3

JavaScript, 138 128 bajtów

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

Z białymi znakami:

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

Przykład:

Przypisz funkcję do zmiennej

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

Następnie oceń tak:

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

1 4 10
1 4 5 5

Historia zmian:

12/3/2015 00:02 - Dzięki użytkownikowi 81655 (daje +1 w komentarzach) za 10 bajtów poprawy

12/2/2015 21:44 - Przełączono na użycie funkcjonalnego stylu w celu zmniejszenia rozmiaru.

csga5000
źródło
3
Możesz to poprawić za pomocą: f=nie jest potrzebne zgodnie z regułami witryny, usuń nawiasy z (i), otaczaj, evalwięc nie potrzebujesz returnlub nawiasów i zamień na iftrójskładnik, aby ozostał zwrócony i zmień '\n'na `\n`, scal t+=...z, t>=maby usunąć dla wsporniki pętli. Oto twoje rozwiązanie w 127 bajtach z wszystkimi tymi ulepszeniami: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 Zaimplementuję niektóre z tych zmian! Kiedy próbuję twojego, dostaję SytaxError: Nieoczekiwany token NIELEGALNY (...). Uwaga: w celu przetestowania funkcji dodałem f =
csga5000
1
SO dodaje kilka symboli po o+końcu linii. Usuń o+=zi napisz to ponownie, a będzie działać. : P
user81655
@ user81655 Nie rozumiem, jak to \nrobi jakąkolwiek różnicę
csga5000
1
Masz na myśli `\n`? Bez niego nie będzie działać, ponieważ kod jest w środku z "..."powodu eval.
user81655,
2

Python 3: 139 bajtów

Nieco inne podejście niż druga odpowiedź. Daje rzeczywistą wydajność z pytania, ponieważ początkowo założyłem, że to wymaganie.

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

Przykładowe użycie:

>>> 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
szturchać
źródło
2

Perl, 86 bajtów

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

Licząc shebang jako trzy, dane wejściowe są pobierane ze standardowego wejścia, oddzielone spacją.


Przykładowe użycie

$ 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
źródło
2

R, 155 bajtów

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

Z wcięciami i podziałami linii:

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

Stosowanie:

> 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
źródło
2

Python 2, 117 bajtów

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

Pobiera dane wejściowe jako listę:

>>[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
źródło
1

Perl, 76 bajtów

Obejmuje +3 za -p(zwykle +1, ale +3, aby grać fair z innym rozwiązaniem perla)

Uruchom z wejściem na STDIN (ostatnia nowa linia na wejściu jest opcjonalna, ale MUSI być nieobecna dla pustego wejścia)

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

Spójrz, nie ma żadnych obliczeń ...

Ton Hospel
źródło
Lepiej późno niż wcale! Bardzo fajne rozwiązanie :)
Dada
0s są dość trudne w tym rozwiązaniu (reprezentowane przez dodatkowe spacje) i muszę być bardzo ostrożny, aby poprawnie obsługiwać spacje, aby zachować 0poprawną liczbę s. W szczególności rozważ dane wejściowe, w których suma częściowa wynosi dokładnie 15, np 1 14 2 13. Wypróbuj je bez
znaku
Tak, próbowałem i zobaczyłem, że 0 jest dodawane na początku niektórych wierszy, jak mówisz (dlatego usunąłem swój komentarz 30 sekund po opublikowaniu). Dzięki
Dada,
0

Java - 158 155 bajtów

Wersja Lambda https://codegolf.stackexchange.com/a/65590/46866 autor: yassin-hajaj , Nie jestem pewien, czy jest to poprawne zgłoszenie, ale nie masz wystarczającej liczby przedstawicieli, aby dodać komentarz do powiązanej odpowiedzi. Liczone przy użyciu 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 bajtów

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

Bez golfa

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

może być używany jak

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
źródło