รหัสกอล์ฟ: แจกลูกบอล (I)


12

ท้าทาย

ในภารกิจนี้คุณได้คำนวณจำนวนวิธีที่เราสามารถกระจายลูกบอล A ไปยังเซลล์ B ด้วยเซลล์ทุกเซลล์ที่มีลูกบอลอย่างน้อยหนึ่งลูก

อินพุต A และ B ถูกกำหนดในบรรทัดเดียวคั่นด้วยช่องว่างอินพุตจะถูกยกเลิกโดย EOF

คุณอาจต้องการตรวจสอบการแก้ปัญหาของคุณที่นี่

อินพุต

0 0
1 0
12 4
6 3
18 17
20 19
15 13
18 9
20 20
17 14
9 2
14 13
18 11

เอาท์พุต

1
0
14676024
540
54420176498688000
23112569077678080000
28332944640000
38528927611574400
2432902008176640000
21785854970880000
510
566658892800
334942064711654400

ข้อ จำกัด

  • A และ B ทุกคนสามารถแยกแยะได้
  • 0 <= A, B <= 20
  • คุณสามารถใช้ภาษาที่คุณเลือกได้
  • ทางออกที่สั้นที่สุดชนะ!

1
มีการ จำกัด เวลาหรือไม่?

@Tim Nordenfur: อัปเดต :-)
Quixotic

ลิงค์นั้นไม่ถูกต้องสำหรับฉัน
mellamokb

3
@Debanjan ฉันไม่ชอบความคิดในการวางคำถามจาก SPOJ ที่นี่ ผู้คนส่งรหัสเพื่อแข่งขันกันที่นั่นและมันจะไม่ยุติธรรมสำหรับพวกเขา
fR0DDY

1
@Debanjan ผมเห็นการอ้างอิงของคุณและเพิ่มคุณMathworld (สม. 5 กล่าวว่าS(n,0)คือ1ถ้าn=0และ0อื่น ๆ ) หากคุณต้องการฉันสามารถค้นหาการอ้างอิงสำหรับคำสั่งที่แข็งแกร่งกว่าที่ Stirling2 อยู่ในกลุ่มย่อยที่เชื่อมโยงของกลุ่ม Riordan แบบเอ็กซ์โปเนนเชียล
Peter Taylor

คำตอบ:


4

JavaScript (90 93 )

function f(a,b){n=m=r=1;for(i=b;i>0;n*=-1){r+=n*m*Math.pow(i,a);m=m*i/(b-i--+1)}return--r}

http://jsfiddle.net/RDGUn/2/

เห็นได้ชัดว่าภาษาที่ใช้คณิตศาสตร์เช่น APL จะเอาชนะฉันได้เนื่องจากการใช้คำฟุ้งซ่านทางไวยากรณ์และการขาดการสร้างทางคณิตศาสตร์ในตัว :)

แก้ไขนอกจากนี้ฉันไม่มีฟังก์ชั่นที่เกี่ยวข้องกับอินพุตยกเว้นพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชั่นไม่แน่ใจว่าจะใช้อินพุตมาตรฐานกับ JavaScript ...

แก้ไข:ย้ายi--ไปยังm=m*นิพจน์ ย้ายn*=-1เข้าfor; เริ่มที่r=1จะรวมการมอบหมายและลบหนึ่งที่ไม่เกี่ยวข้องกับผลตอบแทน (บันทึก 3 ตัวอักษร)


คุณสามารถใช้เปลือก spidermonkey - มันมีอย่างน้อยและreadline printฉันไม่รู้ว่าคนอื่นใช้อะไรที่นี่
Jesse Millikan

@Jesse: น่าสนใจ ฉันจะแพ้ต่อไปฮ่า ๆ ๆ
mellamokb

promptและalertเป็น "มาตรฐาน" io ของ JavaScript เนื่องจากเป็นสายการบล็อคทั่วไปที่เรียกว่า io แม้ว่าคุณจะไม่เคยใช้การบล็อค io ด้วย JavaScript
zzzzBov

4

Golfscript - 56 50 49 48 41 40 38 37 ตัวอักษร

n%{~),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;}/

หมายเหตุ: สิ่งนี้จะจัดการกับอินพุตหลายบรรทัดรวดเร็ว (1/8 วินาทีในการทำเคสทดสอบ) และไม่ผิดเพี้ยนสำหรับอินพุตทางกฎหมายใด ๆ

(เวอร์ชันแรกเป็นโปรแกรม Golfscript แรกของฉันด้วยขอขอบคุณ eBusiness สำหรับการชี้ให้เห็นถึงเทคนิคต่าง ๆ ที่ฉันพลาดไป)

ในการทำให้โพสต์เพื่อการศึกษามีประโยชน์ด้วยนี่คือคำอธิบายวิธีการใช้งาน f(n, k) = k * (f(n-1, k) + f(n-1, k-1))เราเริ่มต้นด้วยการเกิดซ้ำ สิ่งนี้สามารถเข้าใจได้ด้วยการใช้ combinatorically โดยกล่าวว่าการวางnลูกที่แตกต่างในkถังที่แยกได้ซึ่งแต่ละถังมีลูกอย่างน้อยหนึ่งลูกคุณจะเลือกหนึ่งในkถังสำหรับลูกแรก ( k *) จากนั้นจะมีอย่างน้อยอีกหนึ่งลูก ( f(n-1, k)) มิฉะนั้นจะไม่ ( f(n-1, k-1))

ค่าที่เป็นผลมาจากกริดนี้ ทำnหน้าที่เป็นดัชนีแถวและkเป็นดัชนีคอลัมน์และการทำดัชนีทั้งจาก 0 มันเริ่มต้น

1   0   0   0    0    0   0 ...
0   1   0   0    0    0   0 ...
0   1   2   0    0    0   0 ...
0   1   6   6    0    0   0 ...
0   1  14  36   24    0   0 ...
0   1  30 150  240  120   0 ...
0   1  62 540 1560 1800 720 ...
.   .   .   .    .    .   . .
.   .   .   .    .    .   .  .
.   .   .   .    .    .   .   .

ดังนั้นหันไปหาโปรแกรม

n%{~ <<STUFF>> }/

แยกอินพุตเป็นบรรทัดจากนั้นสำหรับแต่ละบรรทัดจะประเมินวางnและkบนสแต็กจากนั้นเรียก<<STUFF>>ซึ่งเป็นดังนี้:

),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;

สิ่งนี้คำนวณk+1รายการแรกของn+1แถวลำดับที่ของตารางนั้น n kในขั้นต้นสแต็คเป็น
),ให้กองของn [0 1 2 ... k]
{!}%ให้กองn [1 0 0 ... 0]ที่มีk0
\{ <<MORE STUFF>> }*นำไปด้านบนและทำให้จำนวนครั้งที่เราดำเนินการn ขณะนี้สแต็กของเราคือแถวของตาราง: ใส่ 0 วินาทีก่อนอาร์เรย์นั้น คนแรกที่จะได้รับและคนที่สองจะเป็น วนรอบองค์ประกอบของอาร์เรย์ สำหรับแต่ละอันวางไว้บนสุดของสแต็กจากนั้นเรียกใช้งานลูปบอดี้ คือการจัดการกองซ้อนที่น่าเบื่อในการรับและปล่อยป๊อปออกจากซ้ายไป<<MORE STUFF>>
[f(i,0) f(i,1) ... f(i,k)]
0.@jf(i,j-1)
{ <<FINAL LOOP>> }/
.@+2$*@)@... j f(i,j-1) f(i,j)... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]k+1 f(i,k)และรวบรวมทุกอย่างไว้ในอาร์เรย์พร้อมสำหรับการวนรอบถัดไป
ในที่สุดเมื่อเราได้สร้างnแถวที่สามของตาราง
)p;เอาองค์ประกอบสุดท้ายออกมาพิมพ์แล้วละทิ้งส่วนที่เหลือของแถว

สำหรับลูกหลานโซลูชัน 38 ชาร์สามข้อในหลักการนี้
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/


1
ค่อนข้างดีสำหรับผู้เริ่มต้นมีการลดขนาดเล็กที่เป็นไปได้สองสามอย่างทันทีที่ฉันพบ[0]-> 1,พื้นที่หลังจากซิปสามารถลบออกได้และพื้นที่อื่น ๆ สามารถลบออกได้ถ้าคุณเพียงเก็บไว้ในโอเปอเรเตอร์แทน k ฉันยังไม่ได้ก้าวผ่านโค้ดของคุณ แต่ฉันสงสัยว่าคุณอาจจะหายไปกับการใช้ค่าโดยไม่ต้องใส่มันลงในอาเรย์ในบางจุด
aaaaaaaaaaaa

1
+1 ฉันไม่เข้าใจ Golfscript แต่ดูเร็วพอและสั้นมาก
Quixotic

@eBusiness และ @Peter Taylor: ในบันทึกอื่น ๆ .. พวกคุณให้คะแนน Golfscript ในระดับที่ง่ายต่อการเรียนรู้มากแค่ไหน?
Quixotic

@Debanjan ขึ้นอยู่กับสิ่งที่คุณรู้อยู่แล้ว มันเป็นภาษาสแต็กที่ใช้งานได้ ฉันเคยใช้ภาษาทำงานก่อน (SML - บวกฉันเขียนโค้ดลักษณะการทำงานในภาษา OO) และฉันเคยใช้ภาษาแบบกองซ้อนมาก่อน (Java bytecode ประกอบกับ Jasmin, PostScript) ดังนั้นอุปสรรคเดียวจริง ๆ ฉันเผชิญคือการเรียนรู้สิ่งที่ผู้ประกอบการที่มีอยู่ หากคุณรู้จักภาษาจากตระกูลอัลกอล (C, Java และอื่น ๆ ) คุณจะมีอุปสรรคสามอย่างที่จะกระโดดพร้อมกัน
Peter Taylor

@Debanjan - ง่ายกว่าที่คิดคุณสามารถเริ่มเขียนโค้ดได้เกือบจะในทันที แต่แน่นอนว่าต้องใช้เวลาพอสมควรในการเรียนรู้เทคนิคเล็ก ๆ น้อย ๆ ทั้งหมด
aaaaaaaaaaaa

3

J, 40

4 :'|-/x(^~*y!~])i.1x+y'/&.".;._2(1!:1)3 

เช่น

4 :'-/((x^~|.@:>:)*y&(!~))i.y'/x:".>{.;:(1!:1)3
15 13
28332944640000

<1 วินาทีสำหรับทุกกรณีทดสอบ

การแก้ไข

  • (52 → 47)ลดด้วย-/แทนที่จะสลับ(1 _1)*(ความคิดของ JB)
  • (47 → 53)ความต้องการอินพุตหลายระดับที่สังเกตเห็น: - /
  • (53 → 48) ใช้ประโยชน์จากสมมาตรแบบทวินาม
  • (48 → 48)ทำโดยปริยาย!
  • (48 → 41)
  • (41 → 40)บีบส่วนเพิ่ม + แปลงเป็น1x+

1
เฮ้! นั่นคือความคิดของฉัน ! O :-)
JB

โอเคฉันจะขโมยมัน1x+แต่เพียงซื้อฉันกลับ 1 ตัวอักษรในขณะที่คุณเอา 5!
JB

3

เสียงกระเพื่อมสามัญ (83)

(defun b (x y)
  (if (= (* x y) 0)
      (if (= (+ x y) 0) 1 0)
      (* y (+ (b (decf x) y) (b x (1- y)))))))

ดูเหมือนว่าควรจะมีวิธีที่สั้นกว่าในการทดสอบเคสพื้นฐาน แต่ไม่มีอะไรเกิดขึ้นกับฉันทันที


3

J, 38 ถึง 42

ขึ้นอยู่กับการตั้งค่าความเข้มงวดของคุณเกี่ยวกับภาษาอินเทอร์แอคทีฟและการนำเสนอผลงานให้เลือกจาก J spectre of solution:

  • 38แอคทีฟที่สั้นที่สุด: 4 :'|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
    เรียกใช้ jconsole ป้อนแล้ววางอินพุต (ลงท้ายด้วย Cd) คุณจะสังเกตเห็นว่าเอาต์พุตคั่นด้วยช่องว่าง (J เป็นภาษาเวกเตอร์จะทำการคำนวณกับอินพุตทั้งหมดโดยรวมและส่งคืนเป็นเวกเตอร์ 1D ซึ่งมีการนำเสนอเริ่มต้นอยู่ในบรรทัดเดียว) ฉันคิดว่าโอเควิญญาณของปัญหานี้คือการคำนวณไม่ใช่การนำเสนอ แต่ถ้าคุณยืนยันที่จะมีการขึ้นบรรทัดใหม่แทน:
  • 39โต้ตอบได้อีกต่อไป: 4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
    การแทนที่Compose ( &) กับUnder ( &.) จะคืนค่าเวกเตอร์ของสตริงซึ่งการนำเสนอจะสิ้นสุดลงในแต่ละบรรทัด
  • โหมดแบทช์42 : 4 :'echo|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
    เรียกใช้จากบรรทัดคำสั่งเป็น$ jconsole balls.ijs < balls.in

หากคุณโหวตสิ่งนี้คุณอาจต้องการให้เครดิตกับโซลูชันของ Eelvexเช่นกัน


คุณต้องการอันเดอร์&.เพื่อให้ทำงานอย่างถูกต้องในโหมดโต้ตอบ
Eelvex

@Elex คุณต้องมีการตีความที่แตกต่างของ "ถูกต้อง" ฉันเริ่ม jconsole, วางโค้ด, วาง input, Cd, และรับ output ไม่จำเป็น ของคุณคืออะไร
JB

รหัสของเรารวมกัน: 4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3. 39ตัวอักษร
Eelvex

ไม่มีechoหรือUnderฉันจะได้ผลลัพธ์ในหนึ่งบรรทัดเท่านั้น (แทนที่จะเป็นหลายบรรทัด)
Eelvex

@Elex แน่นอน แต่นั่นไม่ใช่สิ่งต้องห้ามอย่างชัดแจ้ง
JB

3

GolfScript - 45 38 36 ตัวอักษร

ความสัมพันธ์ที่เกิดขึ้นอีกครั้งของการใช้งานสกปรกขนาดกลาง ( 38 36 ตัวอักษร):

n%{~{.2$*{\(.2$f\2$(f+*}{=}if}:f~p}/

ความสัมพันธ์ที่เกิดซ้ำที่ฉันขโมยมาจากสารละลาย Peter Taylors มันเป็นเช่นนี้:

f(x, y) = y * ( f(x-1, y) + f(x-1, y-1) )

ด้วยกรณีพิเศษถ้าตัวแปรใดตัวแปรหนึ่งเป็น 0

การนำไปใช้ของฉันไม่ได้นำผลลัพธ์ก่อนหน้ามาใช้อีกครั้งดังนั้นแต่ละฟังก์ชั่นการโทรจะเรียกสองสายใหม่ยกเว้นกรณีหนึ่งถึงศูนย์ นี่เป็นกรณีที่แย่ที่สุดของการเรียกใช้ฟังก์ชัน 2 ^ 21-1 ซึ่งใช้เวลา 30 วินาทีในเครื่องของฉัน

โซลูชันซีรีย์แรงเบา (45 ตัวอักษร):

n%{~.),0\{.4$?3$,@[>.,,]{1\{)*}/}//*\-}/p;;}/

2

J, 55 ตัวอักษร

(wd@(4 :'(y^x)--/(!&y*^&x)|.i.y')/@".@,&'x');._2(1!:1)3
  • ผ่านกรณีทดสอบปัจจุบัน ฉันคิดว่าฉันเข้าใจคณิตศาสตร์ ...
  • j602, คอนโซลเท่านั้น ( wd) อินพุตบน stdin, เอาต์พุตบน stdout

สคริปต์ทดสอบทุบตี:

jconsole disballs.ijs <<END
12 4
6 3
END

j6xx นั้นwdทำอะไร
JB

ฉันหมายถึง j602 ... ฉันเดาว่ามันจะเป็น j601 ด้วย มันกำหนดให้เป็นซึ่งถูกกำหนดให้เป็นecho 0 0&$@(1!:2&2)ฉันไม่แน่ใจว่าสิ่งนั้นหมายถึงอะไร แต่มันทำบางสิ่งบางอย่างเช่นรายการที่พิมพ์สวยอันดับ 1 ด้วยการแบ่งบรรทัด (ตอนนี้ฉันเพิ่งสังเกตเห็นว่าใช้ 2 แทนที่จะเป็น 4 ... ฉันคิดว่ามันยังคงเป็น stdout ในโหมดคอนโซลอย่างน้อย)
Jesse Millikan

ฉันมีปัญหาในการใช้รหัสนี้ ฉันเพิ่งพิมพ์ลงในคอนโซลหรือไม่
mellamokb

@mellamokb ฉันใช้สิ่งที่ชอบสคริปต์ทดสอบด้านบนด้วยโปรแกรมที่บันทึกเป็น disballs.ijs และเส้นทางที่ถูกต้องไปยัง j602 / bin / jconsole
Jesse Millikan

@Jesse: ฉันใช้งานบน windows ฉัน<< was unexpected at this time. ขอโทษฉันยังใหม่กับอินพุต J ฉันมักจะใช้มันในโหมดคอนโซล
mellamokb

2

Golfscript - 26 ตัวอักษร

คำเตือน: กรณี 12 4 ต้องการหน่วยความจำจำนวนมาก (แม้ว่าจะไม่มากเท่าคำตอบด้านล่าง) และใช้เวลาสักครู่ในการรัน

~:)\?:x,{x+)base(;.&,)=},,

เห็นได้ชัดว่าคำตอบนี้มีปัญหา แต่ฉันจะทิ้งไว้ที่นี่เพราะความคิดเห็นที่อ้างถึงมันและคำตอบของ mellamokb จะขึ้นอยู่กับมัน

Golfscript - 24 ตัวอักษร

คำเตือน: เคส 12 4 ต้องการหน่วยความจำจำนวนมากและใช้เวลาสักครู่ในการรัน

~:o)\?,{o)base[0]-,o=},,

2
ฉันไม่สามารถคิดได้ว่าคุณคิดอย่างไรกับโค้ดนั้นไม่เพียง แต่เมธอดนี้จะหมดหน่วยความจำสำหรับอินพุตขนาดใหญ่ แต่ฉันก็ไม่สามารถคิดได้ว่าตัวดำเนินการส่วนเพิ่มนั้นดีสำหรับอะไร ที่คุณจริง ๆ แล้วถึงเป้าหมายสำหรับ 6 3 ดูเหมือนจะไม่มีอะไรนอกจากโชค
aaaaaaaaaaaa

นั่นไม่ใช่ตัวตลกนั่นคือภรรยาของฉัน!
Jesse Millikan

2
ฉันไม่เข้าใจ Golfscript แต่อย่างที่คุณพูดและฉันเห็นด้วยกับแนวทางของคุณช้าเกินไป
Quixotic

3
@mellamokb ดีสำหรับคุณในการทำงานว่ามันควรจะทำงาน :) มันใช้เวลาเพียง 2 ตัวอักษรพิเศษเพื่อแก้ไขข้อผิดพลาดที่ ตอนนี้เราอยู่ในพื้นที่ที่มืดซึ่งรหัสที่สั้นที่สุดอาจถูกต้อง แต่ไม่สามารถนำไปใช้ได้จริง โค้ดกอล์ฟเต็มไปด้วยคำตอบที่ไม่มีประสิทธิภาพอย่างบ้าคลั่ง แต่ไมโครวินาทีกับวินาทีมักไม่สำคัญ หนึ่งนี้เป็นกรณีที่รุนแรง ( จำนวนมากของหน่วยความจำมากเกินไป) Debanjan ได้ระบุว่าคำตอบจะต้องเร็วขึ้น แต่เว็บไซต์นี้ไม่ใช่ SPOJ คำถามนี้มีการติดแท็ก code-golf
gnibbler

1
@gnibbler 0 0ควรผลิต1; 0 kสำหรับคนอื่นkควรผลิต0; n 1สำหรับควรผลิตn > 0 1
Peter Taylor

2

Python 140 ตัวอักษร

import sys
f=lambda n,k:(n and k and n>=k and k*(f(n-1,k-1)+f(n-1,k)))or(n+k==0 and 1)or 0
for l in sys.stdin:print f(*(map(int,l.split())))

2

dc, 100 chars

[0q]s5[1q]s6[l2l3>5l3 0>5l2 0=6l2 1-S2l3dS3 1-S3l1xL3s9l1xL2s9+L3*]s1[?z0=5S3S2l1xL3L2+s9fs9l4x]ds4x

อนิจจาดูเหมือนจะไม่ได้รับการสนับสนุนจาก ideone อาจมีตัวละครหนึ่งหรือสองตัวที่ยังคงบีบตัว แต่เป็นเวลานอน

หมายเหตุ: สิ่งนี้รองรับอินพุตหลายบรรทัดมีความแม่นยำเพียงพอที่จะให้ผลลัพธ์ที่ถูกต้องแม้สำหรับ20 19(สาปแช่งคุณ, Perl, ในขณะที่ฉันแก้จุดบกพร่องแก้ปัญหาของฉัน!) และให้ผลลัพธ์ที่ถูกต้องสำหรับ0 0และจะช่วยให้การส่งออกที่ถูกต้องสำหรับ

คำแนะนำจาก Nabb ให้ย่ออย่างน้อยเท่าที่

[0q]sZ[1q]sI[?z0=ZSkSn[lnlk>Zlk0>Zln0=Iln1-SnlkdSk1-SklFxLks9lFxLns9+Lk*]dsFxfs9l4x]ds4x

ที่ค่าใช้จ่ายในการทิ้งขยะลงในสแต็ครีจิสเตอร์


รีจิสเตอร์เป็นอักขระเดี่ยวเสมอ (คุณสามารถใช้อักขระใดก็ได้ซึ่งจะทำให้โค้ดอ่านง่ายขึ้น) ดังนั้นl11จะถูกวิเคราะห์เป็นl1 1(คุณสามารถใช้Kเป็นโทเค็นอักขระเดียวได้0หากคุณไม่ต้องการเปลี่ยนความแม่นยำ) ?[...?z1=4]คุณสามารถเปลี่ยนห่วงป้อนข้อมูลไปยัง คุณสามารถ inline 1แมโครในการลงทะเบียน และคุณสามารถบันทึกตัวอักษรได้มากขึ้นโดยทั่วไป แต่ฉันจะรอให้สั้นกว่าเพื่อทำความเข้าใจ
Nabb

@Nabb, อ่าฉันไม่ได้อ่าน man man อย่างละเอียดเพียงพอ ฉันใช้รีจิสเตอร์เพียง 8 หรือ 9 ตัวเท่านั้นดังนั้นฉันจึงไม่ได้รับผลกระทบจากการเข้าใจผิด ขอบคุณ
Peter Taylor

1

Golfscript (28 31 37 )

~):$\.($\?:@;?,{@+}%{$base$,\-[0]=},,

การปรับเปลี่ยนgnibblerเป็นโซลูชัน GolfScript ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่ใช้งานได้ - ทดสอบกับ [3,2], [4,2], [6,3] และ [9,2] ด้วยคำตอบที่ถูกต้อง (ฉันใช้$และ@สำหรับตัวแปรเพื่อเพิ่มพื้นที่ว่างรอบ ๆbaseคำหลัก)

มีสองปัญหาเกี่ยวกับgnibblerวิธีแก้ปัญหาปัจจุบันของ

  1. การตรวจสอบความยาวหลังจากลบ [0] ไม่รับประกันโซลูชันเนื่องจาก [1,1,1,1] จะถูกต้องสำหรับอินพุต [4,2] แม้ว่าลูกบอลทั้ง 4 ลูกจะอยู่ในเซลล์เดียวกัน (1) ดังนั้นฉันจึงปรับเปลี่ยนเพื่อตรวจสอบว่ามีการใช้ตัวเลขทั้งหมดเช่นอาร์เรย์มี 1-2 ดังนั้นแต่ละเซลล์มีอย่างน้อยหนึ่งลูก
  2. ในกรณีของอินพุต [4,2] รูปแบบฐาน -3 ของตัวเลข 0-27 จะน้อยกว่า 4 หลักและไม่รวม 0 ซ้ายสุด นั่นหมายถึง [1,1] รวมอยู่ในวิธีการแก้ปัญหาที่ถูกต้องแม้ว่าจะเป็นจริงในทางเทคนิค [0,0,1,1] ซึ่งหมายความว่าลูกบอลสองลูกแรกไม่ได้วางไว้ที่ใดก็ตาม ฉันแก้ไขด้วยการเพิ่ม 3 ^ 3 ทุกรายการ (โดยทั่วไป k ^ n-1 ไปยังอาร์เรย์ของรายการ k ^ n) เพื่อให้รายการแรกถูกเลื่อนขึ้นไปสู่การมีอย่างน้อย n- ตัวเลขในรูปแบบ base-k และสุดท้าย รายการจะไม่ถูกต้องโดยอัตโนมัติและจะไม่ส่งผลกระทบต่อการแก้ปัญหา (เพราะตัวเลขที่สองจะเป็น 0 เสมอ)

แก้ไข

~:@\?:$,{$+}%{@base(;@,\-,0=},,

`~:@\?:$,{$+@base(;@,\-,0=},,`

ทางออกที่ดีกว่า! ไม่จำเป็นต้องเพิ่มเพียงเพิ่มตัวเลขทั้งหมดเพื่อให้เริ่มต้นด้วย [1] และจะไม่มีตัวเลขใดหายไป (รวมถึงการเว้นระยะห่างของ 0) เมื่อคุณถอดรหัสตัวเลขแรก โซลูชันนี้ควรใช้งานได้และได้รับการทดสอบกับรายการเดียวกันด้านบน นอกจากนี้ยังเร็วกว่ามากเพราะเราไม่ได้เพิ่มขึ้นก่อนที่จะยกกำลังเพื่อสร้างอาร์เรย์ (แต่ยังคงมีปัญหาจากประสิทธิภาพ / หน่วยความจำเดียวกันสำหรับอินพุตที่ใหญ่ขึ้น)

แก้ไข : ใช้gnibblerความคิดของการย้ายส่วนเพิ่มเติม$ภายในของตัวกรองแทนที่จะเป็นขั้นตอนพิเศษ (บันทึก 3 ตัวอักษร)


0 0เที่ยวบินไปกับการป้อนข้อมูล
Peter Taylor

ดูเหมือนว่าจะจัดการอินพุตหนึ่งบรรทัดเท่านั้น
Peter Taylor

และหยุดn 1สำหรับ n ใด ๆ ทำให้แขวน hmm ..
mellamokb

1
แปลงตัวเลขให้เป็นฐานที่ 1 จะทำ :)
gnibbler

@gnibbler: คุณมีข้อเสนอแนะหรือไม่? ฉันจะต้องขว้างบางอย่างถ้างบที่จุดเริ่มต้นที่จะจับกรณีเหล่านั้น? ดูเหมือนว่าฉันจะสูญเสียพื้นดินอย่างนั้น
mellamokb

0

05AB1E , 19 ไบต์

#D`ULX.Œʒ€gßĀ}gs_P+

หมายเหตุ: 12 4มันช้ามากและแล้วเวลาออกไปสำหรับ มันทำงานได้ตามที่ตั้งใจไว้ จะดูว่าฉันสามารถหาวิธีทดแทนที่เหมาะกับกรณีทดสอบทั้งหมดได้ในเวลาอันสมควรหรือไม่ ดูด้านล่างสำหรับรุ่นที่เร็วกว่าซึ่งใช้ทดสอบเคสทั้งหมดในเวลาน้อยกว่าหนึ่งวินาที

ลองมันออนไลน์หรือตรวจสอบอีกไม่กี่ (เล็ก) กรณีทดสอบ

คำอธิบาย:

#               # Split the (implicit) input-string by spaces
 D              # Duplicate it
  `             # Push both values to the stack
   U            # Pop and store the second value in variable `X`
    L           # Create a list in the range [1,n] for the first value
     X        # Create a list of all possible ways to divide this list into `X` partitions
                # (including empty sublists, so we'll have to filter them out:)
        ʒ       # Filter this list of lists of partition-lists by:
         g     #  Get the length of each partition-list
           ß    #  Get the minimum length
            Ā   #  Truthify; 0 remains 0 (falsey); anything else becomes 1 (truthy)
             }g # After the filter, take the length to get the amount left
 s              # Swap so the duplicated input-list is at the top of the stack again
  _             # Check for each value if they're equal to 0 (1 if truthy; 0 if falsey)
   P            # Take the product of the two to check if both input-values are 0
    +           # And add it to the earlier calculated product (edge case for [0,0] = 1)
                # (After which the result is output implicitly)

05AB1E , 29 ไบต์

นี่เป็นรุ่นที่เร็วกว่าซึ่งใช้งานได้กับทุกกรณีทดสอบในเวลาประมาณ 0.5 วินาทีใน TIO:

Î#R`V©LRvyYmX*NÈ·<*+Xy*®y->÷U

คำตอบ JavaScriptของพอร์ตของ@mellamokb ดังนั้นอย่าลืมอัปเกรดเขา!

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Î                    # Push (result=) 0 and the input
 #                   # Split the input by spaces
  R`                 # Push the values to the stack reversed
    V                # Pop and store the first value in variable `Y`
     ©               # Store the second value in variable `®` (without popping)
      LRv            # Loop `y` in the range [`®`,1], with index `N` in the range [0,`®`):
         yYm         #  Calculate `y` to the power `Y`
            X*       #  Multiply it by `X`
                     #  (Note: `X` is 1 before setting it to another value initially)
              NÈ     #  Check if index `N` is even (1 if truthy; 0 if falsey)
                ·<   #  Double it; and decrease it by 1 (1 if truthy; -1 if falseY0
                  *  #  Multiply it to the earlier number
                   + #  And add it to the result
         Xy*         #  Push `X` multiplied by `y`
         ®y->        #  Push `®` - `y` + 1
             ÷       #  Integer divide them
              U      #  Pop and store it as new variable `X`
                     # (output the result at the top of the stack implicitly after the loop)

หมายเหตุ: สำหรับกรณีธิขอบ0 0ในกรณีนี้ (เหมือนคำตอบ JavaScript ฉันรังเพลิงวิธีนี้) จากเพราะในตัวจะสร้างรายการL[0,1]

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