Come disegnare ghiaccioli di fusione


23

Uno scultore ha il compito di creare sculture di ghiaccioli per il nuovo museo in Groenlandia. Gli sono state fornite le specifiche dal suo capo, che consiste di due numeri: [s, m] o dimensione e fusione. La dimensione deve essere un numero dispari. Gli furono date alcune foto di ghiaccioli reali:

vvvvv [5, 0]
 vvv 
  v


vvvvvvv [7, 0]
 vvvvv 
  vvv
   v


vvvvvvv [7, 2]
 vvvvv 



vvvvvvv [7, 3]




vvv [3, 1]

Ha bisogno di un programma per aiutare a disegnare. Qualsiasi lingua consentita Il programma deve includere S e M, qualsiasi metodo di input accettabile. È quindi necessario stampare una sua rappresentazione artistica ascii.

S è il numero di vs sul primo livello. M è quanti strati sono tagliati dal basso.

Questo è , quindi come al solito questa competizione è basata su byte . Lo spazio bianco conta per il conteggio dei byte. Vince il minimo byte.

Modifica: non otterrai mai un insieme di numeri che non disegna nulla, ad esempio [5, 3]. Tuttavia, non è richiesto il controllo del codice .


Dici che lo spazio bianco conta , ma negli esempi alcune righe hanno spazi finali. È permesso?
Luis Mendo,

Risposte:


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  

Provalo online!


1
Ottimo lavoro, bean a 12 byte di Adnan in 05AB1E !!
yummypasta,

2
@yummypasta bene, penso che il suo nick non sia una coincidenza :)
Bacco,

Grazie! Adnan ed Emigna di solito mi aiutano più di quanto io possa aiutare allora. E hai ragione, il mio soprannome è abbastanza legato a 05AB1E;).
Osable,

16

V , 15 byte

Àévò^lYp2x>òÀñd

Provalo online!

Abbastanza semplice.

À               " 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
Penso che V vince per "linguaggio più offuscabile".
Nissa,

1
quella lingua sembra divertente per il debug
BlueWizard

4
Il codice sorgente sembra un hash generato casualmente. Potrei usarlo come password sicura.
totymedli,

8
Mi piace il fatto che esiste un linguaggio chiamato V in grado di risolvere questo problema.
djechlin,

9

05AB1E , 12 byte

Codice:

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

Spiegazione:

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

Utilizza la codifica CP-1252 . Provalo online!


;-Ý·¹+'v×.csalverebbe un byte
Osable

@Osable non è solo una risposta completamente diversa?
djechlin,

Buon punto, non lo so davvero poiché non esiste un grande algoritmo dietro entrambe le risposte. Lo posterò come un'altra risposta, se necessario.
Osable,

1
@Osable Nice find! Penso che dovresti metterlo come una risposta diversa, poiché è molto diversa da questa.
Adnan,

7

MATL , 22 byte

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

Provalo online!

Spiegazione

'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

Gelatina , 19 byte

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

TryItOnline!

Come?

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

Mi piace quella catena lunghezza-lunghezza nel mezzo ;-)
ETHproductions

Sì, J’(l'intervallo di lunghezza decrementato) avrebbe anche lo stesso effetto, ma non esiste una versione ridotta di J, ed LḶè un po 'carino :)
Jonathan Allan,

5

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

Rubino, 46 44 byte

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

2 byte salvati grazie a GB


putsnon ha bisogno dello spazio bianco
GB

1
E puoi salvare un altro personaggio diminuendo s: invece di ?v*(s-2*i)usarlo?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)])

Modifica: 3 byte salvati grazie a @TuukkaX e @ Challenger5 (Grazie!)


2
Dopo il print, c'è uno spazio bianco inutile :)
Yytsi

1
Perché non usare un lambda? lambda s,m:"\n".join([' '*(s/2-i/2)+'V'*i for i in range(s,m*2,-2)])
0WJYxL9FMN

1
È possibile inserire il codice funzione direttamente dopo il def f(s,m):, salvando due byte.
Esolanging Fruit,

@ J843136028 È lo stesso numero di byte: def f()è 7 lambda è 7. con la punta di Challenger5, def è in realtà più breve. almeno se è quello che intendevi come penso :)
nephi12

@nephi Ma rimuovi anche il print, quindi è più corto di 4 caratteri ( lambda s,m:"\n".join(...)), dato lambdache sostanzialmente hanno un ritorno implicito.
Artyer,

3

JavaScript (ES6), 57 byte

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

Emette una nuova riga finale. Se una nuova riga iniziale è accettabile, quindi per 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]

Provalo online!

Spiegazione:

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

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

Aggiornamento: un byte e un loop loop spariti grazie a @ClaytonRamsey.


È possibile ridurre un byte se si riscrive il ciclo for come per (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 e utilizzo:

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 byte

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

Un programma che accetta input Sseguito daM , separato nuova riga e stampa il risultato.

Suite di test

Come funziona

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.