একটি সর্পিল ক্রম


29

পটভূমি

OEIS ক্রম A272573 হেক্সাগোনাল গ্রিডে একটি সর্পিলকে নিম্নরূপ বর্ণনা করেছে:

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

ক্রম শুরু

1, 2, 3, 4, 5, 6, 7, 4, 6, 8, 5, 9, 8, 10, 2, 11, ...

সর্পিল প্যাটার্নের একটি চিত্র এখানে দেওয়া হয়েছে: এখানে চিত্র বর্ণনা লিখুন

  • a(11) != 1কারণ তখন 3এবং 1দুটি জায়গায় সংলগ্ন হবে।
  • a(11) != 2কারণ তখন 3এবং 2দুটি জায়গায় সংলগ্ন হবে।
  • a(11) != 3কারণ তখন 3নিজেই সংলগ্ন হবে।
  • a(11) != 4কারণ তখন 3এবং 4দুটি জায়গায় সংলগ্ন হবে।
  • অতএব a(11) = 5

চ্যালেঞ্জ

চ্যালেঞ্জটি এমন একটি প্রোগ্রাম লিখুন যা A272573 গণনা করে । এটি , তাই সংক্ষিপ্ততম কোড জিততে পারে।


চিত্রটি এখানে অবরুদ্ধ বলে আমি দেখতে পাচ্ছি না, তাই হয়ত আমি কিছু মিস করছি তবে আপনার উদাহরণটি একটি (11) = 4 দেখায় তবে আপনার ক্রম তালিকায় একটি (11) 5 হয়
জিওবিটস

কেবল একটি ভুল catch এটি ধরার জন্য ধন্যবাদ।
পিটার কেজি

7
এই OEIS ক্রমটি আপাতদৃষ্টিতে আপনার দ্বারা জমা দেওয়া হয়েছিল। খুশী হলাম। :)
আর্নৌল্ড

এন এর সীমা কত? সময়সীমা আছে?
21

5
হেক্সাগনির উত্তরের অপেক্ষায় ...
জোনাথন অ্যালান

উত্তর:


23

জাভাস্ক্রিপ্ট (ES6),  267 .. 206  199 বাইট

অনুক্রমের প্রথম পদগুলিকে সম্বলিত একটি অ্যারে প্রদান করে।এন

n=>(F=v=>++i<n?F([...v,(A=N[i]=[1,!j++||d+1,j%L?d:(j%=L*6)?++d:L++&&d++].map(k=>N[k=i-k].push(i)&&k),g=k=>v[E='every']((V,x)=>V-k|N[x][E](y=>A[E](z=>v[y]-v[z])))?k:g(-~k))()]):v)([L=1],N=[[i=j=d=0]])

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

কিভাবে?

সংজ্ঞা

কনভেনশন দ্বারা, আমরা কর্নার-সেলকে এমন একটি ঘর বলব যা সর্পিল এবং পাশের-কোষের পূর্ববর্তী স্তরের সাথে একই স্তরের মিল রয়েছে যেখানে একটি স্তর রয়েছে যার সাথে পূর্ববর্তী স্তরটির সাথে দুটি প্রান্ত মিল রয়েছে। হিসাবে প্রস্তাব Ourous মাধ্যমে আমরা তাদের ক্রম-1 কোষ এবং অর্ডার-2 কোষ যেমন যথাক্রমে মনে করতে পারেন।

কর্নার-সেলগুলি নীচে হলুদে দেখানো হয়েছে। অন্যান্য সমস্ত কক্ষগুলি সাইড-সেল হয় (কেন্দ্রের ঘরটি ছাড়া যা একটি বিশেষ ক্ষেত্রে)।

কোষের ধরণ

সেল প্রতিবেশী সম্পর্কে

আমাদের সত্যিই গ্রিডের ঘরগুলির স্থানাঙ্কগুলির ট্র্যাক রাখতে হবে না। আমাদের কেবল যে জিনিসটি জানতে হবে তা হ'ল যে কোনও সময় সর্পিলের প্রতিটি কক্ষের প্রতিবেশী কক্ষগুলির তালিকা।

নিম্নলিখিত চিত্রগুলিতে, পূর্ববর্তী স্তরের প্রতিবেশীদের হালকা ছায়ায় এবং গা layer় ছায়ায় বর্তমান স্তরে অতিরিক্ত প্রতিবেশী দেখানো হয়েছে।

আগের কোষগুলির মধ্যে একটি ঘরে 2 প্রতিবেশী থাকে যদি:

  • এটি একটি নতুন স্তরের প্রথম পাশের ঘর ( 8 টির মতো )
  • বা এটি কোণার ঘর, তবে স্তরটির শেষেরটি নয় ( 9 এর মতো )

2 প্রতিবেশী

পূর্ববর্তী কোষগুলির মধ্যে একটি ঘরে 3 প্রতিবেশী থাকে যদি:

  • এটি একটি সাইড-সেল, তবে স্তরটির প্রথমটি নয় ( 10 এর মতো )
  • বা এটি বর্তমান স্তরের শেষ কোণার ঘর (যেমন ১৯ )

3 প্রতিবেশী

সেল প্রতিবেশীদের বাস্তবায়ন

1আমিএনএকজন[এন]

1-1

[                    //
  1,                 // the previous cell is always a neighbor of the current cell
  !j++ || d + 1,     // if this is not the first cell of the layer, the cell at -(d + 1)
                     // is a neighbor (otherwise, we insert 1 twice; doing it that way
                     // saves bytes and having duplicate neighbors is not a problem)
  j % L ?            // if this is a side-cell:
    d                //   the cell at -d is a neighbor
  :                  // else (corner-cell):
    (j %= L * 6) ?   //   if this is not the last cell:
      ++d            //     insert the dummy duplicate neighbor at -(d + 1); increment d
    :                //   else (last cell):
      L++ && d++     //     the cell at -d is a neighbor; increment L; increment d
]                    //

উপরের কোডে:

  • এল1
  • 16×এল

map()আমি-

.map(k =>
  N[k = i - k].push(i) && k
)

অনুক্রমের পরবর্তী শব্দটি সন্ধান করা

এনবনাম[এন]

( g =                 // g = recursive function taking
  k =>                // the candidate value k
    v.every((V, x) => // for each previous cell of value V at position x, make sure that:
      V - k           //   V is not equal to k
      |               //   OR
      N[x].every(y => //   for each neighbor y of x:
        A.every(z =>  //     for each neighbor z of the current cell:
          v[y] - v[z] //       the value of y is not equal to the value of z
        )             //     end
      )               //   end
    )                 // end
    ?                 // if the above conditions are fulfilled:
      k               //   stop recursion and return k
    :                 // else:
      g(-~k)          //   try again with k + 1
)()                   // initial call to g with k undefined (this will cause V - k to be
                      // evaluated as NaN and force the 1st iteration to fail)

দুর্দান্ত ব্যাখ্যা। একটি সম্ভাব্য উন্নতি: অনুভূমিক স্ক্রোলিংয়ের প্রয়োজনীয়তা ছাড়াই কোড ব্লকগুলিতে সম্পূর্ণরূপে দৃশ্যমান (গল্ফ কোডটির জন্য কোনও ব্যাপার নয়) ব্যাখ্যা করা। ফায়ারফক্সে দেখছি, প্রথম ব্যাখ্যা কোড ব্লকে 5 টি লুকানো কলাম এবং দ্বিতীয়টিতে 6 টি লুকানো কলাম রয়েছে।
ট্রাইকোপলাক্স

@ থ্রিচোপ্লেক্স আপনার মন্তব্য এবং পরামর্শের জন্য আপনাকে ধন্যবাদ। আপনি ফায়ারফক্সের কোন সংস্করণ এবং কোন প্ল্যাটফর্ম ব্যবহার করছেন তা নির্দিষ্ট করতে পারেন? আমি সবসময় ব্যাখ্যা ব্লকগুলিকে ফর্ম্যাট করার চেষ্টা করি যাতে কোনও অনুভূমিক স্ক্রোলিংয়ের প্রয়োজন না হয়। আমি এখনই ফায়ারফক্স 65 / Win10 এ আছি এবং আমার কোনও লুকানো কলাম নেই।
Arnauld

আমি ঘরে পৌঁছে ফায়ারফক্সের সংস্করণটি পরীক্ষা করে দেখব, তবে এটি হতে পারে কারণ আমি ফেডোরায় আছি। অন্য একটি ওএস চেক করবে এবং আপনাকে
জানাবে

1
এটি ওএস অনুসারে পৃথক বলে মনে হচ্ছে।
এমএসইতে

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

7

পরিষ্কার , 284 279 272 262 বাইট

import StdEnv
l=[0,-1,-1,0,1,1]
c(u,v)(p,q)=(u-p)^2+(v-q)^2<2||(u-p)*(q-v)==1
$[h:t]m=hd[[e: $t[(h,e):m]]\\e<-[1..]|and[e<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]]

$(scan(\(a,b)(u,v)=(a-u,b-v))(0,0)[(i,j)\\n<-[1..],i<-[1,1:l]&j<-l,_<-[max(~j<<i)1..n]])[]

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

ক্রমটি চিরকালের জন্য উত্পন্ন করে।

ষড়ভুজ ম্যাপিং

কোডগুলির বেশিরভাগই হেক্সাগনকে ম্যাপিংয়ে অনন্যভাবে (x,y)স্থানাঙ্কগুলিতে চলে যায় যাতে সংলগ্নতা নির্ধারণ করার জন্য একটি একক, সরল ফাংশন রয়েছে যা সমস্ত পয়েন্ট ম্যাপিংয়ের জন্য ধারণ করে।

ম্যাপ করা পয়েন্টগুলি এর মতো দেখতে:

              ---
        --- < 2,-2> ---       x-axis ___.X'
  --- < 1,-2> === < 2,-1> ---  /__.X'
< 0,-2> === < 1,-1> === < 2, 0>'
  === < 0,-1> === < 1, 0> ===
<-1,-1> === < 0, 0> === < 1, 1>
  === <-1, 0> === < 0, 1> ===
<-2, 0> === <-1, 1> === < 0, 2>.__
  --- <-2, 1> === <-1, 2> ---  \  'Y.___
        --- <-2, 2> ---       y-axis    'Y.
              ---

সেখান থেকে, সংলগ্নতা নির্ধারণ করা তুচ্ছ এবং এটি ঘটে যখন:

  • x1 == x2 এবং abs(y1-y2) == 1
  • y1 == y2 এবং abs(x1-x2) == 1
  • y1 == y2 - 1 এবং x2 == x1 - 1
  • y1 == y2 + 1 এবং x2 == x1 + 1
  • x1 == x2 এবং y1 == y2

পয়েন্ট জেনারেশন

লক্ষ্য করুন যে একটি সর্পিলে ষড়ভুজটি অতিক্রম করার সময় প্রতিটি স্তরের জন্য পার্থক্যগুলি পুনরাবৃত্তি করে n:

  1. n পদক্ষেপ (1,0)
  2. n-1 পদক্ষেপ (1,-1)
  3. n পদক্ষেপ (0,-1)
  4. n পদক্ষেপ (-1,0)
  5. n পদক্ষেপ (-1,1)
  6. n পদক্ষেপ (0,1)

এটি এই ক্রমের উপসর্গের যোগফল গ্রহণ করে সঠিক ক্রমে পয়েন্টগুলি তৈরি করে:

scan(\(a,b)(u,v)=(a-u,b-v))(0,0)[(i,j)\\n<-[1..],i<-[1,1:l]&j<-l,_<-[max(~j<<i)1..n]]

একসাথে এনেছি

কোডটি যা আসলে প্রশ্ন থেকে ক্রমটি সন্ধান করে তা হ'ল:

$[h:t]m=hd[[e: $t[(h,e):m]]\\e<-[1..]|and[e<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]]

যা ঘুরেফিরে বেশিরভাগ ফিল্টার করে and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]

এই ফিল্টারটি mইতিমধ্যে ম্যাপ করা পয়েন্টগুলির তালিকা থেকে পয়েন্ট নেয় :

  • যে কোনওটির সমান প্রাকৃতিক সংখ্যাগুলি উপেক্ষা করা j
  • সংলগ্ন প্রতিটি (i,j)যেখানেip
  • প্রতিটি (p,q)যেখানে মান qসমানv
  • প্রত্যেক জন্য (u,v)যেখানে uবর্তমান বিন্দু সংলগ্ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.