सेट पहेली का खेल


13

हो सकता है कि आप सेट के खेल को जानते हैं (बच्चों के लिए एक अद्भुत गेम btw) 81 कार्ड के साथ एक कार्ड गेम, जहां प्रत्येक कार्ड पर 4 अलग-अलग विशेषताओं (रूप, संख्या, रंग और भरण) के साथ एक आकृति होती है। प्रत्येक विशेषता के 3 अलग-अलग मूल्य हैं:

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

12 कार्ड टेबल पर खुले रखे गए हैं और अब सेट को इंगित करना चुनौती है। एक सेट में तीन कार्ड होते हैं जहां हर विशेषता मान 0, 1 या 3 बार होता है। लाल आंकड़े, या अपारदर्शी, या 1 नंबर के साथ 2 कार्ड होना अच्छा नहीं है। अधिक दृश्य स्पष्टीकरण के लिए आपूर्ति की गई लिंक देखें ।

मैं एक कार्ड के लिए एक कोड की कल्पना करता हूं जहां सभी विशेषताओं को एन्कोड किया गया है

"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
होनहार लगता है, लेकिन अधिक सटीक रूप से निर्दिष्ट करें कि किस तरह के इनपुट डेटा को संभाला जाना चाहिए (स्टडिन, फ़ाइल, पैरामीटर) और इनपुट और आउटपुट डेटा कैसा दिखेगा। नमूना रन का एक दृश्य प्रतिनिधित्व (स्क्रीनशॉट या समान) भी प्रदान करें।
मैनटवर्क

1
मैंने अपना करीबी वोट वापस ले लिया है और इसे बढ़ा दिया है; यह बहुत दिलचस्प है! :)
दरवाज़े

4
नरक क्या आप "बच्चों के लिए खेल" से मतलब है?
बूथबीज

2
Waitaminute ... 4 अलग-अलग 4 अक्षर हैं: N, D, S, और O.
बूथबी

1
@boothby: मैंने इसके विपरीत कहा होगा। यदि अक्षर प्रत्येक उम्मीदवार के सेट के लिए ओवरलैप नहीं करते हैं, तो आप केवल यह गिन सकते हैं कि प्रत्येक अक्षर या संख्या कितनी बार दिखाई देती है: यदि कोई संख्या या अक्षर दो बार दिखाई देता है, तो सेट मान्य है।
फ्लोडेल

जवाबों:


4

रूबी, 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दो बार आउटपुट करता है क्योंकि DR1Dआपके नमूना डेटा में दो एस हैं।

स्पष्टीकरण:

$*.combination(3).map{|c|- 3 कार्ड के प्रत्येक संयोजन
puts c*?,if- सेट आउटपुट, अगर ...
(0..3).all?{|i|- यदि 0 से 3 तक सभी संख्याएँ (स्ट्रिंग में गुणों का इंडोल) trueइस ब्लॉक में पारित होने पर मूल्यांकन करें
c.map{|x|x[i]}- iप्रत्येक स्ट्रिंग का वें सूचकांक लें
.uniq.size!=2}- यदि अद्वितीय गुणों की मात्रा (रूप, रंग, आदि) 2 नहीं है (तो, 1 या 3)


यह मानते हुए कि यह चुनौती कोडगॉल्फ बन जाएगी, क्या मैं दो सुधारों का प्रस्ताव रख सकता हूं: क) endप्लस कई लाइन टूटने से छुटकारा पाएं : बी if ... puts ... endमें बदलना puts ... if ...) सभी एक ब्लॉक ले सकते हैं, इस तरह x.map{}.all?से बराबर हैx.all?{}
हावर्ड

@ धन्यवाद, जब मैं कंप्यूटर पर आऊंगा तो उन सुधारों को करूंगा।
दरवाज़े

@ हॉवर्ड ने दोनों को शामिल करने का संपादन किया। धन्यवाद!
दरवाज़े

इसके बाद स्पेस भी हटा दें if
हावर्ड

मुझे माणिक समाधान पसंद है, संक्षिप्त, संक्षिप्त और अधिक या कम पठनीय
डॉ। जेरी

5

गणितज्ञ 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", "ओ"}}

या

सरणी 1

फिर प्रत्यारोपित किया जाता है,

सरणी 2

और Tally/@(Characters@#^T)प्रत्येक पंक्ति में अलग-अलग वस्तुओं की संख्या को बढ़ाता है।

{3,1,1,3}

3 "सभी अलग-अलग" से मेल खाती है; 1 "सभी समान" से मेल खाता है।

FreeQ[...,2]निर्धारित करता है कि एक ही प्रकार के 2 कार्ड या ट्रिपल में। अगर गेम ऑफ़ सेट नियमों के अनुसार, 2 लम्बाई में नहीं है, तो तीन कार्ड एक "सेट" हैं।


प्रयोग

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

"सभी समान" या "सभी अलग-अलग" की जांच करने का बहुत चतुर तरीका!
डेविड

4

गणितज्ञ 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

ब्रेकीलॉग , 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
मैं एक कोड-गोल्फ के लिए एक स्पष्ट विजेता कहूंगा। हाउर पूरी तरह से अपठनीय ..
dr jerry

1
@drjerry अन्य गोल्फ कोड के साथ तुलना में यह काफी पठनीय है। उदाहरण के लिए इसमें केवल सादे छोरों और कोई उन्नत चाल नहीं है। मैं बाद में कोड की एक व्याख्या जोड़ूंगा।
हावर्ड

0\zip{.&,2=|}/!को छोटा किया जा सकता हैzip{.&,}%2&!
पीटर टेलर

1

जावास्क्रिप्ट 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]}}}}}}

यह एक फ़ंक्शन है जो ऑब्जेक्ट्स की एक सरणी लेता है, और ऑब्जेक्ट्स की एक सरणी लौटाता है।

DEMO फिडल (साफ-सुथरा होने के साथ)।


आप चर घोषित करने के लिए नहीं है ...
दरवाज़े

@ डॉर्कनोब मैं इसे वापस लेता हूं, आप सही हैं। संपादित। धन्यवाद!
मैथ चिलर

1

एपीएल (आईबीएम), 76

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

मेरे पास आईबीएम एपीएल नहीं है, लेकिन मेरा मानना ​​है कि यह काम करेगा।

सैंपल रन (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 कोड धन्यवाद!
डेरी जेरी

1

ऋषि, ,१

यदि 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'}]

और यहाँ एक व्याख्या का उपयोग करके एक बहुत अलग दृष्टिकोण है कि एक सेट एक प्रक्षेपवक्र लाइन है 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'


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.