सममित लेडीबग्स


22

परिचय:

जब हम लेडीबग्स के बारे में सोचते हैं, तो हम आमतौर पर काले धब्बों के साथ एक लाल या गहरे नारंगी बग के बारे में सोचते हैं। यद्यपि यह आवश्यक नहीं है, क्योंकि लाल / नारंगी चित्तीदार भिंडी के साथ काले भी होते हैं , या बिना धब्बों वाली भिंडी होती है , हम मुख्य रूप से इस एशियाई गुबरैले जैसी भिंडी की तस्वीर लेते हैं:

यहां छवि विवरण दर्ज करें

एक और ध्यान देने वाली बात यह है कि भिंडी पर धब्बे लगभग हमेशा सममित होते हैं। और यहीं से यह चुनौती सामने आती है।

चुनौती:

एक पूर्णांक n( >= 0) को देखते हुए , निम्नलिखित ASCII- आर्ट लेडीबग को एक या कई बार आउटपुट करें, सममित धब्बों को समान रूप से दो पक्षों के बीच विभाजित किया जाए, साथ ही साथ दो या अधिक लेडीबग्स।

यहाँ डिफ़ॉल्ट लेडीबग लेआउट है:

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

यदि n=0, हम ऊपर के रूप में भिंडी का उत्पादन करते हैं।

जब nशून्य से बड़ा होता है, तो हम या तो ASCII- कला बग के रिक्त स्थान को भरते हैं o, या |केंद्र में एक राजधानी के साथ प्रतिस्थापित करते हैं O। लक्ष्य n'खाली' लेडीबग (एस) में परिवर्तन करना है, जबकि अभी भी सममित आउटपुट (प्रति लेडीबग) का उत्पादन करना है, और संभव के रूप में कुछ लेडीबग्स का उत्पादन करना है।

तो इसके लिए वैध आउटपुट n=1हैं:

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

लेकिन यह अमान्य होगा:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

इसके लिए वैध आउटपुट n=2हैं:

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

पहला nजो अब एक सिंगल लेडीबग में फिट होना संभव नहीं है n=24। जिस स्थिति में आपको इसे दो लेडीबग्स में समान रूप से विभाजित करना होगा (आप चुन सकते हैं कि उन्हें एक-दूसरे के बगल में आउटपुट करें, या एक-दूसरे के नीचे - वैकल्पिक रूप से एक स्थान या उनके बीच एक नई-लाइन के साथ)। उदाहरण के लिए:

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

या:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

चुनौती नियम:

  • nकी सीमा में होगा 0-1000
  • आप STDOUT में आउटपुट चुन सकते हैं, स्ट्रिंग या 2D-char एरे / लिस्ट आदि के रूप में वापस आ सकते हैं।
  • नई-नई लाइनों या अनावश्यक व्हाट्सएप की अनुमति नहीं है। अनुगामी श्वेत-रिक्त स्थान और एकल अनुगामी नई-रेखा की अनुमति है।
  • जैसा कि ऊपर उल्लेख किया गया है, जब दो या अधिक लेडीबग आवश्यक होते हैं, तो आप यह चुन सकते हैं कि उन्हें एक दूसरे के बगल में या एक दूसरे के नीचे (या दोनों का मिश्रण ..) के लिए आउटपुट करना है या नहीं।
  • जब दो या अधिक लेडीबग्स एक-दूसरे के बगल में मुद्रित होते हैं, तो बीच में एक एकल वैकल्पिक स्थान की अनुमति होती है। जब दो या अधिक लेडीबग्स को एक दूसरे के नीचे प्रिंट किया जाता है, तो बीच में एक एकल वैकल्पिक नई-लाइन की अनुमति दी जाती है।
  • आप अनुक्रम के दौरान किसी भी चरण पर लेडीबग्स के लेआउट को चुन सकते हैं, जब तक कि वे सममित और इनपुट के बराबर न हों n
  • चूंकि लक्ष्य में nबदलाव है और जितनी संभव हो उतनी कम लेडीबग्स हैं, आप ऊपर से एक से अधिक लेडीबग का उपयोग करना शुरू कर देंगे n=23। इन लेडीबग्स का लेआउट जरूरी नहीं है कि समान होना चाहिए। वास्तव में, यह कुछ इनपुट के लिए संभव नहीं है, जैसे दो का नाम n=25या n=50
  • इसके अलावा, कभी-कभी दो या अधिक लेडीबग्स के बीच डॉट्स को समान रूप से विभाजित करना संभव नहीं होता है। उस स्थिति में आपको उन्हें यथासंभव समान रूप से विभाजित करना होगा, जिनके बीच में 1 का अंतर होगा।

इसलिए n=50, पिछले दो नियमों को ध्यान में रखते हुए, यह एक वैध संभव आउटपुट होगा (जहां पहले बग में 16 स्पॉट हैं, और अन्य दो में 17 हैं):

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

सामान्य नियम:

  • यह , इसलिए बाइट्स जीत में सबसे छोटा जवाब है।
    कोड-गोल्फ भाषाओं को गैर-कोडगॉल्फिंग भाषाओं के साथ उत्तर पोस्ट करने से हतोत्साहित न करें। 'किसी भी' प्रोग्रामिंग भाषा के लिए यथासंभव संक्षिप्त उत्तर के साथ आने का प्रयास करें।
  • मानक नियम आपके उत्तर के लिए लागू होते हैं , इसलिए आपको उचित पैरामीटर और रिटर्न-टाइप, पूर्ण कार्यक्रमों के साथ STDIN / STDOUT, फ़ंक्शन / विधि का उपयोग करने की अनुमति दी जाती है। तुम्हारा कॉल।
  • डिफ़ॉल्ट ढीले निषिद्ध हैं।
  • यदि संभव हो, तो कृपया अपने कोड के लिए एक परीक्षण के साथ एक लिंक जोड़ें।
  • इसके अलावा, यदि आवश्यक हो तो एक स्पष्टीकरण जोड़ें।

खाली लेडीबग के लिए "जितना संभव हो उतना कम परिवर्तन" से आपका क्या मतलब है? जब एक लेडीबग पर n (<24) अक्षर ओ / ओ रखते हैं, तो आप इसमें एन बदलाव करते हैं। या क्या आपका मतलब है n-1 से n में बदलाव (इसलिए आउटपुट 1 से भिन्न होने पर इनपुट के अनुसार भिन्न हो सकते हैं)?
हेमडाल 11

@Heimdall आह खराब होने के कारण भ्रम के लिए खेद है। यह तब था जब मैं विचार कई पात्रों एक स्थान के रूप में जब मैं इस चुनौती के बारे में सोचा अनुमति देने के लिए किया था, लेकिन मैं इस गिरा दिया और सिर्फ इस्तेमाल किया oऔर Oबदले। मैंने शब्दों को थोड़ा बदल दिया है।
केविन क्रूज़सेन

उदाहरण के n=50लिए, मेरा मानना ​​है कि आपका मतलब है कि पहले बग में 16 स्पॉट हैं और अन्य दो में 17 हैं।
जॉन क्लॉज़

यह मेरा पसंदीदा जिमी हेंड्रिक्स एल्बम है।
मोनिका iamnotmaynard

@iamnotmaynard शायद मुझे कुछ स्पष्ट याद आ रहा है, या आपने गलत चुनौती पर टिप्पणी की है? मैं वास्तव में जिमी हेंड्रिक्स और
लेडीबग्स के

जवाबों:


5

चारकोल , 84 81 बाइट्स

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण:

Nθ

स्पॉट की कुल संख्या इनपुट करें।

≔⌈∕∨θ¹¦²³η

आवश्यक लेडीबर्ड्स की संख्या की गणना करें।

Fη«

प्रत्येक लेडीबर्ड पर लूप।

≔⁺÷θη‹ι﹪θηζ

इस लेडीबर्ड पर लगाने के लिए स्पॉट की संख्या की गणना करें।

V_¶I@)↘²↙|/←''-↑!

लेडीबर्ड के सिर और दाएं विंग को प्रिंट करें।

↑⎇›ζ²¹OO²

यदि 21 से अधिक स्पॉट हैं, तो दो स्पॉट प्रिंट करें, अन्यथा पीछे प्रिंट करें।

§|Oζ

यदि स्पॉट की संख्या विषम है तो किसी अन्य स्थान को प्रिंट करें अन्यथा शेष बैक को प्रिंट करें।

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

स्पॉट की संख्या को दो से विभाजित करें, और उन्हें 3, 4, और 3 स्पॉट की तीन पंक्तियों के बीच वितरित करें।

↙»

अगली लेडीबर्ड की शुरुआत में जाएं।

‖B←

पीठ को रखते हुए, कैनवास को बाईं ओर प्रतिबिंबित करें।


8

पायथन 2 , 252 249 238 212 211 213 209 बाइट्स

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

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

  • केविन क्रूज़सेन के लिए धन्यवाद 9 बाइट्स बचाए
  • श्री एक्सकोडर के लिए धन्यवाद 18 बाइट्स सहेजे गए
  • जोनाथन फ़्रेच के लिए 2 बाइट्स धन्यवाद सहेजे

मुझे लगता है कि आप इसके बजाय हटा सकते हैं .replace('A','|O'[b%2])और उपयोग कर सकते हैं c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"?
केविन क्रूज़सेन

230 बाइट्स बदल कर [' o','|O'][i>9]में ' |oO'[i>9::2]और का उपयोग कर |तार्किक या के बजाय। इसके अलावा for i in range(11)एक execबयान में 4 बाइट्स को बचाया।
श्री एक्सकोडर

1
और टिप्पणी अव्यवस्था के लिए खेद है, लेकिन 218 बाइट्सfor लूप के साथ अपनी सूची की समझ को मिलाकर , एक अनावश्यक चर को भी हटा देता है।
श्री एक्सकोडर

@ Mr.Xcoder बहुत बहुत धन्यवाद :)
TFeld

यह संभव सबसे कम ladybugs उत्पादन करने के लिए माना जाता है, नहीं? जब मैं टीआईओ पर 46 के माध्यम से 24 में डालता हूं, तो यह दो के बजाय 3 लेडीबग्स देता है।
निक

7

जावास्क्रिप्ट (ईएस 6), 183 186 बाइट्स

भिंडी के बीच के धब्बों को विभाजित करने के लिए TFeld के उत्तर के रूप में उसी सूत्र का उपयोग करता है ।

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

डेमो


6

Befunge, 292 279 बाइट्स

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

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

व्याख्या

लेडीबग के लिए एएससीआईआई कला को सिंगल बीफुंज स्ट्रिंग में 15 से ऑफसेट किया गया है, जिससे पहले 15 प्रिंट करने योग्य पात्रों को विशेष उद्देश्यों के लिए आरक्षित किया जा सके। इन विशेष वर्णों में से पहले दो नई रेखा और चरित्र का प्रतिनिधित्व करते हैं |, जो दोनों अन्यथा प्रिंट करने योग्य नहीं होंगे। तीसरे का उपयोग नहीं किया गया है, क्योंकि यह एक है ", जिसे एक स्ट्रिंग में उपयोग नहीं किया जा सकता है। अगले दो केंद्र में बड़े स्थानों का प्रतिनिधित्व करते हैं। और शेष दस पंखों पर धब्बे के लिए हैं।

इन विशेष वर्णों को उनके अंतिम रूप में एक लुकअप तालिका के माध्यम से अनुवादित किया जाता है, जो पहली पंक्ति के पहले भाग पर लिखा जाता है।

यह समझाने में आसान बनाने के लिए, यह विभिन्न घटक भागों पर प्रकाश डाला गया कोड है:

निष्पादन पथ के साथ स्रोत कोड हाइलाइट किया गया

*हम |लुकअप टेबल में न्यूलाइन और कैरेक्टर को इनिशियलाइज़ करके शुरू करते हैं , क्योंकि ये स्थिर होते हैं।
*अगला हम स्टड से स्पॉट की संख्या में पढ़ते हैं और आवश्यक लेडीबग्स की संख्या की गणना करते हैं।
*हम तब बग के सेट के लिए बाहरी लूप शुरू कर सकते हैं, अगले लेडीबग के लिए स्पॉट की संख्या की गणना की जा सकती है।
*प्रत्येक लेडीबग के लिए, हम गणना करते हैं कि बड़े केंद्र स्थान को दिखाया जाना चाहिए (यदि spots%2 == 1), और लुकअप तालिका में उचित मान लिखें।
*इसी तरह, हम गणना करते हैं कि क्या बड़े स्थानों के दूसरे जोड़े को (यदि spots/2 > 10) दिखाया जाना है , फिर से लुकअप टेबल को अपडेट करना होगा। हम प्रत्येक विंग पर आवश्यक शेष स्पॉट की गणना भी करते हैं।
*लुकअप टेबल इनिशियलाइज़ेशन का अंतिम भाग एक लूप है जो गणना करता है कि कौन से छोटे स्पॉट्स को प्रदर्शित करने की आवश्यकता है। अनिवार्य रूप से एल्गोरिथ्म है: यदि (spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10, तो स्पॉट को प्रदर्शित करने की आवश्यकता है।
*अगले हम स्टैक पर भिंडी के एन्कोडेड स्ट्रिंग प्रतिनिधित्व को धक्का देते हैं। यह अनिवार्य रूप से सिर्फ एक साधारण स्ट्रिंग है, लेकिन यह थोड़ा जटिल हो गया क्योंकि मैंने इसे कोड में अंतराल में निचोड़ने की कोशिश की ताकि स्रोत एक आयत बन जाए।
*इस बिंदु पर, हम पहले से निर्मित लुकअप टेबल के माध्यम से विशेष मामलों (स्पॉट, लाइन ब्रेक, आदि) को परिवर्तित करके, एक-एक करके वर्णों को संसाधित करने, आउटपुट लूप शुरू करने के लिए तैयार हैं।
*अंत में हम जांचते हैं कि क्या हमने सभी आवश्यक लेडीबग्स प्रदर्शित किए हैं, अन्यथा बाहरी लूप की शुरुआत में वापस जारी रहें।


अच्छा, मुझे वास्तव में पैटर्न पसंद है जो आपके लेडीबग्स के पास 1-23 से प्रत्येक चरण के लिए है। कुछ अन्य उत्तरों की तुलना में अलग। मुझ से +1। क्या आप एक स्पष्टीकरण जोड़ना पसंद करेंगे (बाद में शायद आपने इसे और आगे बढ़ाया है)?
केविन क्रूज़सेन

1
मुझे खुशी है कि आपको पैटर्न पसंद आया। मैंने वास्तव में अलग-अलग संयोजनों को खोजने के लिए बहुत समय बिताया है ताकि एक एल्गोरिथ्म ढूंढा जा सके जो यथासंभव कई चरणों में अच्छा लगे। मेरे जवाब में अब थोड़ा स्पष्टीकरण भी जोड़ दिया।
जेम्स होल्डरनेस

3

रूबी , 203 193 190 बाइट्स

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

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

  • जॉर्डन की बदौलत 10 बाइट्स बचीं

{|m|m.के साथ प्रतिस्थापित किया जा सकता है {$&.; b=(n-1)/23+1के साथ प्रतिस्थापित किया जा सकता है b=1+~-n/23; और के x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}साथ प्रतिस्थापित किया जा सकता है x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}
जॉर्डन

आप का उपयोग करके एक और बाइट बचा सकता है %q{XY}बजाय 'X'+"Y"करके पहले आठ तर्ज पर और कुछ और d=n>0?n/(b=1+~-n/23):b=0के बजाय n>0?d=n/(b=(n-1)/23+1):d=b=0
जॉर्डन

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