সর্পিল পাড়া


19

যদি আমরা প্রাকৃতিক সংখ্যাগুলি নিয়ে থাকি এবং এগুলি ঘড়ির কাঁটা অনুসারে একটি সর্পিল হিসাবে রোল আপ করি তবে আমরা নিম্নলিখিত অসীম সর্পিলটি দিয়ে শেষ করব:

                  ....--57--56
                             |
36--35--34--33--32--31--30  55
 |                       |   |
37  16--15--14--13--12  29  54
 |   |               |   |   |
38  17   4---3---2  11  28  53
 |   |   |       |   |   |   |
39  18   5   0---1  10  27  52
 |   |   |           |   |   |
40  19   6---7---8---9  26  51
 |   |                   |   |
41  20--21--22--23--24--25  50
 |                           |
42--43--44--45--46--47--48--49

সেই সর্পিলটিতে কিছু নম্বর দেওয়া আপনার কাজটি প্রতিবেশীদের নির্ধারণ করা - যার অর্থ উপরে, বাম, ডান এবং নীচে উপাদান।

উদাহরণ

আমাদের যদি একটু নজর থাকে তবে 27দেখতে পাচ্ছি যে এর নিম্নলিখিত প্রতিবেশী রয়েছে:

  • উপরে: 28
  • বাকি আছে: 10
  • ডানে: 52
  • নিচে: 26

সুতরাং আউটপুট হবে: [28,10,52,26]

বিধি

  • ইনপুটটি কোনও ডিফল্ট আই / ও ফর্ম্যাটে একটি সংখ্যা হবেn0
  • আউটপুট কোনও (ধারাবাহিক!) ক্রমে 4 সংখ্যার প্রতিবেশীর একটি তালিকা / ম্যাট্রিক্স / .. হবে
  • আপনি 0 এর পরিবর্তে 1 দিয়ে শুরু হওয়া একটি সর্পিল দিয়ে কাজ করতে পারেন, তবে আপনার উত্তরটিতে এটি নির্দিষ্ট করা উচিত

উদাহরণ

আউটপুটটি ফর্ম্যাটে রয়েছে [above,left,right,below]এবং 0-ভিত্তিক সর্পিল ব্যবহার করে:

0  ->  [3,5,1,7]
1  ->  [2,0,10,8]
2  ->  [13,3,11,1]
3  ->  [14,4,2,0]
6  ->  [5,19,7,21]
16  ->  [35,37,15,17]
25  ->  [26,24,50,48]
27  ->  [28,10,52,26]
73  ->  [42,72,74,112]
101  ->  [100,146,64,102]
2000  ->  [1825,1999,2001,2183]
1000000  ->  [1004003,1004005,999999,1000001]

উত্তর:


6

আর , 156 বাইট

function(n){g=function(h)c(0,cumsum(h((4*(0:(n+2)^2)+1)^.5%%4%/%1/2)))
x=g(sinpi)
y=g(cospi)
a=x[n]
b=y[n]
which(x==a&(y==b+1|y==b-1)|y==b&(x==a+1|x==a-1))}

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

  • @ আরএন এর চেয়ে কিছুটা ভিন্ন পদ্ধতির থেকে অন্য আর উত্তর পোস্ট করেছেন
  • 1-ইন্ডেক্স
  • প্রতিবেশীদের সর্বদা আরোহী মান অনুসারে বাছাই করা হয়
  • অর্ধ সংখ্যা ( ইত্যাদি , ইত্যাদি) এর চেয়ে আরও সুনির্দিষ্ট by টি বাইট অপসারণ roundএবং ব্যবহার করে সংরক্ষণ করাcospi(x)/sinpi(x)cos(x*pi)/sin(x*pi)0.51.5
  • ফলাফল একই হওয়ায় y স্থানাঙ্কগুলিতে বিয়োগ বিয়োগ করে অন্য একটি বাইট সংরক্ষণ করা হয়েছে (কেবল উপরে / নীচে প্রতিবেশীরা বিপরীত)

ব্যাখ্যা:

যদি আমরা মানগুলির ম্যাট্রিক্স স্থানাঙ্কগুলি দেখি, যেখানে প্রথম 0স্থানটি রেখেছি তা বিবেচনা করে x=0, y=0সেগুলি হয়:

x = [0,  1,  1,  0, -1, -1, -1,  0,  1,  2,  2,  2,  2,  1,  0, ...] 
y = [0,  0,  1,  1,  1,  0, -1, -1, -1, -1,  0,  1,  2,  2,  2, ...]

xস্থানাঙ্ক অনুসরণ A174344 OEIS ক্রম রিকার্সিভ সূত্র সঙ্গে:

a(1) = 0, a(n) = a(n-1) + sin(mod(floor(sqrt(4*(n-2)+1)),4)*pi/2)

একই সূত্রটি yম্যাট্রিক্স স্থানাঙ্কের জন্য ধারণ করে , তবে cosপরিবর্তে sinএবং উপেক্ষিত সহ:

a(1) = 0, a(n) = a(n-1) - cos(mod(floor(sqrt(4*(n-2)+1)),4)*pi/2)

সুতরাং, আর-এ আমরা sinpi/cospiপরামিতি হিসাবে এই ফাংশনটিতে সূত্রটি অনুবাদ করতে পারি :

g=function(h)c(0,cumsum(h((4*(0:(n+2)^2)+1)^.5%%4%/%1/2)))

এবং আমরা দুটি সমন্বয়কারী ভেক্টর উত্পাদন করি (আমরা y কমর্ডগুলি তুচ্ছ করি না কারণ আমরা একই ফলাফল পাব, কেবল উপরের / নীচে প্রতিবেশীরা উল্টে):

x=g(sinpi)
y=g(cospi)

নোট করুন যে আমরা (n+2)^2সমন্বয়গুলি তৈরি করেছি , যা উভয় nএবং তাদের প্রতিবেশী সমন্বিত ন্যূনতম প্রয়োজনীয় স্থানাঙ্কের চেয়ে বেশি (একটি শক্ত বাঁধাই হবে (floor(sqrt(n))+2)^2তবে দুর্ভাগ্যক্রমে "গল্ফ" কম)।

অতএব, এখন আমাদের সকল স্থানাঙ্ক রয়েছে, আমরা প্রথমে a,bআমাদের সাথে সম্পর্কিত স্থানাঙ্কগুলি অনুসন্ধান করি n:

a=x[n]
b=y[n]

অবশেষে আমরা তাদের প্রতিবেশীদের অবস্থানগুলি নির্বাচন করি, যেমন:

  • উপরে / ডাউন প্রতিবেশী where x == a and y == b+1 or b-1
  • ডান / বাম প্রতিবেশী where y == b and x == a+1 or a-1

ব্যবহার :

which(x==a&(y==b+1|y==b-1)|y==b&(x==a+1|x==a-1))

"কিছুটা আলাদা" :)
এনজিএম

@ জিএনএম: এহহ ... যেহেতু আপনি যে রোসটা কোডটি ব্যবহার করেছিলেন তা আমার কাছে বেশ "অস্পষ্ট", তাই আমি ধরে নিয়েছি যে কোনওভাবেই আমার
ওইআইএস

4

পার্ল 6 , 94 83 বাইট

{আমার \ s = 0, | [+] ফ্ল্যাট ((1, আমি ... ) জেডএক্স ফ্ল্যাট (1..Inf জেড 1..আইএনএফ)); মানচিত্র {প্রথম: কে, এস [$ _] + $ ^ ডি, গুলি}, আমি, -1,1, -i}

{my \s=0,|[\+] flat((1,*i...*)Zxx(1,1.5...*));map {first :k,s[$_]+$^d,s},i,-1,1,-i}

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

sজটিল সংখ্যা হিসাবে উপস্থাপিত সর্পিল স্থানাঙ্কগুলির একটি অলস, অসীম তালিকা। এটি অন্য দুটি অসীম তালিকা থেকে নির্মিত: 1, *i ... *তালিকা তৈরি করে 1, i, -1, -i ...1, 1.5 ... *তালিকা তৈরি করে 1, 1.5, 2, 2.5, 3, 3.5 ...। তালিকা রেপ্লিকেশন সঙ্গে একসঙ্গে এই দুটি তালিকা জিপ করা হচ্ছে উৎপন্ন প্রতিটি সর্পিল থেকে ধাপের তালিকা পরবর্তী তুল্য: 1, i, -1, -1, -i, -i, 1, 1, 1, i, i, i ...। (তালিকার অনুলিপি অপারেটরের ডান হাতের যুক্তিগুলির ভগ্নাংশের অংশগুলি বাতিল করা হয়েছে) [\+]) এই তালিকায় ত্রিভুজাকার সংযোজন হ্রাস ( ) এবং সামনের দিকে 0 টি আটকানো সর্পিল স্থানাঙ্কের তালিকা তৈরি করে।

অবশেষে, জটিল সংখ্যা থেকে শুরু s[$_]( $_ফাংশন একমাত্র যুক্তি হচ্ছে), আমরা আপ ইনডেক্স (দেখুন first :k) জটিল সংখ্যার সর্পিল যার দ্বারা যে নম্বর থেকে অফসেট হয় i, -1, 1, এবং -i


4

ব্রেন-ফ্লাক , 238 বাইট

((){[()]<((({}[((()))]<>)<<>{((([{}]({}))([{}]{})())[()]){({}[()])<>}{}}>)<<>({}<(((({}{})()){}<>({}))()())<>>)<>>()())<>{{}((()()()[({})]){}<>({}<{}>))(<>)}>}{}){<>((((())()())()())()())(<>)}{}{({}[()]<<>({}<>)<>({}<({}<({}<>)>)>)<>>)}<>

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

আউটপুট বামদিকে, উপরে, ডানদিকে, নীচে।

ব্যাখ্যা

# If n is nonzero:
((){[()]<

  ((

    # Push 1 twice, and push n-1 onto other stack.
    ({}[((()))]<>)

    # Determine how many times spiral turns up to n, and whether we are on a corner.
    # This is like the standard modulus algorithm, but the "modulus" used
    # increases as 1, 1, 2, 2, 3, 3, ...
    <<>{((([{}]({}))([{}]{})())[()]){({}[()])<>}{}}>

  # Push n-1: this is the number behind n in the spiral.
  )<

    # While maintaining the "modulus" part of the result:
    <>({}<

      # Push n+2k+1 and n+2k+3 on top of n-1, where k is 3 more than the number of turns.
      # n+2k+1 is always the number to the right in the direction travelled.
      # If we are on a corner, n+2k+3 is the number straight ahead.
      (((({}{})()){}<>({}))()())<>

    >)<>

  # Push n+1.  If we are on a corner, we now have left, front, right, and back
  # on the stack (from top to bottom)
  >()())

  # If not on a corner:
  <>{{}

    # Remove n+2k+3 from the stack entirely, and push 6-2k+(n+1) on top of the stack.
    ((()()()[({})]){}<>({}<{}>))

  (<>)}

>}{})

# If n was zero instead:
{

  # Push 1, 3, 5, 7 on right stack, and implicitly use 1 (from if/else code) as k.
  <>((((())()())()())()())

(<>)}{}

# Roll stack k times to move to an absolute reference frame
# (switching which stack we're on each time for convenience)
{({}[()]<<>({}<>)<>({}<({}<({}<>)>)>)<>>)}<>

খুব চিত্তাকর্ষক! আমি অনুমান করি আপনি অন্যদের মতো পুরো সর্পিল উত্পাদন করছেন না, আপনি কি?
ბიმო

3

এমএটিএল , 15 বাইট

2+1YLtG=1Y6Z+g)

ইনপুট এবং আউটপুট 1-ভিত্তিক।

আউটপুট সেই ক্রমে বাম, নীচে এবং উপরে এবং ডান প্রতিবেশী দেয়।

এটি অনলাইন চেষ্টা করুন! অথবা টিআইও-তে শেষ হওয়া শেষ দুটি বাদে সমস্ত পরীক্ষার কেস যাচাই করুন

2+      % Implicit input: n. Add 2. This is needed so that
        % the spiral is big enough
1YL     % Spiral with side n+2. Gives a square matrix
t       % Duplicate
G=      % Compare with n, element-wise. Gives 1 for entry containing n
1Y6     % Push 3×3 mask with 4-neighbourhood
Z+      % 2D convolution, keeping size. Gives 1 for neighbours of the
        % entry that contained n
g       % Convert to logical, to be used as an index
)       % Index into copy of the spiral. Implicit display

2
1YL- ম্যাটল্যাবের একটি spiralফাংশন আছে? ম্যাটল্যাব কখন ম্যাথমেটিকায় পরিণত হয়েছিল ?!
সূন্দর - মনিকা

হ্যাঁ, আমি 1 ওয়াইএল বলতে কী বোঝায় তা দেখার পরে এটিকে ডাকাকডকগো-এড করেছিলাম এবং এই কোড এন্ট্রিটি কেবলমাত্র এটি একটি ম্যাটল্যাব জিনিস এবং কেবল একটি ম্যাটল সুবিধামূলক ফাংশন নয় তা নিশ্চিত করার জন্য আমি খুঁজে পেলাম। আমি ভাবতে শুরু করেছি যে এটি গল্ফিংয়ের জন্য আপনি এমএটিএল-তে যোগ করেছেন এমন কিছু হতে পারে, যতক্ষণ না আমি এন্ট্রিটি দেখি।
সূন্দর - মনিকা 18

@ সুন্দর অদ্ভুত যে এটি আর নথিভুক্ত করা হয়নি
লুইস মেন্ডো

3

আর , 172 বাইট

function(x,n=2*x+3,i=cumsum(rep(rep(c(1,n,-1,-n),l=2*n-1),n-seq(2*n-1)%/%2))){F[i]=n^2-1:n^2
m=matrix(F,n,n,T)
j=which(m==x,T)
c(m[j[1],j[2]+c(-1,1)],m[j[1]+c(-1,1),j[2]])}

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

এটি আর, সুতরাং স্পষ্টতই উত্তর 0-সূচী হয়।

বেশিরভাগ কাজ ম্যাট্রিক্স তৈরি করছে। কোড দ্বারা অনুপ্রাণিত: https://rosettacode.org/wiki/Spiral_matrix#R


2

জাভাস্ক্রিপ্ট (ES6), 165 বাইট

সঙ্গে সূচকের মুদ্রণ alert()

f=(n,x=w=y=n+2)=>y+w&&[0,-1,0,1].map((d,i)=>(g=(x,y,A=Math.abs)=>(k=A(A(x)-A(y))+A(x)+A(y))*k+(k+x+y)*(y>=x||-1))(x+d,y+~-i%2)-n||alert(g(x,y)))|f(n,x+w?x-1:(y--,w))

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

কিভাবে?

এক্স,Yজেডআমিএক্স,Y সঙ্গে সর্পিল এর:

একজনএক্স,Y=||এক্স|-|Y||+ +|এক্স|+ +|Y|
এসএক্স,Y={1,যদি Yএক্স-1,যদি Y<এক্স
আমিএক্স,Y=একজনএক্স,Y2+ +(একজনএক্স,Y+ +এক্স+ +Y)×এসএক্স,Y

( এই উত্তরটি ম্যাথ.স্ট্যাকেক্সেক্সঞ্জ থেকে গৃহীত হয়েছে)


এটি ছোট সংখ্যার সাথে ঠিকঠাক কাজ করছে বলে মনে হচ্ছে তবে 2000 এর মতো একটি বৃহত সংখ্যার সাথে এটি পরীক্ষা করার সময় আমি একটি ত্রুটি পেয়েছি t tio.run এ ত্রুটি: RangeError: Maximum call stack size exceededএবং ব্রাউজার কনসোলে ত্রুটি : InternalError: too much recursion. আমি কি ভুল কিছু করছি?
রাত 2

1
@ নাইট 2 পুনরাবৃত্তির সংখ্যা বৃদ্ধি পায় 4এন2, তাই কল স্ট্যাক দ্রুত উপচে পড়ে। একই ধরণের সীমাবদ্ধতা বেশিরভাগ জেএস পুনরাবৃত্ত উত্তরের ক্ষেত্রে প্রযোজ্য, যদিও সঠিক সীমাটি যে প্ল্যাটফর্মটিতে চলছে তার উপর নির্ভর করে।
আর্নৌল্ড


1

পিএইচপি (> = 5.4), 208 বাইট

<?$n=$argv[1];for(;$i++<($c=ceil(sqrt($n))+($c%2?2:3))**2;$i!=$n?:$x=-$v,$i!=$n?:$y=+$h,${hv[$m&1]}+=$m&2?-1:1,$k++<$p?:$p+=$m++%2+$k=0)$r[-$v][+$h]=$i;foreach([0,1,0,-1]as$k=>$i)echo$r[$x+$i][$y+~-$k%2].' ';

এটি চালানোর জন্য:

php -n -d error_reporting=0 <filename> <n>

উদাহরণ:

php -n -d error_reporting=0 spiral_neighbourhoods.php 2001

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

মন্তব্য:

  • -d error_reporting=0বিকল্প নয় আউটপুট নোটিশ / সতর্কবার্তা করতে ব্যবহৃত হয়।
  • এই সর্পিলটি শুরু হয় 1 দিয়ে।

কিভাবে?

আমি এই উত্তরের পরিবর্তিত সংস্করণ দিয়ে সর্পিলটি তৈরি করছি 2 টি মাত্রিক অ্যারেতে ।

আমি nসর্বদা সর্পিলটিতে অতিরিক্ত বৃত্তাকার সংখ্যার (উপরে / নীচে / বাম / ডানটির অস্তিত্বের গ্যারান্টি) পেতে একটি সূত্র দিয়ে ইনপুটটির ভিত্তিতে সর্পিলটির আকারের বিষয়ে সিদ্ধান্ত নিয়েছি । সংখ্যার অতিরিক্ত রাউন্ডের অর্থ +2উচ্চতা এবং+2 2 মাত্রিক অ্যারের প্রস্থ।

সুতরাং যদি nসর্বাধিক আকারের সর্পিলের মধ্যে অবস্থিত হয় 3*3, তবে উত্পন্ন সর্পিল হবে 5*5

পেঁচানো আকার c*cযেখানে c = ceil(sqrt(n)) + k, যদি ceil(sqrt(n))বিজোড় হয়, তাহলে k2 এবং যদি ceil(sqrt(n))এমনকি হয়, তাহলে k3।

উদাহরণস্বরূপ, উপরের সূত্রটি এর ফলাফল করবে:

  • তাহলে n = 1তারপর c = 3এবং সর্পিল আকার হবে3*3
  • তাহলে n <= 9তারপর c = 5এবং সর্পিল আকার হবে5*5
  • তাহলে n <= 25তারপর c = 7এবং সর্পিল আকার হবে7*7
  • তাহলে n <= 49তারপর c = 9এবং সর্পিল আকার হবে9*9
  • এবং আরও ...

সর্পিল উৎপাদিত হলেও আমি দোকানে xএবং yএর nএবং প্রজন্মের পর, আমি আউটপুট উপরে / উপাদান নিচে / এটি ডান বাম /।

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