เกมตั้งปริศนา


13

อาจเป็นได้ว่าคุณรู้จักเกม Set (เกมที่ยอดเยี่ยมสำหรับเด็ก ๆ ) เกมไพ่ที่มี 81 ใบซึ่งการ์ดแต่ละใบมีตัวเลขอยู่ด้วย 4 คุณลักษณะที่แตกต่างกัน (รูปแบบหมายเลขสีและการเติม) แต่ละแอตทริบิวต์มี 3 ค่าแตกต่างกัน:

form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.

วางไพ่ 12 ใบบนโต๊ะและตอนนี้ความท้าทายคือการระบุชุด ชุดประกอบด้วยไพ่สามใบที่ทุกค่าแอตทริบิวต์เกิดขึ้น 0, 1 หรือ 3 ครั้ง การมีไพ่ 2 ใบที่มีตัวเลขสีแดงหรือทึบแสงหรือหมายเลข 1 นั้นไม่ดี ดูที่จัดลิงค์สำหรับคำอธิบายภาพมากขึ้น

ฉันจินตนาการรหัสสำหรับการ์ดที่มีการเข้ารหัสคุณลักษณะทั้งหมด

"WP2N"

หมายถึง

2 Purple Waves with No fill

ร่วมกับตัวอย่างOR1NและDG3N

และ ป้อนคำอธิบายรูปภาพที่นี่

มันเป็นชุด (3 รูปแบบที่แตกต่างกัน 3 สีที่แตกต่างกัน 3 หมายเลขที่แตกต่างกัน 1 เติม)

อินพุตคือสตริงที่คั่นด้วยช่องว่างของรหัสที่ไม่ซ้ำกัน (สุ่มจาก 81 รหัสที่เป็นไปได้) ที่เป็นตัวแทนของการ์ด

"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D"

การแก้ปัญหาจะต้องระบุชุดที่เป็นไปได้ทั้งหมดภายในคอลเลกชันที่กำหนด ดังนั้น

OR1N, WP2N, DG3N

จะต้องเป็นส่วนหนึ่งของการแก้ปัญหาร่วมกับชุดอื่น ๆ ทั้งหมด


5
ฟังดูมีแนวโน้ม แต่โปรดระบุให้ชัดเจนยิ่งขึ้นว่าต้องจัดการกับข้อมูลประเภทใด (stdin, file, พารามิเตอร์) และลักษณะของข้อมูลอินพุตและเอาต์พุตจะเป็นอย่างไร ยังมีการแสดงภาพ (ภาพหน้าจอหรือคล้ายกัน) ของการรันตัวอย่าง
จัดการ

1
ฉันได้ถอนการโหวตอย่างใกล้ชิดของฉันแล้วและอัปเกรดสิ่งนี้ มันน่าสนใจสุด ๆ! :)
Doorknob

4
นรกคุณหมายถึง "game for kids" หรือเปล่า?
บูธโดย

2
Waitaminute ... มี 4 ตัวอักษรที่แตกต่างกัน 4: N, D, S, และ O.
บูธโดย

1
@boothby: ฉันจะได้พูดตรงข้าม หากตัวอักษรไม่ทับซ้อนกันสำหรับชุดผู้สมัครทุกชุดคุณสามารถนับได้ว่ามีตัวอักษรหรือตัวเลขปรากฏขึ้นกี่ครั้ง: ชุดจะใช้ได้หากไม่มีตัวอักษรหรือตัวเลขปรากฏสองครั้ง
flodel

คำตอบ:


4

Ruby, 104 98 81 80 ตัวอักษร

$*.combination(3).map{|c|puts c*?,if(0..3).all?{|i|c.map{|x|x[i]}.uniq.size!=2}}

การรันตัวอย่าง (ใช้ข้อมูลตัวอย่างของคุณ):

c:\a\ruby>set.rb OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
OR1N,WP2N,DG3N
WP2N,DR1D,OG3O
WP2N,DR1D,OG3O
DG3N,WG3S,OG3O

มันออกมาWP2N,DR1D,OG3Oสองครั้งเพราะคุณมีสองDR1Ds ในข้อมูลตัวอย่างของคุณ

คำอธิบาย:

$*.combination(3).map{|c|- การรวมกันของ 3 ใบ
puts c*?,if- ส่งออกชุดถ้า ...
(0..3).all?{|i|- ถ้าตัวเลขทั้งหมดจาก 0 ถึง 3 (ดัชนีของคุณสมบัติในสตริง) ประเมินว่าtrueเมื่อผ่านเข้าไปในบล็อกนี้
c.map{|x|x[i]}- ใช้iดัชนี th ของแต่ละสตริง
.uniq.size!=2}- หากจำนวนของคุณสมบัติที่ไม่ซ้ำกัน (รูปแบบสีและอื่น ๆ ) ไม่ใช่ 2 (ดังนั้น 1 หรือ 3)


สมมติว่าความท้าทายนี้จะกลายเป็น codegolf ผมอาจจะเสนอการปรับปรุงที่สองก) กำจัดendบวกแบ่งบรรทัดหลายแปลงif ... puts ... endลงในputs ... if ...ข) สามารถใช้บล็อกจึงx.map{}.all?มีค่าเท่ากับx.all?{}
ฮาวเวิร์ด

@How ขอบคุณฉันจะทำให้การปรับปรุงเหล่านั้นเมื่อฉันได้รับคอมพิวเตอร์
Doorknob

@Howard แก้ไขเพื่อรวมทั้งสองอย่าง ขอบคุณ!
Doorknob

ifนอกจากนี้ยังนำพื้นที่หลัง
Howard

ฉันชอบวิธีการแก้ปัญหาทับทิมสั้นกระชับและอ่านง่ายขึ้นหรือน้อยลง
dr jerry

5

Mathematica 93 92 93 82 76 73

f={}⋃Select[StringSplit@#~Subsets~{3}, FreeQ[Tally/@(Characters@#^T),2]&]&

ลอจิก

StringSplit@#~Subsets~{3}สร้างรายการชุดย่อย 3 ใบ สามแต่ละเช่น:

{{"D", "G", "3", "N"}, {"W", "G", "3", "S"}, {"O", "G", "3", "O"}}

หรือ

อาร์เรย์ 1

ถูกย้ายแล้ว

อาร์เรย์ 2

และTally/@(Characters@#^T)นับจำนวนรายการที่แตกต่างในแต่ละแถว

{3,1,1,3}

3 สอดคล้องกับ "แตกต่างกันทั้งหมด"; 1 สอดคล้องกับ "all เดียวกัน"

FreeQ[...,2]กำหนดว่าไพ่ 2 ใบประเภทเดียวกันหรือสามใบ หากไพ่ 2 ใบนั้นไม่ใช่ไพ่ในระดับสูงไพ่ทั้งสามใบจะเป็น "ชุด" ตามกฎของ Game of Set


การใช้

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{"DG3N", "WG3S", "OG3O"}, {"OR1N", "WP2N", "DG3N"}, {"WP2N", "DR1D", "OG3O"}}


อาจจะสั้นกว่านี้หากอนุญาตการทำซ้ำ f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&ผลผลิตจะเป็น{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
alephalpha

วิธีที่ฉลาดมากในการตรวจสอบ "เหมือนกันทั้งหมด" หรือ "แตกต่างกันทั้งหมด"!
DavidC

4

Mathematica 73

f = Select[StringSplit@#~Subsets~{3}, FreeQ[Tally /@ Thread@Characters@#, 2] &] &

การใช้

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{"OR1N", "WP2N", "DG3N"}, {"WP2N", "DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S" "," OG3O "}}


4

Brachylogขนาด 12 ไบต์

ṇ₁⊇Ṫz{=|≠}ᵐz

ลองออนไลน์!

รับอินพุตผ่านตัวแปรอินพุตและสร้างเอาต์พุตผ่านตัวแปรเอาต์พุต

กรณีทดสอบที่สองที่นำมาจากการเข้ารหัสที่เพิ่งปิดไปเมื่อเร็ว ๆนี้เนื่องจากโซลูชันนี้ไม่สนใจสิ่งที่จริงหมายถึงอะไร

                The output variable is
  ⊇             a subsequence
   Ṫ            of length 3
ṇ₁              of the input split on spaces,
    z      z    the columns of which
     {   }ᵐ     are all
       |        either
      =         the same element repeated,
        ≠       or entirely free of duplicates.


3

GolfScript, 53 ตัวอักษร

" "/:w,,{:a,{:^,{a^]{w=}%.0\zip{.&,2=|}/!{.p}*;}/}/}/

ต้องป้อนข้อมูลใน STDIN ตัวอย่างออนไลน์ :

> OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D
["OR1N" "DG3N" "WP2N"]
["WP2N" "OG3O" "DR1D"]
["DG3N" "OG3O" "WG3S"]
["WR2D" "OR2D" "DR2D"]

รหัสความคิดเห็น:

" "/:w          # split the input at spaces and assign it to variable w
,,              # create the array [0..n-1] (n being the length of w)
{:a,{:^,{       # three nested loops: a=0..n-1, ^=0..a-1, _=0..b-1 
                # (third loop has no variable assigned but just pushes on stack)
    a^]         # make an array [a,^,_] of the three loop variables
    {w=}%       # take the corresponding list items, i.e. [w[a],w[^],w[_]]
    .0\         # push zero, add duplicate of the the array
    zip         # zip transposes the array, thus [OR1N WP2N DG3N] -> [OWD RPG 123 NNN]
    {           # loop over those entries
      .&        # unique
      ,2=       # length equals 2?
      |         # "or" with top of stack (two zero pushed before)
    }/          # end of loop, on stack remains the results of the "or"s
    !{.p}*      # if no length of 2 is there, make a copy of the set and print it
    ;           # discard stack item
}/}/}/          # closing the three nested loops

2
ฉันจะบอกว่าเป็นผู้ชนะที่ชัดเจนสำหรับรหัสกอล์ฟ Hower ไม่สามารถอ่านได้ทั้งหมด ..
dr jerry

1
@drjerry เปรียบเทียบกับรหัส golfscript อื่น ๆ มันค่อนข้างอ่านง่าย เช่นมันมีลูปธรรมดาเท่านั้นและไม่มีเทคนิคขั้นสูง ฉันจะเพิ่มคำอธิบายของรหัสในภายหลัง
โฮเวิร์ด

0\zip{.&,2=|}/!สามารถย่อให้เล็กลงได้zip{.&,}%2&!
Peter Taylor

1

javascript 323 313

function a(b){d=h=[];c=e=f=0;for(i in b){for(j in b){for(k in b[i]){if(b[i][k]==b[j][k]){if(c+f<4)c++;else if(c==4){h+=b[j];if(h.length=3)return h}}else{for(l in d){for(m in d[l]){g=f;if(d[l][2]==i){if(d[l][3]==k)if(b[j][k]!=d[l][0]&&b[j][k]!=d[l][1])f++;}else{continue}}if(g==f)d[e++]=[b[i][k],b[j][k],j,k]}}}}}}

ฟังก์ชั่นที่ใช้อาร์เรย์ของวัตถุและส่งกลับอาร์เรย์ของวัตถุ

ซอเด็ม (มีระเบียบขึ้น)


คุณไม่ต้องประกาศตัวแปร ...
Doorknob

@ Doorknob ฉันเอามันกลับมาคุณพูดถูก แก้ไข ขอบคุณ!
เครื่องทำความเย็นคณิตศาสตร์

1

APL (IBM), 76

⍉¨x/⍨{{⍵≡1⌽⍵}⍵=1⌽⍵}¨x←⊃¨(∘.,/3⍴⊂⍪¨(' '≠y)⊂y←⍞)⌷⍨¨z/⍨∧/¨2</¨z←,⍳3⍴12

ฉันไม่มี IBM APL แต่ฉันเชื่อว่านี่จะใช้งานได้

การรันตัวอย่าง (การเลียนแบบ IBM APL ใน Dyalog APL)

OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
 OR1N  WP2N  WP2N  DG3N 
 WP2N  DR1D  DR1D  WG3S 
 DG3N  OG3O  OG3O  OG3O 

ครั้งแรกที่ฉันเห็นรหัส apl ขอบคุณ!
dr jerry

1

Sage, 71

ถ้าCเป็นสตริง"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"ให้เรียกใช้งาน

[c for c in Subsets(C.split(),3)if{1,3}>={len(set(x))for x in zip(*c)}]

เพื่อรับ [{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]

และนี่เป็นวิธีที่แตกต่างกันมากโดยใช้การตีความที่ Set เป็นเส้นฉายภาพในGF(3)^4:

[c for c in Subsets(C.split(),3)if sum(matrix(3,map('WODRPG123N'.find,''.join(c))))%3==0]

ฉันรำคาญนิดหน่อยที่Dใช้สองครั้ง ... จนกระทั่งฉันรู้วิธีที่จะใช้มันในทางที่ผิด แต่ยิ่งกว่านั้นฉันก็ใช้findวิธีนี้ในทางที่ผิดด้วย str.findส่งกลับ -1 ถ้าไม่พบจดหมาย ตั้งแต่-1 = 2 mod 3ตัวอักษรจะถูกจัดการอย่างเหมาะสมเพราะมันไม่ได้เกิดขึ้นในS'WODRPG123N'


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