Rendern Sie eine Version des BBC Micro Owl-Logos

13

BBC Micro Owl Logo

Können Sie eine Version des BBC Micro Owl-Logos wie oben beschrieben aus dem Code rendern?

Regeln:

  • Sie können eine beliebige Programmiersprache verwenden.
  • Die Ausgabe kann als Text oder Grafik erfolgen.
  • Kreise müssen sich nicht überlappen.

Gewinner:

  • Die Antwort mit den meisten positiven Stimmen gewinnt.

Ein großes Lob für alle, die dies in BBC Basic versuchen.

Über das BBC Micro können Sie hier lesen

Ben Paton
quelle
3
"Am erfinderischsten" und "am ähnlichsten dem Original" ist subjektiv. Bitte geben Sie ein objektives Gewinnkriterium an. (Ich stimme für den Abschluss gemäß "Fragen ohne ein objektives primäres Gewinnkriterium sind nicht zum Thema gehörig, da unbestreitbar nicht entschieden werden kann, welcher Beitrag gewinnen soll.")
Türklinke
1
Ich habe die Gewinnkriterien auf den kürzesten Code geändert, von dem ich hoffe, dass er für alle weniger subjektiv ist.
Ben Paton
Vielleicht ist Code-Golf in Ordnung, aber ich denke, diese Frage könnte sich stattdessen für einen Beliebtheitswettbewerb eignen. Die meisten Stimmen gewinnen. Das ist objektiv. Mob entscheidet. Dies fördert interessante Ergebnisse, ohne die Ausgabequalität / Kreativität zu beeinträchtigen, um ein paar Zeichen Code zu sparen. Beobachten Sie die Freestyle- Frage nach den olympischen Ringen .
Darren Stone
Gute Idee, ich habe es geändert, um die meisten Upvotes zu gewinnen, was fairer ist. Wie kriege ich das hin?
Ben Paton

Antworten:

28

BBC BASIC

Ich habe versucht, mithilfe von Triggerfunktionen richtige Kreise zu zeichnen, aber das war schmerzhaft langsam. Kam stattdessen mit diesem auf:

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

Hier ist die Ausgabe:

Animiertes GIF des BBC Micro Owl Logos

zimperliches Ossifrage
quelle
6
Wow, wirklich erstaunlich, dass sich jemand die Zeit genommen hat, BBC basic zu benutzen. Ich bin sehr beeindruckt!!
Ben Paton
Das ist eine schöne Eule. Verwenden Sie eine echte BBC oder ein Emulatorprogramm? Wenn es ein Emulator ist, welcher? Weil es nicht dasselbe ist wie das, das ich benutzt habe.
Level River St
Übrigens, wenn Sie Kreise schneller zeichnen möchten, verwenden Sie keine Triggerfunktionen. Verwenden Sie den Satz von Pythagoras: Y = (R ^ 2-X ^ 2) ^ 0.5 Siehe meine Antwort auf die Regenbogenfrage. Und es gibt tatsächlich eine fortgeschrittenere Möglichkeit, dies nur mit Addition zu tun, basierend auf der Tatsache, dass (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}/

Der Code druckt eine ASCII-Kunstversion des Logos ( hier ausführen ).

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 
Howard
quelle
4
Wirklich beeindruckend in 82 Zeichen!
Ben Paton
7

Mathematica

Nichts als Grunzarbeit.

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]

Eule

DavidC
quelle
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)

Ergebnisse in:

Bildbeschreibung hier eingeben

Grundsätzlich besteht die Idee darin, die Basis-2-Darstellung der 17 Zahlen (1397760, 567810, 1070336, 141954, 1381696, 133794, 1054036, 559786, 1332560, 557218, 1052756, 131114, 1380368, 139272, 1064964, 557058 und 1398101) zu verwenden. Machen Sie eine 21x17-Matrix aus 1 und 0 und zeichnen Sie die Matrix so, wie sie ist.

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

'kompilieren mit povray +Ibbc.pov -Obbc.png +A0.1 +R9 -W240 -H285

Bildbeschreibung hier eingeben

matja
quelle
6

Bash

Da Sie keine externen Ressourcen angegeben haben ...

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 - hat deine ASCII-Kunst gestohlen, danke.

Oder nachdem ich es hier hochgeladen habe -

curl -s http://textuploader.com/1ojd | sed -n '/<code/,/<\/code>/p' | sed 's/<[^>]\+>//g'
unclemeat
quelle
4
Nun, das ist laterales Denken, nehme ich an ...
Ben Paton
5

BBC Basic, zufällige Farben, Golf!

149 Zeichen. Ich mag das Golfen nicht besonders (ich bevorzuge die Code-Herausforderungen), aber ich mochte die Lächerlichkeit des Golfspiels in BBC Basic. BBC-Emulator unter http://www.bbcbasic.co.uk/ . Wird im Bildschirmmodus 6 in der Befehlszeile ausgeführt.

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: NEXT

Bildbeschreibung hier eingeben

Erklärung (ungolfed version)

Keine IF-Anweisungen, da der Rest der Zeile nur ausgeführt würde, wenn das IF wahr wäre (um sicherzustellen, dass das NEXT erreicht wurde, müsste ich ein Programm mit Zeilennummern ausführen.) Deshalb habe ich viel ASC (null) verwendet Zeichen) = 0, um die Ausgabe zu steuern. Außerdem musste ich das Pixel in der unteren rechten Ecke abschneiden, damit nach dem Drucken die gesamte Befehlszeile auf dem Bildschirm angezeigt wird (und das sparte 2 Zeichen).

Ich finde es toll, wie BBC basic einen Bezeichner nach FOR erkennt, auch ohne Leerzeichen. 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
quelle
Vielen Dank für Ihren Beitrag, das ist eine wirklich clevere Lösung und eine schöne bunte Eule. Ich habe BBC Basic noch nie gesehen.
Ben Paton
Vielen Dank, dass Sie mich dazu inspiriert haben, einen BBC-Basisemulator zu suchen. Es ist eine großartige Sprache, die ich seit 20 Jahren nicht mehr benutzt habe. Es verfügt über eine Vielzahl integrierter Grafikfunktionen, ohne dass zusätzliche Bibliotheken erforderlich sind, was es zu einer hervorragenden Sprache für das Golfen einer solchen Aufgabe macht.
Level River St
Außerdem habe ich zum ersten Mal Base 64 verwendet. Es war genau richtig für dieses Bild, 18 Pixel für jeweils 2 Zeilen. Ich werde es auf jeden Fall wieder benutzen. Die Tatsache, dass das 6. Bit in Groß- / Kleinschreibung geschrieben ist, bedeutet, dass Sie nur an die anderen fünf denken müssen. Ich fand, das machte es fast so einfach wie Hex, als ich hineinkam.
Level River St
4

C

ASCII-Ausgabe.

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

Code-Ausgabe:

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 
Oberon
quelle
4

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

Wahrscheinlich nicht der kürzeste Code. Ich habe versucht, dem ursprünglichen Logo so nahe wie möglich zu kommen und nur ASCII zu verwenden.

Zum Ausführen: Kopieren und Einfügen in die Javascript-Konsole (z. B. Chrome oder Firefox). Hinweis: Die Ausführung des Skripts kann etwas Zeit in Anspruch nehmen. Wenn Sie also kurz nach dem Drücken der Eingabetaste keine Informationen erhalten, haben Sie etwas Geduld.

tigrou
quelle
Sie können dies verkürzen , indem Sie m=Math;und dann tun m.floor, m.powusw.
eithed
1
Sogar mehr, indem man die äußerste forSchleife in eine einwickelt with (Math)und dann Math.bei jedem Auftreten weglässt . Verschieben Sie die s+=Parts in den For-Loop-Header (neben y++/ x++), um einige geschweifte Klammern zu entfernen. Ich denke, es ist typisch, alert/ promptfür I / O beim Golfen in JS zu verwenden, also würde ich alert(s)am Ende stattdessen mit gehen.
FireFly
Danke für Tipps und Kommentare. Ich bin ein Anfänger, wenn es um die Optimierung der Codegröße geht :) Über den Hinweis / Eingabeaufforderungsvorschlag: Ich habe versucht, sie zu verwenden, aber es gibt einige Probleme: Browser (zumindest Chrome) scheinen Text automatisch umzubrechen, wenn die Zeile zu lang ist Logo.
Tigrou
4

CoffeeScript

Code wird nicht gespielt. Es verwendet einige metaballs -ish Algorithmus „Klebrigkeit“ der Kreise zu simulieren. ASCII-Eule wurde schamlos von anderen Antworten gestohlen :)

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

Beobachten Sie , wie die coffeescript.org-Dokumentation zerstört wird ( klicken Sie auf Ausführen):

OwlScript

Epidemie
quelle
2

PHP

Aufbauend auf den zuvor eingereichten ASCII-Grafikversionen des Logos und Verwendung dieser als Array zum Rendern einer grafischen Version unter Verwendung der GD-Bibliothek.

$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);

Ergebnisse in:

BBC Owl Logo von PHP

Ben Paton
quelle