Rendering di una versione del logo BBC Micro owl [chiuso]


14

Logo BBC Micro Owl

Riesci a visualizzare una versione del logo BBC Micro Owl come sopra dal codice?

Regole:

  • Puoi usare qualsiasi linguaggio di programmazione che ti piace.
  • L'output può essere di testo o grafico.
  • Le cerchie non devono sovrapporsi.

Vincitore:

  • Vince la risposta con il maggior numero di voti.

Complimenti per chiunque tenti di farlo in BBC Basic.

Puoi leggere della BBC Micro qui


4
"Più inventivo" e "più come l'originale" è soggettivo. Fornisci un criterio vincente oggettivo. (Sto votando per chiudere, come da "Le domande senza un criterio vincente primario oggettivo sono fuori tema, in quanto rendono impossibile decidere indiscutibilmente quale voce dovrebbe vincere.")
Doorknob

1
Ho modificato i criteri di vincita con il codice più breve che spero sia meno soggettivo per tutti.
Ben Paton,

Forse il code-golf va bene, ma penso che questa domanda potrebbe adattarsi invece a un tag contest di popolarità . La maggior parte dei voti vince. Questo è obiettivo. La folla decide. Questo incoraggia risultati interessanti senza sacrificare la qualità / creatività dell'output per risparmiare qualche carattere di codice. Testimone della domanda sugli anelli olimpici freestyle .
Darren Stone

Buona idea, l'ho cambiato per la maggior parte dei voti positivi, il che è più giusto. Come faccio a toglierlo dall'attesa?
Ben Paton,

Abbiamo bisogno di una risposta tikz.
Anush,

Risposte:


30

BBC BASIC

Ho provato a usare le funzioni di trigger per disegnare cerchi adeguati, ma è stato dolorosamente lento. È venuto con questo invece:

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

Ecco l'output:

Animated GIF of the BBC Micro Owl Logo


6
Wow, davvero incredibile, qualcuno si è davvero preso il tempo di usare BBC basic. Sono molto colpito !!
Ben Paton,

È un bel gufo. Stai usando una vera BBC o un programma di emulazione. Se è un emulatore, quale? perché non è lo stesso di quello che ho usato.
Level River St

A proposito, se vuoi disegnare cerchi più velocemente, non usare le funzioni trig, usa il teorema di pitagora: Y = (R ^ 2-X ^ 2) ^ 0.5 vedi la mia risposta alla domanda arcobaleno. E in realtà c'è un modo più avanzato di farlo con solo un'aggiunta, basato sul fatto che (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}/

Il codice stampa una versione in arte ascii del logo (esegui qui ).

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 

4
Davvero impressionante in 82 personaggi!
Ben Paton,

7

matematica

Nient'altro che lavoro grugnito.

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]

gufo


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)

Risultati in:

inserisci qui la descrizione dell'immagine

Fondamentalmente l'idea è di prendere la rappresentazione di base 2 dei 17 numeri (1397760, 567810, 1070336, 141954, 1381696, 133794, 1054036, 559786, 1332560, 557218, 1052756, 131114, 1380368, 139272, 1064964, 557058 e 1398101) , trasformalo in una matrice 21x17 di 1 e 0 e traccia la matrice così com'è.


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

'compilare' con povray +Ibbc.pov -Obbc.png +A0.1 +R9 -W240 -H285

inserisci qui la descrizione dell'immagine


6

bash

Dato che non hai specificato risorse esterne ...

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, grazie per aver rubato la tua arte Ascii.

O dopo averlo caricato qui -

curl -s http://textuploader.com/1ojd | sed -n '/<code/,/<\/code>/p' | sed 's/<[^>]\+>//g'

4
Beh, questo è il pensiero laterale suppongo ...
Ben Paton,

6

BBC Basic, colori casuali, golf!

149 caratteri. Non sono così grande nel golf (preferisco le sfide del codice) ma mi è piaciuta la ridicolità del golf in BBC basic. Emulatore della BBC all'indirizzo http://www.bbcbasic.co.uk/ . Funziona in modalità schermo 6 dalla riga di comando.

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

inserisci qui la descrizione dell'immagine

Spiegazione (versione non golfizzata)

Nessuna istruzione IF, poiché il resto della riga verrebbe eseguito solo se l'IF fosse vero (quindi per assicurarsi che il PROSSIMO fosse raggiunto avrei dovuto fare un programma con i numeri di riga.) Quindi ho fatto molto uso di ASC (null carattere) = 0 per controllare l'output. Inoltre, ho dovuto tagliare il pixel nell'angolo in basso a destra per adattarlo all'intera riga di comando sullo schermo dopo la stampa (e che ha salvato 2 caratteri.

Adoro il modo in cui BBC Basic può riconoscere un identificatore dopo FOR, anche senza spazi bianchi. FORE, FORD, FORK, FORMA, 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

Grazie per il contributo che è una soluzione davvero intelligente e un bel gufo multicolore, non ho mai visto prima il golf della BBC di base.
Ben Paton,

Grazie per avermi ispirato ad andare a cercare un emulatore di base della BBC. È un linguaggio eccezionale che non uso da 20 anni. Ha un sacco di servizi grafici integrati senza dover includere librerie aggiuntive, il che lo rende un linguaggio eccellente per giocare a golf in questo modo.
Level River St,

Inoltre, la prima volta che ho usato la base 64. Era giusto per questa immagine, essendo 18 pixel per ogni 2 linee. Lo userò sicuramente di nuovo. Il fatto che il sesto bit sia maiuscolo / minuscolo significa che devi solo pensare agli altri cinque. Ho scoperto che ha reso quasi facile come esagono una volta entrato.
Level River St

Ho appena fatto questo twitter.com/bbcmicrobot/status/1229933895401058304 basandomi su alcune delle tue tecniche, grazie mille; Ho notato, tuttavia, hai perso alcune opportunità di golf. BBC Basic ti consente di abbreviare i comandi, ad esempio 'FOR' = 'F.', 'VDU' = 'V.', Più x / 2 ^ z AND 1 è solo x AND 2 ^ z, non hai bisogno di SHR
bazzargh

4

C

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

Uscita codice:

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 

4

JavaScript - 326 307 285 caratteri (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;

Probabilmente non è il codice più corto. Ho cercato di essere il più vicino possibile al logo originale, usando solo ASCII.

Per eseguire: copia incolla su console javascript (es: chrome o firefox). Nota: l'esecuzione dello script potrebbe richiedere un po 'di tempo, quindi se non arriva nulla dopo aver premuto Invio, sii un po' paziente.


Puoi accorciarlo facendo m=Math;e poi facendo m.floor, m.powecc.
Eithed

1
Perfino moreso avvolgendo il forcerchio più esterno in un with (Math)e quindi omettendo Math.ad ogni occorrenza. Spostare le s+=parti nell'intestazione for-loop (accanto a y++/ x++) per eliminare alcune parentesi graffe. Penso che sia tipico usare alert/ promptper l'I / O quando si gioca a golf in JS, quindi andrei alert(s)invece alla fine.
FireFly,

Grazie per suggerimenti e commenti. Sono un principiante quando si tratta di ottimizzare le dimensioni del codice :) Informazioni su avvisi / suggerimenti: ho provato a usarli, ma ci sono alcuni problemi: i browser (almeno Chrome) sembrano avvolgere automaticamente il testo se la linea è troppo lunga, il che si interrompe logo.
Tigrou,

4

CoffeeScript

Il codice non è golfato. Utilizza alcuni algoritmi metaballs -ish per simulare la "viscosità" dei cerchi. Il gufo ASCII è stato sottratto senza vergogna ad altre risposte :)

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

Guarda che distruggere la documentazione coffeescript.org (colpito Run):

OwlScript


2

PHP

Basandosi sulle versioni ASCII art del logo presentate in precedenza e usando questa come matrice per eseguire il rendering di una versione grafica usando la libreria 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);

Risultati in:

Logo BBC Owl di PHP


2

BBC Basic + GXR

Molto tardi, ma: l'account "bbcmicrobot" su Twitter, che esegue progs <280 caratteri o così, ha aggiunto la ROM GXR Acorn, consentendo di disegnare cerchi ed ellissi. Ho pensato, cosa avrei potuto disegnare con un paio di cerchi? E questo è venuto da me. È basato in parte sulla risposta di @Level River Street, anche se ho usato i comandi di base abbreviati, ho usato i test dei bit anziché SHR e ho cambiato la rappresentazione dei bit:

2MO.2:P."HOW TO DRAW AN OWL":MOV.200,700:PL.&91,120,0:MOV.250,450:PL.0,-200,0:PL.&C1,155,250:V.29,640;130;
5F.G=0TO188:Z=(G MOD18)>8:X=G MOD9*2-Z:Y=G DIV18*2-Z
6IFASC(MID$("@|WhFMxeG|tC^|A_|A?]HSNSEuLUMS?G",(G+6)DIV6,1))AND2^(G MOD6) MOV.X*36,Y*36:PL.&99,24,0
8N.G

screenshot del codice di rendering del bot

Il mio tweet originale è qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.