একটি লাইনে ফ্র্যাক্টাল পয়েন্টস


12

কখনও কখনও, যখন আমি সত্যিই বিরক্ত ( সত্যই বিরক্ত) তখন আমি একটি লাইন বিভাগটি আঁকতে এবং এটিতে পয়েন্ট আঁকতে পছন্দ করি।

প্রথমত, আমি একটি নির্দিষ্ট আকারের একটি রেখাংশ অঙ্কন করি, যা এন এর কিছু মানের জন্য 2 ^ N হয় The লাইনটি বিভিন্ন .অক্ষরের দ্বারা উপস্থাপিত হবে ।

................

তারপরে, আমি বাম প্রান্তে একটি পয়েন্ট প্লট করি। পয়েন্টগুলি Xঅক্ষর দ্বারা প্রতিনিধিত্ব করা হবে ।

X...............

তারপরে, আমি একটি প্যাটার্ন অনুসরণ করি। সর্বাধিক প্লট করা বিন্দু (যা আমি এটিকে ডাকব) থেকে শুরু করে, আমি লাইনের পরবর্তী প্লট পয়েন্ট (বি) এ এগিয়ে চলেছি (প্রয়োজনীয় হিসাবে মোড়ানো)। তারপরে, আমি লাইন (সি) এর পরবর্তী প্লট করা পয়েন্টে এগিয়ে যাই । তারপরে, আমি এই তৃতীয় বিন্দু (সি) এবং পরবর্তী ইতিমধ্যে প্লট করা পয়েন্ট (ডি) এর মাঝখানে একটি নতুন পয়েন্ট প্লট করব।

আপনি যখনই লাইনের চারপাশে মোড়ক করবেন তখনই "মাঝারি" মোড়কের উপায়ে নির্ধারিত হয়। নতুন প্লট করা পয়েন্টটি সর্বদা সি এর ডানদিকে থাকে

ধরা যাক যে নিম্নলিখিত লাইনটি আমার বর্তমান লাইন ছিল। এখানে আমি পরবর্তী দুটি পয়েন্ট প্লট করব কিভাবে। এই উদাহরণস্বরূপ, আমি একটি চিঠি দিয়ে প্রতিটি গুরুত্বপূর্ণ পয়েন্ট লেবেল করব।

X...A...X.X...X.
    ^

X...A...B.X...X.
        ^

X...A...B.C...X.
          ^

X...A...B.C...D.
            ^

X...X...X.X.A.X.
            ^

X...X...X.X.A.B.
              ^

C...X...X.X.A.B.
^

C...D...X.X.A.B.
  ^

X.A.X...X.X.X.X.
  ^

পূর্ববর্তী উদাহরণে ফিরে, পরবর্তী পয়েন্টটি লাইনের মাঝখানে প্লট করা হবে।

X.......X.......

এটি সম্ভবত একটি বিশেষ ক্ষেত্রে কিছুটা: পরবর্তী পয়েন্টে অগ্রসর হওয়া আপনাকে যেখানেই শুরু করেছিল simply একমাত্র দরকারী অর্ধদৈর্ঘ্য পয়েন্টটি হ'ল "চক্রীয়" অর্ধপথ বিন্দু (রেখার অর্ধেক পয়েন্ট), তার নিজের উপরে একটি বিন্দু ষড়যন্ত্র করার বিরোধিতা হিসাবে।

নীচে পয়েন্টগুলির সিরিজটি রয়েছে যা আমি এখান থেকে শেষ পর্যন্ত লাইনে প্লট করব।

X.......X.......
X.......X...X...
X.......X.X.X...
X...X...X.X.X...
X...X...X.XXX...
X.X.X...X.XXX...
X.X.X...XXXXX...

পরবর্তী পয়েন্টটি প্লট করার জন্য আর কোনও ঘর নেই, কারণ এটি দুটি সংলগ্ন পয়েন্টের মধ্যে আবদ্ধ হতে হবে, সুতরাং আমি এন = 4 এর প্রদত্ত মানের জন্য সর্বাধিক গভীরতায় পৌঁছেছি উপরের তালিকার শেষ লাইনটি "সম্পূর্ণ । "

চ্যালেঞ্জ

লক্ষ্যটি হ'ল সংক্ষিপ্ততম প্রোগ্রাম / নামকৃত ফাংশনটি লিখুন যা এন এর প্রদত্ত মানের জন্য সম্পূর্ণ লাইনটি মুদ্রণ / ফিরিয়ে দেবে The উপরেরটি এন = 4 দেখায়।

ইনপুট

ইনপুটটি একক অ-নেতিবাচক পূর্ণসংখ্যা N হবে the উত্পন্ন রেখার দৈর্ঘ্য তখন 2 ^ N হবে।

আউটপুট

আউটপুটটি 2 length N দৈর্ঘ্যের সম্পূর্ণ লাইন হবে, .এবং এটির দ্বারা Xঅক্ষর তৈরি হবে। একটি ট্রেলিং নিউলাইন কিছু যায় আসে না।

উদাহরণ I / O

0
X

1
XX

2
X.XX

3
X.X.XXX.

4
X.X.X...XXXXX...

5
X.X.X...X...X...X.XXX.XXX.......

উত্তর:


4

পাইথন 2, 137

n=input()
l=[0]*2**n;i=0
while~i%2:i=i/2%2**n;l[i]=1;i=sum([k for k,v in enumerate(l*4)if(k>i)*v][1:3])
print''.join(['.X'[x]for x in l])

বেশ সোজা।

পাইথ, 49

কমবেশি একটি অনুবাদ। মূল পার্থক্য হ'ল আমি লাইন উপস্থাপন করে একটি তালিকা ব্যবহার করি না, আমি একটি স্ট্রিং ব্যবহার করি।

J*\.^2QW!%Z2K%/Z2lJ=JXJK\X=Zs<tf&q\X@JT>TKU*4J2)J

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

                         Q=input(); Z=0 #implicit
J*\.^2Q                  J = "."*(2^Q)
W!%Z2                    while !(Z%2):
  K%/Z2lJ                  K=(Z/2)%(len(J))
  =JXJK\X                  change J, the point at index K is changed to a "X"
       f          U*4J     filter all elements T in [0, 1, 2, ..., 4*len(J)-1]:
        &q\X@JT>TK           where J[T]=='X' and T>K
     <t               2    only us the second and third element
  =Zs                      and store the sum to Z
)J                       end while and print J


3

গল্ফস্ক্রিপ্ট (by১ বাইট)

~2\?,[]0{.@|$4*.@?2+1$>2<.+~<!4$,*++.2/\1&!}do;`{&!'X.'1/=}+%

প্রয়োজনীয় লুপ পুনরাবৃত্তির সংখ্যা A061419 বলে মনে হয় তবে ডু -লুপটি এটি গণনা করার চেয়ে কম। একটি ডিভোড ডো লুপের ভিতরে একটি চর সংরক্ষণ করবে save যে অংশটি সবচেয়ে অপব্যয় বোধ করে তা হ'ল আউটপুট রূপান্তর, তবে কীভাবে এটি উন্নত করা যায় তা আমি দেখছি না।



2

জাভা, 209 207 195 191 বাইট

আমি অবাক হয়েছি আমি এটি সংক্ষিপ্তভাবে এটি পেতে সক্ষম হয়েছি। উন্নতির জন্য সম্ভবত এখনও জায়গা আছে। যথারীতি, পরামর্শগুলি প্রশংসা করা হবে :)

এটি a char[]। কল করে কল করুন a(n)

char[]a;int b,c,d,e=2;char[]a(int f){java.util.Arrays.fill(a=new char[b=1<<f],'.');for(a[0]=88;d+1<e;c=(d+e)/2,a[c%b]=88)e=b(d=b(b(c)));return a;}int b(int f){for(;;)if(a[++f%b]>87)return f;}

ইন্ডেন্টযুক্ত:

char[] a;
int b, c, d, e = 2;

char[] a(int f){
    java.util.Arrays.fill(
            a = new char[
                    b = 1 << f
                    ]
            , '.'
    );
    for(
            a[0] = 88;
            d + 1 < e;
                c = (d + e) / 2,
                a[c % b] = 88
        )
        e = b(
                d = b(
                        b(c)
                )
        );
    return a;
}

int b(int f){
    for (;;)
        if (a[++f % b] > 87)
            return f;
}

পিটারকে 12 বাইট ধন্যবাদ :)
4 বাইট টিএনটিকে ধন্যবাদ;)


(c%b+b)%b? আপনি কি cনেতিবাচক আশা করছেন?
পিটার টেলর

c=0এবং d=0সংক্ষিপ্ত করা যেতে পারে ঠিক cএবং dintশ্রেণি স্তরে সংজ্ঞায়িত প্রকারগুলি স্বয়ংক্রিয়ভাবে 0 এ শুরু হয়
টিএনটি

1

হাস্কেল, 182 বাইট

(a:b)%(c:d)|a<c=a:b%(c:d)|1<2=c:(a:b)%d
f i=putStr$map(!(0:g[0,n..]))[0..n-1]where n=2^i;e!l|e`elem`l='X'|1<2='.';g(_:_:c:d:r)|m==c=[]|1<2=mod m n:g((d:r)%[m,m+n..])where m=div(c+d)2

ব্যবহার: f 5। আউটপুট: X.X.X...X...X...X.XXX.XXX.......

দুর্ভাগ্যক্রমে হাস্কেলের স্ট্যান্ডার্ড লাইব্রেরিতে মার্জ ফাংশন নেই, সুতরাং আমাকে নিজের (-> %) সরবরাহ করতে হবে। ভাগ্যক্রমে আমাকে কেবল অসীম তালিকাগুলি একত্রীকরণ করতে হবে, তাই আমাকে বেস কেসগুলি খালি করতে হবে না, খালি তালিকা। এটি এখনও 40 বাইট খরচ।

এটি কীভাবে কাজ করে: এসগুলিকে Xসরাসরি অ্যারেতে সেট করার পরিবর্তে, তারা যেখানে রয়েছে সেগুলির একটি তালিকা রাখি। তদুপরি আমি প্রায় গুটিয়ে রাখি না 2^Nতবে অনন্তের দিকে অবস্থানগুলি বাড়িয়ে রাখি (উদাহরণস্বরূপ N = 2 এর সাথে Xসামনের দিকে অবস্থিত, অবস্থানের তালিকার মতো দেখতে [0,4,8,12,16,20,…])। আমি তৃতীয় এবং চতুর্থ উপাদানটি ( cএবং d) নিই , নতুন অবস্থান গণনা (c+d)/2করি, আউটপুট তালিকার জন্য রাখি , পুরাতন অবস্থানের তালিকাটি পজিশন 4 (দ্য d) থেকে নতুন দিয়ে শুরু করে পুনরায় পুনরায় (c+d)/2সংস্থান করি। (c+d)/2সমান হলে আমি থামি c। অবশেষে আমি 0আউটপুট তালিকায় একটি যুক্ত করব এবং Xপ্রদত্ত অবস্থানগুলিতে এবং .অন্য কোথাও প্রিন্ট করব ।

step by step example, N=2

step  position list       (c+d)/2  output     lists to merge (pos. list for next round)
                                   list       old list from d on / new list from (c+d)/2

  #1  [0,4,8,12,16,…]       10     [10]          [12,16,20,24,…] / [10,14,18,22,…]
  #2  [10,12,14,16,18,…]    15     [10,15]       [16,18,20,22,…] / [15,19,23,27,…]
  #3  [15,16,18,19,20,…]    18

stop here, because c equals (c+d)/2

add 0 to the output list: [0,10,15]
take all elements modulo 2^N: [0,2,3]
print X at position 0, 2 and 3 

1

গণিত, 110 102 112 108

a=Array["."&,n=2^Input[]];a[[Mod[Round@{n/2,n}//.{x_,y_,z___}/;y-x>1:>{z,x+n,(x+y)/2+n,y+n},n]+1]]="X";""<>a
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.