คุณสามารถตีกอล์ฟได้ไหม?


53

คุณจะต้องสร้างสนามกอล์ฟ 18 หลุมแบบสุ่ม

ตัวอย่างผลลัพธ์:

[3 4 3 5 5 4 4 4 5 3 3 4 4 3 4 5 5 4]

กฎ:

  • โปรแกรมของคุณจะต้องแสดงรายการความยาวของรูสำหรับ 18 หลุมที่แน่นอน
  • แต่ละหลุมต้องมีความยาว 3, 4 หรือ 5
  • ความยาวของหลุมจะต้องเพิ่มขึ้นถึง 72 สำหรับหลักสูตรทั้งหมด
  • โปรแกรมของคุณจะต้องสามารถสร้างการกำหนดค่ารูที่เป็นไปได้ด้วยความน่าจะเป็นที่ไม่เป็นศูนย์ (ความน่าจะเป็นของการกำหนดค่าแต่ละรายการไม่จำเป็นต้องเท่ากัน แต่อย่าลังเลที่จะอ้างความรุ่งโรจน์เพิ่มเติม

3
โปรดยืนยันการแก้ปัญหา 44152809?
baby-rabbit

1
ฉันก็อยากรู้อยากเห็นเกี่ยวกับจำนวนที่แน่นอนของการแก้ปัญหา แต่ฉันคิดว่ามันควรจะมากกว่า 44 ล้าน ... (ฉันไม่ใช่นักคณิตศาสตร์ แต่: | 1 (5) / 1 (3) = 306 ความเป็นไปได้ (17 * 18) | 2 (5) / 2 (3) = 69360 poss (17 * 17 * 16 * 15) | 3 (5) / 3 (3) = 11182080 poss (16 * 16 * 16 * 15 * 14 * 13) | ทำ ที่ดูใช่มั้ย
NRGdallas

11
@ baby-rabbit: ฉันสามารถยืนยันการแก้ปัญหา 44,152,809 โดยการแจงนับกำลังดุร้าย นอกจากนี้ก็สามารถคำนวณได้โดยตรงวิธีนี้ตั้งแต่เฉลี่ยอยู่ตรง4และความเป็นไปได้เพียง3, 4หรือ5การเรียนวิธีการแก้ปัญหาที่เป็นไปได้ { no 3's or 5's, one 3 and one 5, two 3's and two 5's, ... , nine 3's and nine 5's} nCr(18,0)*nCr(18,0) + nCr(18,1)*nCr(17,1) + nCr(18,2)*nCr(16,2) + ... + nCr(18,9)*nCr(9,9) = 44,152,809นี้สามารถคำนวณได้โดย ซึ่งหมายความว่าประมาณรวมกันทั้งหมดเป็นไปได้คือการแก้ปัญหาที่ถูกต้อง11.4% (44,152,809 / 3^18)
mellamokb

2
sum(factorial(18)/factorial(x)/factorial(y)/factorial(z) for x in range(25) for y in range(25) for z in range(25) if 3*x+4*y+5*z == 72 and x+y+z == 18)ให้44152809L
Sanjeev Murty

คำตอบ:


29

k ( 18 17 16 ตัวอักษร)

กลับไปที่วิธีดั้งเดิมให้เครดิตแก่ CS เพื่อทำการปรับปรุง

(+/4-){3+18?3}/0

วิธีอื่น (17 ตัวอักษร), วิธีการเดียวกับวิธีแก้ปัญหา J, H / T ถึง CS

4+a,-a:9?2 -18?18

เวอร์ชั่นเก่า:

(72-+/){18?3+!3}/0

ไม่ไวต่อการซ้อนทับมากเกินไปและทำงานในพื้นที่จำนวนคงที่


H / T ถึง CS คืออะไร
Gareth


โปรแกรมนี้ช่วยฉันค้นพบข้อผิดพลาดในล่าม K ของฉัน - ขอบคุณ! ก่อนหน้านี้ฉันไม่ได้ตระหนักว่า nilads สามารถนำไปใช้กับอาร์กิวเมนต์เดียว (ซึ่งพวกเขาไม่สนใจ)
JohnE


15

J, 20 18 17 ตัวอักษร

(?~18){4+(,-)?9#2

วิธีนี้ทำงานในลักษณะเดียวกันกับคำตอบก่อนหน้านี้ยกเว้นว่าตัวเลขสุ่ม 9 หลักเป็น 0 หรือ 1 และถูกลบล้างก่อนที่จะถูกต่อท้าย ซึ่งหมายความว่ามีเป็นจำนวนมาก-1ในฐานะที่มี1s การเพิ่ม 4 ให้รายการ3s, 4s และ5s ที่เพิ่มมากถึง 72 ทุกครั้ง

คำตอบก่อนหน้า:

({~?~@#)3+(,2-])?9#3

สร้าง 9 หลุมแรกแบบสุ่ม?9#3จากนั้นคัดลอกและกลับค่าพวกเขา(,2-])(เปลี่ยน 3 เป็น 5 และ 5 เป็น 3) เพื่อสร้างสุดท้าย 9 นี้รับประกันได้ว่าผลรวมจะเป็น 72 (เนื่องจากทุก 3 จะมีการจับคู่ 5 ยอดรวมเฉลี่ยต่อหลุมจะเท่ากับ 4 และ 4x18 = 72) จากนั้นจะสุ่มสับผลลัพธ์({~?~@#)เพื่อให้แน่ใจว่าทุกชุดค่าผสมเป็นไปได้


จริงๆแล้วคุณจะไม่สร้าง {3,5,4,4,4 ... } คุณดีกว่าในการสับผลลัพธ์ทั้งหมด
ratchet freak

@rachetfreak จุดดี ฉันจะแก้ไขตอนนี้
Gareth

13

รหัสเครื่อง x86 16 บิตภายใต้ MS-DOS - 45 ไบต์

hexdump:

0E5F576A12595188ECE44088C3E44130D8240374F400C4AAE2EF595E80FC2475DFAC0432CD29B020CD29E2F5C3

รหัสฐาน Base64:

Dl9XahJZUYjs5ECIw+RBMNgkA3T0AMSq4u9ZXoD8JHXfrAQyzSmwIM0p4vXD

รหัสที่มาจริงกับความคิดเห็น:

 bits 16
 org 0x100

again:
 push cs               ; Save whatever CS we get.
 pop di                ; Use CS:DI as our course buffer..
 push di               ; Save for later use in the print loop
 push 18               ; We need 18 holes for our golf course.
 pop cx                ; ch = 0, cl = 18.
 push cx               ; Save for later use.
 mov ah, ch            ; Zero out ah.
generate_course:
 in al, 0x40           ; Port 0x40 is the 8253 PIT Counter 0.
 mov bl, al            ; Save the first "random" value in bl.
 in al, 0x41           ; Port 0x41 is the 8253 PIT Counter 1.
 xor al, bl            ; Add some more pseudo randomness.
 and al, 3             ; We only need the two lower bits.
 jz generate_course    ; If zero, re-generate a value, since we need only 3, 4, 5 holes.
 add ah, al            ; Sum in ah register.
 stosb                 ; Store in the course buffer.
 loop generate_course  ; Loop for 18 holes.
 pop cx                ; cx = 18.
 pop si                ; si = course buffer.
 cmp ah, 36            ; 72 holes?
 jne again             ; No, re-generate the whole course.

print:                 ; Yup, we have a nice course.
 lodsb                 ; Load the next hole.
 add al, '2'           ; Add ASCII '2' to get '3', '4' or '5'
 int 0x29              ; Undocumented MS-DOS print function.
 mov al, ' '           ; Print a space too for better readability.
 int 0x29              ; Print the character.
 loop print            ; Print the whole course.
 ret                   ; Return to the beginning of the PSP where a INT 0x20 happen to be.

คอมไพล์ด้วยnasm 18h.asm -o 18h.comและทำงานภายใต้ MS-DOS (หรือ Dosbox) หรือ NTVDM จาก Windows เวอร์ชั่น 32 บิต

ตัวอย่างผลลัพธ์:

4 5 4 5 4 5 3 4 3 4 3 4 4 5 4 3 5 3

3
รักผู้ประกอบ ...
woliveirajr

13

Mathematica 71 68 66 60

ด้วย 6 ตัวอักษรที่บันทึกไว้โดยคำแนะนำของ Tally

RandomSample@RandomChoice@IntegerPartitions[72, {18}, {3, 4, 5}]

{5, 4, 3, 3, 5, 3, 5, 5, 3, 3, 4, 5, 3, 5, 4, 4, 4, 5, 3}

ผลลัพธ์ที่เป็นไปได้ทั้งหมดเป็นไปได้ แต่ไม่น่าเท่ากัน


การวิเคราะห์

IntegerPartitions[72, {18}, {3, 4, 5}]

สร้างพาร์ติชันที่เป็นไปได้ทั้งหมด 10 รายการ (ชุดค่าผสมไม่ใช่การเปลี่ยนลำดับ) จาก 72 เป็น 18 องค์ประกอบซึ่งประกอบด้วย 3, 4 และ 5

partitions


RandomChoice เลือกหนึ่งในนั้น

RandomSample ส่งคืนการเรียงสับเปลี่ยนของตัวเลือกนั้น


ฉันกำลังจะโพสต์คำตอบเดียวกันเกือบทั้งหมดโดยใช้ RandomChoice แทน RandomInteger ฉันคิดว่าคุณสามารถโกนตัวละครได้อีก 4 ตัวโดยทำเช่นนั้น
Tally

ขอขอบคุณ ข้อเสนอแนะของคุณมีประโยชน์
DavidC

8

R - 41

x=0;while(sum(x)!=72)x=sample(3:5,18,T);x

# [1] 5 3 5 3 3 3 3 3 5 4 5 4 5 4 4 5 5 3

อัลกอริทึมคล้ายกับของ @ sgrieve


ปัญหาเช่นเดียวกับ @sgrieve ด้านบน - ไม่มีสิ่งใดป้องกันไม่ให้ข้ามไปใน 18 หลุม
gt6989b

3
นั่นไม่ใช่ปัญหาคำสั่งตัวอย่างในกรณีนี้จะสร้าง 18 ค่าเสมอ
sgrieve

8

GolfScript (26 ตัวอักษร)

{;0{3rand.3+@@+(}18*])}do`

มีความคล้ายคลึงกันที่ชัดเจนกับโซลูชันของ Ilmari แต่ก็มีความแตกต่างที่ชัดเจน โดยเฉพาะอย่างยิ่งฉันใช้ประโยชน์จากความจริงที่ว่าค่าเฉลี่ยคือ 4


ประณาม แต่นั่นเป็นกลอุบายที่ฉลาดกับสภาพลูปที่นั่น ฉันมากับ {;0{3.rand+.@+}18*])72-}doตัวเอง แต่ไม่สามารถหาวิธีทำให้มันสั้นลงได้ +1
Ilmari Karonen

7

Python 77

รหัส

from numpy.random import*;l=[]
while sum(l)!=72:l=randint(3,6,18)
print l

เอาท์พุต

[3 4 4 5 3 3 3 5 4 4 5 4 5 3 4 4 5 4]

การนำเข้าจะฆ่าโซลูชันนี้จริงๆ มันใช้ numpy เพื่อสร้าง 18 ตัวเลขระหว่าง 3 และ 5 และสร้างรายการต่อไปเรื่อย ๆ จนกระทั่งผลรวมของรายการเท่ากับ 72


อะไรทำให้โปรแกรมไม่สามารถเข้าถึง 72 ได้ดีก่อนที่จะสร้าง 18 หลุม สิ่งที่ป้องกันไม่ให้ข้าม 72?
DavidC

3
รหัสจะสร้าง 18 หลุมเสมอจากนั้นตรวจสอบว่าผลรวมเท่ากับ 72 ตัวอย่างเช่นถ้าผลรวมหลังจาก 16 หลุมเป็น 72 ก็จะยังคงสร้างอีก 2 หลุมโดยผลักดันผลรวมที่สูงกว่า 72 และล้มเหลวในการทดสอบ
sgrieve

7

GolfScript, 27 ตัวอักษร

{;18{3.rand+}*].{+}*72-}do`

ใช้วิธีการสุ่มตัวอย่างการปฏิเสธแบบเดียวกับโซลูชัน Python ของ sgrieve ดังนั้นทุกผลลัพธ์ที่ใช้ได้จริงจึงมีโอกาสเท่ากัน


7

Q (25 ตัวอักษร)

เดิม (27)

while[72<>sum a:18?3 4 5];a

ตัวอย่างผลลัพธ์

4 4 3 3 4 5 4 3 4 5 5 3 5 5 5 4 3 3

สั้นลงเล็กน้อย (25)

{72<>sum x}{x:18?3 4 5}/0

7

JavaScript, 66 64 61 ตัวอักษร

แรงบันดาลใจอย่างมากจาก TwoScoopsofPig (PHP) และ Joe Tuskan (JS)

for(a=[s=0];s!=72;)for(s=i=0;i<18;s+=a[i++]=Math.random()*3+3|0);a

for(a=[s=0];s-72;)for(s=i=0;i<18;s+=a[i++]=Math.random()*3+3|0)a

for(a=s=[];s;)for(i=18,s=72;i;s-=a[--i]=Math.random()*3+3|0)a

2
s!=72สามารถs-72บันทึกหนึ่งตัว และเซมิโคลอนสุดท้าย;aไม่จำเป็นสำหรับ char อีกตัว
Joe Tuskan

ฉันไม่เคยเห็นมาfor(i=x;i;i--)ก่อนมันช่วย 2 chars จากfor(i=0;i<x;i++)ขอบคุณคน!
เครื่องทำความเย็นคณิตศาสตร์

7

Python 2, 70 ไบต์

from random import*
print sample(([3,5]*randint(0,9)+[4]*99)[:18],18)
แก้ไข:

นี่คืออีกหนึ่งคล้ายกับวิธีแก้ปัญหาของ sgrieve:

Python 2, 73 ไบต์ + ความน่าจะเป็นที่เท่ากัน

from random import*
a=[]
while sum(a)-72:a=sample([3,4,5]*18,18)
print a

5

JavaScript, 116 99 65 ไบต์

for(i=0,h=[];i<18;)h[i++]=5;while(h.reduce(function(a,b){return a+b})!=72){i=Math.random()*18|0;h[i]=[3,4,4][i%3]}h;

h=[0];while(h.reduce(function(a,b){return a+b})-72)for(i=0;i<18;h[i++]=[3,4,5][Math.random()*3|0])h

while(i%18||(a=[i=s=0]),s+=a[i++]=Math.random()*3+3|0,s-72|i-18)a

1
เมื่อฉันทำงานนี้ใน Chrome 21 i is not definedฉันได้รับ
mellamokb

5

Python, 128 120 116 ตัวอักษร

import random,itertools
random.choice([g for g in itertools.product(*(range(3,6)for l in range(18))) if sum(g)==72])

import คำสั่งยังคงความยาว killers (23 ตัวอักษรเท่านั้นที่จะนำเข้า 2 ฟังก์ชั่นใน namespace)

ฉันหวังว่าคุณไม่ต้องการผลลัพธ์ในอนาคตอันใกล้นี้เนื่องจากรหัสนี้จะประเมินโซลูชันที่เป็นไปได้ทั้งหมดก่อนที่จะเลือกวิธีสุ่ม อาจเป็นทางออกที่ช้าที่สุดสำหรับปัญหานี้

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


4
import random,itertools
grawity

คุณพูดถูกสิ่งนั้นสั้นลงเล็กน้อย
Adrien Plisson

เคล็ดลับอื่น ๆ : import random as r,itertools as iแล้วใช้rและiแทนและrandom itertoolsใช้18*[0]แทนrange(18)และ[3,4,5,6]แทนrange(3,6):)
อเล็กซ์ L

ฉันใช้ python 3: list comprehension เป็นตัวกำเนิดและไม่มีความยาวซึ่งห้ามใช้กับchoice()ฟังก์ชัน นั่นคือสิ่งที่ทำให้รหัสนี้จึงช้า ...
Adrien Plisson

1
อ๊ะขออภัยฉันทำรายการความเข้าใจผิดและนิพจน์ตัวสร้าง (โดยทั่วไปฉันหลีกเลี่ยงรายการความเข้าใจเพื่อสนับสนุนนิพจน์ตัวสร้างเนื่องจากประสิทธิภาพที่ดีขึ้นของตัววนซ้ำ) ดังนั้นแม้ใน python3 ฉันยังคงสามารถลบอักขระบางตัวได้ ... @Alex ทำถูกต้อง
Adrien Plisson

4

PHP - 77 ตัวอักษร

<?while(array_sum($a)!=72){for($i=0;18>$i;){$a[++$i]=rand(3,5);}}print_r($a);

เช่นเดียวกับวิธีแก้ปัญหาของ sgrieve สิ่งนี้สร้างรายการจาก 18 หลุมตรวจสอบราคาพาร์ทั้งหมดและพิมพ์หรือปฏิเสธมันและลองอีกครั้ง น่าแปลกที่โซลูชันทั้งสองของเรามีความยาวเท่ากัน

ค่อนข้างน่ารำคาญ PHP ไม่ได้เสนอฟังก์ชั่นอาร์เรย์ที่มีชื่อสั้น ๆ Array_sum และ print_r กำลังฆ่าฉัน ยินดีต้อนรับข้อเสนอแนะ


1
+=วงเล็บปีกกาจะไม่จำเป็นต้องที่นี่และผลรวมสามารถ <?while($s!=72)for($s=$i=0;18>$i;$s+=$a[++$i]=rand(3,5));print_r($a);
grawity

มีประโยชน์ - ฉันไม่เคยคิดที่จะใส่ตรรกะในการเรียกวนรอบ (และฉันรู้สึกว่าโง่เพราะไม่เพิ่มจำนวนตัวนับสำหรับผลรวม)
TwoScoopsofPig

ขอบคุณ - แต่นั่นไม่ใช่สิ่งที่ฉันหมายถึงโดย "ไม่ต้องใช้เครื่องมือจัดฟันแบบหยิก"; คุณสามารถลบออกได้ในรหัสเดิมด้วย:while(array_sum($a)!=72)for($i=0;18>$i;)$a[++$i]=rand(3,5);
grawity

ดียกเว้นฉันวิ่งแข่งกับ php.ini ที่เข้มงวดกว่านั้นเพราะฉันเล่นกอล์ฟในที่ทำงาน มันบ่นไม่สิ้นสุดเกี่ยวกับการจัดฟันหายไป / ไม่ตรงกัน ปกติฉันจะมี
TwoScoopsofPig

มันแปลกมาก 5.4.7 กับ E_ALL | E_STRICT ไม่เคยบ่นเกี่ยวกับสิ่งที่ขาดหายไป{}(เนื่องจากไวยากรณ์ของ PHP อนุญาตอย่างชัดเจน)
grawity

4

Ruby 1.9 (62 ตัวอักษร)

a=Array.new(18){[3,4,5].sample}until(a||[]).inject(:+)==72
p a

ราง (55 ตัวอักษร)

ใน$ rails cREPL (ในโฟลเดอร์ Rails ใด ๆ ):

a=Array.new(18){[3,4,5].sample}until(a||[]).sum==72
p a

หมายเหตุ: จะทำงานร่วมกับทับทิม 1.8 ถ้าคุณใช้แทนshuffle[0]sample


2
คุณต้องการพื้นที่ว่างรอบ ๆ จนกระทั่ง?
Kaz

@Kaz คุณพูดถูกไม่จำเป็น :) 62 ตัวอักษรตอนนี้
js-coder

1
คุณสามารถใช้(1..18).map{rand(3)+3}เพื่อให้ได้อาร์เรย์แบบสุ่ม;)
epidemian

4

Lisp ( 78 69 ตัวอักษร)

(ทำ ((c () (mapcar (lambda (x) (+ 3 (สุ่ม 3))) (make-list 18)))) () ((= (ใช้ '+ c) 72) c))

(do((c()(loop repeat 18 collect(+ 3(random 3)))))((=(apply'+ c)72)c))

มันค่อนข้างคล้ายกับโซลูชัน Python ของ sgrieve

เริ่มต้นด้วย c เป็น NIL ตรวจสอบผลรวม 72, do"ฟังก์ชันการเพิ่ม" สำหรับ c สร้างรายการหมายเลข 18 ระหว่าง 3 และ 5 ตรวจสอบ 72 อีกครั้งฟองล้างล้างทำซ้ำ

รู้สึกสดชื่นที่ได้เห็นdoและloopเล่นกอล์ฟด้วยกัน


3

C (123 ตัวอักษร) - พยายามอย่างมีประสิทธิภาพ

เดินสายไปยังห้องสุขาและจะสร้างโซลูชันทั้งหมด 44152809 ภายใน 10 วินาที ...

char s[19];g(d,t){int i;if(d--){for(i=51,t-=3;i<54;i++,t--)if(t>=3*d&&t<=5*d)s[d]=i,g(d,t);}else puts(s);}main(){g(18,72);}

โอ้ดี - ไม่ได้อ่านคำถามอย่างถูกต้อง - แต่เนื่องจากเราสร้างโซลูชันทั้งหมดแล้วเลือกสุ่มที่มีความน่าจะเป็นเท่ากันคือแบบฝึกหัดสคริปต์: P


3

Clojure - 55

(shuffle(mapcat #([[4 4][3 5]%](rand-int 2))(range 9)))

เคล็ดลับความสนุก ... ใช้ประโยชน์จากโครงสร้างทางคณิตศาสตร์ของปัญหาที่จะต้องมีจำนวนพาร์ 3 พาร์เท่าที่ 5 รูพาร์


3

Python 83

import random as r;x=[]
while sum(x)!=72:x=[r.randint(3,5) for i in 18*[0]]
print x

เช่นเดียวกับวิธีแก้ปัญหาของ sgrieve แต่ไม่มีปัญหา

วิธีการเล่นกอล์ฟของ Adrien Plisson: 120-> 108 ตัวอักษร

import random as r,itertools as i
r.choice([g for g in i.product(*([3,4,5,6]for l in 18*[0]))if sum(g)==72])

MATLAB 53

x=[];
while sum(x)~=72
x=3+floor(rand(1,18)*3);
end
x

ผลผลิต :

x = 4 3 4 4 4 4 5 4 4 3 4 4 3 5 3 5 4 5


วิธีการที่ดี แต่คุณสามารถบันทึกได้ 4 ไบต์โดยการพิมพ์randi([3,5],1,18)แทน3+floor(rand(1,18)*3)
brainkz

3

Java (61 ตัวอักษร)

while(s!=72)for(i=0,s=0;i<18;i++)s+=3+(int)(Math.random()*3);

ตัวอย่างผลลัพธ์:

5 4 3 4 5 3 4 4 3 5 4 4 4 4 3 4 4 5

ฉันไม่ใช่ผู้เชี่ยวชาญของ Java แต่ไม่ควรมีการประกาศ s และ i และการเรียกใช้ System # println (.. ) บางประเภท?
hiergiltdiestfu

นี่เป็นเพียงข้อมูลโค้ดไม่ใช่โปรแกรม และมันดูเหมือนจริงมากเหมือนเวอร์ชัน @JoeIbanez
Franz D.

2

C (94 ตัวอักษร)

int h[18],s=0,i;
while(s!=72)for(i=s=0;i<18;s+=h[i++]=rand()%3+3);
while(i)printf("%d ",h[--i]);

s=0ในบรรทัดที่ 1 อาจไม่จำเป็นต้องเพราะสิ่งที่มีโอกาสเป็น int เตรียมจะเท่ากับ 72? ฉันไม่ชอบการอ่านค่าที่ไม่ได้กำหนดค่าเริ่มต้นเป็นเส้นตรง C และนี่อาจต้องใช้การเพาะrand()ฟังก์ชัน

เอาท์พุต

3 3 3 4 5 5 3 3 4 5 5 4 3 4 5 5 5 3 

โดยพื้นฐานแล้วคุณจะวนซ้ำสตริงที่มีตัวเลข 18 ตัวอยู่ในช่วง 3 ถึง 5 จนกระทั่งมีค่าเท่ากับ 72? ประสิทธิภาพที่ดีไม่ใช่สิ่งที่จำเป็น
KeithS

5
@ KeithS เพื่อความเป็นธรรมนั่นคือสิ่งที่คำตอบส่วนใหญ่ของคำถามนี้กำลังทำอยู่
Gareth

2

Bash shell script (65 ตัวอักษร)

shuf -e `for x in {0..8}
do echo $((r=RANDOM%3+3)) $((8-r))
done`

( shufมาจากแพ็คเกจ GNU coreutils ขอบคุณ Gareth)


2

C # (143 ไม่ใช่ช่องว่าง):

()=>{
  var n=new Math.Random().Next(10);
  Enumerable.Range(1,18)
    .Select((x,i)=>i<n?3:i>=18-n?5:4)
    .OrderBy(x=>Guid.NewGuid())
    .ForEach(Console.Write);
}

new Guid()สร้าง GUID ที่ว่างเปล่า เพื่อสร้างจริงที่ไม่ซ้ำกัน GUID Guid.NewGuidคุณจะต้องเรียกวิธีการคง
Rotsor

และคุณมีข้อผิดพลาดสองข้อ (เพื่อพูด): การเปรียบเทียบควรเป็น i <n และ i> = 18-n ไม่ใช่วิธีอื่น และคุณสามารถลดขนาดได้โดยใช้ค่าคงที่ 3 แทน x-1 และ 5 แทน x + 1 และจากนั้นคุณสามารถแทนที่ Enumerable ทำซ้ำโดย Enumerable.Range
Mormegil

แก้ไข; 143 ตัวอักษรยังคง
KeithS

ไม่มีมันMath.Random System.Random
CodesInChaos

แนวทาง C # อื่น (143 ตัวอักษร):var r=new Random();for(;;){var e=Enumerable.Range(1,18).Select(i=>r.Next(3,6)).ToList();if(e.Sum()==72){e.ForEach(i=>Console.Write(i));break;}}
thepirat000


2

Perl, 74

{@c=map{3+int rand 3}(0)x18;$s=0;$s+=$_ for@c;redo unless$s==72}print"@c"

ทางเลือกอื่น ๆ :

@q=((3,5)x($a=int rand 9),(4,4)x(9-$a));%t=map{(rand,$_)}(0..17);print"@q[@t{sort keys%t}]"

2

TXR (99 ตัวอักษร)

@(bind g@(for((x(gen t(+ 3(rand 3))))y)(t)((pop x))(set y[x 0..18])(if(= [apply + y]72)(return y))))

นิพจน์นี้สร้างรายการขี้เกียจไม่สิ้นสุดของตัวเลขสุ่มตั้งแต่ 3 ถึง 5:

(gen t (+ 3(rand 3)))  ;; t means true: while t is true, generate.

ส่วนที่เหลือของตรรกะนั้นเป็นลูปแบบง่ายซึ่งตรวจสอบว่าองค์ประกอบ 18 รายการแรกของรายการนี้รวมกันได้มากถึง 72 หรือไม่หากไม่ใช่จะเป็นการดึงองค์ประกอบออกแล้วลองอีกครั้ง การforวนซ้ำประกอบด้วยบล็อกโดยนัยที่เรียกว่าnilและ(return ...)สามารถใช้เพื่อยุติการวนซ้ำและค่าส่งคืน

โปรดทราบว่าความยาว 99 อักขระรวมถึงการขึ้นบรรทัดใหม่ซึ่งจำเป็นต้องใช้


ฉันใส่ความมุ่งมั่นที่อนุญาตให้ (t) ถูกแทนที่ด้วย () :)
Kaz

2

APL 12

4+{⍵,-⍵}?9⍴2

โปรดทราบว่าฉันมีต้นกำเนิดดัชนีตั้งค่าเป็น 0 หมายถึงอาร์เรย์เริ่มต้นที่ 0 ⎕IO←0คุณสามารถตั้งค่านี้ด้วย


คำถามจะถามโปรแกรมที่สามารถสร้างการกำหนดค่าที่เป็นไปได้ทั้งหมด คุณสามารถผลิตสิ่งที่สมมาตร คุณไม่สามารถผลิตได้เช่น 555455555333333343 อย่างน้อยก็ดูเหมือนกับฉัน
Moris Zucca

2

R, 42 ไบต์

a=0;while(sum(a)-72)a=sample(3:5,18,r=T);a

sampleโดยค่าเริ่มต้นจะดึงอย่างสม่ำเสมอระหว่างค่าที่เป็นไปได้ (ที่นี่3 4 5) r=Tย่อมาจากreplace=TRUEและช่วยให้ตัวอย่างที่มีการเปลี่ยน


2

CJam, 17 14 ไบต์

CJam ใหม่กว่าความท้าทายนี้ แต่นี่ไม่ใช่คำตอบที่สั้นที่สุดดังนั้นมันจึงไม่สำคัญ

Z5]Amr*I4e]mrp

ทดสอบที่นี่

เพื่อรักษารวม 72 แต่ละคนต้องจับคู่กับ3 5ดังนั้นนี่คือวิธีการทำงาน:

Z5]            e# Push [3 5].
   Amr         e# Get a random number between 0 and 9.
      *        e# Repeat the [3 5] array that many times.
       I4e]    e# Pad the array to size 18 with 4s.
           mr  e# Shuffle the array.
             p e# Print it.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.