Mathematica, 166137 바이트
l:={i,j};s=Sign;f[p_,q_,h_,w_]:=Grid@Table[(1-Max[s[p-l]s[q-l],0])Boole[Abs@Mean[s@Det@{p-l+#,p-q}&/@Tuples[.5{1,-1},2]]<.6],{i,h},{j,w}]
더 읽기 쉬운 버전 :
l := {i, j}; s = Sign;
f[p_, q_, h_, w_] :=
Grid@Table[(1 - Max[s[p - l] s[q - l], 0]) Boole[
Abs@Mean[
s@Det@{p - l + #, p - q} & /@
Tuples[.5 {1, -1}, 2]] < .6], {i, h}, {j, w}]
라는 함수를 정의합니다 f
. 입력 및 출력 사양을 상당히 자유롭게 해석했습니다. 이 함수 f
는 형식으로 입력을 f[{x0, y0}, {x1, y1}, height, width]
받으며 그리드는 왼쪽 상단부터 시작하여 1- 색인입니다. 출력은 다음과 같습니다
선이 1
s로 표시되고 배경이 0
s 로 표시됩니다 (여기에 f[{2, 6}, {4, 2}, 5, 7]
표시됨). 의 매스 매 티카 매트릭스 바꾸는 작업 1
들과 0
의 문자열로들 #
s와는 .
그냥 표준 방법을 사용할 수 있도록, 이전에 다른 많은 도전에 golfed 된 S,하지만 난 그 아무것도 흥미를 추가 생각하지 않습니다.
설명:
일반적으로 선이 일부 픽셀을 통과하는 경우 픽셀의 네 모서리 중 하나 이상이 선 위에 있고 하나 이상이 아래에 있습니다. 모서리 위 또는 (벡터 사이의 각도를 검사하여 행 아래에 있다면 우리는 확인 {x0,y0}
코너) 및 ( {x0,y0}
에 {x1,y1}
이 각도가 긍정적 인 경우, 모서리 위이며, 각도가 마이너스 인 경우, 모서리 이하이다).
우리는 두 벡터가있는 경우 {a1,b1}
와 {a2,b2}
그들 사이의 각도가 행렬의 행렬식의 부호를 찾아 양 또는 음의 경우, 우리는 확인할 수 있습니다 {{a1,b1},{a2,b2}}
. (이 작업을 수행하는 나의 오래된 방법은 복소수의 산술을 사용했습니다.
이것이 코드에서 작동하는 방식은 다음과 같습니다.
{p-l+#,p-q}&/@Tuples[.5{1,-1},2]
에서 4 개 개의 벡터를 취득 {x0,y0}
하고, 화소의 네 모퉁이 (함께 l:={i,j}
앞서 정의 된 픽셀의 좌표), 또한 사이 벡터 {x0,y0}
와 {x1,y1}
.
s@Det@...
선과 네 모서리 사이의 각도 표시를 찾습니다 (를 사용하여 s=Sign
). 이것들은 -1, 0 또는 1과 같습니다.
Abs@Mean[...]<.6
일부 각도가 양수이고 일부는 음수인지 확인합니다. 이 속성을 가진 4 개의 튜플 부호는 모두 -0.5와 0.5 (포함) 사이의 평균을 갖기 때문에 <
대신 0.6을 사용하여 바이트를 저장합니다 <=
.
여전히 문제가 있습니다.이 코드는 선이 양방향으로 영원히 연장된다고 가정합니다. 따라서 우리는 선의 끝점으로 정의 된 사각형 내부와 외부 에있는 1-Max[s[p-l]s[q-l],0]
(시험 및 오류로 찾은) 을 곱하여 선을 자릅니다 .1
0
나머지 코드는 이러한 픽셀의 격자를 만듭니다.
보너스로 181 바이트에 대해 완전히 다른 방법으로 시도한 초기 시도가 있습니다.
Quiet@Grid@Table[(1-Max[Sign[{i,j}-#3]Sign[{i,j}-#4],0])Boole[#3==#4=={i,j}||2Abs@Tr[Cross@@Thread@{{i,j},#3,#4}]/Norm[d=#3-#4]<2^.5Cos@Abs[Pi/4-Mod[ArcTan@@d,Pi/2]]],{i,#},{j,#2}]&