ASCII Dandelions


17

ये ASCII डंडेलियन हैं:

   \|/      \ /          |      
   /|\       |    \|/    |      
    |        |     |   _\|/_
    |        |     |    /|\

ASCII dandelions के तीन पैरामीटर हैं: स्टेम की लंबाई (1 और 256 के बीच सकारात्मक संख्या, बीज की संख्या (0 और 7 के बीच सकारात्मक संख्या), और अभिविन्यास (^ या v)। उपरोक्त dandelions की लंबाई, बीज और अभिविन्यास, और के लिए है। क्रमशः 3,5, ^), (3,2, ^), (2,3, ^) और (3,7, v)।

बीजों को निम्नलिखित क्रम में भरा जाता है (हेड-डाउन डंडेलियन के लिए उल्टा फहराया जाता है), लंबाई 2 के साथ एक सिंहपर्णी पर चित्रित किया गया है:

seeds:  0    1    2    3    4    5     6      7

             |   \ /  \|/  \ /  \|/  _\ /_  _\|/_
        |    |    |    |   /|\  /|\   /|\    /|\
        |    |    |    |    |    |     |      |

चुनौती:

एक प्रोग्राम / फ़ंक्शन लिखें, जिसे इनपुट के रूप में एक ASCII सिंहपर्णी दिया जाता है, अपनी लंबाई, बीज गणना, और अभिविन्यास उपरोक्त उदाहरणों के समान स्वरूपित करता है और जब उस प्रारूप में दिए गए पैरामीटर उन मापदंडों के साथ एक ASCII सिंहपर्णी लौटाते हैं। आप कोष्ठक ध्यान न दें और मान इनपुट / आउटपुट एक नंबर, अल्पविराम, एक नंबर, एक अल्पविराम हो जाएगा कर सकते हैं, और या तो ^या v। आप के लिए अन्य पात्रों के स्थानापन्न कर सकते हैं ^/ vजब तक कि वे अभी भी आसानी से 'ऊपर' के रूप में व्याख्या की जा सकती / 'डाउन' (उदाहरण के लिए, u/ d)। आपको डंडेलियन के बीच अंतर करने की आवश्यकता नहीं है जो समान दिखते हैं, जैसे (2,1, ^) और (3,0, ^) या (2,1, ^) और (2,1, v)। ASCII कला को देखते हुए, या तो मापदंडों का सेट एक स्वीकार्य आउटपुट होगा, और मापदंडों के दोनों सेट एक ही ASCII कला दे सकते हैं।

यह , इसलिए बाइट्स जीत में सबसे छोटा कोड है।


C # में एक उदाहरण कार्यक्रम (थोड़ा भी गोल्फ नहीं):

    string Dandelion(string s)
    {
        if (s.Contains(','))
        {
            //got parameters as input
            string[] p = s.Split(',');
            //depth and width (number of seeds)
            int d = int.Parse(p[0]);
            int w = int.Parse(p[1]);
            //draw stem
            string art = "  |";
            while (d > 2)
            {
                d--;
                art += "\n  |";
            }
            //draw head
            string uhead = (w % 2 == 1 ? "|" : " ");
            string dhead = uhead;
            if (w > 1)
            {
                uhead = "\\" + uhead + "/";
                dhead = "/" + dhead + "\\";
                if (w > 5)
                {
                    uhead = "_" + uhead + "_\n /|\\";
                    dhead = "_\\|/_\n " + dhead;
                }
                else if (w > 3)
                {
                    uhead = " " + uhead + " \n /|\\";
                    dhead = " \\|/ \n " + dhead;
                }
                else
                {
                    uhead = " " + uhead + " \n  |";
                    dhead = "  |\n " + dhead;
                }
            }
            else
            {
                uhead = "  " + uhead + "\n  |";
                dhead = "  |\n  " + dhead;
            }
            //add head to body
            if (p[2] == "^")
            {
                return uhead + "\n" + art;
            }
            return art + "\n" + dhead;
        }
        else
        {
            //ASCII input
            string[] p = s.Split('\n');
            int l = p.Length - 1;
            int offset = 0;
            //find first non-' ' character in art
            while (p[0][offset] == ' ')
            {
                offset++;
            }
            int w = 0;
            if (p[0][offset] == '|')
            {
                //if '|', either head-down or no head.
                if (offset == 0 || p[l][offset - 1] == ' ')
                {
                    //if no space for a head to the left or no head at the bottom, no head.
                    return l.ToString() + ",1,^";
                }
                //head must have at least size 2, or else indistinguishable from no head case 
                w = 6;
                if (p[l][offset] == '|')
                {
                    //odd sized head
                    w = 7;
                }
                if (offset == 1 || p[l - 1][offset - 2] == ' ')
                {
                    //not size 6 or 7
                    w -= 2;
                    if (p[l - 1][offset - 1] == ' ')
                    {
                        //not size 4 or 5
                        w -= 2;
                    }
                }
                return l.ToString() + "," + w.ToString() + ",v";
            }
            else if (p[0][offset] == '\\')
            {
                //head at least size 2 and not 6/7, or indistinguishable from no head.
                w = 4;
                if (p[0][offset + 1] == '|')
                {
                    w = 5;
                }
                if (p[1][offset] == ' ')
                {
                    w -= 2;
                }
            }
            else
            {
                w = 6;
                if (p[0][offset + 2] == '|')
                {
                    w = 7;
                }
            }
            return l.ToString() + "," + w.ToString() + ",^";
        }
    }

हम बजाय कुछ अन्य विशिष्ट प्रतीकों ले जा सकते हैं ^और v?
क्रिति लिथोस

@KritiiLithos जब तक वे आसानी से 'ऊपर' और 'नीचे' के रूप में व्याख्या की जा सकती है, निश्चित रूप से।
पी ...

3
आप एक लंबाई 2 बीज 1 और लंबाई 3 बीज 0 सिंहपर्णी के बीच का अंतर कैसे पता लगा सकते हैं? बीज 0 और 1 के लिए यह बताना भी असंभव है कि क्या वे फ़्लिप कर रहे हैं ...
ल्यूक

@ ल्यूक आपको समान दिखने वाले पेड़ों के बीच अंतर करने की आवश्यकता नहीं है। आपको उसी ASCII कला को लंबाई 2 बीज 1 के मामले में लंबाई 3 बीज 0 के रूप में वापस करना चाहिए, और जब वह कला इनपुट हो तो लंबाई 2 बीज 1 या लंबाई 3 बीज 0 दोनों वापस कर सकते हैं।
पी ... 19

1
जब तक मैं गलत नहीं हूँ, ऐसा लगता है जैसे हमारे पास एक उत्तर है जो मापदंडों से एएससीआईआई में अनुवाद करता है और एक अन्य उत्तर जो एएससीआईआई से पैरामीटर में अनुवाद करता है। लेकिन हम दोनों कार्यों का समर्थन करने वाले हैं, है ना?
अरनुलद

जवाबों:


6

बीन , 321 बाइट्स

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

length (1-256)
orientation (u or d)
seeds (0-7)

कार्यक्रम का आउटपुट पैरामीटर जब इनपुट एक सिंहपर्णी है, ऊपर के समान प्रारूप में होगा।

Hexdump:

00000000 26 52 ca c1 20 5d d3 d0 80 d5 cd a0 5e 80 4c cc  &RÊÁ ]ÓÐ.ÕÍ ^.LÌ
00000010 a0 45 86 25 3e 88 4d a0 6b 80 4c a0 5e 80 23 60   E.%>.M k.L ^.#`
00000020 cd a0 63 80 43 cd a0 5f 80 50 84 a3 81 00 20 5e  Í c.CÍ _.P.£.. ^
00000030 d0 84 a3 81 01 4d a0 60 80 4a c1 4c a0 45 86 25  Ð.£..M `.JÁL E.%
00000040 3a d0 84 a3 81 02 4c a0 45 92 25 3a d0 84 a3 81  :Ð.£..L E.%:Ð.£.
00000050 03 20 60 a0 5f a3 81 04 cd a0 61 80 50 84 a3 81  . ` _£..Í a.P.£.
00000060 05 20 5e cf 52 cc a0 45 86 25 3c a3 81 06 23 81  . ^ÏRÌ E.%<£..#.
00000070 07 a0 61 cf 53 d0 80 a3 81 08 20 80 b5 4c a0 43  . aÏSÐ.£.. .µL C
00000080 8c 25 3a 00 52 a0 6b d3 50 80 a0 63 20 80 7e 20  .%:.R kÓP. c .~ 
00000090 63 20 80 7b 23 00 53 d0 80 c3 cc d0 80 a0 78 20  c .{#.SÐ.ÃÌÐ. x 
000000a0 80 01 8c 25 3a d2 ce cc a0 5d 80 23 81 09 80 4c  ...%:ÒÎÌ ].#...L
000000b0 d0 84 a0 5e 25 3b 81 23 81 0a ce d3 50 80 a0 78  Ð. ^%;.#..ÎÓP. x
000000c0 20 80 7e 81 23 60 23 71 cc d2 cc d0 84 d0 84 a0   .~.#`#qÌÒÌÐ.Ð. 
000000d0 78 25 3a 25 3a 81 23 81 0b cc a5 3d 8b 4c cc d0  x%:%:.#..Ì¥=.LÌÐ
000000e0 84 d0 84 a0 78 25 39 25 39 81 50 84 d0 84 a0 78  .Ð. x%9%9.P.Ð. x
000000f0 25 3a 25 39 8d 25 3b 4c cc d0 84 d0 84 a0 78 25  %:%9.%;LÌÐ.Ð. x%
00000100 39 25 3c 81 23 81 0b 8d 25 3b 8b 4c d0 84 d0 84  9%<.#...%;.LÐ.Ð.
00000110 a0 78 25 39 25 3b 81 23 81 0b 00 20 80 7b 23 81   x%9%;.#... .{#.
00000120 04 a0 df 20 a0 5c a0 7c a0 2f 0a a0 a0 5f af fc  . ß  \ | /.  _¯ü
00000130 5c a0 fc 20 8a a0 a0 fc a0 20 a0 a0 fc a0 20 7c  \ ü .  ü    ü  |
00000140 20                                                
00000141

समतुल्य जावास्क्रिप्ट:

+a?                               // if input is parameters
  (
    b=(C>5)<<(o=b=="d"),          // encoding if seeds > 5 and if orientation is down
    g=[                           // storing dandelion as array of characters
      c=" _ "[b],                 // "_" if seeds > 5 and orientation is up, else " "
      " \\"[d=+(C>1)],            // "\" if seeds > 1, else " "
      " |"[C&1],                  // "|" if seeds is odd, else " "
      " /"[d],
      c,                          // "_" if seeds > 5 and orientation is up, else " "
      "\n",
      e="  _"[b],                 // "_" if seeds > 5 and orientation is down, else " "
      ...(                        // spread characters for .reverse() to be correct
        C>3?                      // if seeds > 3 "/|\" else " | "
          "/|\\":
          " | "
      ),
      e,                          // "_" if seeds > 5 and orientation is down, else " "
      ..."\n  |  ".repeat(A-1)    // repeat stem length - 1 times
    ],
    o?                            // if orientation is down, reverse
      g.reverse():
      g
  ).join(""):                     // join array of characters
  [                               // else if input is dandelion
    _.length-1,                   // length of stem is number of rows - 1
    a=="  |  "||b[2]!="|"?        // test orientation of dandelion
      _.reverse()&&"d":           // reverse rows if necessary and return "d" for down
      "u"                         // else return "u" for up
    ,
    (
      _[1][1]!=" "?               // if 1,1 is not " ", seeds is 4 or more
        4+(_[0][0]!=_[1][0])*2:   // if 0,0 or 1,0 is "_", seeds is 6 or 7
        (_[0][3]!=" ")*2          // if 0,3 is not " ", seeds is 2 or 3
    )+
    (_[0][2]!=" ")                // if 0,2 is not " ", seeds is odd
  ].join("\n")                    // join parameters with newline to match input format

अवैध रूप से स्टाइन को लेता है जैसा कि अनियंत्रित तारों के न्यूलाइन अलग किए गए सरणी में होता है _और एक ट्रिपल के रूप में मापदंडों को स्पष्ट रूप से आउटपुट करता है। नीचे टेस्ट सूट और डेमो यहाँ :

const js = String.raw`
+a?                               // if input is parameters
  (
    b=(C>5)<<(o=b=="d"),          // encoding if seeds > 5 and if orientation is down
    g=[                           // storing dandelion as array of characters
      c=" _ "[b],                 // "_" if seeds > 5 and orientation is up, else " "
      " \\"[d=+(C>1)],            // "\" if seeds > 1, else " "
      " |"[C&1],                  // "|" if seeds is odd, else " "
      " /"[d],
      c,                          // "_" if seeds > 5 and orientation is up, else " "
      "\n",
      e="  _"[b],                 // "_" if seeds > 5 and orientation is down, else " "
      ...(                        // spread characters for .reverse() to be correct
        C>3?                      // if seeds > 3 "/|\" else " | "
          "/|\\":
          " | "
      ),
      e,                          // "_" if seeds > 5 and orientation is down, else " "
      ..."\n  |  ".repeat(A-1)    // repeat stem length - 1 times
    ],
    o?                            // if orientation is down, reverse
      g.reverse():
      g
  ).join(""):                     // join array of characters
  [                               // else if input is dandelion
    _.length-1,                   // length of stem is number of rows - 1
    a=="  |  "||b[2]!="|"?        // test orientation of dandelion
      _.reverse()&&"d":           // reverse rows if necessary and return "d" for down
      "u"                         // else return "u" for up
    ,
    (
      _[1][1]!=" "?               // if 1,1 is not " ", seeds is 4 or more
        4+(_[0][0]!=_[1][0])*2:   // if 0,0 or 1,0 is "_", seeds is 6 or 7
        (_[0][3]!=" ")*2          // if 0,3 is not " ", seeds is 2 or 3
    )+
    (_[0][2]!=" ")                // if 0,2 is not " ", seeds is odd
  ].join("\n")                    // join parameters with newline to match input format`;

// bean binary
const bin = bean.compile(js);

// program as function
const prog = bean.program(bin);

(document.body.onchange = function () {
  const parameters = stem.value + '\n' + orientation.value + '\n' + seeds.value;
  dandelion.textContent = prog(parameters);
  params.value = prog(dandelion.textContent);
})();
textarea {
  resize: none;
}
<script src="https://cdn.rawgit.com/patrickroberts/bean/master/dst/bean.min.js"></script>
<input id=stem type=number min=1 max=256 value=5>
<select id=orientation>
  <option value="u">u</option>
  <option value="d">d</option>
</select>
<input id=seeds type=number min=0 max=7 value=5>
<p>Dandelion (output from program given parameters)</p>
<pre id=dandelion></pre>
<p>Parameters (output from program given dandelion)</p>
<textarea id=params rows=3></textarea>


2

जावास्क्रिप्ट 513 391 379 355 बाइट्स

134 बाइट्स से गोल्फ की मदद करने के लिए @Neil और 13 बाइट्स में गोल्फ की मदद करने के लिए @Kritii लिथोस के लिए धन्यवाद। इस कार्यक्रम का मानना ​​है कि कोई भी ASCII dandelions यह पहचानने की कोशिश कर रहा है कि स्ट्रिंग की सभी लाइनों के लिए 5 की एक लाइन चौड़ाई है। अर्थात: तना 2 रिक्त स्थान है, ऊर्ध्वाधर रेखा फिर दूसरी 2 जगहें। (इस मुद्दे के कारण इसे बनाए जाने वाले सिंहपर्णी का वर्गीकरण नहीं किया जा सकता है)

(x,y,z)=>{a=Array(x+1).fill(1);if(x.length>1){a=x.split`
`;h=a.length-1;t=b=i=0;for(;i<(h>1)+1;i++)for(j=0;j<5;a[h-i][j++]!=' '&&b++)a[i][j]!=' '&&t++;return[h,(t>b?t:b)-(h>1),t>b?'^':'v']}z<'v'?(a[0]=y&4?y-2:y,a[1]=y&4?7:1):(a[x-1]=1+(y>4)*2+(y>4)*(y&2),a[x]=y&1+(y>2)*6);return a.map(n=>',  |, \\ /, \\|/,_\\ /_,_\\|/_, / \\, /|\\'.split`,`[n]).join`
`}

यह काम किस प्रकार करता है

फ़ंक्शन यह जांचता है कि क्या दिया गया पहला तर्क लंबाई> 1 (एक स्ट्रिंग है)। यदि पहला तर्क एक स्ट्रिंग है, तो यह ASCII सिंहपर्णी के विवरण की पहचान करता है।

सिंहपर्णी की ऊँचाई प्राप्त करने के लिए, यह न्यूलाइन वर्णों के चारों ओर स्ट्रिंग को विभाजित करता है और तत्वों की संख्या को गिनता है - 1. बीजों की संख्या प्राप्त करने के लिए, यह शीर्ष दो और नीचे की दो पंक्तियों पर गैर-स्थान वर्णों की संख्या गिनता है। यदि शीर्ष में अधिक वर्ण हैं, तो इसे सीधा घोषित किया जाता है और यह शीर्ष गिनती -1 का उपयोग करता है, अन्यथा इसे उल्टा घोषित किया जाता है और नीचे की गिनती -1 का उपयोग करता है। यदि कुल ऊंचाई केवल 2 है, तो यह व्यक्तिगत रूप से प्रत्येक पंक्ति की गिनती की जाँच करके और अधिक गैर स्थान वर्णों के साथ पक्ष का चयन करके सीधेपन को निर्धारित करता है।

अन्यथा, फ़ंक्शन बिटविंड गणित का उपयोग करता है ताकि प्रत्येक स्तर को उपयुक्त स्ट्रिंग में परिवर्तित करने से पहले डैंडेलियन के प्रत्येक स्तर के आकार के अनुसार मानों को निर्दिष्ट किया जा सके।

0:  
1:  |  
2: \\ /  
3: \\|/  
4:_\\ /_  
5:_\\|/_  
6: / \\  
7: /|\\

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


1
@JonathanAllan ने यह तय किया कि अब यह एक सिंहपर्णी इनपुट को वर्गीकृत करेगा
f atn Febt'k

1
बस अपने सिंहपर्णी निर्माता को लेते हुए, मैं तब 125 बाइट्स से गोल्फ में सक्षम था। मेरे कोड को सीधे आपके समाधान में नहीं चिपकाया जा सकता है, लेकिन शायद आप कुछ बचत को शामिल कर सकते हैं:(x,y,z,a=[...Array(x+1)].fill(1))=>a.map(n=>', |, \\ /, \\|/,_\\ //,_\\|/_, / \\, /|\\'.split`,`[n],z<'v'?(a[0]=y&4?y-2:y,a[1]=y&4?7:1):(a[x-1]=1+(y>4)*2+(y>4)*(y&2),a[x]=y&1+(y>2)*6)).join`\n`
नील

1
आप वैसे भी भाग elseमें लौटने के कारण निकाल सकते हैं if। यहां तक ​​कि जब मैं यहां हूं, तो मैं केवल यह बताना चाहता था कि कुछ कार्यों जैसे कि splitऔर एस की joinआवश्यकता नहीं है ()जब आप उन्हें- `स्ट्रिंग स्ट्रिंग शाब्दिक रूप से आमंत्रित करते हैं , यही कारण है कि मैंने उन्हें अपनी पिछली टिप्पणी में शामिल नहीं किया।
नील

1
आपको सही प्रकार के उद्धरणों का उपयोग करना होगा, यह केवल `एस के साथ काम करता है , 'एस या "एस के साथ नहीं ।
नील

1
आप एक नई पंक्ति \nमें बदल सकते हैं join`\n`(जैसा कि चरित्र में है)। इसके अलावा, आप बदल सकते हैं (h>2?1:0)बस के लिए h>2और (h>2?2:1)करने के लिए (h>2)+1tio.run/#IRiKF
क्रिति लिथोस

1

पायथन 3.6, 476 453 448 413 394 बाइट्स

समाधान :

def h(i):
 l,s,o=i.split(",");s=int(s);z=["  |  "];q=(int(l)-1)*z;b,d,f,h,g,c,a=["  ","\\/"][s>1]+["  ","\\/"][s>3]+["| ","||"][s%2==1]+[" ","_"][s>5]
 if"d"==o:b,d,h,f,c,g=f,h,d,b,g,c
 r=[[a+b+c+d+a]+[" "+h+g+f+" "],z][s==0];return"\n".join([q+r,r+q]["u"==o])
def j(i):
 if","in i:print(h(i))
 else:[print(f"{m},{j},{k}")for m in range(257)for j in range(8)for k in"ud"if i==h(f"{m},{j},{k}")]

परिणाम

>>> j("6,5,u")
 \|/
 /|\
  |
  |
  |
  |
  |
>>> j("5,2,d")
  |
  |
  |
  |
  |
 / \
>>> j("3,2,u")
 \ /
  |
  |
  |
>>> j("_\|/_\n /|\ \n  |  \n  |  \n  |  \n  |  \n  |  ")
6,7,u
>>> j(" \|/ \n /|\ \n  |  \n  |  \n  |  \n  |  ")
5,5,u
>>> j("  |  \n  |  \n  |  \n  |  \n  |  ")
4,1,u
4,1,d
5,0,u
5,0,d

उधेड़ना

def g(i):
    def h(i):                       # this function draw dandelion
        l, s, o = i.split(",")      # split argument 
        s = int(s)

        # Calcul the string in the flower for up case 
        #   _\|/_   --> abcdb  --> when s=7 we have a=_ b=\ c=| d=/ h=/ g=| f=\ 
        #    /|\    -->  hgf  
        a = "_" if s > 5 else " "
        b = "\\" if s > 1 else " "
        d = "/" if s > 1 else " "
        h = "/" if s > 3 else " "
        f = "\\" if s > 3 else " "
        c = "|" if s%2 == 1 else " "
        g = "|" if s%2 == 1 else "|"

        # Shuffle a bit if the position is down 
        if"d"==o:
            b,d,h,f,c,g=f,h,d,b,g,c

        # treate the case to remove the line with ony white space
        if s==0:
            res=["  |  "]
        else:
            # assemble all piece of the flower
            res += [a+b+c+d+a]
            res += [" "+h+g+f+" "]

        # add stem up or down
        if o=="u":
            res = res + (int(l)-1) * ["  |  "]
        else:
            res = (int(l)-1) * ["  |  "] + res
        return "\n".join(res)

    if "," in i:
        print(h(i))
    else:
        # search in all flower posibility if we can recreate the input
        [print(m,j,k) for m in range(1, 257) for j in range(0, 8)for k in "ud"if i == h(f"{m},{j},{k}")]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.