Toplam her zaman 15


36

Girdi olarak negatif olmayan bir tamsayı dizisi alan ve giriş dizisinin öğeleriyle birlikte sırayla bir vektör / dizi dizisi çıkaran bir program veya işlev yazın, böylelikle her vektörün 15'e kadar toplanmasını sağlayın. N elementleri "15 çarpmaz", o zaman onu 15 geçen sayı kesilmeli ve kalan bir sonraki vektörün ilk elemanı olacaktır. Bu, giriş dizisinin sonuna ulaşana kadar devam eder. Son vektörün toplamı 15'ten azsa, toplamın artması için sonuna bir sayı eklenmelidir.

Örneklere bakarak kuralların daha kolay anlaşıldığını düşünüyorum:

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.

Hem giriş hem de çıkış formatı isteğe bağlıdır. Dilinde en iyisi ne.

Bayt cinsinden en kısa kod kazanır.


Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, cevapları a) dil başına en kısa çözümün bir listesi olarak ve b) genel bir lider tablosu olarak oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra pasajda görünecek bir bağlantı da yapabilirsiniz:

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


'Çıkış formatı isteğe bağlıdır'. Bu [[3, 7, 5], [10, 5]], ilk test durumu için geçerli bir çıktı anlamına mı geliyor ?
Morgan Thrapp

@ MorganThrapp, evet. bu geçerli.
Stewie Griffin,

1
@FlagAsSpam, sorduğunuz örnekte daha fazla açıklama ekledim.
Stewie Griffin,

3
İyi bir test durumu:Input: 100 Output: 15; 15; 15; 15; 15; 15; 10 5
15'te randomra

3
Bu kesinlikle FizzBuzz testinin yerine geçmeli
CSᵠ

Yanıtlar:


8

Pyth, 37 bayt

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

Açıklaması

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)

Bu benim ilk adımımdı, bu yüzden iyileştirmeler önermekten çekinmeyin.

Örnek:

Giriş

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

Çıktı

1
3
4
5
2


7
8

Not: Birkaç bayt boyut küçültme tavsiyesi ve ilk etapta pyth oluşturmak için Isaacg'a çok teşekkürler! Lütfen yorumlarını aşağıya oyla :)


2
Son zamanlarda başka bir şey .?yerine değiştirildi E, ancak dokümanları güncellemeyi unuttum. Bunun için üzgünüm.
isaacg

@isaacg Teşekkürler isaacg! Şimdi çalışmalıydım. Şimdilik 2 karakter olduğundan sadece 1 byte tasarruf etmesine rağmen.
csga5000

1
Konuştuğumuz gibi düzeltmek.
isaacg

3
Birkaç başka öneri: =Z+ZNve =+ZNaynı. Biraz Python's gibi +=. Aynı şekilde, =Z-ZK-> =-ZK. Ayrıca, )sonunda ihtiyacın yok - otomatik olarak doldurulur. Sonunda FNQve VQaynı.
isaacg

1
Sen değiştirerek başka 2 byte kaydedebilirsiniz I>Z0ile IZ- Zeğer gerçekten sadece kontrol ediyoruz, böylece negatif olamaz Zsıfır değildir, ve diğer tüm sayılar truthy ise sıfır, falsy olduğunu.
isaacg

16

Java - 229 200 192 181 172 170 168 bayt

Zaten başlamıştı, kazanmak için değil, eğlence için :)
Herhangi bir öneri kabul edilir.

@ThomasKwa sayesinde 8 bayt
kaydedildi @corsiKa sayesinde 20 bayt
kaydedildi @Ypnypn sayesinde
2 bayt kaydedildi @ user902383 ile 2 bayt kaydedildi

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 bayt

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 bayt

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 bayt

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 bayt

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 bayt

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 bayt

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
Vay, şimdiye kadar bir Java programında kullanılmaya devam edildiğini görmemiştim.
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)

Düzenle 5 Gerçekten golf oynadı, çünkü @ poke * Removed Satır Sonları vb.

Edit 4 Aliased print ve bir baytı kaydetmek için a = ile değiştirildi. @Poke ve @elzell için teşekkürler. Ayrıca, atamadan 2 bayttan tasarruf etmek için giriş değerlendirmesini loop for hareketine taşıdı

Düzenle 3 İkinci saniyede farklı OO’larda tasarruf bulundu

2 Sabit hatayı düzenleyin

Düzenle 1 Girdiyi '[1,2,3,4,5 ...]' biçiminde değiştirdi ve ilk iki yorumu uyguladı, @Morgan Thrapp sayesinde büyük

Burada ilk kez poster. Giriş, boşluklarla ayrılmış girişlerle komut satırıdır, çıkış, gruplama arasında yeni bir satırla, satır başına giriş şeklindedir.


3
Bir değişkene 15 atayarak ve girinti için yalnızca bir boşluk kullanarak bunu 122'ye indirebilirsiniz.
Morgan Thrapp

Ayrıca, ikinci sınavda başarısız olursanız, 2 3 5 elde ederim, ancak 5 2 3 5 olmalı.
Morgan Thrapp

1
@AdamMartin Kodunuzun Pyth versiyonuna ilginizi çekebilir
csga5000

1
Kullandığınız beri printsık sık, bir değişken olarak kaydedin gerekir: p=print. Size 14 karakter daha kazandırır.
dürtmek

2
Geçerli sayı 132'dir, ancak satır sonlarının bir kısmını kaldırırsanız 113'e indirebilirsiniz. Her if s>i:s-=i;p(e-s);p();e=sbirini , örneğin ikincisi için tek bir satıra birleştirebilirsiniz . Bu satır sonları ve girintili karakterleri kurtarır.
dürtmek

7

Haskell, 126 107 102 100 bayt

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

Kullanım örneği: (#[]).(++[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]]

Düzenleme: @Stewie Griffin 19 bayt tasarruf etmeme yardımcı oldu. Teşekkürler!


4

CJam, 39 bayt

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

Burada test et.

Bu çok yetersiz hissediyor, ancak şimdiye kadar benim daha kısa bir çözüme yönelik tüm girişimlerim girişteki sıfırların varlığıyla engellendi.


4

Python2 RegEx tarafından desteklenmektedir : 158 155 bayt

Sevgi ile python yapılmış ve neredeyse hiçbir matematik.
Ya da Regex Math yapacaksanız, sıradan matematik.
'Gerçek' matematik yalnızca son gereksinimi 'düzeltmek için' kullanılır:

Son vektörün toplamı 15'ten azsa, toplamın artması için sonuna bir sayı eklenmelidir.

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

Bunun işleyiş şekli, her N sayısını bir uzunluk uzunluğuna (bir dizgiyi doldurmak için karakter olarak seçilen x) bir dizgeye dönüştürmek ve hepsini ayrı bir alana birleştirmektir string. Sonuç dizesi RegEx BLACK MAGIC aracılığıyla şöyle bir şeye ayrılır:

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

Gibi bir giriş için: f([1, 2, 3, 4, 5, 6, 7, 8, 10])
Bu daha sonra tekrar bölünür ve ardışık xeslerin uzunluğu tekrar sayıları oluşturmak için kullanılır, her şey bir liste kavrayışında güzelce paketlenir.

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

Çıktı:

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

Not: 0'lar için yeterince büyü yoktu, bu yüzden bu giriş diskalifiye edildi.

sıfırlar dahil edilmelidir. İkinci örneğe bakın


Bütün bu isimler oldukça pahalıdır. Kod golfde regex gibi bir şey kullanmanın neredeyse imkansız olmasını sağlar. Yine de, bayt boyutunuz dikkate alındığında fena değil
csga5000 9:15

4

Cidden, 88 bayt

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

Çevrimiçi deneyin

Bu benim ilk Cidden cevabım! Şimdi tüm dilin eksikliklerini yakından tanıyorum!

Hex Dump:

2c6027212a2730604d27206a30bb603b3b3b277cee33352a2827213dbd2b3bbb252827203d7c2827303d7c49
29604dee6a277c407360936c60bc609427304073be4d604d643be433352a2d3b60586060407160499f40712e

Açıklama:

,`'!*'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 kod noktaları kullanılıyorsa, bu karakterler her biri 2 bayt olarak sayılıyor mu? : P
Dan

Gösterilen kaynaktaki unicode'u kullanıyorum, böylece görünmesi gerektiği gibi okunabiliyor. Aksi takdirde, yazdırılamaz olanlarla dolu rastgele çöpler gibi görünür. Resmi kaynak onaltılık çöplük.
quintopia

Komik bir soru olması gerekiyordu
Dan

1
Aynı zamanda başka bir okuyucunun merak edebileceği makul bir soruydu, ben de mizahsızca cevapladım.
quintopia

@quintopia +1 Yeni bir golf dili denemek için! Yeni diller eğlencelidir;) Bu soruya ilk kez de Pyth denedim.
csga5000

3

Javascript, 138 128 bayt

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

Boşluk ile:

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

Örnek:

Fonksiyonu bir değişkene atama

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

Öyleyse şöyle değerlendir:

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

1 4 10
1 4 5 5

Revizyon Geçmişi:

12/3/2015 00:02 - 10 bayt iyileştirme için user81655 (yorumlarda onu +1) sayesinde

12.02.2015 21:44 - Boyutu küçültmek için fonksiyonel stil kullanmaya geçildi.


3
: Bu bu sayıyı artırmak olabilir f=, site kurallarına göre gerekli değildir dan parantez kaldırmak (i)ile surround, evaldeğil gereğini yapmak, böylece returnveya parantez ve değiştirme ifböylece bir Üçlü ile odöndü ve değişim olduğu '\n'için `\n`, birleştirme t+=...ile t>=miçin kaldırmak Döngü dirsekleri. İşte tüm bu iyileştirmelerle 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")
baytta çözümünüz

@ user81655 Bu değişikliklerden bazılarını uygulayacağım! Sizinkini denediğimde SytaxError alıyorum: Beklenmedik belirteç ILLEGAL (...). Not, fonksiyonu test etmek için 5
39'da

1
SO o+, satırın sonunda bazı semboller ekler . Sil o+=zve tekrar yaz, işe yarayacak. : P
kullanıcı81655

@ user81655 Nasıl \nbir fark
yaratacağını anlamıyorum

1
Demek `\n`istiyorsun? Kod içeride çünkü onsuz çalışmaz "..."çünkü eval.
user81655

2

Python 3: 139 bayt

Diğer cevaptan biraz farklı yaklaşım. Asıl sorudan çıktılar çünkü başlangıçta bunun bir gereklilik olduğunu varsaydım.

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

Örnek kullanı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 bayt

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

Shebang'ı üç olarak sayarak girdi boşluktan ayrılmış, stdin'den alınmıştır.


Örnek Kullanım

$ 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 bayt

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

Girintilerle ve satır çizgilerle:

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

Kullanımı:

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

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

Listeyi girdi olarak alı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 bayt

İçin +3 içerir -p(normalde +1, ancak diğer perl çözümüyle adil oynamak için +3)

STDIN girişli Run (girişinde son satır isteğe bağlıdır, ancak GEREKİR boş girişi için mevcut olmayabilir)

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

Bak ma, hiçbir hesaplama yok ...


Geç olsun güç olmasın! Çok güzel bir çözüm olsa :)
Dada

0bu çözümde oldukça zorlar (fazladan boşluklarla temsil edilir) ve 0s sayısını doğru tutmak için alanları doğru bir şekilde idare etmede çok dikkatli olmalıyım . Özellikle, kısmi bir toplamın tam olarak 15 olduğu girişleri göz önünde bulundurun 1 14 2 13. Onları '?' Olmadan deneyin ve ne olacağını görün
Ton Hospel

Evet, denedim ve sizin de söylediğiniz gibi bazı satırların başında eklenen 0'ların olduğunu gördüm (bu yüzden yorumumu gönderdikten 30 saniye sonra sildim). Teşekkürler
Dada

0

Java - 158 155 bayt

Yassin-hajaj tarafından https://codegolf.stackexchange.com/a/65590/46866 adresinin Lambda sürümü, geçerli bir başvuru olup olmadığından emin değilim, ancak bağlantıya verilen cevaba yorum eklemek için yeterli temsilciniz yok. Http://meta.codegolf.stackexchange.com/questions/4944/byte-counter-snippet kullanılarak sayılır

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 Bayt

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

gibi kullanılabilir

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}));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.