Dibuja la Union Jack

8

Prefacio

¡Hay muchos desafíos de "dibujar x bandera", y al buscarlo resulta que no hay desafíos para dibujar el Union Jack! Siento que esta sería una bandera más difícil de dibujar, pero aún así debería ser posible.

Desafío

Dibuja la Union Jack. Puede enviarse a un archivo en cualquier formato de archivo de gráficos disponible libremente o dibujarse en la pantalla.

  • Se aplican las reglas de Code Golf, gana el código más corto en bytes.
  • Se aplican lagunas estándar.
  • No se permiten construcciones para dibujar banderas.

Las dimensiones serán las siguientes. Tamaño mínimo 600x300 píxeles (o unidades si su idioma solo admite gráficos escalables). Error máximo 1 píxel.

Los colores serán rojo, blanco y azul según lo definido por su idioma o su documentación, o # CC0000, #FFFFFF y # 003399 por página de Wikipedia.

ingrese la descripción de la imagen aquí

Shaun Wild
fuente
11
" Hay muchos desafíos de" dibujar x bandera ", y al buscarlo resulta que no hay desafíos para dibujar " podría ser seguido por cualquiera de los miles de banderas nacionales, organizacionales, estatales, etc. ¿Qué tiene esta bandera que hace que dibujarlo sea un desafío fundamentalmente diferente de todas las preguntas de salida gráfica existentes ?
Peter Taylor
1
Esto es muy parecido al desafío de la bandera de Islandia, sin embargo, creo que este tiene un giro particular en la construcción de las rayas diagonales. Como tienen simetría rotacional pero no simetría reflexiva exacta, agrega una capa adicional a la complejidad. La mayoría de las estrategias para la bandera de Islandia no sería una simple conversión para obtener esta.
GuitarPicker
¡No más duro que la bandera portuguesa!
sergiol

Respuestas:

8

BBC BASIC

Rev B, 234 bytes

En lugar de dibujar una cruz blanca y una roja, dibujamos 100 cruces progresivamente más estrechas, cambiando del fondo blanco al primer plano rojo en una coordenada de 60.

p=20761m=1049w=600h=300F.i=-1TO1V.29,w;h;18;4,m;134*i;0;m;w*i;-233;p;0;466;m;0;67*i;m;-466;h*i;p;932;0;18;1,m;511*i;h*i;25;89*i;0;29977;0;0;m;w*i;-h*i;28953;0;45*i;
N.F.c=-100TO0q=25881-c DIV60*512V.m;-c;-h;q;c;h;m;-w;-c;q;w;c;
N.

Descargue el intérprete gratis en http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Totalmente golfizado, 249 bytes

Códigos de VDU de un solo byte, por ejemplo, 25,0combinados en little endian de doble byte, por ejemplo, 25;y uso máximo de constantes para valores comunes. Palabras clave comprimidas en forma abreviada, p. Ej. FOR=> F.(El intérprete se expande automáticamente).

p=20761q=26393r=25881m=1049c=100w=600h=300F.i=-1TO1V.29,w;h;18;4,m;134*i;0;m;w*i;-233;p;0;466;m;0;67*i;m;-466;h*i;p;932;0;18;1,m;511*i;h*i;25;89*i;0;29977;0;0;m;w*i;-h*i;28953;0;45*i;
N.V.m;-c;-h;q;c;h;2m;-w;-c;q;w;c;m;-60;-h;r;60;h;m;-w;-60;r;w;60;

Semigolfed

Códigos de VDU sin procesar. En BBC BASIC, los caracteres pueden enviarse al controlador VDU como VDU65(imprime una A). Hay ciertos caracteres especiales particulares de la BBC para los gráficos. Estos deben ser seguidos por varios otros bytes para especificar coordenadas, etc. Aquí usamos PLOT=> VDU25, GCOL=> VDU18, ORIGIN=> VDU29.

  c=100w=600h=300                                      :REM constants 100,width,height
  FORi=-1TO1                                           :REM loop -1 and 1 (0 draws nothing)
    VDU29,w;h;                                         :REM set origin (bring inside loop for golfing reasons)
    VDU18;4                                            :REM change to blue and draw triangles
    VDU25,4,134*i;0;25,4,w*i;-233;25,81,0;466;25,4,0;67*i;25,4,-466;h*i;25,81,932;0;
    VDU18;1                                            :REM change to red and draw parallelograms
    VDU25,4,511*i;h*i;25,0,89*i;0;25,117,0;0;25,4,w*i;-h*i;25,113,0;45*i;
  NEXT
  VDU25,4,-c;-h;25,103,c;h;25,4,-w;-c;25,103,w;c;      :REM draw white background rectangles
  VDU25,4,-60;-h;25,101,60;h;25,4,-w;-60;25,101,w;60;  :REM draw red foreground rectangles

Primero dibujamos la mitad de las partes diagonales: 2 triángulos azules y 2 paralelogramos rojos. Luego cambiamos la escala de -1 a +1 y dibujamos la otra mitad. Finalmente dibujamos las partes horizontal y vertical en la parte superior: 2 rectángulos blancos para formar una cruz blanca, luego 2 rectángulos rojos. La imagen después de la primera iteración del bucle se muestra a continuación, junto con la imagen final.

ingrese la descripción de la imagen aquí

Código sin golf

BBC basic recuerda las últimas 2 ubicaciones del cursor de gráficos. PLOT81 dibuja un triángulo entre las nuevas coordenadas especificadas y estas dos últimas ubicaciones. PLOT113 y PLOT117 dibujan un paralelogramo de manera similar: se deben dar tres esquinas del paralelogramo en el orden en que se encuentran alrededor del perímetro. Los últimos tres bits del código PLOT definen si las coordenadas dadas son absolutas o relativas, y si se utiliza el color frontal o de fondo. Los bits más significativos definen qué tipo de forma se dibuja (punto, línea, triángulo, paralelogramo, rectángulo, etc.)

  ORIGIN600,300       :REM move the origin (which will be centre of flag) away from the corner of the screen.

  FORi=-1TO1          :REM at scales of -1 and 1, plot half each of the diagonal parts (i=0 plots nothing).
    GCOL0,4             :REM blue foreground colour
    PLOT4,134*i,0       :REM absolute move to peak of upper/lower triangle
    PLOT4,600*i,-233    :REM absolute move to left hand corner
    PLOT81,0,466        :REM relative move to right hand corner, plotting triangle

    PLOT4,0,67*i        :REM absolute move to peak of left/right triangle
    PLOT4,-466,300*i    :REM absolute move to lower corner
    PLOT81,932,0        :REM relative move to upper corner, plotting triangle

    GCOL0,1             :REM red foreground colour
    PLOT4,511*i,300*i   :REM absolute move to long edge of flag
    PLOT0,89*i,0        :REM relative move to corner of flag (top right / bottom left)
    PLOT117,0,0         :REM absolute move to centre of flag, plotting parallelogram (stripe)
    PLOT4,600*i,-300*i  :REM absolute move to corner of flag (bottom right / top left)
    PLOT113,0,45*i      :REM relative move to short edge of flag, plotting parallelogram (stripe)
  NEXT                :REM diagonal parts completed, now plot vertical/horizontal parts on top.

  PLOT4,-100,-300     :REM move to bottom left of vertical white stripe
  PLOT103,100,300     :REM move to top right corner, plot it in background colour (white)
  PLOT4,-600,-100     :REM move to bottom left corner of horizontal white stripe
  PLOT103,600,100     :REM move to top right corner, plot it in background colour (white)

  PLOT4,-60,-300      :REM move to bottom left of vertical red stripe
  PLOT101,60,300      :REM move to top right corner, plot it in foreground colour (red)
  PLOT4,-600,-60      :REM move to bottom left corner of horizontal red stripe
  PLOT101,600,60      :REM move to top right corner, plot it in foreground colour (red)
Level River St
fuente
66
El idioma correcto (nombre) para la tarea :-D
Luis Mendo
3

SVG, 298 bytes

la puntuación excluye 3 nuevas líneas innecesarias agregadas para mayor claridad.

<svg xmlns="http://www.w3.org/2000/svg">
<path d="M67,0h466L0,267v-234L533,300h-466L600,33v232z" fill="blue"/>
<path d="M0,0v22L300,172L45,300h-45L600,0h-45L300,128L600,278v22z" fill="red"/>
<path d="M-10,110h270v-120h80v120h270v80h-270v120h-80v-120h-270z" fill="red" stroke="#fff" stroke-width="20"/>

Inspirado por la respuesta eliminada de Siren (y en particular el ahorro en bytes de la omisión </svg>al final del documento), se me ocurrió un SVG que es dimensionalmente correcto y un poco más corto.

Consiste en una ruta azul y una ruta roja (llena, sin trazos) para las partes diagonales y una ruta roja (llena, con un borde blanco de 20 unidades) para la cruz final. Debido al grosor del borde blanco, las dimensiones especificadas de la cruz deben exceder las dimensiones requeridas en 10 alrededor.

Esto funciona bien para mí en Microsoft IE y Edge. A veces muestra una advertencia de "contenido adicional al final del documento" en Chrome.

Así es como aparece sin y con la cruz final. Se requieren 8 puntos para describir el camino azul, 10 puntos para describir el camino rojo y 12 puntos para el cruce final. No es necesario indicar las intersecciones de líneas rectas dentro de los dos primeros caminos.

ingrese la descripción de la imagen aquí

Level River St
fuente
SVG es un formato de imagen, no un lenguaje de programación
Mego
2
@Mego hay bastantes envíos de SVG en este sitio. En realidad, es más difícil hacerlo sin el beneficio de los bucles. Tal vez debería aplicar el siguiente argumento tal como lo usó el gran Peter Taylor aquí: codegolf.stackexchange.com/questions/19050/… aunque era reacio a hacerlo porque no conozco PHP:PS If anyone wants to argue that SVG isn't a programming language (and I'd be very inclined to agree), consider this a PHP program in the style of many PHP submissions to this site which just echo literal text.
Level River St
1

Logotipo, 260 239 bytes

(Intérprete XLogo)

Utilicé el intérprete XLogo basado en Java, ya que era una de las pocas implementaciones de logotipos que pude encontrar, que admite la configuración del tamaño de la ventana de salida.

El editor XLogo normalmente guarda los archivos como procedimientos que deben llamarse. Este programa está escrito para pegarse en la ventana inmediata. Esto ahorra unos 9 bytes.

window setscreensize[600 300]setsc 4 lt atan 2 repeat 2[repeat 2[setpc 7 setpw 60 fd 400 setpw 20 lt 90 fd 10 lt 90 setpc 1 fd 400 lt 90 fd 10 rt 90]lt asin .8]home wrap setpw 100 setpc 7 repeat 2[repeat 2[fd 600 lt 90]setpw 60 setpc 1] ht

Dado que no se requerían colores exactos, me regrese a esto para usar números de color integrados que ahorraron varios bytes. Si desea ver una versión con colores RGB exactos, consulte las revisiones. También sustituí un cálculo trigonométrico con un equivalente más corto.

Salida de bandera Union Jack

Sin gofres con comentarios

El único truco real aquí es cambiar los colores para la segunda pasada de un bucle y aprovechar la wrapfunción que nos permite dibujar las franjas horizontales con muy poco esfuerzo. Dado que la altura y el ancho de la bandera son factores de 600, podemos avanzar 600 para rayas verticales u horizontales y terminar nuevamente en el centro. Esto evita tener casos separados para cada uno, incluso si dibuja la barra vertical el doble de veces. Estamos ahorrando espacio de código, no ciclos de reloj.

to UnionJack
  #Initialize the screen
  window  #Allow the turtle to overshoot the boundary without reappearing on the opposite side
  setscreensize[600 300]
  setsc 4  #blue background

  lt atan 2 #Turn left, preparing to draw first diagonal
  repeat 2 [ #Draw 2 sets of main diagonal bars
    repeat 2 [ #Each main bar is made of 2 spokes
      setpc 7 setpw 60 #Use a wide white pen
      fd 400 #Draw past the corner of the window
      setpw 20 #Make the pen narrow
      lt 90 fd 10 lt 90 #Do a 10px U-turn
      setpc 1 #Switch to a red pen
      fd 400 #Draw back to the center.
      lt 90 fd 10 rt 90 #Do a 10 px S curve back to center, ready to draw the opposite spoke
    ] #Finish spoke
    lt asin .8 #Turn for the next bar.
  ] #Finish bar
  home #Return to a sane heading
  wrap #Makes the turtle wrap to the opposite side if it overshoots the boundary
  setpw 100 setpc 7 #Wide white pen
  repeat 2 [ #Draw 2 crosses
    repeat 2 [ #Each cross has 2 stripes
      fd 600 #Overshoot the boundary so that we end up where we started at the center, leaving a stripe behind
      lt 90 #Rotate to draw the next stripe
    ] #Finish the stripe
    setpw 60 setpc 1 #Change to a narrow red pen
  ] #Finish cross
  ht #Hide the turtle
end
GuitarPicker
fuente
1

Procesamiento, 312 bytes

Este es el tipo de rompecabezas donde el procesamiento es bastante eficiente.

int a=300,b=2*a,c=255,d=100;size(b,a);background(0,51,153);stroke(c);strokeWeight(60);line(0,a,b,0);line(0,0,b,a);stroke(c,0,0);strokeWeight(20);line(0,310,a,160);line(-22,0,a,160);line(a,139,b,-12);line(a,139,624,a);noStroke();fill(c);rect(250,0,d,b);rect(0,d,b,d);fill(c,0,0);rect(270,0,60,b);rect(0,120,b,60);

Resultados en:

ingrese la descripción de la imagen aquí

6 infinito 8
fuente
0

Python 2, 265 bytes

r="D\0\0"
b="\0\x173"
w="U"*3
N=20*(270*w+60*r+270*w)
L=190*[b]+60*[w]+40*[r]+20*[w]+190*[b]
j=''.join
F=lambda p:j([j(L[150-p*100+i:150+p*150+i:p])+20*w+60*r+20*w+j(L[345-p*145-i:345+p*105-i:p])for i in range(0,200,2)])
print"P6 600 300 85 "+F(-1)+N+36000*r+N+F(1)

Salida como PPM binario, uso:

python golf_unionjack.py > unionjack.ppm

Lrepresenta un corte vertical de las partes diagonales y Fusa la (tipo de) simetría para guardar el código y calcular los índices para las partes superior e inferior.

Karl Napf
fuente
0

Posdata (166 bytes)

00000000: 880a 880a 928b 3020 3092 6b30 881e 9263  ......0 0.k0...c
00000010: 883c 3330 9263 883c 3092 6392 1692 142f  .<30.c.<0.c..../
00000020: 727b 2e38 8800 3092 9d7d 9233 2f77 7b31  r{.8..0..}.3/w{1
00000030: 8801 3192 9d7d 9233 924e 3220 3192 8b30  ..1..}.3.N2 1..0
00000040: 202e 3220 2e36 929d 3020 3088 1e33 3092   .2 .6..0 0..30.
00000050: 8088 0f31 3592 ad34 3592 8834 7b77 2030  ...15..45..4{w 0
00000060: 88fd 881e 3692 8072 8800 3088 1e32 9280  ....6..r..0..2..
00000070: 3930 9288 7d92 8392 4d88 1e31 3592 ad32  90..}...M..15..2
00000080: 7b77 88fb 88e2 880a 3630 9280 3930 9288  {w......60..90..
00000090: 7d92 8332 7b72 88fd 88e2 3688 3c92 8039  }..2{r....6.<..9
000000a0: 3092 887d 9283                           0..}..

Versión no tokenizada:

10 10 scale
0 0 moveto
0 30 lineto
60 30 lineto
60 0 lineto
closepath
clip
/r {.8 0 0 setrgbcolor} def
/w {1 1 1 setrgbcolor} def
gsave
2 1 scale
0 .2 .6 setrgbcolor
0 0 30 30 rectfill
15 15 translate
45 rotate
4 {w 0 -3 30 6 rectfill r 0 0 30 2 rectfill 90 rotate} repeat
grestore
30 15 translate
2 {
w
-5 -30 10 60 rectfill
90 rotate
} repeat
2 {
r
-3 -30 6 60 rectfill
90 rotate
} repeat

Salida:

ingrese la descripción de la imagen aquí

ganso121
fuente