ม้วน ASCII die


16

ในท้าทายนี้คุณจะต้องแสดงผล ascii-art ของมู่เล่แบบสุ่ม

แบบนี้:

   ________
  /\       \
 /  \   6   \
{ 4  }-------}
 \  /   5   /
  \/_______/

โปรดทราบว่า:

   ________
  /\       \
 /  \   3   \
{ 4  }-------}
 \  /   5   /
  \/_______/

เป็นเอาต์พุตที่ไม่ถูกต้องเพราะนั่นไม่ใช่ผลลัพธ์ที่เป็นไปได้ในการตาย

มี6(faces that could be up)*4(faces that could be the left face after the top is determined)*1(faces that could be the right face after the other two are determined)= 24 ความเป็นไปได้ของโรลม้วน

โปรแกรมของคุณจะต้องส่งออกหนึ่งในม้วนกระดาษเหล่านี้ในรูปแบบของ ascii art (จำลองตามแบบด้านล่างโดยที่ xy และ zs ถูกแทนที่ด้วยตัวเลข) ดังกล่าวข้างต้นโดยแต่ละเอาต์พุตมี> 0 ความน่าจะเป็นที่จะเกิดขึ้น จะต้องมีแม้กระทั่ง (พวกเขาจะได้รับอนุญาตให้หลอกลวงลูกเต๋าไม่เหมือนในชีวิตจริง) โปรแกรมของคุณไม่สามารถส่งออกม้วนกระดาษที่ไม่ถูกต้องหรือม้วนกระดาษไม่ได้ โปรแกรมของคุณต้องมีความน่าจะเป็น 1 ในการแสดงผลม้วนที่ถูกต้อง

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

right-handed die
   ________
  /\       \    net
 /  \   z   \     _|4|_ _
{ x  }-------}   |6|2|1|5|
 \  /   y   /      |3|
  \/_______/


left handed die
   ________
  /\       \    net
 /  \   y   \     _|3|_ _
{ x  }-------}   |6|2|1|5|
 \  /   z   /      |4|
  \/_______/

หากความตายของคุณอยู่ทางซ้ายมือสิ่งต่อไปนี้เป็นผลลัพธ์ที่ถูกต้อง แต่ไม่ใช่ถ้าความตายของคุณถูกส่งไปทางขวา:

   ________
  /\       \
 /  \   2   \
{ 1  }-------}
 \  /   3   /
  \/_______/

ในขณะที่คุณสามารถเลือกซ้ายหรือขวามือตายของคุณจะต้องสอดคล้อง: มันไม่สามารถเปลี่ยนจากซ้ายไปขวาหรือในทางกลับกัน

ต่อไปนี้เป็นรายการของผลลัพธ์ที่ถูกต้องสำหรับการตาย อ้างอิงรูปภาพด้านบนสำหรับตำแหน่งของ XYZ:

X-Y-Z
-----
5-4-1
1-5-4
4-1-5

5-6-4
4-5-6
6-4-5

5-3-6
6-5-3
3-6-5

5-1-3
3-5-1
1-3-5

2-6-3
3-2-6
6-3-2

2-4-6
6-2-4
4-6-2

2-1-4
4-2-1
1-4-2

2-3-1
1-2-3
3-1-2

อีกครั้งนี่คือดังนั้นจึงมีจำนวนไบต์น้อยกว่า


4
นักแก้ปัญหาอาจสนใจสูตรสำหรับใบหน้าที่สามที่ได้รับจากอีกสองใบหน้า
xnor

@ xnor และเป็นเช่นนี้ฉันคิดว่ามันเป็นข้อโต้แย้งที่แข็งแกร่งว่าคำถามนี้ซ้ำซ้อน
Digital Trauma

1
ฉันไม่รู้ว่าศิลปะ ASCII ใดที่จะวาดลูกบาศก์ในการฉายนี้ ด้วยขนาดที่เล็ก แต่ฉันไม่รู้ว่าสามารถทำได้ดีกว่าฮาร์ดโค้ดในภาษาเช่น Python หรือไม่
xnor

ที่เกี่ยวข้อง: meta.codegolf.stackexchange.com/a/8197/17602
Neil

@ xnor แน่นอนแม้จะมีลำดับถ่าน 7 และ 8 อยู่ในนั้น
Jonathan Allan

คำตอบ:


8

Python 3, 197 196 192 ไบต์

from random import*;c=choice;r=range(1,7);u=c(r);l=c(list(set(r)-{u,u^7}));print(r'''   ________
  /\       \
 /  \%4d   \
{ %d  }-------}
 \  /%4d   /
  \/_______/'''%(u,l,3*u*l*(u*u-l*l)%7))

ทดสอบบนideone

ถนัดขวา (เปลี่ยนเป็นถนัดมือโดยการสลับu*uกับl*lบรรทัดสุดท้าย)

ผูกพันที่จะต้องเอาชนะ - แต่ขอถอนหายใจด้วยการถอนเงินลูกเต๋าโดยเฉพาะอย่างยิ่งตั้งแต่ความพยายามของฉันในการเล่นกอล์ฟ ASCII ยกเว้นว่าจะดิบและใช้การจัดรูปแบบโรงเรียนเก่าทั้งหมดไม่สามารถบันทึกไบต์ได้
- เคล็ดลับการเล่นกอล์ฟเพิ่มเติมใด ๆ สำหรับผู้ที่ชื่นชอบ n00b


1
คุณสามารถบันทึก 1 ไบต์โดยใช้และfrom random import* c=choice
acrolith

@daHugLenny - ไม่ได้ตอนนี้ฉันสามารถพลาดพื้นที่สีขาวก่อนที่*; ตา!
Jonathan Allan

1
ยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี!
GamrCorps

ขอบคุณ @GamrCorps - ฉันมีความหมายที่จะทำในขณะที่ ... ตอนนี้ฉันมีตัวแทนฉันสามารถโพสต์คำตอบที่มีความหมายในคำถามที่ได้รับการป้องกัน ... : D
Jonathan Allan

2
แทนที่จะมีช่องว่าง 3 ช่องจากนั้น%dให้ใช้%4dแทนและมันจะวางลงบนที่เหมาะสมสำหรับคุณ คุณอาจจะสามารถใช้ประโยชน์จากส่วนอื่น ๆ ของผู้ตายได้เช่นกัน
หมึกมูลค่า

5

C 177

f(r){r=rand()%24;r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

ในการทดสอบโปรแกรม

f(r){r=rand()%24;
r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;
printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

j;
main(){
    for(j=99;j--;puts(""))f();
}

คำอธิบาย

r=                    \\after calculation, assign to r (in order to use only one variable.)
(5545>>r%4*3&63       \\5545 is 12651 in octal. Select 2 digts for the equator
^256-(r*2&8))         \\if 4's bit of r is 0, prepend 4=256/64. Else prepend 3 and reverse one of the faces by xoring with 7. 256-8 = 248 = 3*64+7*8.
*513                  \\now we have a 3 digit octal number. duplicate all digits by multiplying by 1001 octal.
>>r/8*3               \\rightshift 0,1 or 2 digits to rotate. 

5

Javascript 238 232 207 201 bytes

var r=24*Math.random()|0,o=r%3,b=r-o,v="123513653263154214624564";console.log(`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,v[r],v[b+(o+1)%3],v[b+(o+2)%3])

ซึ่งเมื่อ ungolfed คือ:

var r = 24 * Math.random() | 0,
    o = r % 3,
    b = r - o,
    v = "123513653263154214624564";
console.log(
`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,

    v[r],
    v[b+(o+1)%3]
    ,v[b+(o+2)%3]
)

ขั้นตอนวิธี

พิจารณาว่าในแต่ละการตัดมุมของ 8 มุมของค่าตายหน้าตัดจะได้รับการแก้ไข แต่สามารถปรากฏในการหมุน 3 รอบ เช่นในขณะที่มองลงไปที่มุม "1", "2", "3" มุมสามารถหมุนได้รอบแกนผ่านมุมและมุมตรงข้ามเพื่อแสดง "1", "2" หรือ "3" ด้านบนของศิลปะ ASCII

vรหัสยากที่ใบหน้าตายซึ่งตัดกันที่แต่ละมุมbเป็นการชดเชยกับจุดเริ่มต้นของมุมสุ่มและoเป็นจุดเริ่มต้นของการหมุนภายในข้อมูลมุม ASCII art ถูกเขียนไปยังคอนโซลโดยใช้console.logสตริงรูปแบบ


คุณสามารถโกนได้สองสามไบต์โดยใช้`เครื่องหมายคำพูดที่อนุญาตให้ใช้อักขระบรรทัดใหม่ตามตัวอักษรแทนที่จะต้องเขียน\nตลอดเวลา
Neil

@ Neil ชื่นชมมากที่สุดมันทำงานได้ดี ลบ trailing ด้วย';'
traktor53

4

TSQL 308 ไบต์

DECLARE @ char(87)=(SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x)PRINT @

280 ไบต์ (ใน Studio Management Server: Query - ผลลัพธ์เป็นข้อความ)

SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x

หมายเหตุ: โดยการลบการพิมพ์และส่วนที่ประกาศ - และส่งผลลัพธ์โดยตรงจาก SELECT อย่างไรก็ตามมันจะไม่ทำงานในซอ

ซอ


บางทีคุณสามารถเปลี่ยนABS(a^3*b-a*b^3)เป็นบันทึก 4 ไบต์ได้ไหม (ฉันไม่แน่ใจ - ดูเหมือนว่าจะทำงานในซอ แต่มันเป็นเพียงให้ฉันม้วนเดียว, b, c = 5,1,3 ดังนั้นฉันอาจถูกเข้าใจผิด)
Jonathan Allan

@JanathanAllan ขอบคุณสำหรับความคิดเห็นของคุณ เอ็กซ์โพเนนเชียลเขียนด้วย POWER (a, 3) ใน TSQL ^ มีความหมายที่แตกต่าง
t-clausen.dk

4

Javascript, 251 ไบต์

r="replace";a=()=>(0|Math.random()*6)+1;b=(x,y)=>3*x*y*(x*x+6*y*y)%7;u=()=>{x=a(),y=a();z=b(x,y);if(z==0)u();return"   ________\r\n  \/\\       \\\r\n \/  \\   1   \\\r\n{ 2  }-------}\r\n \\  \/   3   \/\r\n  \\\/_______\/"[r](1,x)[r](2,y)[r](3,z);}

โทรโดยใช้ u();
เวลานาน แต่เป็นคำตอบและฉันยังไม่ได้ตอบนาน


ที่ขาดหายไปพื้นที่ที่ด้านบนซ้ายของผลลัพธ์การทดสอบ ideone
Jonathan Allan

a=()=>(0|Math.random()*6)+1;ควรประหยัด 8
traktor53

3

ทับทิม 150 ไบต์

การละเมิดการจัดรูปแบบสตริงทั้งหมด !!!

เครดิตสำหรับสูตรการได้รับหมายเลขสุดท้ายไป @xnor ที่นี่

u=1+rand(6)
l=([*1..6]-[u,u^7]).sample
$><<'%11s
  /\%8s
 /  \%4d%4s
{ %d  }%s}
 \  /%4d%4s
  \/%s/'%[?_*8,?\\,u,?\\,l,?-*7,3*u*l*(u*u-l*l)%7,?/,?_*7]

ไม่มี - เครดิตสำหรับสูตรไปที่ xnor
Jonathan Allan

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