Надання версії логотипу сови BBC Micro [закрито]


15

Логотип BBC Micro Owl

Чи можете ви видати версію логотипу BBC Micro Owl, як зазначено вище, з коду?

Правила:

  • Ви можете використовувати будь-яку мову програмування, яка вам подобається.
  • Вихід може бути текстовим або графічним.
  • Кола не повинні перетинатися.

Переможець:

  • Відповідь з найбільшою кількістю результатів виграє.

Kudos для тих, хто намагається це зробити на базі BBC.

Про BBC Micro ви можете прочитати тут


4
"Найбільш винахідливий" і "найбільше схожий на оригінал" є суб'єктивним. Укажіть об'єктивний критерій виграшу. (Я голосую за закриття, відповідно до "Питання без об'єктивного первинного критерію виграшу є поза темою, оскільки вони унеможливлюють безперечне вирішення, який запис має бути переможений".)
Doorknob

1
Я змінив критерії виграшу на найкоротший код, який, я сподіваюся, є менш суб'єктивним для всіх.
Бен Патон

Можливо, код-гольф добре, але я думаю, що це питання може відповідати тегу популярності-конкурсу . Перемагає більшість голосів. Це об'єктивно. Моб вирішує. Це заохочує цікаві результати без шкоди якості / креативності, щоб заощадити кілька символів коду. Свідком питання олімпійських рингів у вільному стилі .
Даррен Стоун

Хороша ідея, я змінив це на більшість виграшів, що є більш справедливим. Як мені це зняти?
Бен Патон

1
Я не думаю, що закривати шестирічне запитання дванадцятьма добре отриманими відповідями не є корисним.
Джонатан Фрех

Відповіді:


30

BBC BASIC

Я намагався використовувати функції тригрів для малювання правильних кіл, але це було болісно повільно. Замість цього придумали:

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

Ось результат:

Анімований GIF від логотипу мікро сови BBC


6
Нічого собі серйозно дивовижного, хтось насправді знайшов час, щоб скористатись базовою BBC. Я дуже вражений !!
Бен Патон

Це гарна сова. Використовуєте справжню BBC або емуляторну програму. Якщо це емулятор, то який? Тому що це не те саме, що я використав.
Рівень річки Св.

BTW, якщо ви хочете швидше малювати кола, не використовуйте функції тригерів, використовуйте теорему піфагори: Y = (R ^ 2-X ^ 2) ^ 0,5 див. Мою відповідь на питання веселки. І насправді є більш досконалий спосіб зробити це лише з додаванням, виходячи з того, що (1) + (3) + (5) .... (1 + 2n) = (n + 1) ^ 2.
Рівень р. Св.

10

GolfScript

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

Код друкує арт-версію логотипу ascii (запустіть тут ).

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

4
Дійсно вражаючий у 82 символах!
Бен Патон

7

Математика

Нічого, крім бурхливої ​​роботи.

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]

сова


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)

Призводить до:

введіть тут опис зображення

В основному ідея полягає в тому, щоб прийняти базове представлення 17 чисел (1397760, 567810, 1070336, 141954, 1381696, 133794, 1054036, 559786, 1332560, 557218, 1052756, 131114, 1380368, 139272, 1064964, 557058 і 1398101) , перетворіть його в матрицю 21x17 з 1 і 0 і побудуйте матрицю так, як є.


7

Пов-промінь

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

'компілювати' з povray +Ibbc.pov -Obbc.png +A0.1 +R9 -W240 -H285

введіть тут опис зображення


6

Баш

Оскільки ви не вказали жодних зовнішніх ресурсів ...

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>//'

Говард - вкрав твоє мистецтво Ascii, дякую.

Або після того, як я завантажив його сюди -

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

4
Добре, що я думаю, що ...
Бен Патон

6

BBC Basic, випадкові кольори, гольф!

149 символів. Я не такий великий у гольфі (я віддаю перевагу кодовим викликам), але мені сподобалася смішність гольфу в BBC basic. Емулятор BBC за адресою http://www.bbcbasic.co.uk/ . Запускається в режимі 6 екрану в командному рядку.

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: НАСТУПНИЙ

введіть тут опис зображення

Пояснення (необов’язана версія)

Немає тверджень IF, тому що решта рядка буде виконуватися лише в тому випадку, якщо IF було правдивим (тому для того, щоб досягти наступного NEXT, я повинен був би зробити програму з номерами рядків.) Тому я багато використовував ASC (null символ) = 0 для керування виведенням. Крім того, мені довелося відрізати піксель у правому нижньому куті, щоб вмістити весь командний рядок на екрані після друку (і це зберегло 2 символи.

Мені подобається, як базовий BBC може розпізнати ідентифікатор після FOR, навіть не маючи пробілу. 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

Дякуємо за те, що ви зробили це дуже розумне рішення та приємну різнокольорову сову, я раніше не бачив гольф-версій BBC.
Бен Патон

Дякую, що надихнули мене піти і шукати базовий емулятор BBC. Це чудова мова, якою я не користувався 20 років. У ньому вбудовано багато графічних засобів без необхідності включати додаткові бібліотеки, що робить його відмінною мовою для гольфів подібних завдань.
Рівень річки Св.

Також я вперше використав базу 64. Це зображення було правильним для цього зображення - 18 пікселів на кожні 2 рядки. Я обов'язково буду використовувати його знову. Те, що 6-й біт є великими / малими літерами, означає, що ви дійсно повинні думати про інших п'ятьох. Я виявив, що це зробило це так само просто, як і Hex, коли я потрапив у нього.
Рівень річки Св.

Я щойно робив це на twitter.com/bbcmicrobot/status/1229933895401058304 на основі деяких ваших методів, велике спасибі; Я зауважую, проте ви пропустили кілька можливостей для гольфу. BBC Basic дозволяє скорочувати команди, наприклад 'FOR' = 'F.', 'VDU' = 'V.', Плюс x / 2 ^ z AND 1 - це просто x AND 2 ^ z, вам не потрібно SHR
bazzargh

4

С

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

Вихід коду:

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

4

JavaScript - 326 307 285 символів (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;

Напевно, не найкоротший код. Я намагався бути максимально наближеним до оригінального логотипу, використовуючи лише ASCII.

Для виконання: скопіюйте пасту на консоль javascript (наприклад: chrome або firefox). Примітка: сценарій може зайняти небагато часу, тому якщо нічого не натиснути відразу після натискання клавіші Enter, будьте терплячі.


Ви можете скоротити це, роблячи , m=Math;а потім робити m.floor, і m.powт.д.
eithed

1
Навіть більше, загортаючи крайню forпетлю в a, with (Math)а потім опускаючи Math.при кожному виникненні. Перемістіть s+=деталі до заголовка for-loop (поруч із y++/ x++), щоб позбутися деяких брекетів. Я думаю, що це типово використовувати alert/ promptдля вводу-виводу при гольфінгу в JS, тому я б пішов з alert(s)кінцем замість цього.
FireFly

Дякуємо за поради та коментарі. Я початківець, коли мова йде про оптимізацію розміру коду :) Про попередження / пропозицію про швидке повідомлення: Я намагався їх використовувати, але є деякі проблеми: браузери (як мінімум, хром), здається, автоматично загортають текст, якщо рядок занадто довгий, який зламався логотип.
tigrou

4

CoffeeScript

Код не в гольф. Він використовує кілька алгоритмів метаболів для імітації "липкості" кіл. Сова ASCII була безсоромно вкрадена з інших відповідей :)

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

Дивіться, як він знищує документацію coffeescript.org (натисніть Виконати):

OwlScript


2

PHP

Спираючись на представлені раніше версії логотипу ascii, використовуючи це як масив для візуалізації графічної версії за допомогою бібліотеки 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);

Призводить до:

Логотип BBC Owl від PHP


2

BBC Basic + GXR

Дуже пізно до цього, але: обліковий запис 'bbcmicrobot' на twitter, який працює з пробками <280 знаків або близько того, додав ROM GXR Acorn, дозволяючи малювати кола та еліпси. Я подумав, що я можу намалювати за допомогою декількох кіл? І це прийшло до мене. Частково це базується на відповіді @Level River Street, тому я використовував скорочені основні команди, використовував бітове тестування замість SHR і змінив бітове представлення:

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

скріншот коду, що надається ботом

Мій оригінальний твіт тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.