Renderuj wersję logo BBC Micro owl [zamknięta]

15

Logo BBC Micro Owl

Czy możesz wyrenderować wersję kodu BBC Micro Owl zgodnie z powyższym kodem?

Zasady:

  • Możesz użyć dowolnego języka programowania, który ci się podoba.
  • Dane wyjściowe mogą być tekstowe lub graficzne.
  • Kręgi nie muszą się pokrywać.

Zwycięzca:

  • Odpowiedź z największą liczbą głosów pozytywnych wygrywa.

Uznanie dla każdego, kto spróbuje tego w BBC basic.

Możesz przeczytać o BBC Micro tutaj

Ben Paton
źródło
4
„Najbardziej pomysłowy” i „najbardziej podobny do oryginału” jest subiektywny. Podaj obiektywne kryterium wygranej. (Głosuję za zamknięciem, zgodnie z „Pytania bez obiektywnego podstawowego kryterium wygranej są nie na temat, ponieważ uniemożliwiają bezdyskusyjną decyzję, które zgłoszenie powinno wygrać.”)
Klamka
1
Zmieniłem kryteria wygranej na najkrótszy kod, który mam nadzieję jest mniej subiektywny dla wszystkich.
Ben Paton
Może kod-golf jest w porządku, ale myślę, że to pytanie może pasować do tagu konkursu popularności . Większość głosów wygrywa. To jest cel. Mob decyduje. Zachęca to do interesujących wyników bez poświęcania jakości / kreatywności wydruku, aby zaoszczędzić kilka znaków kodu. Zobacz pytanie dotyczące freestyle olimpijskich pierścieni .
Darren Stone
Dobry pomysł Zmieniłem go na większość zwycięskich zwycięstw, co jest bardziej sprawiedliwe. Jak mogę to zatrzymać?
Ben Paton
1
Nie sądzę, aby zamykanie sześcioletniego pytania z dwunastoma dobrze przyjętymi odpowiedziami było owocne.
Jonathan Frech

Odpowiedzi:

30

BBC BASIC

Próbowałem użyć funkcji Trigger, aby narysować właściwe koła, ale było to boleśnie powolne. Zamiast tego wymyśliłem:

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

Oto wynik:

Animowany GIF z logo BBC Micro Owl

r3mainer
źródło
6
Wow, naprawdę niesamowita, ktoś naprawdę poświęcił czas na użycie BBC basic. Jestem pod wielkim wrażeniem!!
Ben Paton
To miła sowa. Czy używasz prawdziwego programu BBC lub emulatora? Jeśli to emulator, to który? bo to nie to samo, którego użyłem.
Level River St
BTW, jeśli chcesz szybciej rysować koła, nie używaj funkcji triggera, użyj twierdzenia Pitagorasa: Y = (R ^ 2-X ^ 2) ^ 0,5 zobacz moją odpowiedź na pytanie tęczy. W rzeczywistości istnieje bardziej zaawansowany sposób robienia tego tylko z dodatkiem, w oparciu o fakt, że (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}/

Kod drukuje logo w wersji ascii (uruchom tutaj ).

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 
Howard
źródło
4
Naprawdę imponujące w 82 znakach!
Ben Paton
7

Matematyka

Nic prócz chrząknięcia.

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]

sowa

DavidC
źródło
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)

Prowadzi do:

wprowadź opis zdjęcia tutaj

Zasadniczo chodzi o to, aby wziąć reprezentację base-2 17 liczb (1397760, 567810, 1070336, 141954, 1381696, 133794, 1054036, 559786, 1332560, 557218, 1052756, 131114, 1380368, 139272, 1064964, 557058 i 1398101) , utwórz z niej matrycę 21x17 o wartości 1 i 0 i wykreśl matrycę taką, jaka jest.

plannapus
źródło
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}}

'Połącz z povray +Ibbc.pov -Obbc.png +A0.1 +R9 -W240 -H285

wprowadź opis zdjęcia tutaj

matja
źródło
6

Grzmotnąć

Ponieważ nie określono żadnych zasobów zewnętrznych ...

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 - dzięki, ukradłem twoją sztukę Ascii.

Lub po przesłaniu go tutaj -

curl -s http://textuploader.com/1ojd | sed -n '/<code/,/<\/code>/p' | sed 's/<[^>]\+>//g'
nieszczęście
źródło
4
Cóż, to myślenie lateralne, jak sądzę ...
Ben Paton
6

BBC Basic, losowe kolory, gra w golfa!

149 znaków. Nie jestem wielkim golfistą (wolę wyzwania kodowe), ale podobała mi się niedorzeczność gry w BBC basic. Emulator BBC na stronie http://www.bbcbasic.co.uk/ . Działa w trybie ekranu 6 w wierszu poleceń.

WIDŁO = 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,177,128,32, -13 * S, -10 * S: NASTĘPNY

wprowadź opis zdjęcia tutaj

Wyjaśnienie (wersja bez golfa)

Brak instrukcji JEŻELI, ponieważ reszta linii byłaby wykonywana tylko wtedy, gdyby JEŻELI była prawdziwa (więc aby upewnić się, że NEXT został osiągnięty, musiałbym zrobić program z numerami linii.) Dlatego często korzystałem z ASC (null znak) = 0, aby kontrolować wyjście. Musiałem także odciąć piksel w prawym dolnym rogu, aby dopasować całą linię poleceń na ekranie po wydrukowaniu (i to pozwoliło zaoszczędzić 2 znaki.

Uwielbiam to, jak BBC basic może rozpoznać identyfikator po FOR, nawet bez spacji. 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
źródło
Dzięki za wniesienie wkładu, które jest naprawdę sprytnym rozwiązaniem i ładną wielokolorową sową, nigdy wcześniej nie widziałem golfa BBC basic.
Ben Paton,
Dziękujemy za inspirację do szukania podstawowego emulatora BBC. To świetny język, którego nie używałem od 20 lat. Ma wiele wbudowanych funkcji graficznych bez konieczności dołączania bibliotek dodatkowych, co czyni go doskonałym językiem do gry w golfa w takim zadaniu.
Level River St
Również po raz pierwszy użyłem podstawy 64. To było w sam raz dla tego obrazu, bo 18 pikseli na każde 2 linie. Na pewno użyję go ponownie. Fakt, że szósty bit jest pisany wielkimi / małymi literami oznacza, że ​​naprawdę musisz myśleć tylko o pozostałych pięciu. Przekonałem się, że to sprawiło, że stało się to prawie tak proste, jak hex, kiedy się w to wszedłem.
Level River St
Właśnie zrobiłem to twitter.com/bbcmicrobot/status/1229933895401058304 w oparciu o niektóre z twoich technik, wielkie dzięki; Zauważyłem jednak, że przegapiłeś kilka okazji do gry w golfa. BBC Basic pozwala skracać polecenia, np. „FOR” = „F.”, „VDU” = „V.”, Plus x / 2 ^ z AND 1 to tylko x AND 2 ^ z, nie potrzebujesz SHR
bazzargh
4

do

Wyjście 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);}}

Kod wyjściowy:

* * * * * * * * * 
 *     * *     * 
*   *   *   *   * 
   * *     * *   
*   *       *   * 
 *     * *     * 
* *     *     * * 
 * *         *   
* * * * * * *   * 
 * * * *         
* * * * *       * 
 * * * *         
  * * * *       * 
   * * * *       
    * * * *     * 
     * * * *     
      * * * *   * 
       *   * *   
      *   *   * * 
 * * * * * *   * 
                * 
Oberon
źródło
4

JavaScript - 326 307 285 znaków (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;

Prawdopodobnie nie najkrótszy kod. Starałem się być jak najbliżej oryginalnego logo, używając tylko ASCII.

Aby wykonać: skopiuj wklej do konsoli javascript (np .: chrome lub firefox). Uwaga: uruchomienie skryptu może trochę potrwać, więc jeśli nic nie przyjdzie zaraz po naciśnięciu Enter, bądź trochę cierpliwy.

tigrou
źródło
Można skrócić ten wykonując m=Math;a potem robi m.floor, m.powitd.
eithed
1
Nawet więcej, zawijając zewnętrzną forpętlę w a, with (Math)a następnie pomijając Math.przy każdym wystąpieniu. Przenieś s+=części do nagłówka for-loop (obok y++/ x++), aby pozbyć się nawiasów klamrowych. Myślę, że typowe jest używanie alert/ promptdo I / O podczas gry w JS, więc alert(s)zamiast tego wybrałbym na końcu.
FireFly
Dziękuję za wskazówki i komentarze. Jestem początkującym, jeśli chodzi o optymalizację rozmiaru kodu :) O alercie / sugestii: Próbowałem ich użyć, ale są pewne problemy: przeglądarki (przynajmniej Chrome) wydają się automatycznie zawijać tekst, jeśli linia jest zbyt długa, co się zepsuło logo.
tigrou
4

CoffeeScript

Kod nie jest golfowy. Wykorzystuje algorytm metaballish do symulacji „lepkości” kół. ASCII sowa została bezwstydnie skradziona z innych odpowiedzi :)

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

Zobacz, jak niszczy dokumentację coffeescript.org (hit Run):

OwlScript

epidemia
źródło
2

PHP

Opierając się na wcześniej przedstawionych wersjach logo ascii i używając go jako tablicy do renderowania wersji graficznej przy użyciu biblioteki 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);

Prowadzi do:

Logo BBC Owl z PHP

Ben Paton
źródło
2

BBC Basic + GXR

Bardzo późno na to, ale: konto „bbcmicrobot” na Twitterze, które uruchamia prog <mniej więcej 280 znaków, dodało ROM Acorn GXR ROM, umożliwiając rysowanie okręgów i elips. Pomyślałem, co mogę narysować za pomocą kilku kółek? I to do mnie dotarło. Opiera się on częściowo na odpowiedzi @Level River Street, ponieważ użyłem skróconych podstawowych poleceń, użyłem testów bitowych zamiast SHR i zmieniłem reprezentację bitową:

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

zrzut ekranu z bota renderowanego kodu

Mój oryginalny tweet jest tutaj

bazzargh
źródło