ผลรวมอยู่เสมอ 15


36

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้อาร์เรย์ของจำนวนเต็มที่ไม่เป็นลบเป็นอินพุตและเอาต์พุตชุดของเวกเตอร์ / อาร์เรย์ที่มีองค์ประกอบของอาร์เรย์อินพุตตามลำดับให้แยกเพื่อให้เวกเตอร์แต่ละอันรวมกันเป็น 15 ถ้าผลรวมของแรก อิลิเมนต์ N จะไม่ "โดน 15" ดังนั้นจำนวนที่ผ่าน 15 ต้องถูกตัดออกและส่วนที่เหลือจะเป็นองค์ประกอบแรกของเวกเตอร์ถัดไป สิ่งนี้จะดำเนินต่อไปจนกว่าจะถึงจุดสิ้นสุดของอาร์เรย์อินพุต หากผลรวมของเวกเตอร์สุดท้ายนั้นน้อยกว่า 15 จะต้องเพิ่มจำนวนท้ายเพื่อให้ผลรวมเพิ่มขึ้น

ฉันคิดว่ากฎนั้นเข้าใจง่ายกว่าโดยดูจากตัวอย่าง:

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.

ทั้งอินพุตและรูปแบบเอาต์พุตเป็นทางเลือก สิ่งที่ดีที่สุดในภาษาของคุณ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

คุณสามารถทำให้ชื่อภาษาเป็นลิงค์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

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


'รูปแบบเอาต์พุตเป็นตัวเลือก' หมายความว่า[[3, 7, 5], [10, 5]]จะเป็นผลลัพธ์ที่ถูกต้องสำหรับกรณีทดสอบครั้งแรก?
Morgan Thrapp

@ MorganThrapp ใช่ ถูกต้อง
Stewie Griffin

1
@FlagAsSpam ฉันได้เพิ่มคำอธิบายเพิ่มเติมในตัวอย่างที่คุณถาม
Stewie Griffin

3
กรณีทดสอบที่ดี:Input: 100 Output: 15; 15; 15; 15; 15; 15; 10 5
สุ่ม

3
สิ่งนี้ควรแทนที่การทดสอบ
FizzBuzz

คำตอบ:


8

Pyth, 37 ไบต์

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

อธิบาย

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)

นี่เป็น pyth แรกของฉันดังนั้นอย่าลังเลที่จะแนะนำการปรับปรุง

ตัวอย่าง:

อินพุต

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

เอาท์พุต

1
3
4
5
2


7
8

หมายเหตุ:ขอบคุณ Isaacg สำหรับคำแนะนำการลดขนาดหลายไบต์และการสร้าง pyth ตั้งแต่แรก! กรุณาโหวตความคิดเห็นของเขาด้านล่าง :)


2
เมื่อเร็ว ๆ นี้มีการเปลี่ยนแปลงเป็น.?แทนที่Eแต่ฉันลืมอัปเดตเอกสาร ขอโทษสำหรับเรื่องนั้น.
isaacg

@isaacg ขอบคุณ isaacg! ฉันควรที่จะทำงานตอนนี้ แม้ว่าจะบันทึกได้เพียง 1 ไบต์เนื่องจากตัวละครนั้นเป็น 2 ตัวในขณะนี้
csga5000

1
แก้ไขมันตามที่เราพูด
isaacg

3
ข้อเสนอแนะอื่น ๆ : =Z+ZNและ=+ZNเหมือนกัน +=มันเป็นบิตเช่นงูหลาม Likewiese, ->=Z-ZK =-ZKนอกจากนี้คุณไม่จำเป็นต้องใช้)ในตอนท้าย - มันจะถูกเติมโดยอัตโนมัติ ในที่สุดFNQและVQเหมือนกัน
isaacg

1
คุณสามารถบันทึกอีก 2 ไบต์ได้ด้วยการแทนที่I>Z0ด้วยIZ- Zไม่สามารถลบได้ดังนั้นคุณแค่ตรวจสอบว่าZไม่ใช่ศูนย์และศูนย์นั้นเป็นเท็จในขณะที่ตัวเลขอื่น ๆ ทั้งหมดเป็นจริง
isaacg

16

Java - 229 200 192 181 172 170 168 ไบต์

ได้เริ่มขึ้นแล้วไม่ใช่เพื่อชัยชนะ แต่เพื่อความสนุก :)
ข้อเสนอแนะใด ๆ ยินดีต้อนรับ

บันทึก 8 ไบต์ขอบคุณ @ThomasKwa
บันทึกแล้ว 20 ไบต์ขอบคุณ @corsiKa
บันทึก 2 ไบต์ขอบคุณ @Ypnypn
บันทึก 2 ไบต์ขอบคุณ @ 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 ไบต์

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 ไบต์

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 ไบต์

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 ไบต์

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 ไบต์

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 ไบต์

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
ว้าวไม่เคยเห็นการใช้งานจริงในโปรแกรม 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)

แก้ไข 5อย่างแท้จริง golfed ขอบคุณ @poke * เอาตัวแบ่งบรรทัด ฯลฯ

แก้ไข 4 Aliased print และแทนที่ a = ด้วย a - = เพื่อบันทึก byte ขอบคุณ @poke และ @elzell ย้ายอินพุต eval ไปเป็นลูปเพื่อบันทึก 2 ไบต์จากการกำหนด

แก้ไข 3พบการประหยัดใน OO ที่แตกต่างกันภายในไม่กี่วินาทีถ้า

แก้ไข 2แก้ไขข้อบกพร่อง

แก้ไข 1เปลี่ยนอินพุตให้อยู่ในรูปแบบ '[1,2,3,4,5 ... ]' และใช้งานความคิดเห็นสองรายการแรกขอบคุณมากกับ @Morgan Thrapp

โปสเตอร์ครั้งแรกที่นี่ อินพุตเป็นบรรทัดคำสั่งที่มีรายการคั่นด้วยช่องว่างเอาต์พุตคือรายการต่อบรรทัดโดยมีบรรทัดใหม่ระหว่างการจัดกลุ่ม


3
คุณสามารถรับมันได้ที่ 122 โดยการกำหนด 15 ให้กับตัวแปรและใช้เพียงหนึ่งช่องว่างสำหรับการเยื้อง
Morgan Thrapp

นอกจากนี้คุณล้มเหลวในกรณีทดสอบที่สองฉันได้รับ 2 3 5 แต่มันควรจะเป็น 5 2 3 5
Morgan Thrapp

1
@AdamMartin คุณอาจจะสนใจรหัส
Pyth

1
เนื่องจากคุณกำลังใช้จึงมักจะคุณควรบันทึกเป็นตัวแปร:print p=printช่วยให้คุณประหยัดอีก 14 ตัวอักษร
โผล่

2
จำนวนปัจจุบันคือ 132 แต่คุณสามารถลดลงได้ถึง 113 หากคุณลบตัวแบ่งบรรทัดบางส่วน คุณสามารถรวมทุก ๆ หากเป็นบรรทัดเดียวเช่นif s>i:s-=i;p(e-s);p();e=sสำหรับบรรทัดที่สอง ที่ช่วยให้คุณแบ่งบรรทัดและตัวอักษรเยื้อง
โผล่

7

Haskell, 126 107 102 100 ไบต์

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

ตัวอย่างการใช้: (#[]).(++[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]]

แก้ไข: @Stewie Griffin ช่วยให้ฉันประหยัดได้ 19 ไบต์ ขอบคุณ!


4

CJam, 39 ไบต์

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

ทดสอบที่นี่

สิ่งนี้ให้ความรู้สึกที่ไม่ดีนัก แต่ความพยายามทั้งหมดของฉันในการแก้ปัญหาที่สั้นกว่านั้นถูกทำลายโดยการมีศูนย์ในอินพุต


4

Python2 ขับเคลื่อนโดย RegEx : 158 155ไบต์

สร้างด้วยงูหลามด้วยความรักและแทบไม่มีคณิตศาสตร์
หรือคณิตศาสตร์ Regex ถ้าคุณจะคณิตศาสตร์เอก
คณิตศาสตร์ 'ของจริง' ใช้เพื่อ 'แก้ไข' ข้อกำหนดสุดท้ายเท่านั้น:

หากผลรวมของเวกเตอร์สุดท้ายนั้นน้อยกว่า 15 จะต้องเพิ่มจำนวนท้ายเพื่อให้ผลรวมเพิ่มขึ้น

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

วิธีการทำงานนี้โดยการแปลงแต่ละหมายเลข N เป็นสตริงที่มีความยาว N (กxเลือกให้เป็นถ่านที่จะเติมสตริง) stringและร่วมงานกับพวกเขาทั้งหมดเข้ามาในพื้นที่แยก สตริงผลลัพธ์ถูกแบ่งผ่านRegEx BLACK MAGICออกเป็นดังนี้:

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

สำหรับอินพุทที่ชอบ: f([1, 2, 3, 4, 5, 6, 7, 8, 10])
จากนั้นก็แยกอีกครั้งและความยาวของxเอสอีติดต่อกันจะถูกใช้เพื่อสร้างตัวเลขอีกครั้งทุกอย่างที่อัดแน่นอยู่ในรายการความเข้าใจ

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

เอาท์พุท:

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

หมายเหตุ: มีเวทมนต์ไม่เพียงพอสำหรับยุค 0 ดังนั้นรายการนี้จะตัดสิทธิ์

ต้องรวมศูนย์ ดูตัวอย่างที่สอง


ชื่อฟังก์ชั่นเหล่านั้นค่อนข้างแพง ทำให้การใช้บางอย่างเช่น regex เป็นไปไม่ได้ในการเล่นกอล์ฟ ถึงกระนั้นขนาดไบต์ของคุณก็ไม่เลวเมื่อพิจารณา
csga5000

4

จริงจัง, 88 ไบต์

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

ลองออนไลน์

มันเป็นคำตอบแรกของฉันอย่างจริงจัง! ตอนนี้ฉันคุ้นเคยกับข้อบกพร่องของภาษาอย่างใกล้ชิด!

ฐานสิบหก:

2c6027212a2730604d27206a30bb603b3b3b277cee33352a2827213dbd2b3bbb252827203d7c2827303d7c49
29604dee6a277c407360936c60bc609427304073be4d604d643be433352a2d3b60586060407160499f40712e

คำอธิบาย:

,`'!*'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 ตัวอักษรเหล่านั้นนับเป็น 2 ไบต์หรือไม่ : P
Dan

ฉันใช้ยูนิโค้ดในแหล่งที่ปรากฎเพื่อให้สามารถอ่านได้ในลักษณะที่มันควรจะเป็น มิฉะนั้นมันจะดูเหมือนขยะสุ่มที่เต็มไปด้วย unprintables แหล่งที่มาอย่างเป็นทางการคือฐานสิบหก
quintopia

มันควรจะเป็นคำถามที่มีอารมณ์ขัน
Dan

1
มันเป็นคำถามที่สมเหตุสมผลที่ผู้อ่านคนอื่นอาจสงสัยเกี่ยวกับเรื่องนี้ดังนั้นฉันตอบมันอย่างตลก
quintopia

@quintopia +1 สำหรับการลองภาษากอล์ฟใหม่! ภาษาใหม่สนุก;) ฉันลอง pyth เป็นครั้งแรกในคำถามนี้เช่นกัน
csga5000

3

Javascript, 138 128 ไบต์

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

ด้วยช่องว่าง:

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

ตัวอย่าง:

กำหนดฟังก์ชั่นให้กับตัวแปร

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

จากนั้นประเมินเช่น:

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

1 4 10
1 4 5 5

ประวัติการแก้ไข:

12/3/2558 00:02 - ขอบคุณ user81655 (+1 เขาในความคิดเห็น) สำหรับการปรับปรุง 10 ไบต์

12/2/2015 21:44 - เปลี่ยนเป็นใช้สไตล์การทำงานตามลำดับเพื่อลดขนาด


3
คุณสามารถปรับปรุงนี้กับเหล่านี้f=ไม่จำเป็นต้องตามกฎเว็บไซต์ลบวงเล็บจาก(i)ล้อมรอบด้วยevalดังนั้นคุณจึงไม่จำเป็นต้องใช้returnหรือวงเล็บและแทนที่ifด้วย ternary เพื่อที่oจะถูกส่งกลับและการเปลี่ยนแปลง'\n'ที่จะ`\n`ผสานt+=...กับt>=mการถอด วงเล็บห่วง นี่คือวิธีการแก้ปัญหาของคุณใน 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")
user81655

@ user81655 ฉันจะใช้การเปลี่ยนแปลงเหล่านั้น! เมื่อฉันลองของคุณฉันจะได้รับ SytaxError: โทเค็นที่ไม่คาดคิด ILLEGAL (... ) หมายเหตุเพื่อทดสอบฟังก์ชั่นฉันเพิ่ม f =
csga5000

1
ดังนั้นเพิ่มสัญลักษณ์บางอย่างหลังจากo+ที่ตอนท้ายของบรรทัด ลบo+=zและเขียนอีกครั้งและมันจะทำงาน : P
user81655

@ user81655 ฉันไม่เห็นว่า\nสร้างความแตกต่างใด ๆ
csga5000

1
คุณหมายถึง`\n`? มันจะไม่ทำงานโดยไม่ได้เพราะรหัสที่อยู่ภายในเพราะ"..." eval
user81655

2

Python 3: 139 ไบต์

วิธีการที่แตกต่างกันเล็กน้อยกว่าคำตอบอื่น ๆ สร้างเอาต์พุตจริงจากคำถามเพราะเริ่มแรกฉันคิดว่านั่นเป็นข้อกำหนด

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

ตัวอย่างการใช้งาน:

>>> 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 ไบต์

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

นับ Shebang เป็นสามอินพุทถูกนำมาจาก stdin เว้นวรรค


ตัวอย่างการใช้งาน

$ 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 ไบต์

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

ด้วยการเยื้องและการกระจาย:

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

การใช้งาน:

> 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 ไบต์

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

รับอินพุตเป็นรายการ:

>>[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 ไบต์

รวมถึง +3 สำหรับ-p(ปกติ +1 แต่ +3 เพื่อเล่นอย่างยุติธรรมกับโซลูชัน perl อื่น ๆ )

เรียกใช้ด้วยอินพุตบน STDIN (ขึ้นบรรทัดใหม่สุดท้ายของอินพุตเป็นตัวเลือก แต่ต้องขาดสำหรับอินพุตว่าง)

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

ดูสิไม่มีการคำนวณอะไรเลย ...


มาสายดีกว่าไม่มาเลย! วิธีแก้ปัญหาที่ดีมาก :)
Dada

0s ค่อนข้างยุ่งยากในการแก้ปัญหานี้ (แสดงด้วยช่องว่างเพิ่มเติม) และฉันจะต้องระมัดระวังอย่างมากในการจัดการช่องว่างอย่างถูกต้องเพื่อให้หมายเลข0ถูกต้อง โดยเฉพาะอย่างยิ่งพิจารณาปัจจัยการผลิตที่เป็นผลรวมบางส่วนเป็นสิ่งที่ 15 1 14 2 13เช่น ลองพวกเขาโดยไม่มี `? 'และดูว่าเกิดอะไรขึ้น
Ton Hospel

ใช่ฉันลองแล้วเห็นว่า 0 มีการเพิ่มที่จุดเริ่มต้นของบรรทัดเหมือนที่คุณพูด (นั่นคือเหตุผลที่ฉันลบความคิดเห็นของฉัน 30 วินาทีหลังจากโพสต์มัน) ขอบคุณ
Dada

0

Java - 158 155 ไบต์

รุ่นแลมบ์ดาhttps://codegolf.stackexchange.com/a/65590/46866โดยyassin-hajaj , ไม่แน่ใจว่าการส่งที่ถูกต้อง แต่ไม่มีตัวแทนเพียงพอที่จะเพิ่มความคิดเห็นในคำตอบที่เชื่อมโยง นับโดยใช้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 ไบต์

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

สามารถใช้งานได้เช่น

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}));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.