Dobble / SpotIt कार्ड जनरेटर


15

परिचय

डोबबल / स्पॉट इट एक कार्ड गेम है, जहां लोगों को कम से कम समय में जोड़े के कार्ड पर एक ही चिन्ह लगाना होता है, इसे इंगित करें और अगली जोड़ी में स्थानांतरित करें। प्रत्येक कार्ड में कई चिह्न होते हैं (सामान्य संस्करण में 8), लेकिन कार्ड के प्रत्येक जोड़े के बीच एक समान है।

खेल की भौतिक प्रति से उदाहरण: जोड़े के उदाहरण के साथ कार्ड

चुनौती

एक कार्यक्रम लिखें, जिसमें प्रतीकों का सेट (एकल एशियासी अक्षर) और एकल कार्ड पर प्रतीकों की संख्या प्रत्येक कार्ड के प्रतीकों के साथ आउटपुट लिस्टिंग कार्ड का उत्पादन करेगी। स्पष्ट रूप से कई समतुल्य संयोजन हैं, आपके प्रोग्राम को बस किसी भी संयोजन को लिखना होगा जो दिए गए इनपुट के लिए सबसे बड़ी मात्रा में कार्ड का उत्पादन करता है।

यह एक कोड-गोल्फ है, इसलिए कोड को कम, बेहतर।

सबसे जटिल मामले के लिए ब्रह्मांड की गर्मी से पहले गणना खत्म हो जाएगी तो यह भी बहुत अच्छा होगा।

इनपुट

कार्य करने के लिए दो तर्क / स्टडिन (आपकी पसंद)

  • उनमें से सबसे पहले प्रतीकों का संग्रह, कुछ 'ABCDE' या 'A', 'B', 'C', 'D', 'E'] जैसे- आपकी पसंद का प्रारूप, स्ट्रिंग, सेट, सूची, स्ट्रीम , या जो कुछ भी पसंद की भाषा के लिए मुहावरेदार है। वर्ण [ए-ज़-ज़ेड0-9] के सेट से दिए जाएंगे, कोई डुप्लिकेट नहीं है (इसलिए इनपुट प्रतीक सेट का अधिकतम आकार 62 है)। वे संभवत: में व्यवस्थित नहीं होंगे। तो आप "yX4i9A" के साथ-साथ 6-प्रतीक मामले के लिए भी प्राप्त कर सकते हैं)।

  • दूसरा तर्क पूर्णांक है, जो एकल कार्ड पर प्रतीकों की मात्रा को दर्शाता है। यह प्रतीक के आकार की तुलना में <= होगा।

उत्पादन

नई लाइनों द्वारा अलग-अलग कई पंक्तियों को प्रिंट करें, उनमें से प्रत्येक में एकल कार्ड के लिए प्रतीक हैं।

उदाहरण

ABC
2
>>>>
AB
BC
AC

या

ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF

या

ABCDE
4
>>>>
ABCD

संकेत

  • उत्पादित कार्डों की संख्या अलग-अलग प्रतीकों की मात्रा से बड़ी नहीं हो सकती है और कई संयोजनों में यह काफी छोटा होगा
  • यदि आपको समस्या के गणित पक्ष की सहायता की आवश्यकता है, तो आप कुछ गणित पृष्ठभूमि पढ़ना चाह सकते हैं

यह मेरी पहली कोड गोल्फ चुनौती है, इसलिए कृपया प्रारूपण / शैली के साथ संभावित मुद्दों को क्षमा करें - यदि आप उन्हें टिप्पणियों में इंगित करते हैं, तो मैं त्रुटियों को ठीक करने का प्रयास करूंगा।



सुझाए गए परीक्षण-केस ('abcdefghijklmnopqrstu', 5)-> ['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']या कुछ अन्य 21-कार्ड कार्य-समाधान। (ध्यान दें कि यह ऑर्डर 4 का अनुमानित परिमित विमान है)।
जोनाथन एलन

जवाबों:


5

पायथन 2 , 192 162 बाइट्स

मेरा तर्क है कि यह हर परिदृश्य के लिए अधिकतम कार्ड का उत्पादन करता है और यह 3 परीक्षण मामलों को संभालता है।

from itertools import*
def m(a,s):
    C=["".join(x)for x in combinations(a,s)]
    while len(C):
        print C[0]
        C=list(set(A for A in C if len(set(A)&set(C[0]))==1<s))

इसे ऑनलाइन आज़माएं!

कलन विधि

एक वर्णमाला aऔर एक कार्ड के आकार को देखते हुए s, sतत्वों के सभी संयोजनों को लें aऔर इसे कॉल करें C:

  • का पहला तत्व लें C, इसे कॉल करेंC0
  • सहेजें C0
  • से सभी तत्वों को निकालेंC जिनके पास एक C0समान नहीं है1
  • के दूसरे तत्व के साथ दोहराएँ C
  • तब तक जारी रखें Cखाली रहने

फिर सहेजे गए तत्वों को प्रिंट करें।

बहस

में से कुछ गैर खाली सबसेट C, हमारे अधिक से अधिक समाधान है K। चूँकि इसमें कम से कम एक तत्व होता है और कोई भी दो तत्व अप्रभेद्य होते हैं, एक मनमाना तत्व चुनते हैं C0, जिसमें Cहोना है K। में किसी भी तत्व eके लिए K, eसंघ की कार्डिनैलिटी x1 के लिए x != eहै K; इसलिए उन सभी तत्वों को समाप्त करें Cजिनकी संगति C0में कार्डिनैलिटी नहीं है। 1. उसी तर्क से, एक नया मनमाना तत्व चुनें C, इसे जोड़ें Kऔर घटाएं C। अंततः Cखाली सेट है और Kअधिकतम समाधान होगा क्योंकि किसी भी बिंदु पर हमने ऐसा तत्व नहीं चुना जो किसी अन्य तत्व से अलग था।


परीक्षण के मामलों

ये परीक्षण मामले मुझे एहसास होने से पहले लिखे गए थे कि छपाई एक आवश्यकता थी।

a=["a","b","c"]
b=2
c=3
d=m(a,b)
print d,len(d)==c
>> ['bc', 'ab', 'ac'] True

a=["a","b","c","d","e","f","g"]
b=3
c=7
d=m(a,b)
print d,len(d)==c
>> ['aef', 'abc', 'bde', 'ceg', 'adg', 'cdf', 'bfg'] True

a=["a","b","c","d","e"]
b=4
c=1
d=m(a,b)
print d,len(d)==c
>> ['abcd'] True

अपडेट करें

  • +9 [16-12-07] प्रिंट आवश्यकता को पूरा करें
  • -11 [१६-१२-०-07] मेरे Rचर को बाहर निकाला
  • -30 [16-12-09] @ चरो Kके लिए धन्यवाद, मेरे चर को निकाल दिया !

1
क्या आपको वास्तव में सेट K को C से हर चरण पर घटाना है? मुझे लगता है कि आपके द्वारा किए गए फ़िल्टरिंग ( A for A in C if len(set(A)&set(C[0]))==1) पहले से ही चुने गए तत्वों को हटा देता है, जब तक कि s == 1 (इस मामले में लेन (सेट (सी [0])) और सेट (सी [0]) 1 नहीं होगा)। आप अपनी दूसरी अंतिम पंक्ति को गोल्फ के लिए ले सकते हैं:C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Leo

मैं सैंडबॉक्स में डॉबल चैलेंज लिख रहा था और डोम हेस्टिंग्स ने मुझे इस सवाल के लिए एक संभावित डूप (जो कि अच्छी तरह से हो सकता है) के रूप में बताया, हालांकि एक बात जो मैंने गौर की वह यह है कि एन * एन का पूर्ण डोबबल डेक बनाना बहुत कठिन है। + एन + 1 कार्ड (और प्रतीक) एन + 1 प्रतीक प्रति कार्ड के साथ एन एक गैर-प्राइम प्राइम-पॉवर है। N = 4 = 2 ^ 2 के लिए यह 4 * 4 + 4 + 1 = 21 प्रतीकों और कार्डों की समान संख्या का उपयोग करके एक डेक होगा; हालाँकि यह समाधान केवल 13 कार्ड का एक डेक तैयार करता है - फिर भी 21 संभव है
जोनाथन एलन

@JonathanAllan ने केवल एक TIO लिंक जोड़ा है। मैंने फ़ंक्शन को 21 वर्णों की वर्णमाला और प्रति कार्ड 5 वर्णों के साथ चलाया। यह 21 कार्ड का उत्पादन करता है। मुझे लगता है कि यह सही है जब तक कि मुझे गलत नहीं समझा।
नॉनलाइनयरफ्रूट

हम्म, क्षमा करें, मैंने इसे स्थानीय रूप से चलाने के बाद कुछ गलती की होगी! ( यही कारण है कि आदेश 4. की एक पूर्ण Dobble डेक है :) )
जोनाथन एलन

2

हास्केल, 175 156 बाइट्स

मेरी पहली गोल्फ में, मुझे पता है कि अगर मैंने कुछ गड़बड़ की है।

import Data.List
f 0_=[[]]
f n a=g$c n a
c n a=[a!!i:x|i<-[0..(length a)-1],x<-f(n-1)(drop(i+1)a)]
g[]=[]
g(x:t)=x:g(filter(\z->length(z`intersect`x)<= 1)t)

इसे ऑनलाइन आज़माएं!

@ -पल मटर को सुधार और -19 बाइट्स के लिए धन्यवाद


मूल संस्करण


1
PPCG में आपका स्वागत है! ध्यान दें कि आयात आपके स्कोर की ओर गिनता है। संभावित सुधार: 156 बाइट्स, जिसमें आयात भी शामिल है
पॉल मटर

सिर के लिए धन्यवाद, मुझे यकीन नहीं था कि अगर उन्होंने किया!
बग

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