Desenhe o Union Jack

8

Prefácio

Existem muitos desafios "empate x bandeira" e, ao buscá-lo, não há desafios para atrair o sindicato Jack! Eu sinto que isso seria uma bandeira mais difícil de desenhar, mas ainda deve ser possível.

Desafio

Desenhe o Union Jack. Ele pode ser enviado para um arquivo em qualquer formato de arquivo gráfico disponível gratuitamente ou desenhado na tela.

  • Código Aplicam-se as regras de golfe, o código mais curto em bytes ganha.
  • Aplicam-se brechas padrão.
  • Não são permitidos recursos internos para desenho de bandeira.

As dimensões devem ser as seguintes. Tamanho mínimo 600x300 pixels (ou unidades, se o seu idioma suportar apenas gráficos escaláveis.) Erro máximo 1 pixel.

As cores serão vermelho, branco e azul, conforme definido pelo seu idioma ou sua documentação, ou # CC0000, #FFFFFF e # 003399 por página da Wikipedia.

insira a descrição da imagem aqui

Shaun Wild
fonte
11
" Existem muitos desafios" empate x bandeira "e, ao buscá-lo, não há desafios para empunhar o " poderia ser seguido por milhares de bandeiras nacionais, organizacionais, estaduais etc. O que essa bandeira tem que faz do desenho um desafio fundamentalmente diferente de todas as questões de saída gráfica existentes ?
Peter Taylor
1
Isso é muito parecido com o desafio da bandeira da Islândia, no entanto, acho que este tem um toque particular na construção das listras diagonais. Como possuem simetria rotacional, mas não simetria reflexiva exata, isso adiciona uma camada extra à complexidade. A maioria das estratégias para a bandeira da Islândia não seria uma conversão simples para obter essa.
GuitarPicker 30/08/16
Não é mais difícil que a bandeira portuguesa!
sergiol

Respostas:

8

BBC BASIC

Rev B, 234 bytes

Em vez de desenhar uma cruz branca e uma cruz vermelha, desenhamos 100 cruzamentos progressivamente mais estreitos, alternando de fundo branco para primeiro plano vermelho com uma 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.

Faça o download do intérprete gratuitamente em http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Totalmente jogado, 249 bytes

Códigos VDU de byte único, por exemplo, 25,0combinados em little endian de byte duplo, por exemplo, 25;e uso máximo de constantes para valores comuns. Palavras-chave compactadas para a forma abreviada, por exemplo, FOR=> F.(o intérprete se expande automaticamente.)

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;

Semigolfe

Códigos VDU brutos. No BBC BASIC, os caracteres podem ser enviados para o controlador VDU como VDU65(imprime um A.) Existem certos caracteres especiais específicos da BBC para gráficos. Estes devem ser seguidos por vários outros bytes para especificar coordenadas, etc. Aqui 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

Primeiro, desenhamos metade das partes diagonais: 2 triângulos azuis e 2 paralelogramos vermelhos. Em seguida, alteramos a escala de -1 para +1 e desenhamos a outra metade. Finalmente, desenhamos as partes horizontais e verticais na parte superior: 2 retângulos brancos para formar uma cruz branca, depois 2 retângulos vermelhos. A imagem após a primeira iteração do loop é mostrada abaixo, juntamente com a imagem final.

insira a descrição da imagem aqui

Código ungolfed

O BBC basic lembra os dois últimos locais do cursor gráfico. PLOT81 desenha um triângulo entre as novas coordenadas especificadas e esses dois últimos locais. PLOT113 e PLOT117 desenham um paralelogramo da mesma maneira: três cantos do paralelogramo devem ser dados na ordem em que são encontrados percorrendo o perímetro. Os últimos três bits do código PLOT definem se as coordenadas fornecidas são absolutas ou relativas e se a cor de primeiro plano ou de fundo é usada. Os bits mais significativos definem que tipo de forma é desenhada (ponto, linha, triângulo, paralelogramo, retâ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
fonte
6
A linguagem direita (nome) para o :-D tarefa
Luis Mendo
3

SVG, 298 bytes

A pontuação exclui 3 novas linhas desnecessárias adicionadas para maior clareza.

<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 na resposta excluída da Siren (e, em particular, na economia de bytes por omitir </svg>no final do documento), criei um SVG que é dimensionalmente correto e um pouco mais curto.

Consiste em um caminho azul e um caminho vermelho (preenchido, sem traços) para as partes diagonais e um caminho vermelho (preenchido, com borda branca de 20 unidades) para a cruz final. Devido à espessura da borda branca, as dimensões especificadas da cruz devem exceder em 10 as dimensões necessárias.

Isso funciona bem para mim no Microsoft IE e Edge. Às vezes, exibe um aviso de "conteúdo extra no final do documento" no Chrome.

Veja como aparece sem e com a cruz final. São necessários 8 pontos para descrever o caminho azul, 10 pontos para descrever o caminho vermelho e 12 pontos para a cruz final. As interseções de linhas retas nos dois primeiros caminhos não precisam ser fornecidas.

insira a descrição da imagem aqui

Level River St
fonte
SVG é um formato de imagem, não uma linguagem de programação
Mego
2
@Mego, existem muitos envios de SVG neste site. Na verdade, é mais desafiador fazê-lo sem o benefício de loops. Talvez eu deva aplicar o seguinte argumento, conforme usado pelo grande Peter Taylor aqui: codegolf.stackexchange.com/questions/19050/… embora tenha relutado em fazê-lo porque não conheço 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)

Eu usei o interpretador XLogo baseado em Java, pois era uma das poucas implementações de Logo que encontrei que suporta a configuração do tamanho da janela de saída.

O editor XLogo normalmente salva arquivos como procedimentos que devem ser chamados. Este programa foi escrito para ser colado na janela imediata. Isso economiza cerca de 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

Como as cores exatas não eram necessárias, reconfigurei isso para usar números de cores internos que salvaram vários bytes. Se você quiser ver uma versão com cores RGB exatas, verifique as revisões. Também substituí um cálculo trigonométrico por um equivalente mais curto.

Saída da bandeira Union Jack

Ungolfed com comentários

O único truque real aqui é mudar as cores para a segunda passagem de um loop e aproveitar o wraprecurso que nos permite desenhar as listras horizontais com muito pouco esforço. Como a altura e a largura da bandeira são fatores de 600, podemos avançar 600 para listras verticais ou horizontais e voltar ao centro novamente. Isso evita casos separados para cada um, mesmo que desenhe a barra vertical duas vezes mais. Estamos economizando espaço para código, não para ciclos de relógio.

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
fonte
1

Processando, 312 bytes

Este é o tipo de quebra-cabeça em que o processamento é 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);

Resulta em:

insira a descrição da imagem aqui

6infinity8
fonte
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)

Saída como PPM binário, uso:

python golf_unionjack.py > unionjack.ppm

Lrepresenta uma fatia vertical das partes diagonais e Fusa a (tipo de) simetria para salvar o código e calcular os índices da parte superior e inferior.

Karl Napf
fonte
0

Postscript (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..}..

Versão não 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

Resultado:

insira a descrição da imagem aqui

goose121
fonte