Kết xuất phiên bản logo của con cú BBC Micro


13

Logo BBC Micro Owl

Bạn có thể đưa ra một phiên bản của logo BBC Micro Owl như trên từ mã không?

Quy tắc:

  • Bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào bạn thích.
  • Đầu ra có thể là văn bản hoặc đồ họa.
  • Các vòng tròn không phải chồng chéo.

Người chiến thắng:

  • Câu trả lời với hầu hết các chiến thắng.

Kudos cho bất cứ ai cố gắng này trong BBC cơ bản.

Bạn có thể đọc về BBC Micro tại đây


3
"Sáng tạo nhất" và "giống như bản gốc nhất" là chủ quan. Vui lòng cung cấp một tiêu chí chiến thắng khách quan. (Tôi bỏ phiếu cho gần, theo "Câu hỏi mà không có một tiêu chí chiến thắng chính mục tiêu là off-topic, như họ làm cho nó không thể không thể tranh cãi quyết định nhập nên giành chiến thắng.")
tay nắm cửa

1
Tôi đã thay đổi tiêu chí giành chiến thắng thành mã ngắn nhất mà tôi hy vọng sẽ ít chủ quan hơn cho mọi người.
Ben Paton

Có thể code-golf là tốt nhưng tôi nghĩ rằng câu hỏi này có thể phù hợp với một thẻ cuộc thi phổ biến thay thế. Hầu hết phiếu bầu đều thắng. Đó là mục tiêu. Mob quyết định. Điều này khuyến khích các kết quả thú vị mà không phải hy sinh chất lượng đầu ra / sáng tạo để tiết kiệm một vài ký tự mã. Chứng kiến câu hỏi nhẫn tự do Olympic .
Darren Stone

Ý tưởng hay là tôi đã thay đổi nó thành hầu hết các chiến thắng, công bằng hơn. Làm thế nào để tôi có được điều này mất?
Ben Paton

Câu trả lời:


28

BBC CƠ BẢN

Tôi đã thử sử dụng các hàm trig để vẽ các vòng tròn thích hợp, nhưng điều đó rất chậm. Đến với điều này thay vào đó:

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

Đây là đầu ra:

GIF hoạt hình của Logo BBC Micro Owl


6
Wow thực sự tuyệt vời một người thực sự đã dành thời gian để sử dụng BBC cơ bản. Tôi rất ấn tượng!!
Ben Paton

Đó là một con cú đẹp. Bạn đang sử dụng một BBC thực sự hay một chương trình giả lập. Nếu đó là một trình giả lập, cái nào? Vì nó không giống với cái tôi đã dùng.
Cấp sông St

BTW, nếu bạn muốn vẽ vòng tròn nhanh hơn, đừng sử dụng các hàm trig, hãy sử dụng định lý pythagoras: Y = (R ^ 2-X ^ 2) ^ 0,5 xem câu trả lời của tôi cho câu hỏi cầu vồng. Và thực sự có một cách nâng cao hơn để làm điều đó chỉ với phép cộng, dựa trên thực tế là (1) + (3) + (5) .... (1 + 2n) = (n + 1) ^ 2.
Cấp sông St

10

GolfScript

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

Mã này in một phiên bản nghệ thuật ascii của logo (chạy ở đây ).

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

4
Thực sự ấn tượng với 82 ký tự!
Ben Paton

7

Toán học

Không có gì ngoài công việc lẩm bẩm.

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]

cú


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)

Kết quả trong:

nhập mô tả hình ảnh ở đây

Về cơ bản, ý tưởng là lấy đại diện cơ sở-2 của 17 số (1397760, 567810, 1070336, 141954, 1381696, 133794, 1054036, 559786, 1332560, 557218, 1052756, 131114, 1380368, 139272 , biến nó thành ma trận 21x17 gồm 1 và 0 và vẽ sơ đồ ma trận.


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

'biên dịch' với povray +Ibbc.pov -Obbc.png +A0.1 +R9 -W240 -H285

nhập mô tả hình ảnh ở đây


6

Bash

Vì bạn không chỉ định không có tài nguyên bên ngoài ...

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 - đã đánh cắp nghệ thuật của bạn, cảm ơn.

Hoặc sau khi tôi tải nó lên đây -

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

4
Vâng, đó là suy nghĩ bên lề tôi cho rằng ...
Ben Paton

5

BBC Basic, màu sắc ngẫu nhiên, chơi golf!

149 ký tự. Tôi không giỏi chơi golf (tôi thích các thử thách về mã) nhưng tôi thích sự lố bịch của việc chơi golf trong BBC cơ bản. Trình giả lập BBC tại http://www.bbcbasic.co.uk/ . Chạy ở chế độ màn hình 6 tại dòng lệnh.

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: TIẾP THEO

nhập mô tả hình ảnh ở đây

Giải thích (phiên bản chưa được chỉnh sửa)

Không có câu lệnh IF, vì phần còn lại của dòng sẽ chỉ được thực thi nếu IF đúng (vì vậy để đảm bảo NEXT đạt được, tôi sẽ phải thực hiện một chương trình với số dòng.) Do đó tôi đã sử dụng rất nhiều ASC (null ký tự) = 0 để kiểm soát đầu ra. Ngoài ra, tôi đã phải cắt bỏ pixel ở góc dưới bên phải để vừa với toàn bộ dòng lệnh trên màn hình sau khi in (và điều đó đã lưu 2 ký tự.

Tôi thích cách BBC cơ bản có thể nhận ra một định danh sau FOR, ngay cả khi không có khoảng trắng. 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

Cảm ơn vì đã đóng góp đó là một giải pháp thực sự thông minh và một con cú nhiều màu đẹp, tôi chưa từng thấy BBC chơi golf cơ bản trước đây.
Ben Paton

Cảm ơn bạn đã truyền cảm hứng cho tôi để đi và tìm kiếm một trình giả lập cơ bản của BBC. Đó là một ngôn ngữ tuyệt vời mà tôi đã không sử dụng trong 20 năm. Nó có rất nhiều tiện ích đồ họa được tích hợp mà không cần phải bao gồm các thư viện bổ trợ, điều này làm cho nó trở thành một ngôn ngữ tuyệt vời để chơi golf một nhiệm vụ như thế này.
Cấp sông St

Ngoài ra, lần đầu tiên tôi đã sử dụng cơ sở 64. Nó phù hợp với hình ảnh này, là 18 pixel cho mỗi 2 dòng. Tôi chắc chắn sẽ sử dụng nó một lần nữa. Thực tế là bit thứ 6 là chữ hoa / chữ thường có nghĩa là bạn chỉ thực sự phải nghĩ về năm chữ còn lại. Tôi thấy rằng nó làm cho nó dễ dàng như hex khi tôi vào nó.
Cấp sông St

4

C

Đầu ra 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);}}

Mã đầu ra:

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

4

JavaScript - 326 307 285 ký tự (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;

Có lẽ không phải là mã ngắn nhất. Tôi đã cố gắng gần nhất có thể với logo ban đầu, chỉ sử dụng ASCII.

Để thực hiện: sao chép dán vào bảng điều khiển javascript (ví dụ: chrome hoặc firefox). Lưu ý: tập lệnh có thể mất một chút thời gian để chạy vì vậy nếu không có gì đến ngay sau khi nhấn enter, hãy kiên nhẫn một chút.


Bạn có thể rút ngắn điều này bằng cách thực hiện m=Math;và sau đó thực hiện m.floor, m.powv.v.
eithed

1
Ngay cả moreso bằng cách bọc lớp ngoài cùng fortrong một with (Math)và sau đó bỏ qua Math.ở mỗi lần xuất hiện. Di chuyển các s+=bộ phận vào tiêu đề vòng lặp for (bên cạnh y++/ x++) để thoát khỏi một số dấu ngoặc nhọn. Tôi nghĩ rằng đó là điển hình để sử dụng alert/ promptcho I / O khi chơi gôn trong JS, vì vậy alert(s)cuối cùng tôi sẽ đi cùng.
FireFly

Cảm ơn lời khuyên và ý kiến. Tôi là người mới bắt đầu khi tối ưu hóa kích thước mã :) Về đề xuất cảnh báo / nhắc nhở: Tôi đã thử sử dụng chúng, nhưng có một số vấn đề: trình duyệt (ít nhất là chrome) dường như tự động ngắt văn bản nếu dòng quá dài, bị hỏng Logo.
tigrou

4

Cà phê

Mã không được đánh gôn. Nó sử dụng một số metaballs thuật toán -ish để mô phỏng "stickyness" của các vòng tròn. Cú ASCII đã bị đánh cắp một cách đáng xấu hổ từ các câu trả lời khác :)

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

Xem nó phá hủy tài liệu coffeescript.org (nhấn Run):

OwlScript


2

PHP

Dựa trên các phiên bản nghệ thuật của logo đã được gửi trước đó và sử dụng nó làm mảng để hiển thị phiên bản đồ họa bằng thư viện 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);

Kết quả trong:

Logo BBC Owl từ PHP

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.