Cómo dibujar carámbanos de fusión

23

Un escultor tiene la tarea de crear esculturas de carámbano para el nuevo museo en Groenlandia. Su jefe le ha dado especificaciones, que consisten en dos números: [s, m] o tamaño y fusión. El tamaño debe ser un número impar. Le dieron algunas fotos de carámbanos reales:

vvvvv [5, 0]
 vvv 
  v


vvvvvvv [7, 0]
 vvvvv 
  vvv
   v


vvvvvvv [7, 2]
 vvvvv 



vvvvvvv [7, 3]




vvv [3, 1]

Necesita un programa para ayudar a dibujar. Cualquier idioma permitido. El programa necesita tomar S y M, cualquier método de entrada aceptable. Luego debe imprimir una representación de arte ascii del mismo.

S es cuántos vs hay en la primera capa. M es cuántas capas se cortan desde la parte inferior.

Este es el , por lo que, como de costumbre, esta competencia se basa en bytes . El espacio en blanco cuenta para el conteo de bytes. Menos bytes gana.

Editar: nunca obtendrá un conjunto de números que no dibuje nada, por ejemplo [5, 3]. Sin embargo, no se requiere verificar el código .

yummypasta
fuente
Dices que el espacio en blanco sí cuenta , pero en los ejemplos algunas líneas tienen espacios finales. eso está permitido?
Luis Mendo

Respuestas:

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  

Pruébalo en línea!

Osable
fuente
1
Buen trabajo, ¡¡¡has 12 @ bytes de Adnan en 05AB1E !!
yummypasta
2
@yummypasta bueno, creo que su nick no es una coincidencia :)
Bacco
¡Gracias! Adnan y Emigna generalmente me ayudan más de lo que yo puedo ayudar entonces. Y tienes razón, mi apodo está bastante relacionado con 05AB1E;).
Osable
16

V , 15 bytes

Àévò^lYp2x>òÀñd

Pruébalo en línea!

Bastante sencillo.

À               " 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
DJMcMayhem
fuente
55
Creo que V gana por "el lenguaje más ofuscable".
Nissa
1
ese idioma parece divertido de depurar
BlueWizard
44
El código fuente se parece a un hash generado aleatoriamente. Podría usarlo como una contraseña segura.
totymedli
8
Me gusta que haya un lenguaje llamado V que pueda resolver este problema.
djechlin
9

05AB1E , 12 bytes

Código:

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

Explicación:

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

Utiliza la codificación CP-1252 . Pruébalo en línea!

Adnan
fuente
;-Ý·¹+'v×.cahorraría un byte
Osable
@Osable, ¿no es esa una respuesta completamente diferente?
djechlin
Buen punto, realmente no lo sé ya que no hay un gran algoritmo detrás de ambas respuestas. Lo publicaré como otra respuesta si es necesario.
Osable el
1
@Osable ¡Buen hallazgo! Creo que deberías decirlo como una respuesta diferente, ya que es muy diferente de esta.
Adnan
7

MATL , 22 bytes

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

Pruébalo en línea!

Explicación

'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
Luis Mendo
fuente
6

Jalea , 19 bytes

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

TryItOnline!

¿Cómo?

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
Jonathan Allan
fuente
Me gusta esa cadena de longitud y longitud en el medio ;-)
ETHproductions
Sí, J’(el rango de longitud disminuyó) también tendría el mismo efecto, pero no hay una versión reducida de J, y LḶes algo lindo :)
Jonathan Allan
5

Lote, 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%%
Neil
fuente
5

Ruby, 46 44 bytes

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

2 bytes guardados gracias a GB

Level River St
fuente
putsno necesita el espacio en blanco
GB
1
Y puede guardar un personaje más disminuyendo s: en lugar de ?v*(s-2*i)usar?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)])

Editar: Guardado 3 bytes gracias a @TuukkaX y @ Challenger5 (¡Gracias!)

nephi12
fuente
2
Después de printeso, hay un espacio en blanco inútil :)
Yytsi
1
¿Por qué no usar una lambda? lambda s,m:"\n".join([' '*(s/2-i/2)+'V'*i for i in range(s,m*2,-2)])
0WJYxW9FMN
1
Puede poner el código de función directamente después de def f(s,m):, guardando dos bytes.
Esolanging Fruit
@ J843136028 Es el mismo número de bytes: def f()es 7 lambda es 7. Con la sugerencia de Challenger5, def es en realidad más corto. al menos si eso es lo que
querías
@nephi Pero también elimina el print, por lo que es 4 caracteres más corto ( lambda s,m:"\n".join(...)), ya que lambdabásicamente tienen un retorno implícito.
Artyer
3

JavaScript (ES6), 57 bytes

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

Emite una nueva línea final. Si una nueva línea inicial es aceptable, entonces para 54 bytes:

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

Python 2, 63 bytes

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

Turtlèd , 53 bytes

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

Pruébalo en línea!

Explicación:

@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]
Limón Destructible
fuente
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);}

Sin golf:

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

Actualización: Un byte y un cuerpo de bucle desaparecieron gracias a @ClaytonRamsey.

Eugene
fuente
Puede reducir un byte si reescribe el bucle for como for (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);}

Sin golf y uso:

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

}
Karl Napf
fuente
1

Pyth, 21 bytes

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

Un programa que toma la entrada de Sseguido de M, separado por nueva línea e imprime el resultado.

Banco de pruebas

Cómo funciona

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