วิธีการวาดจุดหลอมเหลว


23

ช่างแกะสลักได้รับมอบหมายให้สร้างประติมากรรมน้ำแข็งสำหรับพิพิธภัณฑ์ใหม่ในกรีนแลนด์ เขาได้รับข้อมูลจำเพาะจากหัวหน้าของเขาซึ่งประกอบด้วยตัวเลขสองตัว: [s, m] หรือขนาดและละลาย ขนาดต้องเป็นเลขคี่ เขาได้รับภาพถ่ายของหยาดน้ำแข็งจริงบางภาพ:

vvvvv [5, 0]
 vvv 
  v


vvvvvvv [7, 0]
 vvvvv 
  vvv
   v


vvvvvvv [7, 2]
 vvvvv 



vvvvvvv [7, 3]




vvv [3, 1]

เขาต้องการโปรแกรมเพื่อช่วยในการวาด ภาษาใด ๆ ที่ได้รับอนุญาต โปรแกรมจำเป็นต้องใช้ใน S และ M วิธีการอินพุตใด ๆ ที่ยอมรับได้ จากนั้นคุณจะต้องพิมพ์การแสดงภาพ ASCII ของมัน

S คือจำนวนvs บนเลเยอร์แรก M คือจำนวนเลเยอร์ที่ถูกตัดออกจากด้านล่าง

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

แก้ไข: คุณจะไม่ได้รับชุดตัวเลขที่ไม่ได้วาดอะไรเลยเช่น [5, 3] ไม่จำเป็นต้องตรวจสอบรหัส


คุณพูดว่าช่องว่างนับแต่ในตัวอย่างบางบรรทัดมีช่องว่างต่อท้าย อนุญาตหรือไม่
Luis Mendo

คำตอบ:


8

05AB1E , 11 ไบต์

;-Ý·¹+'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  

ลองออนไลน์!


1
Good Job, you bean @ Adnan มี 12 ไบต์ใน 05AB1E !!
yummypasta

2
@yummypasta ดีผมคิดว่านิคของเขาไม่ใช่เรื่องบังเอิญ :)
Bacco

ขอบคุณ! Adnan และ Emigna มักจะช่วยฉันมากกว่าที่ฉันสามารถช่วยได้ และคุณถูกต้องชื่อเล่นของฉันค่อนข้างเกี่ยวข้องกับ 05AB1E;)
Osable

16

V , 15 ไบต์

Àévò^lYp2x>òÀñd

ลองออนไลน์!

ค่อนข้างตรงไปตรงมา

À               " 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
ฉันคิดว่า V ชนะสำหรับ "ภาษาที่น่ารังเกียจที่สุด"
Nissa

1
ภาษานั้นดูสนุกในการแก้ไขข้อบกพร่อง
BlueWizard

4
ซอร์สโค้ดดูเหมือนแฮชที่สร้างแบบสุ่ม ฉันสามารถใช้มันเป็นรหัสผ่านที่ปลอดภัย
totymedli

8
ฉันชอบที่มีภาษาที่เรียกว่า V ที่สามารถแก้ปัญหานี้ได้
djechlin

9

05AB1E , 12 ไบต์

รหัส:

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

คำอธิบาย:

ÅÉ             # 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

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


;-Ý·¹+'v×.cจะบันทึกหนึ่งไบต์
Osable

@Oable ไม่ได้เป็นเพียงคำตอบที่แตกต่างอย่างสิ้นเชิง?
djechlin

จุดดีฉันไม่รู้จริง ๆ เนื่องจากไม่มีทั้งอัลกอริทึมที่อยู่เบื้องหลังทั้งคำตอบ ฉันจะโพสต์มันเป็นคำตอบอื่นถ้าจำเป็น
Osable

1
@Oableable ค้นหาที่ดี! ฉันคิดว่าคุณควรจะให้มันเป็นคำตอบที่แตกต่างกันเพราะมันแตกต่างจากที่นี่มาก
Adnan

7

MATL , 22 ไบต์

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

ลองออนไลน์!

คำอธิบาย

'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

เยลลี่ขนาด 19 ไบต์

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

TryItOnline!

อย่างไร?

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

ฉันชอบห่วงโซ่ความยาวความยาวที่อยู่ตรงกลาง ;-)
ETHproductions

ใช่J’(ช่วงของความยาว decremented) นอกจากนี้ยังจะมีผลเช่นเดียวกัน แต่ไม่มีรุ่นที่ลดลงของJและLḶเป็นชนิดของน่ารัก :)
โจนาธานอัลลัน

5

รุ่นที่ 142 ไบต์

@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 ไบต์

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

บันทึก 2 ไบต์ด้วย GB


putsไม่ต้องการช่องว่าง
GB

1
และคุณสามารถประหยัดอักขระได้อีกหนึ่งตัวโดยการลดค่า s: แทนที่จะ?v*(s-2*i)ใช้?v*s;s-=2
GB

4

Python, 76 73 ไบต์

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

แก้ไข:บันทึกแล้ว 3 ไบต์ด้วย @TuukkaX และ @ Challenger5 (ขอบคุณ!)


2
หลังจากที่printมีเป็นช่องว่างที่ไร้ประโยชน์ :)
Yytsi

1
ทำไมไม่ใช้แลมบ์ดา? lambda s,m:"\n".join([' '*(s/2-i/2)+'V'*i for i in range(s,m*2,-2)])
0WJYxW9FMN

1
คุณสามารถใส่รหัสฟังก์ชั่นได้โดยตรงหลังจากdef f(s,m):บันทึกสองไบต์
แยกผลไม้

@ J843136028 มันมีจำนวนไบต์เท่ากัน: def f()คือ 7 lambda คือ 7 ด้วยทิปของ Challenger5 ค่า def จะสั้นกว่าจริง อย่างน้อยถ้านั่นคือสิ่งที่คุณหมายเหมือนฉันคิดว่า :)
nephi12

@nephi แต่คุณก็ลบprintดังนั้นมันจึงสั้นกว่า 4 ตัวอักษร ( lambda s,m:"\n".join(...)) เนื่องจากlambdaโดยทั่วไปแล้วจะมีผลตอบแทนโดยปริยาย
Artyer

3

JavaScript (ES6), 57 ไบต์

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

เอาต์พุตบรรทัดใหม่ที่ต่อท้าย หากบรรทัดใหม่ชั้นนำเป็นที่ยอมรับก็เท่ากับ 54 ไบต์:

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


3

ตุรกี , 53 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

@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 ไบต์

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);}

Ungolfed:

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);
}

อัปเดต: หนึ่งไบต์และวนซ้ำหายไปขอบคุณ @ClaytonRamsey


คุณสามารถลดหนึ่งไบต์ถ้าคุณเขียน for-loop ใหม่สำหรับ (int i = 0; i ++ <l; v + = "v");
Clayton Ramsey

1

C, 83 ไบต์

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 และการใช้งาน:

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

Pyth, 21 ไบต์

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

โปรแกรมที่รับอินพุตSตามด้วยMคั่นด้วยบรรทัดใหม่และพิมพ์ผลลัพธ์

ชุดทดสอบ

มันทำงานอย่างไร

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