স্ল্যাশ ব্যবহার করে হিলবার্ট কার্ভ আঁকুন


30

হিলবার্ট বক্ররেখা একটি স্থান ভরাট ফ্র্যাক্টাল করে একটি হিসাবে প্রতিনিধিত্ব করা যেতে পারে Lindenmayer সিস্টেম প্রজন্মান্তরে সঙ্গে যে মত এই বর্ণন:
হিলবার্ট কার্ভ
ধন্যবাদ http://www.texample.net/tikz/examples/hilbert-curve/ চিত্রের জন্য।

লক্ষ্য

সম্ভাব্যতম সংক্ষিপ্ত প্রোগ্রামটি লিখুন (বাইটে) যা স্ট্ডিনের থেকে ধনাত্মক পূর্ণসংখ্যা নেবে এবং কেবলমাত্র ফরোয়ার্ড স্ল্যাশ, পশ্চাদপদ স্ল্যাশ, স্পেস এবং নিউলাইন ব্যবহার করে স্ট্যান্ডআউটে নবম ক্রম হিলবার্ট বক্ররেখা আঁকবে।

উদাহরণস্বরূপ, ইনপুট 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

লিন্ডেনমায়ারের উপস্থাপনা ব্যবহার করে একটি এএসসিআইআই-টার্টল পদ্ধতি ( এখানে চেষ্টা করুন) )।

বিগ আপনাকে আরও কিছু গল্ফ করার জন্য @ ভেন্টোকে ধন্যবাদ জানায়


এই একটি বিট আরো Golfed, আশা করি তুমি কিছু মনে না করেন: ideone.com/kvcPWT - .map(&:rstrip)"কোন পিছনের শূন্যস্থানগুলি" প্রয়োজন পূর্ণ করা যোগ করা হয়েছিল।
ভেন্টোরো

@ ভেন্তোর ধন্যবাদ আশা করি আপনি আপত্তি করবেন না যে আমি আপনার সমাধানটি নিয়েছি - এমনকি আপনি মানচিত্রের যুক্তির আশেপাশে প্যারান্থেসগুলি ফেলে দিতে পারেন।
হাওয়ার্ড

আহ, অবশ্যই! আমি আরও বুঝতে পেরেছি যে মোট 205 টি অক্ষরের জন্য (পূর্বের মতো একই লিঙ্কটি দেখুন) এবং xএর সাথে অ্যাসাইনমেন্টের সংজ্ঞা এবং সংক্ষিপ্তকরণ সম্ভব । yd
ভেন্টোরো

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()

এটি পূর্ববর্তী বক্ররেখার বাইরে নবম অর্ডার হিলবার্ট বক্ররেখার জন্য পুনরাবৃত্তির পদ্ধতির ব্যবহার করে। কার্ভগুলি আরও ভাল কাটা এবং ম্যানিপুলেশনের জন্য 2 ডি নাম্পার অ্যারে হিসাবে উপস্থাপন করা হয়।

এখানে কিছু উদাহরন:

$ python hilbert.py
2
  /
  \/\
/\   \
 / /\/
 \ \
  \/
$ python hilbert.py
3
       \
     /\/
    /   /\
    \/\ \ \
  /\  / / /
 / /  \/  \/\
 \ \/\  /\   \
\/   / / / /\/
  /\/ /  \ \
  \   \/\ \/
   \/\   \
     / /\/
     \ \
      \/
$ python hilbert.py
4
              /
              \/\
            /\   \
           / / /\/
           \ \ \  /\
         /\/  \/  \ \
        /   /\  /\/ /
        \/\ \ \ \   \/\
      /\  / /  \ \/\   \
     / /  \/ /\/   / /\/
     \ \/\  /   /\/ /   /\
   /\/   /  \/\ \   \/\ \ \
  /   /\/ /\  / / /\  / / /
  \/\ \  / /  \/ / /  \/  \/\
/\   \ \ \ \/\   \ \/\  /\   \
 / /\/  \/   / /\/   / / / /\/
 \ \  /\  /\/  \  /\/ /  \ \
  \/  \ \ \  /\/  \   \/\ \/
    /\/ / / /   /\ \/\   \
    \   \/  \/\ \ \  / /\/
     \/\  /\  / / /  \ \
       / / /  \/  \/\ \/
       \ \ \/\  /\   \
        \/   / / / /\/
          /\/ /  \ \
          \   \/\ \/
           \/\   \
             / /\/
             \ \
              \/

5

মালসিস - 234 221 টি অক্ষর

আমি এখানে কিছু এল-সিস্টেমের গন্ধ পেয়েছি :) মালসিস হ'ল অনলাইন এল-সিস্টেম দোভাষী। এটি সত্যই গুরুতর এন্ট্রি নয় তবে আমি অনুভব করেছি যে সমাধানটি কিছুটা আকর্ষণীয়।

মালসিসের সিনট্যাক্সটি গল্ফিংয়ের জন্য সত্যিই ভাল নয় কারণ এতে প্রচুর দীর্ঘ কীওয়ার্ড রয়েছে তবে এটি যথেষ্ট সংক্ষিপ্ত, পাঠযোগ্য এবং অভিব্যক্তিপূর্ণ।

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/ প্রসেস

গল্ফ সংস্করণ:

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;

এবং আসকি হেক্সাগোনাল গসপার বক্ররেখা সম্পর্কে কীভাবে? :)

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

http://malsys.cz/g/ae5v5vGB


2

জাভাস্ক্রিপ্ট (ES6) 313 340

সম্পাদনা করুন কিছু চরিত্র সত্যিই ব্যবহার মুছে খারাপ ফাংশন H থেকে একটি ফিরতি মানের পরিবর্তে W বিশ্বব্যাপী পরিবর্তনশীল মত - চর্চা

প্রতিটি এক্স, ওয়াইয়ের জন্য x, y অবস্থানকে দূরত্ব ডি ( উইকিপিডিয়া দেখুন ) এ রূপান্তর করা এবং নিকটস্থ অবস্থানগুলি সংযুক্ত থাকলে তা যাচাইকরণ,

ফায়ারফক্স কনসোলে পরীক্ষা। পপআপের মাধ্যমে ইনপুট, কনসোল.লগের মাধ্যমে আউটপুট।

কোনও পূর্ববর্তী স্থান নেই এবং চিত্রের উপরে বা নীচে কোনও নতুন লাইন নেই। তবে প্রতিটি লাইন একটি নতুন লাইন দিয়ে সমাপ্ত করা হয়েছে, আমি মনে করি এটি আসকি শিল্প চিত্র তৈরির সঠিক উপায়।

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.logforচতুর্থ লাইনের পরে আপনারও অতিরিক্ত স্থান রয়েছে এবং আপনার শেষ লাইনের বিরতি থেকে মুক্তি পেতে সক্ষম হওয়া উচিত।
বব

@ باب হ্যাঁ বাস্তবে আমি আরও প্রায় 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

পার্লকে যদি আমি আরও ভালভাবে বুঝতে পারি তবে সম্ভবত এটি আরও গল্ফ করতে পারে। লাইন 1-এ সংজ্ঞায়িত উত্পাদনের বিধিগুলি ব্যবহার করে একটি লিন্ডমায়ার সিস্টেম পদ্ধতির ব্যবহার।


2

এপিএল (ডায়ালগ ইউনিকোড) , 90 বাইট এসবিসিএস

⎕∘←¨' +$'r''¨↓1↓∘⍉∘⌽⍣4' /\'[{3|(⊢+⍉)2@(¯1 0+3 1×s÷2)s⊢(¯.5×≢⍵)⊖(2×s←⍴⍵)↑⍵,⍨-⊖⍵}⍣⎕⊢2 2⍴0]

এটি অনলাইন চেষ্টা করুন!

2 2⍴0 শূন্যের 2x2 ম্যাট্রিক্স

{ }⍣⎕ ইনপুট এন এবং একটি ফাংশন এন বার প্রয়োগ করুন

⍵,⍨-⊖⍵ ম্যাট্রিক্সের বামে নিজেকে উল্লম্বভাবে বিপরীত এবং অবহেলিত অনুলিপিটি সংযুক্ত করুন

(2×s←⍴⍵)↑ জিরো সহ প্যাড যাতে মাত্রাগুলি (হিসাবে মনে রাখা) s দ্বিগুণ হয়ে যায়

¯.5×≢⍵ উল্লম্বভাবে কেন্দ্রের জন্য নীচে ঘোরান, প্যাডিং শূন্যগুলির মধ্যে স্যান্ডউইচড

2@(¯1 0+3 1×s÷2) নির্দিষ্ট স্থানে 2-গুলি রাখুন - এগুলি ফ্র্যাক্টালের ছোট উদাহরণগুলির মধ্যে লিঙ্কিং স্ল্যাশ

(⊢+⍉) এর ট্রান্সপোজড স্বের সাথে ম্যাট্রিক্স যুক্ত করুন

3|মডুলো 3; আমরা অবহেলা ব্যবহার করেছি, সুতরাং দয়া করে নোট করুন -1≡2 (Mod 3) এবং -2≡1 (Mod 3)

' /\'[ ] স্ট্রিংয়ে সূচক হিসাবে ম্যাট্রিক্স উপাদানগুলি ব্যবহার করুন ' /\'

1↓∘⍉∘⌽⍣4 চারদিক থেকে 1-উপাদান-প্রশস্ত খালি মার্জিনটি ছাঁটাই

লাইনে বিভক্ত

' +$'⎕r''¨ প্রত্যেকের থেকে চলার স্থানগুলি সরান (এই চ্যালেঞ্জটির এটি প্রয়োজন)

⎕∘←¨ আউটপুট প্রতিটি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.