हिल्बर्ट कर्व ड्रा करें


12

हिल्बर्ट कर्व एक प्रकार का स्पेस-फिलिंग कर्व है, और यह मूल रूप से एक लाइन को एक प्लेन में मैप करता है। लाइन में प्रत्येक बिंदु विमान में सिर्फ एक बिंदु से मेल खाता है, और विमान में प्रत्येक बिंदु लाइन पर सिर्फ एक बिंदु से मेल खाता है। दिखाया गया है हिल्बर्ट वक्र के 4 के माध्यम से पुनरावृत्तियों:

Iterations 0 अप करने के लिए 4:

इस कार्य का उद्देश्य: कोड लिखें जो ऊपर बताए अनुसार हिल्बर्ट वक्र के चौथे पुनरावृति को खींचता है। आपका कोड पूरा होना चाहिए - दूसरे शब्दों में, यदि आप हिल्बर्ट कर्व को आकर्षित करने के लिए एक फ़ंक्शन बनाते हैं, तो आपके कोड को उस फ़ंक्शन को कॉल करना होगा। आउटपुट या तो स्क्रीन पर सीधे प्रदर्शित किया जा सकता है, या आप आउटपुट को एक छवि फ़ाइल में लिख सकते हैं। वक्र को घुमाया या फ़्लिप किया जा सकता है, लेकिन लाइनों को समकोण पर काटना चाहिए और आउटपुट को बढ़ाया नहीं जा सकता। ASCII कला की सराहना की जाती है, लेकिन इसे स्वीकार नहीं किया जाएगा। बाइट्स जीत में सबसे छोटा कोड!


इनपुट की संख्या कितनी है? या हम किसी भी मूल्य को कम से कम 4 चुन सकते हैं?
लुइस मेन्डो

क्या ASCII कला को चित्रमय माना जाता है?
गेब्रियल बेनामी

नहीं; क्षमा करें - तब यह एक और प्रश्न का डुप्लिकेट होगा
जे। एंटोनियो पेरेज़

@JorgePerez क्या वक्र में एक अलग अभिविन्यास हो सकता है? अपने उदाहरणों के एक लंबवत रूप से फ़्लिप या 90-डाउन रोटेट संस्करण की तरह
लुइस मेन्डो

हाँ! यद्यपि समग्र आकार अभी भी चौकोर होना चाहिए
जे। एंटोनियो पेरेज़

जवाबों:


7

आर, 90 बाइट्स

n=scan();a=1+1i;b=1-1i;z=0;for(k in 1:n)z=c((w<-1i*Conj(z))-a,z-b,z+a,b-w)/2;plot(z,t="s")

@Luis मेंडोज़ द्वारा पोस्ट किए गए लिंक में उपयोग किए गए एल्गोरिदम का बेशर्म आर-पोर्ट।

हमारे n=5लिए:

यहाँ छवि विवरण दर्ज करें


7

MATL , 39 38 बाइट्स

O5:"tZjJ*JQ-wJq+t2+&y2j+_v2/]XG25Y01ZG

यह इनपुट के रूप में पुनरावृत्तियों की संख्या लेता है। यदि आप इसे हार्ड-कोड करना चाहते हैं, iतो संख्या से बदल दें ।

कार्यक्रम यहां दिखाए गए जोनास लुंडग्रेन द्वारा मतलाब कोड का एक बंदरगाह है

परिणाम नीचे दिखाया गया है। आप इसे MATL ऑनलाइन पर भी आज़मा सकते हैं ! आउटपुट के उत्पादन में कुछ सेकंड लगते हैं। यह संकलक प्रयोगात्मक है; यदि यह शुरू में काम नहीं करता है, तो आपको पृष्ठ को ताज़ा करने और "रन" को फिर से दबाने की आवश्यकता हो सकती है।

यहाँ छवि विवरण दर्ज करें

व्याख्या

O          % Push 0. This is the initial value of "z" in the original code
5:"        % Do 5 times
  t        %   Duplicate
  Zj       %   Complex conjugate
  J*       %   Multiply by 1j (imaginary unit). This is "w" in the original code
  JQ-      %   Subtract 1+1j
  w        %   Swap: brings copy of "z" to top
  Jq+      %   Add 1-1j
  t        %   Duplicate
  2+       %   Add 2
  &y       %   Duplicate the third element from top
  2j+_     %   Add 2j and negate
  v        %   Concatenate the three matrices vertically
  2/       %   Divide by 2
]          % End
XG         % Plot (in complex plane). The numbers are joined by straight lines
25Y0       % Push string 'square'
1ZG        % Make axis square

क्या आप बता सकते हैं कि आपका कोड कैसे काम करता है?
जे। एंटोनियो पेरेज़

एल्गोरिथ्म लिंक में जैसा है। लेकिन मैं एक स्पष्टीकरण
जोड़ूंगा

@ जॉर्ज स्पष्टीकरण में जोड़ा गया
लुइस

omg, आप जिस पर आधारित हैं, वह मेरा = /
त्रुटी

जोनास लुंडग्रेन के लिए @flawr सारा श्रेय :-)
लुइस

6

MATLAB, 264 262 161 बाइट्स

यह अभी भी बहुत ही समान काम करता है, सिवाय इसके कि हम मूल रूप से हिल्बर्ट वक्र के "व्युत्पन्न" की गणना करते हैं, कि हम तब `कमसुम` के माध्यम से" एकीकृत "करते हैं। यह कोड आकार को बाइट्स के एक गुच्छा से कम करता है।

function c;plot(cumsum([0,h(1,1+i,4)]));axis equal;end function v=h(f,d,l);v=d*[i*f,1,-i*f];if l;l=l-1;D=i*d*f;w=h(f,d,l);x=h(-f,D,l);v=[x,D,w,d,w,-D,-x];end;end

पुराना संस्करण

यह सिर्फ सादा पुनरावर्ती दृष्टिकोण है। मैंने सरलता के लिए वेक्टर जानकारी संग्रहीत करने के लिए जटिल संख्याओं का उपयोग किया। आप भाग में वक्र को बदल सकते हैं h(0,1,1+i,4)। पहला तर्क p=0प्रारंभिक स्थिति है, दूसरा तर्क fअभिविन्यास ( +1या -1) के लिए एक ध्वज है , तीसरा तर्क dदिशा / रोटेशन है जिसमें वक्र खींचा जाना चाहिए और चौथा lपुनरावृत्ति गहराई है।

function c;hold on;h(0,1,1+i,4);axis equal;end function p=h(p,f,d,l);q=@plot;if l;l=l-1;d=i*d*f;p=h(p,-f,d,l);q(p+[0,d]);p=p+d;d=-i*d*f;p=h(p,f,d,l);q(p+[0,d]);p=p+d;p=h(p,f,d,l);d=-i*d*f;q(p+[0,d]);p=p+d;p=h(p,-f,d,l);else;q(p + d*[0,i*f,1+i*f,1]);p=p+d;end;end

पुराने संस्करणों में ऐसा दिखता है:

यह 2015 की तरह दिखता है:

->

1
मतलाब R2015 बी में यह रंगों में प्लॉट करता है <3
लुइस

हाहा सो कूल :)
दोष नोव

@LuisMendo मैं अब इस cumsumविचार के साथ थोड़ा सा गोल्फ करने में सक्षम था जो सिर्फ शानदार है!
त्रुटी

3

MATLAB / ऑक्टेव, 202 बाइट्स

मैंने देखा संस्करण @LuisMendo जुड़ा हुआ है पिछले की तुलना में जिस तरह से कम था "हस्तनिर्मित" समाधान लेकिन एक बिल्कुल अलग दृष्टिकोण का उपयोग करता। मैं अब सीडब्ल्यू के रूप में एक गोल्फ संस्करण यहां पोस्ट कर रहा हूं:

यह संस्करण लिंडेनमेयर सिस्टम दृष्टिकोण पर आधारित है:

A=zeros(0,2);B=A;C=A;D=A;n=[0,1];e=[1,0];for k=1:4;a=[B;n;A;e;A;-n;C];b=[A;e;B;n;B;-e;D];c=[D;-e;C;-n;C;e;A];D=[C;-n;D;-e;D;n;B];A=a;B=b;C=c;end;A=[0,0;cumsum(A)];plot(A(:,1),A(:,2));axis off;axis equal

यहाँ छवि विवरण दर्ज करें


3

जावास्क्रिप्ट (ईएस 6), 266 ... 233 232 बाइट्स

हिल्बर्ट कर्व का एक एसवीजी प्रतिपादन।

document.write('<svg><path fill=none stroke=red d="M8 8'+(f=(i,s='2',d=x=y=8)=>i?f(i-1,s.replace(/./g,c=>[32410401423,,10432423401][+c]||c)):s.replace(/./g,c=>c-4?(d+=c&1&&c-2,''):`L${x+=4-'4840'[d&=3]} ${y+=4-'0484'[d]}`))(5)+'">')

नील को धन्यवाद देकर 1 बाइट बचाया


1
कोशिशfill=none
नील

2

पायथन 3, 177 175 171 बाइट्स

हिल्बर्ट वक्र के लिए लिंडेनमेयर प्रणाली का एक सरल कार्यान्वयन। गोल्फ सुझाव का स्वागत करते हैं!

संपादित करें: -2 बाइट्स काडे के लिए धन्यवाद। -3 बाइट्स का पुनर्गठन कैसे हिल्बर्ट वक्र बनाया गया है से। ETHproductions के लिए धन्यवाद के साथ -1 बाइट।

from turtle import*;s="a";exec('t=""\nfor c in s:t+=c>"F"and"+-abFF-+baFFba-+FFab+-"[c<"b"::2]or c\ns=t;'*5)
for c in s:
 if"-">c:rt(90)
 elif"F">c:lt(90)
 elif"a">c:fd(9)

यहाँ छवि विवरण दर्ज करें

Ungolfing

import turtle

hilbert_seq = "a"

for _ in range(5):
    new_seq = ""
    for char in hilbert_seq:
        if char == "a":
            new_seq += "-bF+aFa+Fb-"
        elif char == "b":
            new_seq += "+aF-bFb-Fa+"
        else:
            new_seq += char
    hilbert_seq = new_seq

for char in hilbert_seq:
    if char == "F":
        turtle.forward(9)
    elif char == "+":
        turtle.right(90)
    elif char == "-":
        turtle.left(90)

बदलने से आप कैसे tदो बाइट्स बचा सकते हैं t+=[[c,"+AF-BFB-FA+"][c=="B"],"-BF+AFA+FB-"][c=="A"]:। चूंकि पैटर्न उन दोनों के लिए लगभग समान है, मुझे आश्चर्य है कि अगर वहाँ कुछ तरीका है कि उपयोग कर रहा है ..
Kade

शायद एक बाइट को बचाने के if c>"E":लिए बदल जाए if"E"<c:?
ETHproductions

1

MSWLogo (संस्करण 6.5 बी), 136 बाइट्स

यहां अंतिम हिल्बर्ट वक्र कार्यक्रम के आधार पर ।

to h :n :a :l
if :n=0[stop]
rt :a
h :n-1(-:a):l
fd :l
lt :a
h :n-1 :a :l
fd :l
h :n-1 :a :l
lt :a
fd :l
h :n-1(-:a):l
rt :a
end
h 5 90 9

एक फ़ंक्शन hपरिभाषित किया गया है, जो पुनरावृत्तियों :n(1-आधारित), कोण :a, लंबाई की संख्या लेता है :l। यह पुनरावर्ती है, :aअभिविन्यास को सही करने के लिए दो उदाहरणों में उपेक्षित कोण के साथ स्वयं के निचले पुनरावृत्ति को बुलाता है ।

  • rt :a, lt :aकछुए को घुमाएं (त्रिभुज वाली बात जिसका रास्ता पता लगाया गया है) दाएं, बाएं, :aडिग्री द्वारा ।
  • fd :lकछुए को कदमों से आगे बढ़ाता है :l

अंत में, फ़ंक्शन कहा जाता है h 5 90 9:। कछुआ, एक अतिरिक्त 2 बाइट्स के लिए छिपा हो सकता है ht

(5-1) -इस पुनरावृत्ति


ऊपरी बाएं कोने पर क्या हो रहा है?
त्रुटी

@flawr यह कछुआ है। इसे जोड़कर छिपाया जा सकता है ht
मोनिका

1

गणितज्ञ 128 बाइट्स

Graphics[Line@AnglePath[Total/@Split[Cases[Nest[#/.{-2->(s=##&@@#&)[l={-1,2,0,1,-2,0,-2,1,0,2,-1}],2->s@-l}&,{-2},4],-1|1|0],#!=0&][[;;-2,;;-2]]*Pi/2]]

यदि आप चाहें तो उपरोक्त 4 को पुनरावृत्तियों की एक अलग संख्या से बदलें।

पूर्ण अनुक्रमों के बजाय पूर्णांक अनुक्रमों के साथ एक लिंडेनमेयर प्रणाली के रूप में किया गया इसलिए दूसरा उत्पादन नियम पहले नियम का नकारात्मक है। यह संस्करण 151 बाइट्स है।

जोनास लुंडग्रेन के MATLAB कोड का पोर्ट केवल 128 बाइट्स है।

z=0;Graphics[Line[{Re[#],Im[#]}&/@Flatten[Table[w=I*Conjugate[z];z={w-(a=1+I),z-(b=1-I),z+a,b-w}/2,{k,5}][[5]]]],AspectRatio->1]

मैं देखता हूं कि गणितज्ञ के भविष्य के संस्करण में, यह वास्तव में छोटा हो सकता है, जैसे कुछ:

Graphics@HilbertCurve[n]

http://mathworld.wolfram.com/HilbertCurve.html


1

लिंडेनमस्म , 63 बाइट्स

लिंडेनमस्म जवाब के साथ एक और सवाल? बहुत बढ़िया!

STT
AXI A
INC 5
SET F 0
RPL A -BF+AFA+FB-
RPL B +AF-BFB-FA+
END

एक बार फिर, पायथन के साथ कुछ ड्राइंग बग के कारण turtle, कभी-कभी जब आप इसे चलाते हैं तो पूरी ड्राइंग नहीं होती है। हालाँकि आप देख सकते हैं कि यह वास्तव में काम करता है:

4 पुनरावृति

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.