힐버트 곡선은 A와 표현 될 수있는 공간 충전 프랙탈입니다 Lindenmayer에 시스템 연속 세대와 그 다음과 같이 :
덕분에 http://www.texample.net/tikz/examples/hilbert-curve/ 이미지의.
골
stdin에서 양의 정수 n을 가져 와서 슬래시, 백 슬래시, 공백 및 줄 바꿈 만 사용하여 n 차 힐버트 곡선을 stdout으로 그리는 가능한 가장 짧은 프로그램 (바이트)을 작성하십시오.
예를 들어, 입력이 1
출력 인 경우
\
\/
입력이 2
출력 인 경우
/
\/\
/\ \
/ /\/
\ \
\/
입력이 3
출력 인 경우
\
/\/
/ /\
\/\ \ \
/\ / / /
/ / \/ \/\
\ \/\ /\ \
\/ / / / /\/
/\/ / \ \
\ \/\ \/
\/\ \
/ /\/
\ \
\/
등등. 줄 간격이 적은 곳에 붙여 넣으면 더 좋아 보입니다.
출력에는 곡선 끝 위나 아래에 줄 바꿈이 포함되어서는 안되며 줄의 후행 공백이 없어야합니다.
답변
루비, 247 (230) 205 자
r=?D
y=d=0
z=(1..2*x=2**gets.to_i.times{r.gsub!(/\w/){$&<?H?'-H~+D~D+~H-':'+D~-H~H-~D+'}}-1).map{' '*2*x}
r.bytes{|c|c>99?(z[y-=s=-~d/2%2][x-=1-d/2]='/\\'[d%2]
x+=d/2
y+=1-s):d-=c
d%=4}
puts z.map &:rstrip
Lindenmayer 표현을 사용하는 ASCII 거북 접근 방식 ( 여기 시도 ).
더 많은 골프 를 해주신 @Ventero 에게 감사드립니다 .
답변
파이썬, 282
from numpy import*
def r(n):
x=2**n-2;b=3*x/2+1;c=x/2+1;a=zeros((x*2+2,)*2,int);a[x+1,x+1]=1;a[b,x/2]=a[x/2,b]=-1
if n>1:s=r(n-1);a[:x,c:b]=rot90(s,3)*-1;a[c:b,:x]|=rot90(s)*-1;a[c:b,x+2:]|=s;a[x+2:,c:b]|=s
return a
for l in r(input()):print''.join(' /\\'[c] for c in l).rstrip()
재귀 적 접근 방식을 사용하여 이전 곡선에서 n 차 힐버트 곡선을 구성합니다. 곡선은 더 나은 슬라이싱 및 조작을 위해 2d numpy 배열로 표시됩니다.
여기 몇 가지 예가 있어요.
$ python hilbert.py
2
/
\/\
/\ \
/ /\/
\ \
\/
$ python hilbert.py
3
\
/\/
/ /\
\/\ \ \
/\ / / /
/ / \/ \/\
\ \/\ /\ \
\/ / / / /\/
/\/ / \ \
\ \/\ \/
\/\ \
/ /\/
\ \
\/
$ python hilbert.py
4
/
\/\
/\ \
/ / /\/
\ \ \ /\
/\/ \/ \ \
/ /\ /\/ /
\/\ \ \ \ \/\
/\ / / \ \/\ \
/ / \/ /\/ / /\/
\ \/\ / /\/ / /\
/\/ / \/\ \ \/\ \ \
/ /\/ /\ / / /\ / / /
\/\ \ / / \/ / / \/ \/\
/\ \ \ \ \/\ \ \/\ /\ \
/ /\/ \/ / /\/ / / / /\/
\ \ /\ /\/ \ /\/ / \ \
\/ \ \ \ /\/ \ \/\ \/
/\/ / / / /\ \/\ \
\ \/ \/\ \ \ / /\/
\/\ /\ / / / \ \
/ / / \/ \/\ \/
\ \ \/\ /\ \
\/ / / / /\/
/\/ / \ \
\ \/\ \/
\/\ \
/ /\/
\ \
\/
답변
Malsys – (234) 221 자
나는 여기서 L 시스템을 냄새 맡는다. 🙂 Malsys는 온라인 L 시스템 인터프리터이다. 이것은 실제로 심각한 항목은 아니지만이 솔루션이 다소 흥미로운 것처럼 느꼈습니다.
Malsys의 구문은 긴 키워드가 많이 포함되어 있기 때문에 실제로 골프에는 좋지 않지만 여전히 짧고 읽기 쉽고 표현력이 뛰어납니다.
lsystem HilbertCurveAscii {
set symbols axiom = R;
set iterations = 5;
set rightAngleSlashMode = true;
interpret F as DrawLine;
interpret + as TurnLeft;
interpret - as TurnRight;
rewrite L to + R F - L F L - F R +;
rewrite R to - L F + R F R + F L -;
}
process all with HexAsciiRenderer;
통역사 : http://malsys.cz/Process
골프 버전 :
lsystem H{set symbols axiom=R;set iterations=3;set
rightAngleSlashMode=1;interpret.as DrawLine;interpret+as
TurnLeft;interpret-as TurnRight;rewrite L to+R.-L.L-.R+;rewrite
R to-L.+R.R+.L-;}process H with HexAsciiRenderer;
그리고 Ascii 6 각형 Gosper 곡선은 어떻습니까? 🙂
____
____ \__ \
\__ \__/ / __
__/ ____ \ \ \
/ __ \__ \ \/
\ \ \__/ / __
\/ ____ \/ /
\__ \__/
__/
답변
자바 스크립트 (ES6) 313 (340)
함수 H의 반환 값 대신 전역 변수 w와 같이
실제로 나쁜 습관을 사용하여 제거 된 일부 문자 편집
각 x, y에 대해 x, y 위치를 거리 d로 변환하고 ( Wikipedia 참조 ) 가장 가까운 위치가 연결되어 있는지 확인
FireFox 콘솔에서 테스트하십시오. 팝업을 통한 입력, console.log를 통한 출력
이미지 위나 아래에는 후행 공백과 줄 바꿈이 없습니다. 그러나 각 줄은 줄 바꿈으로 끝납니다. Ascii 아트 이미지를 만드는 올바른 방법이라고 생각합니다.
n=1<<prompt(),d=n-1
H=(s,x,y)=>{for(w=0;s>>=1;)p=x&s,q=y&s,w+=s*s*(3*!!p^!!q),q||(p&&(x=s-1-x,y=s-1-y),[x,y]=[y,x])}
for(r=t='';++r<d+n;t+='\n')for(r>d?(x=r-d,f=x-1):(f=d-r,x=0),t+=' '.repeat(f),z=r-x;x<=z;)
h=H(n,y=r-x,x)|w,H(n,y,x-1),x?t+=' \\'[h-w<2&w-h<2]:0,H(n,y-1,x++),y?t+=' /'[h-w<2&w-h<2]:0
console.log(t)
답변
펄, 270 자
슈퍼 골프
$_=A,%d=<A -BF+AFA+FB- B +AF-BFB-FA+>,$x=2**($n=<>)-2;eval's/A|B/$d{$&}/g;'x$n;s/A|B//g;map{if(/F/){if($r+$p==3){$y+=$p<=>$r}else{$x+=$r<2?$r-$p:$p-$r}$s[($r-1)%4>1?$x--:$x++][$r>1?$y--:$y++]=qw(/ \\)[($p=$r)%2]}else{($r+=2*/-/-1)%=4}}/./g;map{print map{$_||$"}@$_,$/}@s
별로 골프하지 않았다
$_=A,%d=<A -BF+AFA+FB- B +AF-BFB-FA+>,$x=2**($n=<>)-2;
eval's/A|B/$d{$&}/g;'x$n;
s/A|B//g;
map{if(/F/){
if($r+$p==3){$y+=$p<=>$r}else{$x+=$r<2?$r-$p:$p-$r}
$s[($r-1)%4>1?$x--:$x++][$r>1?$y--:$y++]=qw(/ \\)[($p=$r)%2]
}else{
($r+=2*/-/-1)%=4
}
}/./g;
map{print map{$_||$"}@$_,$/}@s
내가 Perl을 더 잘 이해한다면 아마 골프를 더 많이 할 수있을 것이다. 라인 1에 정의 된 생산 규칙을 사용하여 Lindenmayer 시스템 접근 방식을 사용합니다.
답변
APL (Dyalog Unicode) , 90 바이트 SBCS
⎕∘←¨' +$'⎕r''¨↓1↓∘⍉∘⌽⍣4⊢' /\'[{3|(⊢+⍉)2@(¯1 0+3 1×s÷2)s⊢(¯.5×≢⍵)⊖(2×s←⍴⍵)↑⍵,⍨-⊖⍵}⍣⎕⊢2 2⍴0]
2 2⍴0
0의 2×2 행렬
{ }⍣⎕
N을 입력하고 함수를 N 번 적용
⍵,⍨-⊖⍵
행렬의 왼쪽에 수직으로 반전되고 부정 된 사본을 연결합니다.
(2×s←⍴⍵)↑
차원 (으로 기억 됨 s
)이 인수의 두 배가 되도록 0으로 채 웁니다.
¯.5×≢⍵
패딩 제로 사이에 끼 우고 수직으로 가운데에 놓으려면 회전하십시오.
2@(¯1 0+3 1×s÷2)
특정 위치에 2-s를 넣으십시오-이들은 작은 프랙탈 인스턴스 사이의 연결 슬래시입니다.
(⊢+⍉)
자기 변형 된 행렬을 추가
3|
모듈로 3; 부정을 사용 했으므로 -1≡2 (mod 3) 및 -2≡1 (mod 3)
' /\'[ ]
문자열에서 행렬 요소를 색인으로 사용 ' /\'
1↓∘⍉∘⌽⍣4
모든면에서 1 요소 너비의 빈 여백을 다듬습니다.
↓
줄로 나누다
' +$'⎕r''¨
각각에서 후행 공백을 제거하십시오 (이 과제는 필요합니다)
⎕∘←¨
각각 출력