ASCII Dandelions


17

เหล่านี้เป็นดอกแดนดิไล ASCII:

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

ดอกแดนดิไลต์ ASCII มีสามพารามิเตอร์: ความยาวของก้าน (จำนวนบวกระหว่าง 1 ถึง 256, จำนวนเมล็ด (จำนวนบวกระหว่าง 0 และ 7), และการวางแนว (^ หรือ v) ดอกแดนดิไลอันเหนือมีความยาว, เมล็ดและทิศทาง, ( 3,5, ^), (3,2, ^), (2,3, ^) และ (3,7, v) ตามลำดับ

เมล็ดจะถูกเติมในลำดับต่อไปนี้ (พลิกคว่ำสำหรับหัว dandelions ลง), ภาพประกอบบนดอกแดนดิไลอันที่มีความยาว 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 art ชุดของพารามิเตอร์ทั้งสองจะเป็นเอาต์พุตที่ยอมรับได้และพารามิเตอร์ทั้งสองชุดสามารถให้ ASCII art เดียวกันได้

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


ตัวอย่างโปรแกรมใน 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?
Kritixi Lithos

@KritixiLithos ตราบใดที่พวกเขาสามารถตีความได้อย่างง่ายดายว่า 'ขึ้น' และ 'ลง' แน่นอน
...

3
คุณจะพบความแตกต่างระหว่างความยาว 2 เมล็ด 1 และความยาว 3 เมล็ด 0 ดอกแดนดิไลอันได้อย่างไร สำหรับเมล็ด 0 และ 1 มันเป็นไปไม่ได้ที่จะบอกได้ว่าพวกมันพลิก ...
ลูกา

@ ลุคคุณไม่จำเป็นต้องแยกแยะระหว่างต้นไม้ที่มีลักษณะเหมือนกัน คุณควรคืนค่า ASCII art เดียวกันในกรณีของความยาว 2 เมล็ด 1 เช่นเดียวกับความยาว 3 เมล็ด 0 และสามารถส่งคืนความยาว 2 เมล็ด 1 หรือความยาว 3 เมล็ด 0 เมื่อศิลปะนั้นเป็นอินพุต
...

1
นอกจากว่าฉันเข้าใจผิดดูเหมือนว่าเรามีคำตอบที่แปลจากพารามิเตอร์เป็น ASCII และคำตอบอื่นที่แปลจาก ASCII เป็นพารามิเตอร์ แต่เราควรสนับสนุนทั้งสองงานใช่มั้ย
Arnauld

คำตอบ:


6

บีน 321 ไบต์

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

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

พารามิเตอร์เอาต์พุตของโปรแกรมเมื่ออินพุตคือ dandelion จะอยู่ในรูปแบบเดียวกันกับด้านบน

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

JavaScript ที่เทียบเท่า:

+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

ใช้ stdin โดยปริยายโดยขึ้นบรรทัดใหม่โดยคั่นอาร์เรย์ของสตริงที่ไม่ได้จัดรูปแบบ_และส่งออกพารามิเตอร์โดยปริยายเป็น triplet ชุดทดสอบด้านล่างและสาธิตที่นี่ :

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

Javascript 513 391 379 355 ไบต์

ขอบคุณ @Neil ที่ช่วยตีกอล์ฟออก 134 ไบต์และ @Kritixi Lithos สำหรับช่วยตีกอล์ฟออก 13 ไบต์โปรแกรมนี้จะถือว่าดอกแดนดิไลอันแบบ ASCII ใด ๆ ที่พยายามระบุมีความกว้าง 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 ถึง 7 ตามรูปร่างของแต่ละระดับของดอกแดนดิไลอันที่จะวาดก่อนที่จะแปลงแต่ละระดับเป็นสตริงที่เหมาะสม

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

ลองออนไลน์


1
@JanathanAllan แก้ไขมันเพื่อที่ตอนนี้มันจะจัดหมวดหมู่ข้อมูลดอกแดนดิไลอัน
fəˈnɛtɪ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`
Neil

1
คุณสามารถลบelseเพราะคุณกลับมาในifส่วนต่อไป ในขณะที่ฉันอยู่ที่นี่ฉันแค่อยากจะชี้ให้เห็นว่าฟังก์ชั่นบางอย่างเช่นsplitและjoinไม่ต้องการ()s เมื่อคุณเรียกใช้พวกเขาใน - `ตัวอักษรสตริงที่ยกมาซึ่งเป็นเหตุผลที่ฉันไม่ได้รวมไว้ในความคิดเห็นก่อนหน้า
Neil

1
คุณต้องใช้การเรียงลำดับคำพูดที่ถูกต้องใช้ได้กับ`s เท่านั้นไม่ใช่'s หรือ"s
นีล

1
คุณสามารถเปลี่ยน\nในjoin`\n`การขึ้นบรรทัดใหม่ (ในขณะที่ตัวอักษร) นอกจากนี้คุณสามารถเปลี่ยน(h>2?1:0)ไปเพียงh>2และการ(h>2?2:1) tio.run/#IRiKF(h>2)+1
Kritixi Lithos

1

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