위 코드에 따라 BBC Micro Owl 로고 버전을 코드에서 렌더링 할 수 있습니까?
규칙 :
- 원하는 프로그래밍 언어를 사용할 수 있습니다.
- 출력은 텍스트 또는 그래픽 일 수 있습니다.
- 원은 겹치지 않아도됩니다.
우승자:
- 가장 많이 찬성을 가진 답이 이깁니다.
BBC 기본에서 이것을 시도하는 누군가를위한 Kudos.
BBC Micro에 대한 내용은 여기를 참조하십시오.
위 코드에 따라 BBC Micro Owl 로고 버전을 코드에서 렌더링 할 수 있습니까?
규칙 :
우승자:
BBC 기본에서 이것을 시도하는 누군가를위한 Kudos.
BBC Micro에 대한 내용은 여기를 참조하십시오.
답변:
적절한 원을 그리기 위해 삼각 함수를 사용해 보았지만 고통스럽게 느 렸습니다. 대신에 이것을 생각해 냈습니다.
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
출력은 다음과 같습니다.
"!C-DD[5v`>U8G`J2zX['b#L*\\q>FQp "{32-}%96base 2base{" *"2/=}%18/{""*1>17/~n@n}/
이 코드는 로고의 ASCII 아트 버전을 인쇄합니다 ( 여기에서 실행 ).
* * * * * * * * *
* * * *
* * * * *
* * * *
* * * *
* * * *
* * * * *
* * *
* * * * * * * *
* * * *
* * * * * *
* * * *
* * * * *
* * * *
* * * * *
* * * *
* * * * *
* * *
* * * *
* * * * * * *
*
그런 일 외에는 아무것도 없습니다.
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]
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 숫자 (297760, 567810, 1070336, 141954, 1381696, 133794, 1054036, 559786, 1332560, 557218, 1052756, 131114, 1380368, 139272, 1064964, 557058 및 1398101)를 기본 2로 표현하는 것입니다. 1과 0의 21x17 행렬로 만들고 행렬을 그대로 플로팅합니다.
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
외부 리소스를 지정하지 않았으므로 ...
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>//'
하워드-아스키 아트를 훔쳤습니다. 감사합니다.
또는 여기에 업로드 한 후 -
curl -s http://textuploader.com/1ojd | sed -n '/<code/,/<\/code>/p' | sed 's/<[^>]\+>//g'
149 자 나는 골프에 큰 관심이 없지만 (코드 도전을 선호합니다) BBC 기본에서 골프의 어리 석음이 마음에 들었습니다. 에서 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 basic이 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
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);}}
코드 출력 :
* * * * * * * * *
* * * *
* * * * *
* * * *
* * * *
* * * *
* * * * *
* * *
* * * * * * * *
* * * *
* * * * * *
* * * *
* * * * *
* * * *
* * * * *
* * * *
* * * * *
* * *
* * * *
* * * * * * *
*
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 만 사용하여 원본 로고에 최대한 가깝게 노력했습니다.
실행하려면 붙여 넣기를 자바 스크립트 콘솔 (예 : chrome 또는 firefox)에 복사합니다. 참고 : 스크립트를 실행하는 데 약간의 시간이 걸릴 수 있으므로 enter 키를 누른 직후에 아무것도 나타나지 않으면 조금 인내심을 가지십시오.
m=Math;
다음 일을 m.floor
, m.pow
등
for
루프를 감싸고 각 발생 with (Math)
을 생략함으로써 더욱 그렇습니다 Math.
. s+=
부품을 for 루프 헤더 ( y++
/ 옆 x++
)로 이동하여 일부 버팀대를 제거하십시오. JS에서 골프를 칠 때 I / O에 alert
/ 를 사용하는 것이 일반적이라고 생각합니다 . prompt
alert(s)
코드가 골프화되지 않았습니다. 그것은 몇 가지 사용 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
PHP
이전에 제출 한 로고의 아스키 아트 버전을 기반으로하고이를 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 기본 + GXR
매우 늦었지만 트위터에서 'bbcmicrobot'계정은 280 자 이하의 progs를 실행하므로 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
내 원래 트윗이 여기에 있습니다