ลูกเต๋าเหล่านี้ไม่มีการถ่ายทอดหรือไม่?


31

ลูกเต๋าที่ไม่ผ่านกรรมเป็นของเล่นเล็ก ๆ ที่ท้าทายความสามารถของเราในทฤษฎีความน่าจะเป็น เราต้องการคำจำกัดความเล็กน้อยสำหรับความท้าทายนี้:

พิจารณาลูกเต๋าสองลูกAและBที่ถูกโยนในเวลาเดียวกัน เราบอกว่าเต้นBถ้าความน่าจะเป็นของแสดงจำนวนขนาดใหญ่กว่าBเป็นอย่างเคร่งครัดมากกว่าความน่าจะเป็นของBแสดงเป็นตัวเลขที่มากกว่า

ตอนนี้พิจารณาชุดของสามลูกเต๋าที่มีป้ายชื่อ, B , C ชุดของลูกเต๋าดังกล่าวเรียกว่าไม่ผ่านกรรมวิธีถ้า

  • ทั้งAเต้นB , Bเต้นCและCเต้นA
  • หรือCเต้นB , Bเต้นและเต้นC

เป็นหนึ่งในตัวอย่างโปรดของฉันพิจารณาลูกเต๋า Grimeซึ่งมีด้านต่อไปนี้:

A: 3 3 3 3 3 6
B: 2 2 2 5 5 5
C: 1 4 4 4 4 4

น่าสนใจค่าเฉลี่ยของการตายแต่ละครั้งเท่ากับ 3.5 เหมือนกับการตายปกติ

สามารถแสดงให้เห็นว่า:

  • เต้นBที่มีความน่าจะเป็นของ 7/12
  • Bเต้นCด้วยความน่าจะเป็นที่ 7/12
  • Cเต้นAด้วยความน่าจะเป็นที่ 25/36

ตอนนี้ลูกเต๋าโดยเฉพาะเหล่านี้ก็ยิ่งแปลก หากเราหมุนแต่ละครั้งสองครั้งและเพิ่มผลลัพธ์ลำดับของการเต้นที่ได้รับการกลับรายการ:

  • B beats A ที่มีความน่าจะเป็น 85/144
  • Cเต้นBด้วยความน่าจะเป็น 85/144
  • Aเต้นC ที่มีความน่าจะเป็น 671/1296

ขอเรียกชุดของลูกเต๋ากับอสังหาริมทรัพย์นี้Grime-nontransitive

ในทางตรงกันข้ามถ้าลูกเต๋ารักษาวงจรเดิมของพวกเขาเมื่อใช้สองโยนเราเรียกพวกเขาnontransitive อย่างยิ่ง (หากไม่มีการวนรอบสองครั้งสำหรับการโยนสองครั้งเราเพียงเรียกพวกเขาว่าไม่มีการถ่ายทอด )

ความท้าทาย

รับสามลูกเต๋าหกด้านตรวจสอบซึ่งคุณสมบัติดังกล่าวข้างต้นชุดนี้มีและเป็นหนึ่งในการส่งออกของสายต่อไปนี้: none, nontransitive, ,Grime-nontransitivestrongly nontransitive

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นรับอินพุตผ่าน STDIN, อาร์กิวเมนต์บรรทัดคำสั่ง, พร้อมท์หรืออาร์กิวเมนต์ของฟังก์ชันและเขียนผลลัพธ์ไปที่ STDOUT หรือส่งคืนเป็นสตริง

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

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

none
1 2 3 4 5 6, 6 5 4 3 2 1, 1 3 5 2 4 6
1 1 1 6 6 6, 4 4 4 5 5 5, 5 5 5 5 5 5
1 1 2 5 6 6, 2 2 3 4 4 6, 2 3 3 4 4 5
0 1 2 3 4 5, 1 1 2 3 3 5, 1 2 2 2 3 5
3 13 5 7 13 7, 5 7 11 5 7 13, 5 9 13 5 7 9

nontransitive
1 2 2 4 6 6, 1 2 3 5 5 5, 2 3 4 4 4 4
1 4 4 4 4 4, 2 2 2 4 5 6, 2 3 3 3 5 5
1 2 1 6 5 6, 3 1 3 6 2 6, 2 4 2 4 4 5
3 4 6 6 7 7, 4 4 4 7 7 7, 5 5 5 5 6 7
2 5 11 11 14 14, 5 5 5 14 14 14, 8 8 8 8 8 17

Grime-nontransitive
3 3 3 3 3 6, 2 2 2 5 5 5, 1 4 4 4 4 4
1 1 4 5 5 5, 2 2 2 3 6 6, 3 3 3 4 4 4
2 1 4 6 4 4, 2 4 5 2 3 5, 3 3 6 3 3 3
11 11 13 15 15 16, 12 12 12 13 16 16, 13 13 13 14 14 14
4 4 7 16 19 19, 4 7 13 13 13 19, 4 10 10 10 16 19

strongly nontransitive
2 2 2 5 5 5, 2 3 3 3 5 5, 1 1 4 5 5 5
2 2 2 3 6 6, 2 2 2 5 5 5, 2 2 4 4 4 5
1 5 1 3 6 5, 6 6 4 2 2 1, 5 3 4 3 4 2
0 0 2 4 4 5, 0 1 1 3 5 5, 1 1 2 3 4 4
1 1 9 17 17 21, 1 5 5 13 21 21, 5 5 13 13 13 17

ถ้าคุณต้องการทดสอบโค้ดของคุณให้ละเอียดยิ่งขึ้น Peter Taylor ก็ใจดีพอที่จะเขียนการใช้งานอ้างอิงซึ่งจำแนกลูกเต๋าทั้งหมด 5,000 ชุดที่มีด้าน 1 ถึง 6 และค่าเฉลี่ย 3.5 ลิงก์ Pastebin


ฉันลืมไปทั้งหมดเกี่ยวกับลูกเต๋าที่ไม่ผ่านกรรมวิธี ขอขอบคุณ :)
npst

ตัวอย่างที่ไม่ใช่การแปลแรกนั้นถูกต้องหรือไม่? 1 2 2 4 6 6, 1 2 3 5 5 5, 2 3 4 4 4 4ฉันได้รับ A <B 17/36, B> C 19/36, C <A 16/36
Tobia

@Tobia คุณลืมว่าสามารถดึงได้ คุณต้องหาวิธีที่แต่ละลูกเต๋าแพ้กับคนอื่น ๆ และตรวจสอบว่ามันน้อยกว่าความน่าจะเป็นที่ชนะ: ใช่ A ชนะต่อ B ที่ 17/36 แต่ A แพ้เทียบกับ B ที่มีเพียง 16/36 ดังนั้น A B ในทำนองเดียวกัน C ชนะกับ A ด้วย 16/36 ตามที่คุณพูด แต่ C แพ้ A เพียง 14/36 ดังนั้น C ชนะ A
Martin Ender

คำตอบ:


5

Dyalog APL, 107 100 ไบต์

{({+/×+/¨,¨×⍵∘.-¨1⌽⍵}{3≠|a←⍺⍺⍵:1⋄a=b←⍺⍺∘.+⍨¨⍵:2⋄3+a=-b}⍵)⊃(⊂'none'),'strongly '⍬'Grime-',¨⊂'nontransitive'}

{T←{+/×+/¨∊¨×⍵∘.-¨1⌽⍵}⋄3≠|S←T⍵:'none'⋄N←'nontransitive'⋄S=D←T∘.+⍨¨⍵:'strongly ',N⋄S=-D:'Grime-',N⋄N}

(ขอบคุณ @Tobia สำหรับวิธีแก้ปัญหาที่ง่ายกว่าสั้นกว่าดีกว่า)

ข้อมูลเบื้องต้น:

  • การมอบหมาย

  • คั่นงบ

  • {} แลมบ์ดาฟอร์ม

  • ⍺⍵ อาร์กิวเมนต์ซ้ายและขวา

  • A:Bยาม ("ถ้าAแล้วกลับมาB ")

Tเป็นฟังก์ชั่นที่ส่งกลับ 3 ถ้า A เต้น B, B เต้น C และ C เต้น A; -3 ถ้าตรงกันข้ามคือกรณี; และบางสิ่งอยู่ภายในเป็นอย่างอื่น ในรายละเอียด:

  • 1⌽⍵เป็นหนึ่งในการหมุนของ ถ้าเป็น ABC การหมุนคือ BCA

  • ∘.-คำนวณตารางการลบระหว่างเวกเตอร์สองตัว ( 1 2...10 ∘.× 1 2...10เป็นตารางสูตรคูณที่เรารู้จักจากโรงเรียน) เราใช้สิ่งนี้ระหว่างแต่ละ¨รายการ( ) ของและรายการที่เกี่ยวข้องใน1⌽⍵และรายการที่สอดคล้องกันใน

  • × Signum ของตัวเลขทั้งหมดในตารางการลบ

  • ∊¨ แผ่แต่ละตาราง

  • +/¨และรวมมัน ขณะนี้เรามีตัวเลขสามตัวที่แทนยอดคงเหลือ: จำนวนที่ชนะลบด้วยการแพ้คดีสำหรับ A vs B, B vs C, C และ A

  • × สัญลักษณ์ของสิ่งเหล่านั้น

  • +/ รวม

จากนั้นจัดการกรณีต่าง ๆ ในทางกลับกัน:

  • 3≠|S←T⍵:'none' ถ้า T⍵ค่าสัมบูรณ์ไม่ใช่ 3 ให้ส่งคืน 'none'

  • N←'nontransitive' เราต้องการคำนี้มาก

  • S=D←T∘.+⍨¨⍵:'strongly ',NคำนวณTสำหรับคู่ของลูกเต๋า ( ∘.+⍨¨⍵←→ ⍵((∘.+)¨)⍵) และกลับมา "อย่างยิ่ง ... " หากความสัมพันธ์แบบเดียวกันระหว่าง ABC ยังคงอยู่

  • S=-D:'Grime-',N ⍝ "สิ่งสกปรก" หากความสัมพันธ์อยู่ในทิศทางตรงกันข้าม

  • N ถ้าทุกอย่างอื่นล้มเหลวเพียงแค่ "ไม่ถ่ายทอด"


1
คุณเอาชนะฉันมัน! ฉันกำลังแก้ไขปัญหานี้เมื่อ 3 วันก่อน แต่หลังจากนั้นฉันก็หยุดเขียนคำตอบ มันคล้ายกับของคุณเกินไปดังนั้นฉันจะโพสต์ไว้ที่นี่ มันสั้นกว่าเล็กน้อยที่ 100 ตัวอักษร:{T←{+/×+/¨∊¨×⍵∘.-¨1⌽⍵}⋄3≠|S←T⍵:'none'⋄N←'nontransitive'⋄S=D←T∘.+⍨¨⍵:'strongly ',N⋄S=-D:'Grime-',N⋄N}
Tobia

@ MartinBüttner: คำที่ถูกต้องในชื่อเรื่องคือ "ตัวอักษร" เนื่องจากจำนวนไบต์จะแตกต่างกันไปขึ้นอยู่กับชุดอักขระที่ใช้ในการเข้ารหัสสัญลักษณ์ APL โดยปกติแล้วพวกเขาจะถูกเข้ารหัสในครึ่งบนของไบต์ 8 บิตหลังจาก ASCII ทุกวันนี้เราใช้ UTF-8 แต่ชุดอักขระเก่ายังคงมีประโยชน์ ... ส่วนใหญ่เพื่อลดจำนวนไบต์เป็นจำนวนตัวอักษรเมื่อเล่นกอล์ฟ!
Tobia

@Tobia ในรหัสสั้นกว่าสำคัญกว่ากอล์ฟเพื่อให้คุณชนะ! ฉันไม่คุ้นเคยกับมารยาทการเล่นกอล์ฟ แต่ฉันคิดว่าคุณควรโพสต์มันเป็นคำตอบที่แยกต่างหากเพราะมันแตกต่างอย่างมากและคุณมาถึงด้วยตนเอง
ngn

@Tobia ฉันชอบที่จะนับเป็นตัวละครเช่นกัน แต่ถ้าการเข้ารหัสแบบคลาสสิกมีความหมายแล้วไบต์ = ตัวอักษรดังนั้นบางทีมันอาจจะไม่สำคัญว่าสิ่งที่เราเรียกพวกเขาว่า ...
ngn

@Tobia แน่นอนว่ามันไม่มีประโยชน์อะไรที่จะนับจำนวนตัวละครในความท้าทายที่ทำคะแนนเป็นไบต์ อย่างไรก็ตามไม่มีใครบอกว่าเราให้คะแนนเป็น UTF-8 ไบต์ ในความเป็นจริงแท็ก wiki บอกอย่างชัดเจนว่าการเข้ารหัสที่มีอยู่สามารถใช้กับอักขระที่อยู่นอกช่วง ASCII ได้ และ APL มีเพจรหัสของตัวเองดังนั้นชุดอักขระทั้งหมดจะพอดีภายในไบต์ นโยบายเกี่ยวกับ PPCG คือการใช้เพจรหัสนี้เพื่อนับ APL - มันแทบจะไม่ยุติธรรมที่จะลงโทษ APL เนื่องจากเก่ากว่า ASCII
Martin Ender

13

Python 2, 269

นี่เป็นนิพจน์เล็กน้อยที่ดีที่ประเมินค่าฟังก์ชัน ยอมรับจำนวนเต็มสามรายการ ผ่านทุกกรณีทดสอบ

lambda A,B,C,w=lambda A,B:cmp(sum(cmp(a,b)for a in A for b in B),0),x=lambda A,B:cmp(sum(cmp(a+c,b+d)for a in A for b in B for c in A for d in B),0): (w(A,B)==w(B,C)==w(C,A)!=0)*((x(A,B)==x(B,C)==x(C,A))*["","strongly ","Grime-"][x(A,B)*w(A,B)]+"nontransitive")or"none"

2

J - 311 257 ไบต์

อัปเดต (13 มกราคม 2558):

g=:4 :'(+/,x>/y)>+/,y>/x'
h=:4 :'(,+/~x)g,+/~y'
f=: 3 :0
'a b c'=:y
if. (b g a)*(c g b)*a g c do.
a=.2{y
c=.0{y
end.
'none'([`]@.((a g b)*(b g c)*c g a))((''([`]@.((b h a)*(c h b)*a h c))'Grime-')([`]@.((a h b)*(b h c)*c h a))'strongly '),'nontransitive'
)

คำอธิบาย: การใช้ Gerunds ทำให้if.s เป็น@.s ได้ง่ายขึ้น

รุ่นเก่ากว่า:

ก่อนอื่นให้ลองเขียนโค้ดทั้งสองใน J เช่นกัน

g=:4 :'(+/,x>/y)>+/,y>/x'
h=:4 :'(,+/~x)g,+/~y'
f=: 3 :0
'a b c'=:y
if. (b g a)*(c g b)*a g c do.
a=.2{y
c=.0{y
end.
if. (a g b)*(b g c)*c g a do.
if. (a h b)*(b h c)*c h a do.
'strongly nontransitive'
elseif. (b h a)*(c h b)*a h c do.
'Grime-nontransitive'
elseif. do.
'nontransitive'
end.
else.
'none'
end.
)

เรียกใช้โดยใช้ไวยากรณ์ที่คล้ายกับที่ติดตาม (เว้นวรรคเพื่อความชัดเจน):

f 3 6 $          1 1 9 17 17 21, 1 5 5 13 21 21, 5 5 13 13 13 17

คำอธิบาย:

gถูกกำหนดให้เป็น diad ที่ใช้สองอาร์เรย์ที่บอกว่าลูกเต๋าแรกชนะลูกเต๋าที่สอง
hถูกกำหนดให้เป็น diad ที่มีสองอาร์เรย์ที่บอกว่าถ้าขว้างสองครั้งและรวมกัน
fคือ monad ที่รับตารางและส่งคืนสตริงที่ คำตอบที่ถูก

แก้ไข: แก้ไขข้อผิดพลาดในเงื่อนไข Grime-nontransitive (แทนที่,ด้วย*)


ฉันชอบคำแนะนำสำหรับการปรับปรุง :)
Jay Bosamiya

@ MartinBüttnerฉันเคยลองแล้ว แต่ไม่รู้ว่าจะต่อกันหลายบรรทัด (หรือประโยคตามที่รู้จักกันใน J) โดยไม่เพิ่มความยาวรหัสมากขึ้น ... การเรียนรู้เกี่ยวกับ "gerunds" ทำให้ฉันเป็น ประโยคที่หลายคนเป็นหนึ่งซึ่งสิ้นสุดการตัดทอนรหัสเช่นกัน ...
เจ Bosamiya

1

Pyth 129 133

Lmsd^b2Msmsm>bkGHDPNK-ghNeNgeNhNR?^tZ<KZKZAGHmsdCm,PkP,yhkyekm,@Qb@QhbUQ?"none"|!G%G3s[*!+GH"Grime-"*qGH"strongly ""nontransitive

ลองที่นี่หรืออย่างน้อยที่สุดที่คุณสามารถทำได้ แต่evalดูเหมือนออนไลน์จะไม่ชอบรายการ :( หากคุณต้องการลองที่นั่นให้จัดเก็บรายการลูกเต๋า 3 ลูกลงในตัวแปรที่โปรแกรมไม่ได้ใช้แล้วแทนที่ด้วยตนเอง อินสแตนซ์ทั้งหมดที่Qมีตัวแปรนั้นการกำหนดค่าเริ่มต้นตัวอย่าง:

J[[3 3 3 3 3 6)[2 2 2 5 5 5)[1 4 4 4 4 4))

สิ่งนี้ผ่านการทดสอบทุกกรณีของมาร์ตินฉันไม่ได้ใจผ่านทุกกรณีของปีเตอร์: พี

คำอธิบาย (นี่จะเป็น doozy)

Lmsd^b2

ค่อนข้างง่ายทำให้ฟังก์ชั่นyที่ส่งคืนผลรวมของคู่ของคาร์ทีเซียนแต่ละค่าใน iterable def y(b):return map(lambda d:sum(d),product(b,repeats=2))เทียบเท่ากับ: นี่ใช้เพื่อสร้างแม่พิมพ์หลายด้านที่จำลองการขว้างปาปกติสองครั้ง

Msmsm>bkGH

กำหนดฟังก์ชั่นgของ 2 ข้อโต้แย้งที่ส่งกลับจำนวนครั้งที่ตายอีกครั้ง def g(G,H):return sum(map(lambda k:sum(map(lambda b:b>k,G)),H)เทียบเท่า

DPNK-ghNeNgeNhNR?^tZ<KZKZ

กำหนด funtion Pที่รับรายการของสองลูกเต๋าเป็นอาร์กิวเมนต์ สิ่งนี้จะส่งกลับ -1 ถ้าผู้ตายแรก 'แพ้', 0 สำหรับเน็คไทและ 1 ถ้าผู้ตายคนแรก 'ชนะ' เทียบเท่ากับ:

def P(N):
 K=g(N[0],N[-1]) - g(N[-1],N[0])
 return -1**(K<0) if K else 0

การAGHมอบหมายทำหน้าที่เหมือนการมอบหมาย python 2-tuple เป็นหลักG,H=(result)

msdCm,PkP,yhkyekm,@Qb@QhbUQ

จะอธิบายย้อนหลังผ่านแผนที่ m,@Qb@QhbUQวนซ้ำมากกว่า b = 0..2 และสร้างลูกเต๋า 2 ลูกพร้อมดัชนี b และดัชนี b + 1 สิ่งนี้ทำให้เรามีลูกเต๋า (A, B), (B, C), (C, A) (pyth จะปรับเปลี่ยนดัชนีโดยอัตโนมัติตามความยาวของรายการ)

ถัดไปm,PkP,yhkyekวนซ้ำผลลัพธ์ของแผนที่ก่อนหน้าโดยแต่ละคู่ลูกเต๋าจะถูกจัดเก็บเป็น k ในแต่ละการวิ่ง ส่งคืนtuple(P(k),P(tuple(y(k[0]),y(k[-1]))))สำหรับแต่ละค่า ที่เดือดลงมาถึง `((จังหวะ A, 2 × A จังหวะ 2 * B), (B จังหวะ C ?, 2 * B จังหวะ .. ))

ในที่สุดmsdCสรุปผลรวมของแผนที่ก่อนหน้าหลังจากที่ซิปแล้ว zip ทำให้ค่า 'beats' ของลูกเต๋าเดี่ยวทั้งหมดใน tuple แรกและค่าลูกเต๋าสองในวินาที

?"none"|!G%G3s[*!+GH"Grime-"*qGH"strongly ""nontransitive

สิ่งขั้นต้นที่พิมพ์ผลลัพธ์ออกมา หาก G เป็น 0 หรือไม่หารด้วย 3 จับนี้ ธ ปท +/- 3 ( |!G%G3), พิมพ์noneมิฉะนั้นพิมพ์ผลรวมของรายการ follwing [not(G+H)*"Grime",(G==H)*"strongly ","nontransitive"]นี้: ฉันคิดว่า booleans อธิบายตนเองได้ค่อนข้างดีเกี่ยวกับคำจำกัดความของคำถาม โปรดทราบว่า G ไม่สามารถเป็นศูนย์ได้ที่นี่เนื่องจากถูกตรวจสอบก่อนหน้านี้


1

J (204)

นานเกินไปอาจจะเล่นกอล์ฟได้มากโดยมีระบบที่มีประสิทธิภาพมากขึ้นสำหรับการเลือกสายที่เหมาะสม

f=:3 :'(<,>)/"1+/"2>"1,"2(<,>)/L:0{(,.(1&|.))y'
n=:'nontransitive'
d=:3 :0
if.+/*/a=.f y do.+/*/b=.f<"1>,"2+/L:0{,.~y if.a-:b do.'strongly ',n elseif.a-:-.b do.'Grime-',n elseif.do.n end.else.'none'end.
)

1

Matlab (427)

มันไม่สั้นและฉันแน่ใจว่ามันสามารถเล่นกอล์ฟได้มากขึ้นฉันพยายามแก้ปัญหานี้เพราะฉันคิดว่ามันเป็นงานที่สนุกมากดังนั้นขอบคุณ@ MartinBüttnerสำหรับการสร้างความท้าทายนี้!

a=input();b=input();c=input();
m = 'non';l=@(a)ones(numel(a),1)*a;n=@(a,b)sum(sum(l(a)>l(b)'));g=@(a,b)n(a,b)>n(b,a);s=@(a,b,c)sum([g(a,b),g(b,c),g(c,a)]);
x=s(a,b,c);y=s(a,c,b);if x~=3 && y~=3;m=[m,'e'];else m=[m,'transitive'];o=ones(6,1);a=o*a;a=a+a';a=a(:)';b=o*b;b=b+b';b=b(:)';c=o*c;c=c+c';c=c(:)';u=s(a,b,c);
v=s(a,c,b);if u==3|| v==3;if x==3&&u==3 || y==3&&v==3 m=['strongly ',m];else m=['Grime-',m];end;end;end;disp(m);

นี่คือรหัสความยาวเต็มรูปแบบพร้อมความคิดเห็นบางส่วนหากคุณต้องการลองทำความเข้าใจว่าเกิดอะไรขึ้น ฉันรวมกรณีทดสอบกระต่ายและ excluced คำสั่ง input:

%nontransitive
% a = [1 2 2 4 6 6];
% b = [1 2 3 5 5 5];
% c = [2 3 4 4 4 4];

%none
% a = [1 2 3 4 5 6];
% b = [6 5 4 3 2 1];
% c = [1 3 5 2 4 6];

%grime nontransitive
% a = [3 3 3 3 3 6];
% b = [2 2 2 5 5 5];
% c = [1 4 4 4 4 4];

%strongly nontransitive
% a = [2 2 2 5 5 5];
% b = [2 3 3 3 5 5];
% c = [1 1 4 5 5 5];

m = 'non';

l=@(a)ones(numel(a),1)*a;
n=@(a,b)sum(sum(l(a)>l(b)'));
%input as row vector, tests whether the left one beats the right one:
g=@(a,b)n(a,b)>n(b,a);
s=@(a,b,c)sum([g(a,b),g(b,c),g(c,a)]);
%if one of those x,y has the value 3, we'll have intransitivity
x=s(a,b,c); 
y=s(a,c,b);
if x~=3 && y~=3 %nontransitive
    m=[m,'e'];
else %transitive
    m=[m,'transitive'];
    o=ones(6,1);
    a=o*a;a=a+a';a=a(:)'; %all possible sums of two elements of a
    b=o*b;b=b+b';b=b(:)';
    c=o*c;c=c+c';c=c(:)';
    u=s(a,b,c);
    v=s(a,c,b);

    %again: is u or v equal to 3 then we have transitivity
    if u==3 || v==3 %grime OR strongly
        % if e.g. x==3 and u==3 then the 'intransitivity' is in the same
        % 'order', that means stronlgy transitive
        if x==3 && u==3 || y==3 && v==3%strongly
            m=['strongly ',m];
        else %grime
            m=['Grime-',m];
        end   
    end
end

disp(m);

มันจะไม่สั้นลงไหมถ้าคุณอ่านอาเรย์หนึ่งinput()แล้วกำหนดสามองค์ประกอบให้a,b,c? นอกจากนี้โปรดใช้สตริงแน่นอนในข้อมูลจำเพาะ ( none, nontransitiveและพิมพ์ใหญ่Grime) ... อาจจะช่วยให้คุณประหยัดแม้ไบต์
Martin Ender

ใช่อาจจะสั้นกว่านี้ฉันจะดูที่ สตริงจะตรงเหล่านั้นฉันเพิ่งออกdispคำสั่งในรุ่นยาวพวกเขาเพียงสำหรับการทดสอบโปรแกรม mแต่ข้อความสุดท้ายถูกเก็บไว้ใน Gและฉันแก้ไข
ข้อบกพร่อง

0

JavaScript - 276 ไบต์

function(l){r=function(i){return l[i][Math.random()*6|0]};p=q=0;for(i=0;j=(i+1)%3,i<3;++i)for(k=0;k<1e5;++k){p+=(r(i)>r(j))-(r(i)<r(j));q+=(r(i)+r(i)>r(j)+r(j))-(r(i)+r(i)<r(j)+r(j))}alert((a=Math.abs)(p)>5e3?((a(q)>5e3?p*q>0?'strongly ':'Grime-':'')+'nontransitive'):'none')}

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

นิพจน์ประเมินค่าไปยังฟังก์ชันที่ควรถูกเรียกด้วยอาร์กิวเมนต์เพียงตัวเดียวนั่นคืออาร์เรย์ของจำนวนเต็มสามอาร์เรย์ ตรวจสอบซอเพื่อให้สามารถเรียกใช้รหัสด้วยตัวเอง

นี่คือรุ่นที่ไม่ได้แต่งแต้ม:

function (diceList) {
    var getRandomValue = function (idDie) {
        return diceList[idDie][Math.floor(Math.random() * 6)];
    };

    var probabilitySimpleThrow = 0;
    var probabilityDoubleThrow = 0;

    for (var idDieA = 0; idDieA < 3; ++idDieA)
    {
        var idDieB = (idDieA + 1) % 3;
        for (var idThrow = 0; idThrow < 1e5; ++idThrow)
        {
            probabilitySimpleThrow += getRandomValue(idDieA) > getRandomValue(idDieB);
            probabilitySimpleThrow -= getRandomValue(idDieA) < getRandomValue(idDieB);

            probabilityDoubleThrow += getRandomValue(idDieA) + getRandomValue(idDieA) > getRandomValue(idDieB) + getRandomValue(idDieB);
            probabilityDoubleThrow -= getRandomValue(idDieA) + getRandomValue(idDieA) < getRandomValue(idDieB) + getRandomValue(idDieB);
        }
    }

    if (Math.abs(probabilitySimpleThrow) > 5e3) {
        if (Math.abs(probabilityDoubleThrow) > 5e3) {
            if (probabilitySimpleThrow * probabilityDoubleThrow > 0) {
                var result = 'strongly ';
            }
            else {
                var result = 'Grime-';
            }
        }
        else {
            var result = '';
        }

        result += 'nontransitive';
    }
    else {
        var result = 'none';
    }

    alert(result);
}

หืมฉันไม่คิดว่านี่จะเป็นวิญญาณของการท้าทาย โดยพื้นฐานแล้วคุณเปลี่ยนจากการท้าทายทฤษฎีความน่าจะเป็นความท้าทายทางสถิติ ;) ... แทนที่จะโยนแบบสุ่มคุณสามารถระบุการโยนที่เป็นไปได้ทั้งหมดเพียงครั้งเดียว ที่จะให้ผลลัพธ์ที่แน่นอน (และจะทำงานเร็วขึ้นมาก)
Martin Ender

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