แสดงโลโก้นกฮูกของ BBC Micro [รุ่น]


15

โลโก้ BBC Micro Owl

คุณสามารถแสดงโลโก้ BBC Micro Owl ตามรหัสด้านบนได้หรือไม่?

กฎ:

  • คุณสามารถใช้ภาษาการเขียนโปรแกรมใด ๆ ที่คุณชอบ
  • เอาต์พุตสามารถเป็นข้อความหรือกราฟิก
  • แวดวงไม่ต้องเหลื่อมกัน

ผู้ชนะ:

  • คำตอบที่มีผู้โหวตมากที่สุดเป็นผู้ชนะ

ความรุ่งโรจน์สำหรับทุกคนที่พยายามทำสิ่งนี้ใน BBC เบื้องต้น

คุณสามารถอ่านเกี่ยวกับ BBC Micro ได้ที่นี่


4
"สร้างสรรค์มากที่สุด" และ "เหมือนต้นฉบับมากที่สุด" เป็นเรื่องส่วนตัว โปรดระบุเกณฑ์การชนะอย่างมีวัตถุประสงค์ (ฉันลงคะแนนให้ปิดตาม "คำถามที่ไม่มีเกณฑ์การชนะขั้นต้นอย่างมีวัตถุประสงค์นั้นเป็นหัวข้อที่ไม่สามารถตัดสินได้ว่ารายการใดควรชนะ")
Doorknob

1
ฉันเปลี่ยนเกณฑ์การชนะเป็นรหัสที่สั้นที่สุดซึ่งฉันหวังว่าจะเป็นอัตนัยน้อยลงสำหรับทุกคน
Ben Paton

อาจเป็นโค้ดกอล์ฟได้ แต่ฉันคิดว่าคำถามนี้อาจเหมาะกับแท็กการประกวดความนิยมแทน คะแนนโหวตมากที่สุดชนะ นั่นคือวัตถุประสงค์ ฝูงชนตัดสินใจ สิ่งนี้ส่งเสริมผลลัพธ์ที่น่าสนใจโดยไม่ลดทอนคุณภาพ / ความคิดสร้างสรรค์ในการบันทึกโค้ดบางส่วน ร่วมเป็นสักขีพยานในคำถามแหวนโอลิมปิกฟรีสไตล์
Darren Stone

ความคิดที่ดีฉันได้เปลี่ยนมันเป็นชัยชนะ upvotes ส่วนใหญ่ซึ่งเป็นธรรม ฉันจะยกเลิกการระงับนี้ได้อย่างไร
Ben Paton

1
ฉันไม่คิดว่ามันจะเป็นผลดีที่จะปิดคำถามอายุหกขวบด้วยคำตอบที่ได้รับอย่างดีสิบสองข้อ
Jonathan Frech

คำตอบ:


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 Micro Owl


6
ว้าวคนที่น่าทึ่งอย่างจริงจังที่จริงเอาเวลาที่จะใช้บีบีซีขั้นพื้นฐาน ฉันประทับใจมาก !!
Ben Paton

นั่นเป็นนกฮูกที่ดี คุณใช้ 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 Art (ทำงานที่นี่ )

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

4
น่าประทับใจมากใน 82 ตัวอักษร!
Ben Paton

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)

ผลลัพธ์ใน:

ป้อนคำอธิบายรูปภาพที่นี่

โดยพื้นฐานแล้วความคิดคือการใช้การแทนเบส -2 ของตัวเลข 17 ตัว (1397760, 567810, 1070336, 141954, 1381696, 133794, 1054036, 559786, 1332560, 557218, 1052756, 131114, 1380368, 139272, 13,936,985, 1370368 ทำให้มันกลายเป็นเมทริกซ์ 21x17 ของ 1 และ 0 และวางแผนพล็อตตามที่เป็น


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

'รวบรวม' กับ 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 สีแบบสุ่ม golfed!

149 ตัวอักษร ฉันไม่ได้ใหญ่ขนาดนั้นในการเล่นกอล์ฟ (ฉันชอบความท้าทายด้านรหัส) แต่ฉันชอบความไร้สาระของการเล่นกอล์ฟในระดับพื้นฐานของ 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: NEXT

ป้อนคำอธิบายรูปภาพที่นี่

คำอธิบาย (เวอร์ชันที่ไม่ได้ปรุงแต่ง)

ไม่มีคำสั่ง IF เพราะส่วนที่เหลือของบรรทัดจะถูกดำเนินการหาก IF เป็นจริง (เพื่อให้มั่นใจว่า NEXT มาถึงฉันจะต้องทำโปรแกรมที่มีหมายเลขบรรทัด) ดังนั้นฉันจึงใช้ ASC เป็นจำนวนมาก character) = 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 เบื้องต้นมาก่อน
Ben Paton

ขอบคุณที่สร้างแรงบันดาลใจให้ฉันไปและค้นหาผู้จำลองพื้นฐานของ BBC มันเป็นภาษาที่ยอดเยี่ยมที่ฉันไม่ได้ใช้ใน 20 ปี มีสิ่งอำนวยความสะดวกด้านกราฟิกมากมายในตัวโดยไม่จำเป็นต้องมีห้องสมุดเสริมซึ่งทำให้เป็นภาษาที่ยอดเยี่ยมสำหรับการเล่นกอล์ฟแบบนี้
Level River St

ครั้งแรกที่ฉันใช้เบส 64 มันเหมาะกับภาพนี้คือ 18 พิกเซลต่อ 2 บรรทัด ฉันจะใช้อีกครั้งแน่นอน ข้อเท็จจริงที่ว่าบิตที่ 6 เป็นตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กหมายความว่าคุณต้องคิดอีกห้าบิตเท่านั้น ฉันพบว่ามันทำให้มันง่ายเหมือน hex เมื่อฉันเข้าไป
Level River St

ฉันเพิ่งทำtwitter.com/bbcmicrobot/status/1229933895401058304นี้ขึ้นอยู่กับเทคนิคของคุณขอบคุณมาก; ฉันสังเกตเห็นว่าคุณพลาดโอกาสในการเล่นกอล์ฟ BBC Basic ให้คุณย่อคำสั่งเช่น 'FOR' = 'F', 'VDU' = 'V.', บวก x / 2 ^ z และ 1 เป็นเพียง x และ 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
แม้กระทั่ง moreso โดยการforล้อมรอบนอกสุด - ห่วงในwith (Math)และจากนั้นให้ละเว้นMath.แต่ละครั้ง ย้ายs+=ชิ้นส่วนไปยังส่วนหัว for-loop (ถัดจากy++/ x++) เพื่อกำจัดเครื่องหมายปีกกาบางส่วน ฉันคิดว่ามันเป็นเรื่องปกติที่จะใช้alert/ promptสำหรับ I / O เมื่อเล่นกอล์ฟใน JS ดังนั้นฉันจะไปด้วยalert(s)ในตอนท้ายแทน
FireFly

ขอบคุณสำหรับเคล็ดลับและความคิดเห็น ฉันเป็นผู้เริ่มต้นเมื่อพูดถึงการปรับขนาดโค้ดให้ดีที่สุด :) เกี่ยวกับคำแนะนำการแจ้งเตือน / แจ้งเตือน: ฉันพยายามใช้ แต่มีปัญหาบางอย่าง: เบราว์เซอร์ (อย่างน้อย Chrome) ดูเหมือนจะตัดข้อความโดยอัตโนมัติหากบรรทัดยาวเกินไป เครื่องหมาย
tigrou

4

CoffeeScript

รหัสไม่เล่นกอล์ฟ มันใช้อัลกอริทึมmetaballs --ishบางอย่างเพื่อจำลอง "เหนียว" ของวงกลม นกฮูก 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 (กด Run):

OwlScript


2

PHP

การสร้างโลโก้ ascii art ที่ส่งมาก่อนหน้านี้และใช้สิ่งนี้เป็นอาร์เรย์ในการสร้างภาพกราฟิกโดยใช้ไลบรารี 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' บนทวิตเตอร์ซึ่งใช้งานโปรแกรม <280 chars หรือเพิ่ม Acorn GXR ROM เพื่อเพิ่มการวาดวงกลมและวงรี ฉันคิดว่าฉันจะวาดอะไรด้วยวงกลมสองวง? และนี่ก็มาหาฉัน มันขึ้นอยู่กับคำตอบของ @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

สกรีนช็อตของรหัสที่แสดงผลบอต

ทวีตดั้งเดิมของฉันอยู่ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.