Renderizar uma versão do logotipo da BBC Micro owl

13

Logotipo da BBC Micro Owl

Você pode renderizar uma versão do logotipo da BBC Micro Owl conforme o código acima?

Regras:

  • Você pode usar qualquer linguagem de programação que desejar.
  • A saída pode ser texto ou gráfico.
  • Os círculos não precisam se sobrepor.

Vencedora:

  • A resposta com mais votos positivos vence.

Muitos elogios para quem tenta isso na BBC basic.

Você pode ler sobre a BBC Micro aqui

Ben Paton
fonte
3
"Mais inventivo" e "mais parecido com o original" é subjetivo. Por favor, forneça um critério de vitória objetivo. (Eu estou votando para perto, como por "perguntas sem um critério vencedora principal objetivo é off-topic, uma vez que tornam impossível decidir indiscutivelmente que a entrada deve ganhar.")
Doorknob
1
Alterei os critérios de vitória para o código mais curto, que espero seja menos subjetivo para todos.
Ben Paton
Talvez code-golf esteja bem, mas acho que essa pergunta poderia se adequar a uma tag de concurso de popularidade . A maioria dos votos vence. Isso é objetivo. Mob decide. Isso incentiva resultados interessantes sem sacrificar a qualidade / criatividade da saída para economizar alguns caracteres de código. Testemunhe a pergunta dos anéis olímpicos de estilo livre .
Darren Stone
Boa ideia: mudei para a maioria das vitórias positivas, o que é mais justo. Como faço para tirar isso da espera?
Ben Paton

Respostas:

28

BBC BASIC

Tentei usar funções trigonométricas para desenhar círculos adequados, mas isso foi dolorosamente lento. Em vez disso, surgiu isso:

10 MODE 1
20 GCOL 0,1 : VDU 19,1,3,0,0,0
30 FOR Y%=0 TO 20
40 READ N% : P%=65536
50 FOR X%=0 TO 16
60 IF (N% AND P%)=0 THEN GOTO 160
70 X0% = X%*32+384 : Y0% = 872-Y%*32
80 FOR DX%=-16 TO 16 STEP 8
90 FOR DY%=-8 TO 8 STEP 8
100 PLOT 69,X0%+DX%,Y0%+DY%
110 NEXT DY% : NEXT DX%
120 FOR DX%=-8 TO 8 STEP 8
130 FOR DY%=-16 TO 16 STEP 32
140 PLOT 69,X0%+DX%,Y0%+DY%
150 NEXT DY% : NEXT DX%
160 P%=P%/2
170 NEXT : NEXT
1000 DATA 87381,33410,69905,10280
1010 DATA 69649,33410,82181,40968
1020 DATA 87377,43520,87297,43520
1030 DATA 21761,10880,5441,2720
1040 DATA 1361,552,1093,43682,1

Aqui está a saída:

GIF animado do logotipo da BBC Micro Owl

r3mainer
fonte
6
Uau, alguém realmente sério levou um tempo para usar o BBC basic. Estou muito impressionado!!
Ben Paton
Essa é uma bela coruja. Você está usando uma BBC real ou um programa emulador. Se é um emulador, qual? porque não é o mesmo que eu usei.
Level River St
BTW, se você quiser desenhar círculos mais rapidamente, não use funções trigonométricas, use o teorema de Pitágoras: Y = (R ^ 2-X ^ 2) ^ 0,5 veja minha resposta à pergunta do arco-íris. E, na verdade, existe uma maneira mais avançada de fazê-lo com apenas adição, com base no fato de que (1) + (3) + (5) .... (1 + 2n) = (n + 1) ^ 2.
Level River St
10

GolfScript

"!C-DD[5v`>U8G`J2zX['b#L*\\q>FQp "{32-}%96base 2base{"   *"2/=}%18/{""*1>17/~n@n}/

O código imprime uma versão ascii art do logotipo (execute aqui ).

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 
Howard
fonte
4
Realmente impressionante em 82 caracteres!
Ben Paton
7

Mathematica

Nada além de trabalho pesado.

w = 20; h = 25; r = .7; r2 = .2; t = Table; d = Disk;
owl = Graphics[{Polygon[{{0, 0}, {w, 0}, {w, h}, {0, h}}],
   ColorData[57, 4],
   t[d[{k, 22}, r], {k, 2, 19, 2}],
   t[d[{18, k}, r], {k, 2, 21, 2}],
   t[d[{k, #}, r], {k, #2}] & @@@ {{21, {3, 9, 10, 11, 17}}, {20, {2, 
       6, 10, 14, 18}},
     {19, {5, 6, 7, 13, 14, 15}}, {18, {6, 9, 11, 14}}, {17, {10, 
       17}, {16, {16}}, {15, {15}}, {14, {8, 10, 12, 14}},
      {13, {9}}, {12, {9}}}},  
   t[d[{# - k, k}, r], #2] & @@@ {{20, {k, 18, 3, -1}}, {19, {k, 16, 
       6, -1}}, {18, {k, 16, 5, -1}}, {17, {k, 14, 7, -1}}, {16, {k, 
       14, 6, -1}}, {14, {k, 11, 5, -1}}, {14, {k, 12, 5, -1}}},
   t[d[{k, 4}, r], {k, {8, 12}}],
   t[d[{k, 3}, r], {k, 3, 13, 2}],
   d[{8, 13}, r],
   Black, d[{10, 21}, r2], d[{8, 13}, r2], d[{9, 12}, r2],
   t[d[{19 - k, k}, r2], {k, 16, 6, -1}],
   t[d[{17 - k, k}, r2], {k, 14, 7, -1}],
   t[d[{15 - k, k}, r2], {k, 12, 6, -1}],
   t[d[{k, 19}, r2], {k, {6, 14}}]}, ImageSize -> 220]

coruja

DavidC
fonte
7

R

image(t(matrix(as.integer(sapply(c(1397760,567810,1070336,141954,1381696,133794,
                                   1054036,559786,1332560,557218,1052756,131114,
                                   1380368,139272,1064964,557058,1398101),
                                   intToBits)[1:21,]),nr=21)),ax=F)

Resulta em:

insira a descrição da imagem aqui

Basicamente, a idéia é obter a representação da base 2 dos 17 números (1397760, 567810, 1070336, 141954, 1381696, 133794, 1054036, 559786, 1332560, 557218, 1052756, 131114, 1380368, 139272, 1064964, 557058 e 1398101) , transformá-lo em uma matriz 21x17 de 1 e 0s e plotar a matriz como está.

plannapus
fonte
7

Pov-Ray

background{color<.14,.01,.01>}
camera{orthographic location z*-2 up y*24 right x*20}
#macro s(X,Y)sphere{<X,Y,0>,1.07,2.6}#end
#declare b=array[17]{1397760,567810,1070336,141954,1381696,133794,1054036,
559786,1332560,557218,1052756,131114,1380368,139272,1064964,557058,1398101}
blob{threshold 0.9 #for(j,0,16,1)#declare V=b[j];#for(i,0,28,1)
#if(mod(V,2))s(j-8,i-10)#end #declare V=floor(V/2);#end #end
pigment{color<1,1,.8>}finish{ambient 1}}

'ajuntar com povray +Ibbc.pov -Obbc.png +A0.1 +R9 -W240 -H285

insira a descrição da imagem aqui

matja
fonte
6

Bater

Como você não especificou nenhum recurso externo ...

curl -s http://codegolf.stackexchange.com/questions/19214/render-a-version-of-the-bbc-micro-owl-logo | grep '* * *' | sed -n '/code>\*/,/<pre>/p' | sed '$d' | sed 's/<pre><code>//'

Howard - roubou sua arte Ascii, obrigado.

Ou depois que eu enviei aqui -

curl -s http://textuploader.com/1ojd | sed -n '/<code/,/<\/code>/p' | sed 's/<[^>]\+>//g'
desgrudar
fonte
4
Bem, isso é pensamento lateral suponho ...
Ben Paton
5

BBC Basic, cores aleatórias, jogou golfe!

149 caracteres. Eu não sou tão grande no golfe (prefiro os desafios do código), mas gostei do ridículo do golfe no básico da BBC. Emulador da BBC em http://www.bbcbasic.co.uk/ . Executa no modo de tela 6 na linha de comando.

FORQUILHA = 6TO185S = K MOD9 = 5VDU-32 * (K MOD18 = 15), 17.128 + RND (6) * (ASCMID $ ("? OSUuLEMSMS ^ H? = A_W", K / 6,1) / 2 ^ (K MOD6) AND1), 32,17,128,32, -13 * S, -10 * S: PRÓXIMO

insira a descrição da imagem aqui

Explicação (versão não destruída)

Nenhuma instrução IF, porque o restante da linha só seria executada se o IF fosse verdadeiro (para garantir que o NEXT fosse alcançado, eu teria que fazer um programa com números de linha.) Portanto, fiz muito uso do ASC (null caractere) = 0 para controlar a saída. Além disso, tive que cortar o pixel no canto inferior direito para caber em toda a linha de comando na tela após a impressão (e isso salvou 2 caracteres.

Eu amo como a BBC basic pode reconhecer um identificador depois de FOR, mesmo sem espaço em branco. FORE, FORD, FORK, FORM, FORS, FORT :-)

 FOR K=6 TO 185

     REM Set S to true(-1) if K mod 9 = 5, otherwise set S to false(0)

     S = K MOD 9=5

     REM If K mod 18 = 15, send asc(space)=32 to the VDU controller,otherwise send 0.  
     REM This causes staggering every 2 lines.

     VDU-32*(K MOD18=15)

     REM Vdu 17 for colour. foreground colours start at 0, background colours at 128.
     REM Rnd(6) to choose a bright color. Multiply by the horrible expression. 
     REM The horrible expression evaluates to 1 if the pixel is to be printed, 0 if not.
     REM Picture data is stored in base 64 in the string.
     REM MID$ extracts the characters in order. 
     REM The FOR loop starts at K=6 so that this will work properly.
     REM Extracted character SHR ((K mod 6)) AND 1 to decide to
     REM colour pixel or not. BBC basic does not have SHR operator.
     REM so we divide by 2^(K mod 6) instead.

     VDU 17,128+RND(6)*
      (ASC(MID$( "?OSUuLEMSS^H?=A_<A^tC|dGxEMh>W" ,K/6,1))/2^(K MOD 6)AND 1)

     REM Print a space in the new background colour

     VDU 32

     REM Change background colour back to black

     VDU 17,128

     REM Print another space 

     VDU 32

     REM If S is true (-1) print a carriage return and linefeed. otherwise two 0's

     VDU -13*S,-10*S

 NEXT
Level River St
fonte
Obrigado por contribuir, que é uma solução realmente inteligente e uma bela coruja multicolorida, eu nunca vi a BBC básica antes.
Ben Paton
Obrigado por me inspirar a procurar um emulador básico da BBC. É uma ótima linguagem que não uso há 20 anos. Possui muitas facilidades gráficas incorporadas sem a necessidade de incluir bibliotecas adicionais, o que a torna uma excelente linguagem para jogar golfe em uma tarefa como essa.
Level River St
Além disso, na primeira vez que usei a base 64. Era o ideal para esta imagem, sendo 18 pixels para cada 2 linhas. Definitivamente vou usá-lo novamente. O fato de o sexto bit estar em maiúsculas / minúsculas significa que você só precisa pensar nos outros cinco. Eu descobri que isso tornava quase tão fácil quanto o feitiço quando eu entrei nele.
Level River St
4

C

Saída ASCII.

x[]={256,191,424,104,376,60,316,30,286,15,287,15,383,67,403,153,325,102,341,153,511};i=20;mai
n(){for(;i>=0;i--){i&1&&putchar(32);while(x[i]){putchar(x[i]&1?42:32);x[i]>>=1;putchar(32);}pu
tchar(10);}}

Saída de código:

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 
Oberon
fonte
4

JavaScript - 326 307 285 caracteres (ASCII)

a=[1716886015,1133746501,253693823,1010572830,3215485048,0];s="";with(Math)
for(y=0;44>y;y++,s+="\n")for(x=0;90>x;x++,s+="#8*+=:-. "[min(floor(d),8)])
for(j=d=0;22>j;j++)for(i=0;9>i;i++)1==((8==i?j+1:a[floor(j/4)]>>i+j%4*8)&1)
&&(d+=50/pow(pow(x-10*(i+j%2/2)-4,2)+pow(2*y-4*j-4,2),1.5));s;

Provavelmente não é o código mais curto. Tentei estar o mais próximo possível do logotipo original, usando apenas ASCII.

Para executar: copie e cole no console javascript (por exemplo: chrome ou firefox). Nota: o script pode demorar um pouco para ser executado; portanto, se nada acontecer logo após pressionar enter, seja um pouco paciente.

tigrou
fonte
Você pode encurtar isso fazendo m=Math;e fazendo m.floor, m.powetc.
eithed
1
Mais ainda, envolvendo o forloop externo em um with (Math)e omitindo Math.a cada ocorrência. Mova as s+=peças para o cabeçalho do loop for (próximo a y++/ x++) para se livrar de algumas chaves. Eu acho que é típico usar alert/ promptpara E / S ao jogar golfe no JS, então eu iria alert(s)no final.
FireFly
Obrigado por dicas e comentários. Eu sou iniciante no que diz respeito à otimização do tamanho do código :) Sobre a sugestão de alerta / prompt: tentei usá-los, mas existem alguns problemas: os navegadores (pelo menos no Chrome) parecem envolver automaticamente o texto se a linha for muito longa, que quebrou logotipo.
usar o seguinte
4

CoffeeScript

Código não é jogado. Ele usa algum algoritmo metaballs -ish para simular a "aderência" dos círculos. ASCII coruja foi descaradamente roubado de outras respostas :)

canvas = document.createElement 'canvas'
canvas.style.backgroundColor = '#240202'
canvas.style.transform = 'scale(0.5) translate(-480px,-570px)'
W = canvas.width = 960
H = canvas.height = 1140
D = 50
R = D / 2
ctx = canvas.getContext '2d'
imageData = ctx.getImageData 0, 0, W, H
data = imageData.data
owl = '''

\ * * * * * * * * *
\  *     * *     *
\ *   *   *   *   *
\    * *     * *
\ *   *       *   *
\  *     * *     *
\ * *     *     * *
\  * *         *
\ * * * * * * *   *
\  * * * *
\ * * * * *       *
\  * * * *
\   * * * *       *
\    * * * *
\     * * * *     *
\      * * * *
\       * * * *   *
\        *   * *
\       *   *   * *
\  * * * * * *   *
\                 *
'''.split '\n'

insideDot = (x, y) ->
  w = 0
  for du in [-1..1] then for dv in [-1..1]
    u = x // D + du
    v = y // D + dv
    continue unless owl[v]?[u] is '*'
    dx = x - (u * D + R)
    dy = y - (v * D + R)
    d = dx * dx + dy * dy
    w += 1 / (d * d)
    return yes if w > 0.0000008
  no

for y in [0...H] then for x in [0...W] when insideDot x, y
  i = (y * W + x) * 4
  data[i] = data[i+1] = data[i+3] = 255
  data[i+2] = 214

ctx.putImageData imageData, 0, 0
document.body.appendChild canvas

Assista a ele destruir a documentação do coffeescript.org (pressione Executar):

OwlScript

epidemia
fonte
2

PHP

Com base nas versões ascii art do logotipo enviadas anteriormente e usando isso como o array para renderizar uma versão gráfica usando a biblioteca GD.

$circleWidth = 34;
$circleHeight = 34;
$movement = 24;
$canvasWidth = 480;
$canvasHeight = 570;
$image = imagecreatetruecolor($canvasWidth, $canvasHeight);
$backgroundColour = imagecolorallocate($image, 36, 2, 2);
ImageFillToBorder($image, 0, 0, $backgroundColour, $backgroundColour);
$circleColour = imagecolorallocate($image, 255, 255, 214);
$coordinates ='
* * * * * * * * * 
 *     * *     *  
*   *   *   *   * 
   * *     * *    
*   *       *   * 
 *     * *     *  
* *     *     * * 
 * *         *    
* * * * * * *   * 
 * * * *          
* * * * *       * 
 * * * *          
  * * * *       * 
   * * * *        
    * * * *     * 
     * * * *      
      * * * *   * 
       *   * *    
      *   *   * * 
 * * * * * *   *  
                * ';
$coordinates = str_split($coordinates);
$coordinateX = $movement;
$coordinatY = $movement;
$i=1;
foreach ($coordinates as $coordinate) {
    if ($i < 19) {
        if ($coordinate == '*') { 
            ImageFilledEllipse($image, $coordinateX, $coordinatY, $circleWidth, $circleHeight, $circleColour);  
        }
        $coordinateX = $coordinateX + $movement;
        $i++;
    } else {
        $i=1;
        $coordinateX = $movement;
        $coordinatY = $coordinatY + $movement;
    }
}
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);

Resulta em:

Logotipo da BBC Owl do PHP

Ben Paton
fonte