슬래시를 사용하여 힐버트 커브 그리기


30

힐버트 곡선은 A와 표현 될 수있는 공간 충전 프랙탈입니다 Lindenmayer에 시스템 연속 세대와 그 다음과 같이 :
힐버트 커브
덕분에 http://www.texample.net/tikz/examples/hilbert-curve/ 이미지의.

stdin에서 양의 정수 n을 가져 와서 슬래시, 백 슬래시, 공백 및 줄 바꿈 만 사용하여 n 차 힐버트 곡선을 stdout으로 그리는 가능한 가장 짧은 프로그램 (바이트)을 작성하십시오.

예를 들어, 입력이 1출력 인 경우

 \
\/

입력이 2출력 인 경우

  /
  \/\
/\   \
 / /\/
 \ \
  \/

입력이 3출력 인 경우

       \
     /\/
    /   /\
    \/\ \ \
  /\  / / /
 / /  \/  \/\
 \ \/\  /\   \
\/   / / / /\/
  /\/ /  \ \
  \   \/\ \/
   \/\   \
     / /\/
     \ \
      \/

등등. 줄 간격이 적은 곳에 붙여 넣으면 더 좋아 보입니다.

출력에는 곡선 끝 위나 아래에 줄 바꿈이 포함되어서는 안되며 줄의 후행 공백이 없어야합니다.

답변:


10

루비, 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 에게 감사드립니다 .


이 좀 더 Golfed 당신이 생각하지 않았 으면 : ideone.com/kvcPWT을 - (가) .map(&:rstrip)은 "어떤 후행 공백"요구 사항을 충족하기 위해 추가되어야했다.
Ventero

@Ventero 감사합니다. 내가 당신의 해결책을 취했다는 것을 신경 쓰지 않기를 바랍니다-당신은지도 논쟁 주변의 패러 틴을 버릴 수도 있습니다.
Howard

아 물론! 나는 또한 그냥의 정의를 인라인 할 수 있다고 실현 x하고 할당을 단축 y하고 d(이전과 같은 링크를 참조) 205 개 문자의 총.
Ventero

12

파이썬, 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
              /
              \/\
            /\   \
           / / /\/
           \ \ \  /\
         /\/  \/  \ \
        /   /\  /\/ /
        \/\ \ \ \   \/\
      /\  / /  \ \/\   \
     / /  \/ /\/   / /\/
     \ \/\  /   /\/ /   /\
   /\/   /  \/\ \   \/\ \ \
  /   /\/ /\  / / /\  / / /
  \/\ \  / /  \/ / /  \/  \/\
/\   \ \ \ \/\   \ \/\  /\   \
 / /\/  \/   / /\/   / / / /\/
 \ \  /\  /\/  \  /\/ /  \ \
  \/  \ \ \  /\/  \   \/\ \/
    /\/ / / /   /\ \/\   \
    \   \/  \/\ \ \  / /\/
     \/\  /\  / / /  \ \
       / / /  \/  \/\ \/
       \ \ \/\  /\   \
        \/   / / / /\/
          /\/ /  \ \
          \   \/\ \/
           \/\   \
             / /\/
             \ \
              \/

5

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/g/3DcVFMWn

통역사 : 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 곡선은 어떻습니까? :)

      ____
 ____ \__ \
 \__ \__/ / __
 __/ ____ \ \ \
/ __ \__ \ \/
\ \ \__/ / __
 \/ ____ \/ /
    \__ \__/
    __/

http://malsys.cz/g/ae5v5vGB


2

자바 스크립트 (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)

alert대신을 사용하여 일부 문자를 저장할 수 console.log있습니다. for네 번째 줄 다음 에 여분의 공간 이 있으며 마지막 줄 바꿈을 제거 할 수 있어야합니다.
Bob

@ 밥 네 사실 15 자 이상을 절약 할 수 있습니다. 어쨌든 300 개가 넘는 메신저를 포기했습니다. 고정 피치 글꼴없이 이미지를 완전히 인식 할 수 없기 때문에 '경고'를 사용하는 것을 좋아하지 않습니다
edc65

2

펄, 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 시스템 접근 방식을 사용합니다.


2

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의 2x2 행렬

{ }⍣⎕ 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''¨ 각각에서 후행 공백을 제거하십시오 (이 과제는 필요합니다)

⎕∘←¨ 각각 출력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.