Rendre une version du logo BBC Micro owl [fermé]

14

BBC Micro Owl Logo

Pouvez-vous rendre une version du logo BBC Micro Owl comme ci-dessus à partir du code?

Règles:

  • Vous pouvez utiliser n'importe quel langage de programmation que vous aimez.
  • La sortie peut être du texte ou un graphique.
  • Les cercles n'ont pas à se chevaucher.

Gagnant:

  • La réponse avec le plus de votes positifs l'emporte.

Félicitations à tous ceux qui tentent cela dans BBC basic.

Vous pouvez lire sur le BBC Micro ici

Ben Paton
la source
4
«Le plus inventif» et «le plus semblable à l'original» est subjectif. Veuillez fournir un critère de gain objectif. (Je vote pour clore, selon "Les questions sans critère de gain principal objectif sont hors sujet, car elles empêchent incontestablement de décider quelle inscription devrait gagner.")
Bouton de porte
1
J'ai changé les critères de victoire pour le code le plus court qui, je l'espère, est moins subjectif pour tout le monde.
Ben Paton
Peut - être que le code-golf est bien, mais je pense que cette question pourrait plutôt convenir à un tag de concours de popularité . La plupart des votes l'emportent. C'est objectif. Mob décide. Cela encourage des résultats intéressants sans sacrifier la qualité de sortie / la créativité pour enregistrer quelques caractères de code. Soyez témoin de la question des anneaux olympiques de style libre .
Darren Stone
Bonne idée, je l'ai changé pour la plupart des victoires de votes positifs, ce qui est plus juste. Comment puis-je retirer cela?
Ben Paton
Nous avons besoin d'une réponse tikz.
Anush

Réponses:

30

BBC BASIC

J'ai essayé d'utiliser les fonctions trigonométriques pour dessiner les cercles appropriés, mais c'était douloureusement lent. Entré avec ceci à la place:

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

Voici la sortie:

GIF animé du logo BBC Micro Owl

r3mainer
la source
6
Wow vraiment incroyable quelqu'un a vraiment pris le temps d'utiliser la BBC basic. Je suis très impressionné!!
Ben Paton
C'est une belle chouette. Utilisez-vous un vrai BBC ou un programme émulateur. Si c'est un émulateur, lequel? car ce n'est pas le même que celui que j'ai utilisé.
Level River St
BTW, si vous voulez dessiner des cercles plus rapidement, n'utilisez pas les fonctions trigonométriques, utilisez le théorème de Pythagore: Y = (R ^ 2-X ^ 2) ^ 0,5 voir ma réponse à la question arc-en-ciel. Et il y a en fait une façon plus avancée de le faire avec seulement l'addition, basée sur le fait 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}/

Le code imprime une version art ascii du logo (exécutez ici ).

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 
Howard
la source
4
Vraiment impressionnant en 82 caractères!
Ben Paton
7

Mathematica

Rien que du grognement.

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]

hibou

DavidC
la source
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)

Résulte en:

entrez la description de l'image ici

Fondamentalement, l'idée est de prendre la représentation en base 2 des 17 nombres (1397760, 567810, 1070336, 141954, 1381696, 133794, 1054036, 559786, 1332560, 557218, 1052756, 131114, 1380368, 139272, 1064964, 557058 et 1398101) , faites-en une matrice 21x17 de 1 et 0 et tracez la matrice telle quelle.

plannapus
la source
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}}

'compiler avec povray +Ibbc.pov -Obbc.png +A0.1 +R9 -W240 -H285

entrez la description de l'image ici

matja
la source
6

Frapper

Puisque vous n'avez spécifié aucune ressource externe ...

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 - a volé votre art ascii, merci.

Ou après l'avoir téléchargé ici -

curl -s http://textuploader.com/1ojd | sed -n '/<code/,/<\/code>/p' | sed 's/<[^>]\+>//g'
dégrader
la source
4
Eh bien, c'est une pensée latérale, je suppose ...
Ben Paton
6

BBC Basic, couleurs aléatoires, golfé!

149 caractères. Je ne suis pas si grand sur le golf (je préfère les défis de code) mais j'ai aimé le ridicule du golf dans BBC basic. Émulateur BBC sur http://www.bbcbasic.co.uk/ . Fonctionne en mode écran 6 sur la ligne de commande.

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

entrez la description de l'image ici

Explication (version non golfée)

Pas d'instructions IF, car le reste de la ligne ne serait exécuté que si l'IF était vrai (donc pour m'assurer que le NEXT a été atteint, je devrais faire un programme avec des numéros de ligne.) J'ai donc beaucoup utilisé ASC (null caractère) = 0 pour contrôler la sortie. De plus, j'ai dû couper le pixel dans le coin inférieur droit pour adapter toute la ligne de commande à l'écran après l'impression (et cela a sauvé 2 caractères.

J'adore la façon dont BBC basic peut reconnaître un identifiant après FOR, même sans espace blanc. 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
la source
Merci d'avoir contribué c'est une solution vraiment intelligente et une belle chouette multicolore, je n'avais jamais vu de golf BBC basic auparavant.
Ben Paton
Merci de m'avoir inspiré pour aller chercher un émulateur de base BBC. C'est un super langage que je n'ai pas utilisé depuis 20 ans. Il dispose de nombreuses fonctionnalités graphiques intégrées sans avoir à inclure de bibliothèques supplémentaires, ce qui en fait un excellent langage pour jouer à une tâche comme celle-ci.
Level River St
Aussi, la première fois que j'ai utilisé la base 64. C'était juste pour cette image, soit 18 pixels pour 2 lignes. Je vais certainement l'utiliser à nouveau. Le fait que le 6e bit soit en majuscule / minuscule signifie que vous n'avez vraiment à penser qu'aux cinq autres. J'ai trouvé que cela rendait presque aussi facile que l'hexagone une fois entré.
Level River St
Je viens de faire ce twitter.com/bbcmicrobot/status/1229933895401058304 basé sur certaines de vos techniques, merci beaucoup; Je remarque cependant que vous avez manqué des opportunités de golf. BBC Basic vous permet d'abréger les commandes, par exemple 'FOR' = 'F.', 'VDU' = 'V.', Plus x / 2 ^ z ET 1 est juste x ET 2 ^ z, vous n'avez pas besoin de SHR
bazzargh
4

C

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

Sortie de code:

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 
Oberon
la source
4

JavaScript - 326 307 285 caractères (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;

Probablement pas le code le plus court. J'ai essayé d'être aussi proche que possible du logo d'origine, en utilisant uniquement ASCII.

Pour exécuter: copiez-collez sur la console javascript (par exemple: chrome ou firefox). Remarque: l'exécution du script peut prendre un peu de temps, donc si rien ne vient juste après avoir appuyé sur Entrée, soyez un peu patient.

tigrou
la source
Vous pouvez raccourcir ce en faisant m=Math;puis faire m.floor, m.powetc.
eithed
1
Même plus en enveloppant la forboucle la plus externe dans un with (Math), puis en omettant Math.à chaque occurrence. Déplacez les s+=parties vers l'en-tête for-loop (à côté de y++/ x++) pour vous débarrasser de quelques accolades. Je pense qu'il est typique d'utiliser alert/ promptpour les E / S lorsque vous jouez au golf en JS, donc j'irais alert(s)à la fin à la place.
FireFly
Merci pour les conseils et commentaires. Je suis un débutant en ce qui concerne l'optimisation de la taille du code :) À propos de la suggestion d'alerte / invite: j'ai essayé de les utiliser, mais il y a quelques problèmes: les navigateurs (chrome au moins) semblent automatiquement envelopper le texte si la ligne est trop longue, ce qui a cassé logo.
tigrou
4

CoffeeScript

Le code n'est pas joué. Il utilise certains metaballs algorithme ish pour simuler « stickyness » des cercles. Le hibou ASCII a été volé sans vergogne à d'autres réponses :)

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

Regardez-le détruire la documentation coffeescript.org ( cliquez sur Exécuter):

OwlScript

épidémie
la source
2

PHP

En s'appuyant sur les versions ascii art du logo soumis précédemment et en l'utilisant comme tableau pour rendre une version graphique à l'aide de la bibliothèque 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);

Résulte en:

Logo BBC Owl de PHP

Ben Paton
la source
2

BBC Basic + GXR

Très tard, mais: le compte 'bbcmicrobot' sur Twitter qui exécute des progs <280 caractères ou plus a ajouté la ROM Acorn GXR, permettant de dessiner des cercles et des ellipses. J'ai pensé, que pouvais-je dessiner avec quelques cercles? Et cela m'est venu. Il est basé en partie sur la réponse de @Level River Street, j'ai utilisé des commandes de base abrégées, utilisé des tests de bits au lieu de SHR et changé la représentation des bits:

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

capture d'écran du code rendu par le bot

Mon tweet d'origine est ici

bazzargh
la source