Saltar al contenido

Dibujar un patrón de pata de gallo

Basta ya de buscar por todo internet ya que llegaste al sitio indicado, tenemos la solución que quieres y sin liarte.

Solución:

Pyth, 616055 49 bytes

j*vwmjk*Qd++Rm012Jmms}k++Rhd5U-d4T=T13+Lm1T_mP_dJ

Pruébelo en línea: demostración

edición 1: combine las dos declaraciones que generan la banda y el triángulo (ver más abajo)

edición 2: No vi que podemos usar ningún símbolo. 5 bytes guardados editar

editar 3: @ Calvin’sHobbies permitió traducir la imagen base. Dado que mi enfoque se basó en esta idea, esto ayudó bastante. -6 bytes

Y para el Bono de galletas:

.w*vw*RQ++Rm012Jmm*K255}k++Rhd5U-d4T=T13+LmKT_mP_dJ

Esto es solo 2 bytes más largo (51 bytes) y genera el archivo o.png. Para la entrada 5n4 genera la siguiente imagen:

Patrón de pata de gallo

Explicación:

El patrón de pata de gallo se ve realmente bastante irregular. Pero si llevamos las 7 columnas de la izquierda a la derecha y las 5 filas superiores a la parte inferior, obtenemos un patrón mucho más agradable:

.#####...................
..#####..................
...#####.................
....#####................
.....#####...............
#.....#####..............
##.....#####.............
###.....#####............
####.....####............
#####.....###............
######.....##............
#######.....#............
########.................
#############.....#######
##############.....######
###############.....#####
################.....####
#################.....###
##################.....##
#############.#####.....#
#############..#####.....
#############...#####....
#############....#####...
#############.....#####..
#############......#####.
#############.......#####

Primero produzco el bloque 13×13 superior izquierdo:

.#####.......
..#####......
...#####.....
....#####....
.....#####...
#.....#####..
##.....#####.
###.....#####
####.....####
#####.....###
######.....##
#######.....#
########.....

Hay 2 desigualdades simples, que describen las dos #-áreas. La banda se puede describir por y + 1 <= x <= y + 5 y el triángulo se puede describir por x <= y - 5. He combinado estas dos condiciones:

Jmms}k++Rhd5U-d4T=T13
                 =T13   T = 13
 m               T      map each d of [0, 1, ..., 12] to: 
                           the list produced by
  m             T          map each k of [0, 1, ..., 12] to:
       +Rhd5                  the list [d+1, d+2, ..., d+5]
      +                       extended by 
            U-d4              the list [0, 1, ..., d - 5]
    }k                        test if k is in the list
   s                          and convert the boolean result to 1 or 0
J                       assign this 13x13 block to J

Luego +Rm012 agrega 12 ceros al final de cada fila, para obtener el bloque superior de 25x13.

El bloque inferior de 25x13 ahora es realmente simple:

+Lm1T_mP_dJ
      m   J    map each row d of J to:
       P_d        reverse the row and pop the last element
     _         reverse the order the rows
+Lm1T          add T ones at the beginning of each row. 

Todo lo que queda ahora es repetir el patrón e imprimirlo.

j*vwmjk*Qd+upperlower   implicit: Q = first input number
          +upperlower   combine the two blocks to a 25x26 block
    m                   map each row d to:
       *Qd                 repeat d Q times
     jk                    and join to a string
 *vw                    read another number from input and repeat
j                       join by newlines and print

La diferencia con el Bono de galletas código:

  • 255 en lugar de 1
  • en lugar de mjk*Qd yo suelo *RQ, ya que no quiero un string
  • .w guarda este 2D-array a archivo (lo convierte a png implícitamente)

CJam, 10673 71 bytes

0000000: 71 7e 22 04 94 51 af 40 6e 73 b2 68 3a e1 7e 13 f2 a1  q~"[email protected]
:.~... 0000012: 3e 1d de f5 64 9c 6b 0f 27 4c 36 d7 81 3d 30 35 56 f8 >...d.k.'L6..=05V. 0000024: cd e8 cd 7c dc 90 31 59 40 8b 8c 22 32 35 36 62 32 32 ...|[email protected]"256b22 0000036: 62 41 73 33 39 2a 2e 2a 73 32 35 2f 2a 66 2a 4e 2a bAs39*.*s25/*f*N*

Huellas dactilares 1 y 0 en lugar de . y #. Pruébelo en línea en el intérprete de CJam.

Cómo funciona

q~      e# Read and evaluate all input. This pushes W and H.
"…"     e# Push an encoding of run lengths of the characters in the output.
256b22b e# Convert from base 256 to base 22.
As39*   e# Push "10" and repeat it 39 times.
.*      e# Vectorized character repetition; multiply each base 22 digit (run
        e# length) by the corresponding character of "10…10".
s25/    e# Flatten and split into chunks of length 25.
*       e# Repeat the resulting array of rows H times.
f*      e# Repeat each row W times.
N*      e# Join the rows, separating by linefeeds.

Bono de galletas

0000000: 27 50 6f 31 70 71 7e 5d 5f 5b 32 35 5f 29 5d 2e 2a 5c  'Po1pq~]_[25_)].*
0000012: 7e 22 04 94 51 af 40 6e 73 b2 68 3a e1 7e 13 f2 a1 3e  ~"[email protected]:.~...>
0000024: 1d de f5 64 9c 6b 0f 27 4c 36 d7 81 3d 30 35 56 f8 cd  ...d.k.'L6..=05V..
0000036: e8 cd 7c dc 90 31 59 40 8b 8c 22 32 35 36 62 32 32 62  ..|[email protected]"256b22b
0000048: 41 73 33 39 2a 2e 2a 73 32 35 2f 2a 66 2a 73 2b 4e 2a  As39*.*s25/*f*s+N*

imprime un BitMap portátil en lugar de arte ASCII.

A continuación se muestra la salida para la entrada 24 13, convertido a PNG:

producción

Befunge-93, 2120 1967 bytes

¡Aquí hay algunos befunge de alta calidad, con manejo de excepciones para la depuración!

&&00p10pv
v       <
    >94+2*20p        v
>00g|   >                v
    @                >10g>0020gv-1:<
                               >:0`|
                     ,       v    $<
                     +        >v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v
 v_$1-:#^_$20g1-20p55^       >|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>"!DAB"[email protected]
 ,:
 >^".......#.....#####......."                                                    <
  ^".......##.....#####......"                                                  <
  ^".......###.....#####....."                                                <
  ^".......####.....####....."                                              <
  ^".......#####.....###....."                                            <
  ^".......######.....##....."                                          <
  ^".......#######.....#....."                                        <
  ^".......########.........."                                      <
  ^"####################....."                                    <
  ^".####################...."                                  <
  ^"..####################..."                                <
  ^"...####################.."                              <
  ^"....####################."                            <
  ^".....####################"                          <
  ^"#.....##############.####"                        <
  ^"##.....#############..###"                      <
  ^"###....#############...##"                    <
  ^"####...#############....#"                  <
  ^"#####..#############....."                <
  ^".#####.#############....."              <
  ^"..##################....."            <
  ^"........#####............"          <
  ^".........#####..........."        <
  ^"..........#####.........."      <
  ^"...........#####........."    <
  ^"............#####........"  <
^                     p00-1g00<

(Obviamente, esto todavía es muy fácil. Solo quería obtener una respuesta aquí por ahora)

Entonces, esto se compone de diferentes partes.

&&00p10p

Este es solo el inicializador, toma los valores y los almacena

    >94+2*20p
>00g|      > 
    @  

Esta sección restablece el recuento de filas, por lo que podemos imprimir otras imágenes (de ancho) una al lado de la otra. 94+2* está calculando 26, el número de filas. Además, si la altura es cero, el programa terminará.

>10g

Esto obtiene el ancho de la pila para que sepamos cuántos imprimir.

0020gv-1:<
     >:0`|
         $

Esto agrega dos valores ficticios a la pila para saber cuándo hemos terminado una operación, así como en qué fila (n) estamos. Esto luego agrega n valores a la pila

>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v
|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>"!DAB"[email protected]

                                                    <
                                                  <
                                                <
                                              <
                                            <
                                          <
                                        <
                                      <
                                    <
                                  <
                                <
                              <
                            <
                          <
                        <
                      <
                    <
                  <
                <
              <
            <
          <
        <
      <
    <
  <
<

Esta es una sección de control que se dirigirá a la fila (26-n). Esta es la forma más fácil de averiguar cómo hacerlo.

".......#.....#####......."
".......##.....#####......"
".......###.....#####....."
".......####.....####....."
".......#####.....###....."
".......######.....##....."
".......#######.....#....."
".......########.........."
"####################....."
".####################...."
"..####################..."
"...####################.."
"....####################."
".....####################"
"#.....##############.####"
"##.....#############..###"
"###....#############...##"
"####...#############....#"
"#####..#############....."
".#####.#############....."
"..##################....."
"........#####............"
".........#####..........."
"..........#####.........."
"...........#####........."
"............#####........"

Esto, obviamente, se lee y mostrará cualquier fila que se lea en la pila al revés. Esto significa que cuando lo sacamos, se imprimirá correctamente.

v_
,:
>^

Esto se imprimirá hasta que la pila llegue a 0, que dejamos antes.

1-:#^_

Esto quita 1 del número de la línea específica para imprimir, luego verifica si es cero o no. Si no es cero, volvemos al cuarto bloque de código.

          ,
          +
20g1-20p55^

Esto resta 1 de la fila (n), imprime una nueva línea y vuelve al bloque 3

p00-1g00

Una vez impresas todas las filas, esto resta una de la altura inicial y vuelve al bloque 2.

Todo el resto del código es control de flujo o gestión de pila. Escribiendo este mas de lo que pensé que sería, pero estoy satisfecho con cómo se ve. Es mucho más fácil de jugar y probablemente seguirá siendo un proyecto para otro día.

2120 -> 1967: recortó algunas líneas con muchos espacios desperdiciados

Nos puedes avalar nuestra tarea ejecutando un comentario y dejando una valoración te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *