হাফস্ট্যাডারের চিত্র-চিত্র সিকোয়েন্স তৈরি করুন


16

ইন গোডেলের, Escher, Bach , ডগলাস Hofstadter প্রবর্তন একটি পূর্ণসংখ্যা অনুক্রম যাতে সাধারণভাবে চিত্রে-চিত্রে ক্রম হিসাবে উল্লেখ করা হয়:

2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, ...

আপনি নিজেই চ্যালেঞ্জের অংশ হিসাবে অনুক্রমের সংজ্ঞাটি কার্যকর করে উপভোগ করতে পারেন, তবে আপনি যদি এটি জানতে না চান বা না করতে চান তবে এটি সিক্যুয়েন্স A030124 এবং উইকিপিডিয়ায় কিছুটা পরিষ্কার সংজ্ঞা হিসাবে OEIS এ খুঁজে পেতে পারেন ।

একটি প্রোগ্রাম বা ফাংশন লিখুন যা nSTDIN, ARGV বা ফাংশন আর্গুমেন্টের মাধ্যমে দেওয়া nহয়, কোনও যুক্তিসঙ্গত তালিকা বিন্যাসে STDOUT এর ক্রমের প্রথম সংখ্যাগুলির একটি তালিকা মুদ্রণ করে।

এটি কোড গল্ফ, বাইট জেতে সংক্ষিপ্ততম সমাধান।

উত্তর:


6

সিজেম, 38 30 29 21 বাইট

li_3*,2>\{(_pX+:X-}*;

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

কিভাবে এটা কাজ করে

li                     " Read an integer N from STDIN.              ";
  _3*,2>               " Push S := [ 2 3 ... (N * 3 - 1) ].         ";
        \{        }*   " Do the following N times:                  ";
          (            " Shift an integer I from S.                 ";
           _p          " Print a copy of I, followed by a linefeed. ";
             X+:X      " Execute X += I. (X is initialized to 1.)   ";
                 -     " Remove X from S.                           ";
                    ;  " Discard S from the stack.                  ";

উদাহরণ রান

$ cjam <(echo 'li_3*,2>\{(_pX+:X-}*;') <<< 20
2
4
5
6
8
9
10
11
13
14
15
16
17
19
20
21
22
23
24
25

দোভাষীর জন্য ইউআরএল টাইপ করার সময় আপনি অ্যাডিটসুর হাতছাড়া করেছেন
বিটা

@ বেটাডেেকে তবে কেন এটি সংশোধন করার জন্য সম্পাদনা করা হবে না;)
মার্টিন এন্ডার

@ মার্টিন আমি ভাবি নি যে আমার যথেষ্ট প্রতিনিধি আছে ...
বিটা

2
@ বেটাডেকে আপনি করেন না, তবে আপনি এখনও তাদের পরামর্শ দিতে পারেন (যা তারা গ্রহণযোগ্য হলে আপনাকে 2 জনপ্রতিদ্বন্দ্বীও দেয়)।
মার্টিন ইন্ডার

আমার কোডের 8 টি অতিরিক্ত বাইট বন্ধ করে গল্ফ করার জন্য আমি এত চতুর অনুভব করেছি। তখন আমি বুঝতে পেরেছিলাম যে এটি এখন হিস্টোক্র্যাট, ম্যাটজয়িস এবং পিটার টেলরের উত্তরগুলির মতোই ...
ডেনিস

6

হাস্কেল, 67 61 60 56 55 53 টি অক্ষর

g n=take n$2:4:h
a#(x:s)=[a..x-2]++x#s
h=5#scanl(+)8h

প্রথম অ্যালগরিদম ফিরে।

এই সমাধানটি অনুক্রমের প্রারম্ভিক উপাদানগুলির সংমিশ্রণ করে পরিপূরক সিক্যুয়েন্সটি গণনা করে। এরপরে পরিপূরকের ক্রম সংখ্যাগুলির মধ্যে সমস্ত সংখ্যা হিসাবে ক্রমটি গণনা করে।

(#)পরিপূর্ণ পরিক্রমের মধ্যে সংখ্যাগুলি গণনা করে এমন ফাংশন।
hক্রম নিজেই।
gফাংশন যা প্রশ্নের উত্তর দেয়।

g ফাংশনটি h থেকে প্রয়োজনীয় পরিমাণের উপাদানগুলি গ্রহণের জন্য সংজ্ঞায়িত করা হয়।

সুক্ষ্ণ বিষয়গুলো:

hপ্রথম 2 উপাদান বাদে আসলে চিত্র চিত্রের ক্রম sequ
পরিপূরক ক্রমটি গণনা করা হয় না, তবে প্রতিটি উপাদানের জন্য 1 যোগ করে পরিপূরক ক্রম হয়।
এই দুটি সূক্ষ্মতাগুলির কারণ scanl(+)8h(যা যুক্ত 1 এর সাথে পরিপূরক সিকোয়েন্সের জন্য কোড (প্রথম 2 উপাদানগুলি বাদে) এর 8মধ্যে রয়েছে । এটি এর সাথে 1 যুক্ত করে পরিপূরক ক্রমের তৃতীয় উপাদানটির জন্য।
গণনাটি প্রথম দুটি উপাদান অনুপস্থিত না হওয়ার কারণ হ'ল এগুলি যুক্ত করা gহয়েছে 2:4:h

উদাহরণ:

>g 50
[2,4,5,6,8,9,10,11,13,14,15,16,17,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,57,58,59]

5

রুবি, 54 48

f=->n{x=1
b=*2..n*n
n.times{b-=[x+=p(b.shift)]}}

ডেমো

সম্পাদনা: এটিকে আরও একবার গল্ফ করেছিলাম যখন বুঝতে পেরেছিলাম যে স্মৃতিতে আমার সম্পূর্ণ পরিপূরক ক্রম ধরে রাখার দরকার নেই। এটি এখন কীভাবে কাজ করে তা এখানে: আমরা xপরিপূরক ক্রমের বৃহত্তম গণিত সংখ্যার উপর নজর রাখতে ব্যবহার করি এবং সিকোয়েন্সের bপ্রার্থীদের একটি পুল। nবার, আমরা মধ্যে ক্ষুদ্রতম অবশিষ্ট উপাদান আউটপুট bএবং xপরিপূরক অনুক্রমের পরবর্তী নম্বর গণনা করতে এটি যোগ । তারপরে আমরা প্রার্থীদের পুল থেকে উভয় নম্বর সরিয়ে ফেলি, সুতরাং আমরা সর্বদা সর্বনিম্ন সংখ্যাটি আউটপুট দিচ্ছি যা ইতিমধ্যে উভয় ক্রমের সাথে যোগ করা হয়নি।

রুবি গল্ফ ট্রিকস: স্ট্যাবি ল্যাম্বডা সিনট্যাক্স একটি পদ্ধতির সংজ্ঞা থেকে কম। প্রয়োজন যে আউটপুট stdout- এ পরিবর্তে ফেরত মান হিসাবে দেওয়া হয় আমাকে সত্য যে ফেরত মান ব্যবহার অনুপ্রাণিত p(x)হয় xযা আমি সাধারণত মনে নেই, কারণ এটি অরাজকতা গলফ ব্যবহৃত রুবি সংস্করণে কেস না।


1
এটা কিভাবে কাজ করে?
গর্বিত হাসেলেলার

1
আপনি ব্যবহার করতে পারে FWIW 2..2*n। আমাকে ব্যবহার করতে হবে n*nকারণ আমি কার্যকরভাবে করছি b = [x]^bতাই এর বৃহত্তম মানেরটির bবৃহত্তম মানের চেয়ে বড় হওয়া আমার প্রয়োজন x, তবে আপনার b -= [x]ঠিক প্রয়োজন যাতে bআউটপুট ক্রমের বৃহত্তম সম্ভাব্য মান থাকে।
পিটার টেলর

4

গল্ফস্ক্রিপ্ট ( 24 21 বাইট)

~.3*,1>\{(\(.p@+\|}*;

অনলাইন ডেমো

এটি বেশ আলাদাভাবে শুরু হয়েছিল, তবে এর গল্ফস্ক্রিপ্ট পোর্টে রূপান্তরিত হয়েছিল histocrat এর রুবি সমাধান সামনে ডেনিস কিছু প্রস্তাবনা যার ফলে এটি একটি কিছুটা ভিন্ন দিক নিতে তৈরি। বিশেষত, সংখ্যাগুলি মুদ্রণ করা হিসাবে আমরা তাদের চিহ্নিত করি শেষে তাদের প্রিন্ট করার জন্য একটি অ্যারেতে সংগ্রহ করা থেকে বেশ কিছুটা সাশ্রয় হয়; কারণটি হ'ল এর অর্থ হ'ল যে কোনও মুহুর্তে আমাদের স্ট্যাকের 3 টিরও বেশি আইটেম সম্পর্কে চিন্তা করতে হবে না।

ব্যবচ্ছেদ

~.3*,           # Eval input n, dup, multiply by 3, make list [0 1 ... 3n-1]
1>              # Discard 0, which is part of neither sequence
\{              # Execute n times: stack contains pool of numbers not yet seen
                # in either sequence and the first element of it is the next element of the
                # complement sequence
  (\(           #   Pop two numbers from the start of the pool: stack is
                #     pool[0] pool[2..max] pool[1]
  .p            #   Print pool[1]
  @+            #   Rotate pool[0] to top and add to pool[1]
  \|            #   Place pool[0]+pool[1] at the start of the pool and
                #   (this is the clever bit) remove it from later in the pool
}*
;               # Discard the unused remainder of the pool

তোমাদের স্থলাভিষিক্ত তাহলে ^সঙ্গে \-, আপনি প্রতিস্থাপন করতে পারেন ).*সঙ্গে 3*। এটি কোনও বাইট সংরক্ষণ করবে না, তবে এটি চালানোর সময় এবং মেমরির ব্যবহারকে হ্রাস করে। - আপনার অ্যারে উপরে পূর্ণসংখ্যা রেখে একটি বাইট সংরক্ষণ করতে সক্ষম হওয়া উচিত। লুপটিতে একই বাইট গণনা থাকবে তবে প্রাথমিককরণটি একটি বাইট সংক্ষিপ্ত হবে।
ডেনিস

2
সেট ইউনিয়ন পার্থক্যের চেয়েও আরও ভাল কাজ করে:~.3*,1>\{(\(.p@+\|}*;
ডেনিস

3

জে - 28 চর

nযুক্তি হিসাবে ফাংশন গ্রহণ ।

($+/\(-.~2+i.)&:>:+/)^:_&2 4

nবাম আর্গুমেন্ট হিসাবে আমরা কোনও ফাংশনটি চালিয়ে যাচ্ছি যতক্ষণ না এটি কোনও পরিবর্তন না ঘটে ততক্ষণ তার ডান আর্গুমেন্টে বারবার onto যুক্তিটি শুরু করার তালিকা 2 4

ফাংশনে নিজেই, আমরা আংশিক অঙ্কগুলি +/\এবং সম্পূর্ণ যোগফল গ্রহণ করি +/এবং তারপরে তাদের উভয়কে বৃদ্ধি করি &:>:। এরপরে আমরা প্রতিটি পূর্ণসংখ্যা 2 থেকে সম্পূর্ণ যোগফল ( 2+i.) এর চেয়ে একের মধ্যে তৈরি করি এবং বিয়োগফল সেট করি (-. সংজ্ঞা দ্বারা একটি দীর্ঘ চিত্র-চিত্রের ক্রম রেখে আংশিক )। অবশেষে, আমরা তালিকাটি দৈর্ঘ্যে সংক্ষিপ্ত বা ঘূর্ণায়মানভাবে প্রসারিত করব n

ফলাফলটি 2 4হয়ে ওঠে 3 7এবং এটি 2..8ছাড়তে সরানো হয় 2 4 5 6 8। অন্য রাউন্ড পরে, 2 4 5 6 8হয়ে 3 7 12 18 26যায়

2 4 5 6 8 9 10 11 13 14 15 16 17 19 20 21 22 23 24 25 27

এইভাবে, আমরা বারবার চিত্র-চিত্রের ক্রম প্রসারিত করি। $দৈর্ঘ্য আচরণ এইমাত্র কোনো অ- তুচ্ছ চরিত্র সঞ্চয় জন্য ক্রম দৈর্ঘ্য হত্তয়া অপেক্ষা উপায় নেইn বা তার অধিক, এবং outputting nপ্রথম মান যখন তারা পরিবর্তন বন্ধ। আমাদের খুব দীর্ঘ অপেক্ষা করতে হবে না: আমরা অভ্যন্তরীণ ক্রিয়াটির চারটি প্রয়োগ থেকে 46336 টির মতো পদ পেতে পারি।

কে একই ফাংশন:

  • কে 2, 37 টি অক্ষর: {{x#y@&~_lin[y:1+!1+/y;1+\y]}[x]/2 4}
  • k4, 36 টি অক্ষর: {{x#y@&~(y:2+!1+/y)in\:1+\y}[x]/2 4}

2

জাভা - 183 158

আমি এটাই সবচেয়ে বেশি গল্ফ করেছি এবং এতে আমি গর্বিত! (যদিও এটি চার্টের শীর্ষের কাছাকাছি নেই (কারণ এটি জাভা))

পরামর্শের জন্য পিটার টেলরকে ধন্যবাদ

class f{public static void main(String[]a){int q=1,m=Byte.valueOf(a[0]),w=2,n[]=new int[m*m*2];for(n[q+=w]=1;m-->0;){System.out.println(w);for(;n[++w]>0;);}}}

বড় -

public class f {
    public static void main(String[] a) {
        int q = 1, m = Byte.valueOf(a[0]), w = 2, n[] = new int[m * m * 2];
        for (n[q += w] = 1; m-- > 0;) {
            System.out.println(w);
            for (; n[++w] > 0;)
                ;
        }
    }
}

লুপের জন্য সেই অভ্যন্তরটি বেশ চিত্তাকর্ষকভাবে আবদ্ধ, তবে আমি মনে করি আপনি কয়েকটি বাইট সংরক্ষণ করতে পারেন। Byte.valueOfতিনটি সাশ্রয় করে এবং যেহেতু প্রশ্নটি ইনপুটটির পরিসর নির্দিষ্ট করে না বলে আমি মনে করি এটি গ্রহণযোগ্য হওয়া উচিত। লুপগুলির বাইরে, mকেবল আরম্ভের জন্য ব্যবহৃত হয় n, তাই k++<mহতে পারে m-->0, kসম্পূর্ণরূপে মুছে ফেলা । পূর্ববর্তী আরম্ভকারী int[] nহিসাবে হিসাবে আরম্ভ করা যেতে পারে int n[]nকখনও কখনও অন্য মান আছে 1, তাই n[...]!=0হতে পারে n[...]>0। ইনিশিয়ালাইজারটি তখন প্রথম forলুপের আরম্ভকারী অংশে পরিণত হতে পারে ।
পিটার টেলর

এবং যদি আপনি পরিত্রাণ পান uএবং কেবল ব্যবহার ++wকরেন তবে সেট করার দরকার নেই n[q]বা n[w]। একটি বাগ আছে, এর মধ্যে আপনি nকখন শেষের দিকে m==2ছুটে যাবেন, যা প্রথম দিকে শুরু করে সবচেয়ে ভাল ফিক্সড বলে মনে হচ্ছেn=new int[2*m*m] , , তবে আমার মনে হয় এটি 157 বাইটে নেমে গেছে।
পিটার টেলর

আমি লুপের জন্য প্রথমটির প্রাথমিকের অংশ হিসাবে ইনিশিয়ালিসায়ার হওয়ার অর্থ যা ছিল for(int q=1,w=2,m=...,n[]=...;m-->0;){...সেমিকোলন সংরক্ষণ করছিল ।
পিটার টেলর

1

পাইথন 2 - 77 বাইট


কোড:

n=input();x=1;b=range(2,n*n)
while n:v=b.pop(0);x+=v;print v;b.remove(x);n-=1

স্টিডিন থেকে আগত ইনপুট ব্যতীত @ হিস্টোক্র্যাটের সমাধান হিসাবে একই কাজ করে।


1

পাইথন 2 - 68

R=[1]
s=0
n=input()
while n:s+=1+(s+1in R);R+=[R[-1]+s];print s;n-=1

0

জেলি , 15 বাইট

SƤŻ‘µṀ‘Rḟ
2dz¡ḣ

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

6 এর ইনপুটটিতে মেমরি ত্রুটি।

কিভাবে এটা কাজ করে

SƤŻ‘µṀ‘Rḟ  Aux. link (monad). Input: part of the desired sequence
SƤŻ‘       Sum of prefixes, then prepend a zero and increment
           This is a list of numbers to exclude from the next iteration
    µ      Re-focus on the above
     Ṁ‘Rḟ  Create range 1..Max + 1, then remove all elements of the above
           +1 is needed to progress from [2] to [2,4]

2dz¡ḣ  Main link (monad). Input: n, number of terms
2dz¡   Starting from 2, apply aux. link n times
    ḣ  Take n elements from the beginning

আরও দক্ষ সংস্করণ, 16 বাইট

SƤŻ‘µṀ‘Rḟḣ³
2ÇÐL

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

এই জে উত্তর থেকে একটি ধারণা ব্যবহার করে । প্রতিটি পুনরাবৃত্তি কাঙ্ক্ষিত দৈর্ঘ্যে কাটা, এবং ফিক্সপয়েন্ট নিন। আমি (সর্বোচ্চ + 1 S) এর পরিবর্তে (যোগফল) ব্যবহার করে ভেবেছিলাম Ṁ‘, তবে আমি এর সঠিকতার গ্যারান্টি দিতে পারি না।


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