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 .


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!


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

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!


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

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

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%%

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


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


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+` `)

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]

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]

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.


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

}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.