Bồ công anh ASCII


17

Đây là bồ công anh ASCII:

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

Bồ công anh ASCII có ba tham số: Chiều dài của thân (số dương từ 1 đến 256, số hạt (số dương từ 0 đến 7) và hướng (^ hoặc v). Các bồ công anh ở trên có chiều dài, hạt và hướng, ( 3,5, ^), (3,2, ^), (2,3, ^) và (3,7, v) tương ứng.

Hạt giống được điền theo thứ tự sau (lộn ngược cho bồ công anh từ trên xuống), được minh họa trên một cây bồ công anh có chiều dài 2:

seeds:  0    1    2    3    4    5     6      7

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

Các thách thức:

Viết chương trình / hàm mà khi cho bồ công anh ASCII làm đầu vào, trả về độ dài, số hạt và hướng được định dạng tương tự như các ví dụ trên và khi các tham số trong định dạng đó trả về một bồ công anh ASCII với các tham số đó. Bạn có thể bỏ qua dấu ngoặc đơn và giả sử đầu vào / đầu ra sẽ là một số, dấu phẩy, số, dấu phẩy và ^hoặc v. Bạn có thể thay thế các ký tự khác trong ^/ vmiễn là chúng vẫn có thể dễ dàng được hiểu là 'lên' / 'xuống' (ví dụ: u/ d). Bạn không cần phân biệt giữa các bồ công anh trông giống nhau, chẳng hạn như (2.1, ^) và (3.0, ^) hoặc (2.1, ^) và (2.1, v). Với nghệ thuật ASCII, một trong hai bộ tham số sẽ là đầu ra chấp nhận được và cả hai bộ tham số có thể cho cùng một nghệ thuật ASCII.

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng.


Một chương trình ví dụ trong C # (thậm chí không được đánh gôn):

    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() + ",^";
        }
    }

Chúng ta có thể lấy một số biểu tượng khác biệt thay vì ^v?
Kritixi Lithos

@KritixiLithos Miễn là chúng có thể dễ dàng được hiểu là 'lên' và 'xuống', chắc chắn.
P ...

3
Làm thế nào để bạn tìm thấy sự khác biệt giữa chiều dài 2 hạt 1 và chiều dài 3 hạt 0 bồ công anh? Đối với hạt 0 và 1, cũng không thể biết được chúng có bị lật không ...
Luke

@Luke Bạn không cần phân biệt giữa các cây trông giống nhau. Bạn nên trả lại nghệ thuật ASCII tương tự trong trường hợp độ dài 2 hạt 1 như chiều dài 3 hạt 0 và có thể trả về độ dài 2 hạt 1 hoặc chiều dài 3 hạt 0 khi nghệ thuật đó là đầu vào.
P ...

1
Trừ khi tôi nhầm, có vẻ như chúng ta có một câu trả lời dịch từ tham số sang ASCII và một câu trả lời khác dịch từ ASCII sang tham số. Nhưng chúng ta phải hỗ trợ cả hai nhiệm vụ, phải không?
Arnauld

Câu trả lời:


6

Bean , 321 byte

Chấp nhận đầu vào dưới dạng một chuỗi trong stdin mà không theo dõi dòng mới. Các tham số sẽ được thực hiện theo cách tương tự, nhưng được định dạng là

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

Các tham số đầu ra của chương trình khi đầu vào là bồ công anh sẽ có cùng định dạng như trên.

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 tương đương:

+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

Hoàn toàn lấy stdin làm mảng phân tách dòng mới của chuỗi không được định dạng trong _và ngầm xuất các tham số dưới dạng bộ ba. Bộ thử nghiệm dưới đây và demo tại đây :

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 byte

Cảm ơn @Neil vì đã giúp chơi golf 134 byte và @Kritixi Lithos vì đã giúp chơi golf 13 byte Chương trình này giả định rằng bất kỳ bồ công anh ASCII nào đang cố gắng xác định có độ rộng 5 cho tất cả các dòng của chuỗi. tức là: thân là 2 khoảng trắng, đường thẳng đứng sau đó là 2 khoảng trắng. (Nó không thể phân loại bồ công anh mà nó tạo ra do vấn đề này)

(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`
`}

Làm thế nào nó hoạt động

Hàm kiểm tra xem đối số đầu tiên được đưa ra có độ dài> 1 (là một chuỗi). Nếu đối số đầu tiên là một chuỗi, nó xác định các chi tiết của bồ công anh ASCII.

Để có được chiều cao của bồ công anh, nó chia chuỗi xung quanh các ký tự dòng mới và đếm số phần tử - 1. Để có được số lượng hạt, nó đếm số lượng ký tự không gian trên hai dòng trên cùng và hai dòng dưới cùng. nếu có nhiều ký tự ở trên cùng, nó được khai báo là thẳng đứng và nó sử dụng số đếm trên 1, nếu không, nó được khai báo là lộn ngược và sử dụng số dưới cùng-1. Nếu tổng chiều cao chỉ có 2, nó xác định độ thẳng đứng bằng cách kiểm tra số lượng của từng dòng riêng lẻ và chọn bên có nhiều ký tự không gian hơn.

Mặt khác, hàm sử dụng toán học bitwise để gán các giá trị từ 0 đến 7 theo hình dạng của từng cấp độ của bồ công anh được vẽ trước khi chuyển đổi từng cấp độ thành chuỗi thích hợp.

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

Dùng thử trực tuyến



1
Chỉ cần người tạo ra bồ công anh của bạn, sau đó tôi đã có thể chơi golf 125 byte. Mã của tôi không thể được dán trực tiếp vào giải pháp của bạn, nhưng có lẽ bạn có thể kết hợp một số khoản tiết kiệm:(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
Bạn có thể loại bỏ elsebởi vì bạn trở lại trong ifphần nào. Ngoài ra, trong khi tôi ở đây, tôi chỉ muốn chỉ ra rằng một số chức năng như splitjoinkhông cần ()s khi bạn gọi chúng trên `chuỗi ký tự được trích dẫn, đó là lý do tại sao tôi không đưa chúng vào nhận xét trước đó.
Neil

1
Bạn phải sử dụng đúng loại trích dẫn, nó chỉ hoạt động với `s, không phải 's hoặc "s.
Neil

1
Bạn có thể thay đổi \ntrong join`\n`một dòng mới (như trong nhân vật). Ngoài ra, bạn có thể thay đổi (h>2?1:0)thành chỉ h>2(h>2?2:1)thành (h>2)+1. tio.run/#IRiKF
Kritixi Lithos

1

Python 3.6, 476 453 448 413 394 byte

Giải pháp :

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}")]

Kết quả

>>> 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

Mở ra

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}")]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.