Làm thế nào để vẽ băng tan


23

Một nhà điêu khắc được giao nhiệm vụ tạo ra các tác phẩm điêu khắc bằng đá cho bảo tàng mới ở Greenland. Ông đã được ông chủ của mình cung cấp thông số kỹ thuật, bao gồm hai số: [s, m] hoặc kích thước và tan chảy. Kích thước phải là một số lẻ. Ông đã được đưa ra một số hình ảnh của các cột băng thực sự:

vvvvv [5, 0]
 vvv 
  v


vvvvvvv [7, 0]
 vvvvv 
  vvv
   v


vvvvvvv [7, 2]
 vvvvv 



vvvvvvv [7, 3]




vvv [3, 1]

Anh ta cần một chương trình để giúp vẽ. Bất kỳ ngôn ngữ cho phép. Chương trình cần phải có S và M, bất kỳ phương thức nhập liệu nào cũng được chấp nhận. Sau đó, bạn phải in ra một đại diện nghệ thuật ascii của nó.

S là có bao nhiêu vs trên lớp đầu tiên. M là có bao nhiêu lớp được cắt ra từ phía dưới.

Đây là , vì vậy thông thường, cuộc thi này dựa trên byte . Khoảng trắng không tính cho đếm byte. Ít nhất là byte thắng.

Chỉnh sửa: Bạn sẽ không bao giờ có được một tập hợp các số không rút ra được gì, ví dụ [5, 3]. Kiểm tra mã là không cần thiết tuy nhiên.


Bạn nói khoảng trắng không được tính , nhưng trong các ví dụ, một số dòng có khoảng trắng ở cuối. Điều đó có được phép không?
Luis Mendo

Câu trả lời:


8

05AB1E , 11 byte

;-Ý·¹+'v×.c

;-          Compute x = Input[1]-Input[0]/2  (e.g. 7,2 -> -1.5)
  Ý         Push [0, ..., x]                 (e.g. 7,2 -> [0, -1])
   ·        Multiply each value by 2         (e.g. 7,2 -> [0, -2])
    ¹+      Add Input[0] to each value       (e.g. 7,2 -> [7, 5])
      'v×   String multiply by 'v'
         .c Center all strings and implicitly display them  

Hãy thử trực tuyến!


1
Tốt lắm, bạn đậu 12 byte của Adnan trong 05AB1E !!
yummypasta

2
@yummypasta tốt, tôi nghĩ nick của anh ấy không phải là ngẫu nhiên :)
Bacco

Cảm ơn! Adnan và Emigna thường giúp tôi nhiều hơn tôi có thể giúp sau đó. Và bạn nói đúng, biệt danh của tôi khá liên quan đến 05AB1E;).
Có thể vào

16

V , 15 byte

Àévò^lYp2x>òÀñd

Hãy thử trực tuyến!

Khá đơn giản.

À               " Arg1 times:
 év             "   Insert a 'v'
   ò       ò    " Recursively:
    ^l          "   Break if there is only one character on this line
      Y         "   Yank this line
       p        "   Paste it below us
        2x      "   Delete two characters
          >     "   Indent this line
            À   " Arg2 times:
             ñd "   Delete a line

5
Tôi nghĩ rằng V chiến thắng cho "ngôn ngữ khó hiểu nhất".
Nissa

1
ngôn ngữ đó có vẻ thú vị để gỡ lỗi
BlueWizard

4
Mã nguồn trông giống như một số băm được tạo ngẫu nhiên. Tôi có thể sử dụng nó như một mật khẩu an toàn.
totymedli

8
Tôi thích rằng có một ngôn ngữ gọi là V có thể giải quyết vấn đề này.
djechlin

9

05AB1E , 12 byte

Mã số:

ÅÉ'v×R²F¨}.c

Giải trình:

ÅÉ             # List of uneven numbers: [1, 3, 5, ..., input]
  'v×          # String multiply by 'v', giving ['v', 'vvv', 'vvvvv', ...]
     R         # Reverse the array
      ²F }     # Second input times, do...
        ¨      #   Remove the first element of the array
          .c   # Centralize the array

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


;-Ý·¹+'v×.csẽ tiết kiệm được một byte
Osable

@Osable không phải là một câu trả lời hoàn toàn khác nhau sao?
djechlin

Điểm hay, tôi thực sự không biết vì không có thuật toán lớn đằng sau cả hai câu trả lời. Tôi sẽ đăng nó như một câu trả lời khác nếu cần.
Osable

1
@Osable Đẹp tìm! Tôi nghĩ bạn nên đặt nó như một câu trả lời khác, vì nó rất khác với câu trả lời này.
Ad Nam

7

MATL , 22 byte

'v'itQ2/i-wX"R2&PRZ{Zv

Hãy thử trực tuyến!

Giải trình

'v'   % Push character 'v'
it    % Input first number. Duplicate
Q2/   % Add 1 and divide by 2
i-    % Input second number. Subtract
w     % Swap
X"    % Char matrix of 'v' repeated those many times along each dim
R     % Upper triangular part
2&P   % Flip horizontally
R     % Upper triangular part
Z{    % Split char matrix along first dimension into a cell array of strings 
Zv    % Remove trailing spaces from each string. Implicitly display

6

Thạch , 19 byte

Rm-2”vẋµLḶ⁶ẋżðḣL_¥Y

Dùng thử trực tuyến!

Làm sao?

Rm-2”vẋµLḶ⁶ẋżðḣL_¥Y - Main link: s, m
       µ            - monadic chain separation
R                   - range(s)  [1,2,3,...s]
 m-2                - mod -2    [s,s-2,s-4,...,1]
    ”v              - 'v'
      ẋ             - repeat    ['v'*s,...,'vvv','v']  (call this y)
             ð      - dyadic chain separation
        L           - length, effectively (s+1)/2
         Ḷ          - lowered range [0,1,2,...length-1]
          ⁶         - ' '
           ẋ        - repeat ['', ' ', ... ' '*(length-1)]
            ż       - zip with y
                 ¥  - last two links as a dyad
               L    -     length
                _   -     subtract m
              ḣ     - head
                  Y - join with line feeds
                    - implicit print

Tôi thích chuỗi dài không giới hạn ở giữa ;-)
ETHproductions

Vâng, J’(phạm vi độ dài giảm dần) cũng có tác dụng tương tự, nhưng không có phiên bản hạ thấp nào J, và LḶnó rất dễ thương :)
Jonathan Allan

5

Hàng loạt, 142 byte

@set/ah=%1-%2-%2
@set s=v
@for /l %%i in (3,2,%1)do @call set s=%%s%%vv
@for /l %%i in (1,2,%h%)do @call echo %%s%%&call set s= %%s:~0,-2%%

5

Ruby, 46 44 byte

->s,m{0.upto(s/2-m){|i|puts' '*i+?v*s;s-=2}}

Lưu 2 byte nhờ GB


putskhông cần khoảng trắng
GB

1
Và bạn có thể lưu thêm một ký tự bằng cách giảm s: thay vì ?v*(s-2*i)sử dụng?v*s;s-=2
GB

4

Python, 76 73 byte

def f(s,m):print"\n".join([' '*(s/2-i/2)+'V'*i for i in range(s,m*2,-2)])

Chỉnh sửa: Đã lưu 3 byte nhờ @TuukkaX và @ Challenger5 (Cảm ơn!)


2
Sau printđó, có một khoảng trắng vô dụng :)
Yytsi

1
Tại sao không sử dụng lambda? lambda s,m:"\n".join([' '*(s/2-i/2)+'V'*i for i in range(s,m*2,-2)])
0WJYxW9FMN

1
Bạn có thể đặt mã chức năng trực tiếp sau def f(s,m):, lưu hai byte.
Esolanging Fruit

@ J843136028 Đó là cùng số byte: def f()là 7 lambda là 7. với mẹo của Challenger5, def thực sự ngắn hơn. ít nhất nếu đó là những gì bạn muốn nói như tôi nghĩ :)
nephi12

@nephi Nhưng bạn cũng xóa print, vì vậy, nó ngắn hơn 4 ký tự ( lambda s,m:"\n".join(...)), vì lambdavề cơ bản, nó có một sự trở lại ngầm.
Artyer

3

JavaScript (ES6), 57 byte

f=(s,m,p=``)=>s<m+m?``:p+`v`.repeat(s)+`
`+f(s-2,m,p+` `)

Xuất ra một dòng mới. Nếu một dòng mới hàng đầu được chấp nhận, thì với 54 byte:

f=(s,m,p=`
`)=>s<m+m?``:p+`v`.repeat(s)+f(s-2,m,p+` `)

3

Python 2, 63 byte

lambda s,m:'\n'.join((s-x)/2*' '+x*'v'for x in range(s,m*2,-2))

3

Turtlèd , 53 byte

@v?,:l[v,l][ [ l]rr[ d,ur]ld' l]?<:d[ [ u]d[ ' d]luu]

Hãy thử trực tuyến!

Giải trình:

@v,           set char var to v, write it to cell

   ?:l        take positive int input, move that many character right, move 1 left

      [v,l]   move left back to the v, writing v on all the cells it goes on

           [                   ]                      until the current cell is a space

             [ l]    move left until finding a space
                 rr  move two right

                   [     ]  until cell is a space
                     d,ur   move down, write v, move up and right


                          ld' l    move left, down, write space

                                [end of big loop]


                                  [that part made the "icicle", the next melts some]




                                ?<:    
           Take integer input again,
           rotate counterclockwise, move that number right (now up the icicle)

                                    d      move down
                                     [               ] until cell is space
                                       [ u]d   up until space is found, down 1
                                            [ ' d]  until space is found, write space to cell and move down
                                                  luu    move left, up, up
                                                   [end loop]

2

Java, 138 137 byte

void m(int l,int r){int f=l;do{String v="";for(int i=0;i++<l;v+="v");if(l/2<r)break;System.out.printf("%"+f--+"s%n",v);l-=2;}while(l>0);}

Ung dung:

void m(int l, int r) {
    int f = l;
    do {
        String v = "";
        for (int i = 0; i++ < l; v += "v");
        if (l / 2 < r) break;
        System.out.printf("%" + f-- + "s%n", v);
        l -= 2;
    } while (l > 0);
}

Cập nhật: Một byte và thân vòng lặp biến mất nhờ @ClaytonRamsey.


Bạn có thể cắt giảm một byte nếu bạn viết lại vòng lặp for như for (int i = 0; i ++ <l; v + = "v");
Clayton Ramsey

1

C, 83 byte

i,j;f(s,m){for(i=-1;i++<s/2-m;)for(j=-1;++j<=s;)putchar(j<s?j>=i&&s-j>i?86:32:10);}

Ungolfed và cách sử dụng:

i,j;
f(s,m){
  for(i=-1;i++<s/2-m;)
    for(j=-1;++j<=s;)
      putchar(j<s ?
                j>=i&&s-j>i ? 86 : 32
                : 10);
}


main() {

  f(5,0);
  f(7,0);
  f(7,2);
  f(7,3);
  f(3,1);

}

1

Bình thường, 21 byte

j<E.e+*kd*hyb\v_Uh/Q2

Một chương trình lấy đầu vào của S theo sauM , phân tách dòng mới và in kết quả.

Bộ kiểm tra

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

j<E.e+*kd*hyb\v_Uh/Q2  Program. Inputs: Q, E
                  /Q2  Yield Q // 2
                 h      + 1
                U      Yield [0, 1, 2, ..., Q //2 +1]
               _       Reverse
   .e                  Map over with elements as b and zero-indexed indices as k:
           yb           2 * b
          h              + 1
         *   \v          "v" characters
     +                  prepended with
       k                k
      * d                spaces
 <E                    All but the last E elements
j                      Join on newlines
                       Implicitly print
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.