Wie zeichnet man schmelzende Eiszapfen


23

Ein Bildhauer hat die Aufgabe, Eiszapfen-Skulpturen für das neue Museum in Grönland zu schaffen. Er hat von seinem Chef Spezifikationen erhalten, die aus zwei Zahlen bestehen: [s, m] oder Größe und Schmelze. Größe muss eine ungerade Zahl sein. Er bekam ein paar Fotos von echten Eiszapfen:

vvvvv [5, 0]
 vvv 
  v


vvvvvvv [7, 0]
 vvvvv 
  vvv
   v


vvvvvvv [7, 2]
 vvvvv 



vvvvvvv [7, 3]




vvv [3, 1]

Er braucht ein Programm zum Zeichnen. Beliebige Sprache erlaubt. Das Programm muss S und M einschließen, wobei jede Eingabemethode akzeptabel ist. Sie müssen dann eine ASCII-Kunstdarstellung davon ausdrucken.

S ist, wie viele vs auf der ersten Schicht sind. M ist, wie viele Schichten von unten ausgeschnitten werden.

Dies ist , daher basiert dieser Wettbewerb wie üblich auf Bytes . Leerzeichen zählen für die Bytezählung. Wenigste Bytes gewinnt.

Bearbeiten: Sie erhalten nie eine Reihe von Zahlen, die nichts zeichnen, zum Beispiel [5, 3]. Ein Prüfcode ist jedoch nicht erforderlich.


Sie sagen, Leerzeichen zählen , aber in den Beispielen haben einige Zeilen nachgestellte Leerzeichen. Ist das erlaubt
Luis Mendo

Antworten:


8

05AB1E , 11 Bytes

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

Probieren Sie es online!


1
Gute Arbeit, du hast @ Adnans 12 Bytes in 05AB1E !!
Yummypasta

2
@yummypasta gut, ich denke, sein Nick ist kein Zufall :)
Bacco

Vielen Dank! Adnan und Emigna helfen mir normalerweise mehr, als ich dann helfen kann. Und du hast recht, mein Spitzname ist ziemlich verwandt mit 05AB1E;).
Osable

16

V , 15 Bytes

Àévò^lYp2x>òÀñd

Probieren Sie es online!

Ziemliech direkt.

À               " 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
Ich denke, dass V für "am meisten obfuscatable Sprache" gewinnt.
Nissa

1
Diese

4
Der Quellcode sieht aus wie zufällig generierter Hash. Ich könnte es als sicheres Passwort verwenden.
Totymedli

8
Mir gefällt, dass es eine Sprache namens V gibt, die dieses Problem lösen kann.
Djechlin

9

05AB1E , 12 Bytes

Code:

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

Erläuterung:

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

Verwendet die CP-1252- Codierung. Probieren Sie es online!


;-Ý·¹+'v×.cwürde ein Byte speichern
Osable

@Osable ist das nicht eine ganz andere Antwort?
Djechlin

Guter Punkt, ich weiß es wirklich nicht, da hinter beiden Antworten kein großer Algorithmus steckt. Ich werde es als eine andere Antwort posten, wenn nötig.
Osable

1
@Osable Schöne Entdeckung! Ich denke, Sie sollten es als eine andere Antwort ausdrücken, da es sich sehr von dieser unterscheidet.
Adnan

7

MATL , 22 Bytes

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

Probieren Sie es online!

Erläuterung

'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

Jelly , 19 Bytes

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

TryItOnline!

Wie?

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

Ich mag diese lange Kette in der Mitte ;-)
ETHproductions

Ja, J’(Bereich der Länge verringert) würde auch den gleichen Effekt haben, aber es gibt keine abgesenkte Version von J, und das LḶist irgendwie süß :)
Jonathan Allan

5

Batch, 142 Bytes

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

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

2 Bytes gespart dank GB


putsbraucht kein Leerzeichen
GB

1
Und Sie können ein weiteres Zeichen speichern, indem Sie s dekrementieren: anstatt es zu ?v*(s-2*i)verwenden?v*s;s-=2
GB

4

Python, 76 73 Bytes

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

Bearbeiten: 3 Bytes dank @TuukkaX und @ Challenger5 gespeichert (Danke!)


2
Nach dem printgibt es ein nutzloses Leerzeichen :)
Yytsi

1
Warum nicht ein Lambda verwenden? lambda s,m:"\n".join([' '*(s/2-i/2)+'V'*i for i in range(s,m*2,-2)])
0WJYxW9FMN

1
Sie können den Funktionscode direkt nach dem einfügen def f(s,m):und so zwei Bytes sparen.
Esolanging Fruit

@ J843136028 Es ist die gleiche Anzahl von Bytes: def f()7 lambda ist 7. Mit Challenger5s Tipp ist def tatsächlich kürzer. Zumindest, wenn du das so
meintest,

@nephi Aber du entfernst auch das print, es ist also 4 Zeichen kürzer ( lambda s,m:"\n".join(...)), da es im lambdaGrunde genommen eine implizite Rückgabe gibt.
Artyer

3

JavaScript (ES6), 57 Byte

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

Gibt eine nachgestellte Newline aus. Wenn eine führende Zeile akzeptabel ist, dann für 54 Bytes:

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

3

Python 2, 63 Bytes

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

3

Turtlèd , 53 Bytes

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

Probieren Sie es online!

Erläuterung:

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

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

Update: Ein Byte und ein Loop-Body sind dank @ClaytonRamsey verschwunden.


Sie können ein Byte reduzieren, wenn Sie die for-Schleife wie folgt umschreiben: (int i = 0; i ++ <l; v + = "v");
Clayton Ramsey

1

C 83 Bytes

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 und Nutzung:

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 Bytes

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

Ein Programm, das die Eingabe von Sgefolgt von M, durch Zeilenumbrüche getrennt, annimmt und das Ergebnis druckt.

Testsuite

Wie es funktioniert

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.