উলামের সর্পিলের পুরষ্কার


17

উলমের সর্পিল গণিতের ক্ষেত্রে সত্যই আকর্ষণীয়, তবুও চমকপ্রদ topic এটি কীভাবে বিশদে কাজ করে তা এখানে পাওয়া যাবে , তবে একটি সংক্ষিপ্ত সারাংশ যেমন ব্যাখ্যা করা যায়:

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

উদ্দেশ্য

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

উদাহরণস্বরূপ, ইনপুট 3 দেওয়া, আপনার প্রোগ্রাম আউটপুট করা উচিত 5,3,2,7কারণ 3 টি সারি নিম্নলিখিত সর্পিল উত্পাদন করে:

5 4 3 <-- first row has the primes 5 and 3
6 1 2 <-- second row has the prime 2
7 8 9 <-- third row has the prime 7

যেহেতু এটি একটি কোড গল্ফ, অল্প বাইটের জবাব (যতই অদক্ষই হোক না কেন) এর উত্তর! স্ট্যান্ডার্ড লুফোলগুলি গ্রহণযোগ্য নয়।


একটি পিছনে কমা অনুমোদিত? বা আরও ভাল, স্থান পৃথক, উদাহরণস্বরূপ `` `5 3 2 7```
টম কার্পেন্টার

5
যতক্ষণ না এটি মানব পঠনযোগ্য এবং প্রাইমগুলি আমাকে বলতে পারে, নির্দ্বিধায়।
অ্যাডিসন ক্রম্প

উত্তর:


8

পাইথ, 20 বাইট

f}TPTsuC+R=hZ_GtyQ]]

অনলাইনে চেষ্টা করুন: বিক্ষোভ

এই কোডটি সম্পূর্ণ উলমের সর্পিল উত্পন্ন করে, প্রাইমগুলির জন্য সমস্ত লাইন এবং ফিল্টারকে সংযুক্ত করে।

ব্যাখ্যা:

f}TPTsuC+R=hZ_GtyQ]]   implicit: Z = 0
      u           ]]   reduce, start with G = [[]]
               tyQ     for H in [0, 1, ..., 2*input-2] do:
             _G           reverse the order of the lines
        +R=hZ             append Z + 1 at the end of each line, 
                          updating Z each time with the new value Z + 1
       C                  update G with the transposed of ^
                       this gives the Ulam's spiral
     s                 combine all lines to a big list of numbers
f                      filter for numbers T, which satisfy:
 }TPT                    T appears in the prime-factorization of T
                         (<==> T is prime)

6

ম্যাটল্যাব, ৪৮

a=fliplr(spiral(input(''))');disp(a(isprime(a)))

মূলত এটি প্রয়োজনীয় আকারের একটি সর্পিল তৈরি করে (ব্যবহারকারীর কাছ থেকে অনুরোধ করা), তারপরে এটি এমনভাবে সাজিয়ে তোলে যাতে এটি সঠিক সারির ক্রমে উপস্থিত হয়। এটি একটিতে সঞ্চিত হয়। এরপরে এটি সমস্ত মান প্রদর্শন করে যা একটি মৌলিক।

আপনি যে কোনও পঠনযোগ্য ফর্ম্যাটটি বলেছিলেন, আমি একটি বাইট সংরক্ষণ করেছি এবং বিতরণের ডিফল্ট আউটপুট () যা (আপনার পরীক্ষার ক্ষেত্রে, n = 3) গেছে:

 5
 3
 2
 7

একটি যুক্ত বোনাস হিসাবে, এটি কোনও সংখ্যাসহ কোনও এন> 0 এর জন্য কাজ করে। উদাহরণস্বরূপ, এন = 10 এর আউটপুট হল:

97
61
59
37
31
89
67
17
13
 5
 3
29
19
 2
11
53
41
 7
71
23
43
47
83
73
79

1
খুব সুন্দর! সেই spiralফাংশনটি জেনে রাখা ভাল
লুইস মেন্ডো

6

সিজেম, 42 33 বাইট

Xali(2*{_W%zY@,Y+:Y,>a+}*e_{mp},`

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

সর্বশেষতম সংস্করণে @ মার্টিনের প্রস্তাবিত উল্লেখযোগ্য উন্নতি রয়েছে।

সর্পিল তৈরির পদ্ধতিটি হ'ল প্রতিটি পদক্ষেপে ম্যাট্রিক্সটি আমাদের এ পর্যন্ত 90 ডিগ্রি ঘোরানো হয়েছে এবং অতিরিক্ত সংখ্যার সাথে একটি সারি যুক্ত করতে হবে। এটি বার (n / 2) * 4বার হয়।

ফলাফল ম্যাট্রিক্সের মানগুলি তখন প্রাইম হওয়ার জন্য ফিল্টার করা হয়।

ব্যাখ্যা:

Xa    Push initial matrix [1].
li    Get input and convert to int.
(2*   Calculate 2*(n-1), which is the number of rotations and row additions needed.
{     Start rotation loop.
  _     Copy current matrix for getting number of rows later.
  W%    Reverse the order of the rows...
  z     ... and transpose the matrix. The combination produces a 90 degree rotation.
  Y     Get next value from variable Y (which is default initialized to 2).
  @,    Rotate previous matrix to top, and get number of rows. This is the number
        of columns after the 90 degree rotation, meaning that it's the length of
        the row to be added.
  Y+    Add first value to row length to get end value.
  :Y    Save it in Y. This will be the first value for next added row.
  ,     Create list of values up to end value.
  >     Slice off values up to start value, leaving only the new values to be added.
  a+    Wrap the new row and add it to matrix.
}*    End of rotation loop.
e_    Flatten matrix into list.
{mp}, Filter list for primes.
`     Convert list to string for output.

2/4*দ্বারা প্রতিস্থাপন করা যেতে পারে 2*, বা আপনি উদ্দেশ্য মত এটি ছেড়ে ফেলেছেন?
ইটিএইচ প্রডাকশনগুলি

@Etproductions এটি সমতুল্য নয় কারণ এটি একটি পূর্ণসংখ্যা বিভাগ। উদাহরণস্বরূপ, ইনপুট 3 এর জন্য ফলাফলটি 4 হওয়া দরকার ually আসলে, এখন আমি এটি সম্পর্কে চিন্তাভাবনা করি, আমি বিশ্বাস করি যে একটি বাইট সংরক্ষণ করতে হবে। (2*সঠিক হওয়া উচিত।
রেটো কোরাডি

5

গণিত 223

এই যথোপযুক্ত মনে কুবা এর কোড একটি ঊলম সর্পিল জন্য। এজন্য আমি এটি একটি সম্প্রদায়ের উইকি হিসাবে জমা দিচ্ছি। আমি কেবল এটি গল্ফ করেছি এবং প্রাইমগুলি বেছে নিয়েছি, যে সারিটি তারা বাস করে তার তালিকাভুক্ত।

r=Range;i=Insert;t=Transpose;s@n_:=#~Select~PrimeQ&/@Nest[With[{d=Length@#,l=#[[-1,-1]]},
Composition[i[#,l+3d+2+r[d+2],-1]&,t@i[t@#,l+2d+1+r[d+1],1]&,i[#,l+d+r[d+1,1,-1],1]&,
t@i[t@#,l+r[d,1,-1],-1] &][#,15]]&,{{1}},(n-1)/2]

উদাহরণ

 s{15]

{{197, 193, 191}, {139, 137}, {199, 101, 97, 181}, {61, 59, 131}, 3 103, 37, 31, 89, 179}, 9 149, 67, 17, 13}, {5, 3, 29}, 1 151, 19, 2, 11, 53, 127}, {107, 41, 7}, {71, 23}, {109, 43, 47, 83, 173}, {73, 79}, 113}, {157, 163, 167}, 211, 223}

প্রদর্শন উন্নতি করতে:

 %// MatrixForm

জরায়ু


4

গণিত, 118 বাইট

f=Permute[Range[#*#],Accumulate@Take[Join[{#*#+1}/2,Flatten@Table[(-1)^j i,{j,#},{i,{-1,#}},{j}]],#*#]]~Select~PrimeQ&

এটি প্রতিটি পরবর্তী সংখ্যার অবস্থান হিসাবে জমা করা যেতে পারে তা উল্লেখ করে লিনিয়ার আকারে উলম সর্পিল উত্পন্ন করে

{(n*n + 1)/2, +1, -n, -1, -1, +n, +n, +1, +1, +1, -n, -n, -n, ...}

অর্থাত্ কেন্দ্রটি থেকে শুরু করুন, তারপরে 1 ডানদিকে সরান, 1 টি উপরে, 2 বাম, 2 নীচে, 3 ডান, 3 উপরে, ...

আউটপুট:

In[515]:= f[5]
Out[515]= {17,13,5,3,19,2,11,7,23}

1

জাভাস্ক্রিপ্ট, 516 363 304 276 243 240 বাইট

আমার সমাধানটি সর্পিলের সাথে ঘন ম্যাট্রিক্স তৈরি করে না, পরিবর্তে এটি সূচকটি প্রদান করে যা প্রদত্ত ক্রমের উলমের ম্যাট্রিক্সে প্রদত্ত সংখ্যার সাথে মিলে যায়। সুতরাং এটি 2 এবং এম * এম এর মধ্যে সংখ্যার মধ্য দিয়ে পুনরাবৃত্তি করে এবং fn ulamIdx দ্বারা প্রদত্ত আইডেক্সের সাহায্যে প্রাইমের একটি অ্যারে তৈরি করে

M=15;
$=Math;
_=$.sqrt;
/**
 * Return M*i+j (i.e. lineal or vector idx for the matrix) of the Ulam Matrix for the given integer
 * 
 * Each Segment (there are 4 in each round) contains a line of consecutive integers that wraps the 
 * inner Spiral round. In the foCowing example Segments are: {2,3}, {4,5},
 * {6,7}, {8,9}, {a,b,c,d}, {e,f,g,h}, {i,j,k,l}, {m,n,o,p}  
 *            
 *    h g f e d
 *    i 5 4 3 c
 *    j 6 1 2 b
 *    k 7 8 9 a 
 *    l m n o p
 * 
 * @param n integer The integer which position in the Matrix we want.
 * @param M integer Matrix Order. 
 */
/*
 * m: modulus representing step in segment in current spirtal round
 * v: Step in current spiral round, i.e. n - (inner spirals greatest num.)
 * s: the current Segment one of [1, 2, 3, 4] that represents the current spiral round 
 * L: Segment Length (Current spiral round Order - 1)
 * B: inner Spiral Order, for trib¿vial case 1 it's -1 special case handled differently.
 * C: relative line (row or column) corresponding to n in current spiral Round 
 * R: relative line (column or row) corresponding to n in current spiral Round
 * N: Curren (the one that contains n) Spiral (matrix) round Order
 * D: Difference between M and the current Spiral round order.
 */

/**
 * Runs the loop for every integer between 2 and M*M
 * Does not check sanity for M, that should be odd.
 */
r=[];
for (x = 2; x < M * M; x++) {
    p=1;
    // Is Prime?
    for (k = 2; p&&k <= _(x); k++)
        if (x % k==0) p=0;
    if (p) {
        B = $.floor(_(x - 1));
        B=B&1?B:B-1;
        N = B + 2;
        D = (M - N) / 2;
            v = x - B * B;
            L = B + 1;
            s = $.ceil(v / L);
            m = v % L || L;
            C = D + (s < 3 ? N - m : 1 + m);
            R = s&2 ? D + 1 : D + N;
            w= s&1 ? M * C + R : M * R + C;
        // /*uncomment to debug*/ console.log("X:" + x + ": " + ((s&1) ? [C, R].join() : [R, C].join()));
        r[w] = x;
    }
}
alert(r);

minified দেখতে দেখতে দেখতে:

for(M=15,$=Math,_=$.sqrt,r=[],x=2;x<M*M;x++){for(p=1,k=2;p&&k<=_(x);k++)x%k==0&&(p=0);p&&(B=$.floor(_(x-1)),B=1&B?B:B-1,N=B+2,D=(M-N)/2,v=x-B*B,L=B+1,s=$.ceil(v/L),m=v%L||L,C=D+(s<3?N-m:1+m),R=2&s?D+1:D+N,w=1&s?M*C+R:M*R+C,r[w]=x)}alert(r);

15 ইনপুট জন্য আউটপুট হয়:

,,,,,,,,,,,,,,,, 197 ,,,, 193, 191 ,,,,,,,,,,,,,,,, 139, 137 ,,,,, 199, 101 ,,,, 97 ,,,,,,,, 181 ,,,,,,,, 61, 59 ,,,, 131 ,,,, 103, 37 ,,,,,, 31, 89, 179, 149, 67, 17 ,,,, 13 ,,,,,,,,,,,, 5,, 3, 29 ,,,,,, 151 ,,, 19 ,,, 2,11, 53, 127 ,,,, 107, 41, 7 ,,,,,,,,,,,, 71 ,,,, 23 ,,,,,,, ,,, 109, 43 ,,,, 47 ,,,, 83, 173 ,,,, 73 ,,,,,, 79 ,,,,,,,,,, 113 ,,,,,,, ,,,,, 157 ,,,,,, 163 ,,,, 167 ,,,, 211 ,,,,,,,,,,,, 223


এটি ছিল সামান্য সংকোচনের। আপনি কি আপনার মূল কোড এবং আপনার পরিবর্তনগুলি ব্যাখ্যা করতে পারেন?
অ্যাডিসন ক্রম্প

আমি কিছু অকেজো বন্ধনী অপসারণ করেছি। এবং বুঝতে পেরেছি যে ইউআই () এর 4 টি শর্তসাপূর্ণ ব্লক রয়েছে। 3 টি লাইন সহ প্রত্যেকটি বর্তমান বিভাগের জন্য সারি এবং কলম তৈরি করেছে (মূল ডকব্লক দেখুন) সুতরাং আমি আপনার 4 টি ব্লককে এলএল এবং এলএলটি লাইন দ্বারা প্রতিস্থাপন করেছি এবং এলটিটি সারি বা কলাম হবে কিনা তা ফেরতের লাইন স্থির করে। এস & 2 টি (3,2) (উপরের এবং বাম বিভাগে) এর ক্ষেত্রে সত্য; s <3, এর জন্য (1,2) ডান এবং উপরের দিকে। এস এবং 1, এর জন্য (1,3) নির্ধারণ করবে যে ll & llt এর মানগুলি সারি & করল বা কর্ন & সারি এবং এম (সর্পিল ক্রম) × সারি + কোল ওভারল্যাপিং সূচকগুলি প্রতিরোধ করে (যেমন ম্যাট্রিক্স সংশোধন করার মতো তবে ভুল লাইনীয় আইডেক্স সহ, সঠিকতা হবে)
এলএল

মূল লুপে (রান ()) কেবলমাত্র আমি প্রাইম হলেই (যা কখনই <2 বা% 1 এর জন্য পরীক্ষা করার প্রয়োজন হয় না) এটি সর্পিলটিতে i এর সূচক (এলএল, এলএলটি) জিজ্ঞাসা করে, যা আয়ুগুলি সংশোধন করে। তারপরে কেবল ফলাফল অ্যারে প্রিন্ট করুন।
juanmf

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

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