उलम के सर्पिल की शर्तें


17

उलम का सर्पिल वास्तव में आकर्षक, अभी तक गूढ़ है, गणित में विषय है। यह विस्तार से कैसे काम करता है यहां पाया जा सकता है , लेकिन एक संक्षिप्त सारांश के रूप में समझाया जा सकता है:

मैं एक लिखना शुरू करता हूं, फिर मैं इसके दाईं ओर एक दो लिखता हूं। दो से ऊपर, मैं एक तीन लिखता हूं, और उसके बाईं ओर मैं चार लिखता हूं। मैं लगभग 1 (और मेरे और 1 के बीच किसी भी संख्या) के आसपास चक्कर लगाने के इस पैटर्न को जारी रखता हूं (या जब तक बंद करने के लिए नहीं कहा जाता है), एक सर्पिल पैटर्न बनाता है। (नीचे उदाहरण देखें)

लक्ष्य

एक प्रोग्राम बनाएं जो n को स्वीकार करता है (हमेशा शून्य से अधिक एक विषम संख्या होगी) एक इनपुट के रूप में जो पंक्तियों की संख्या के साथ संबंध रखता है, फिर उलम सर्पिल की पंक्ति द्वारा प्रिम्स पंक्ति के मूल्यों को प्रिंट करता है। स्वरूपण किसी भी फैशन हो सकता है, लेकिन मानव पठनीय और स्पष्ट होना चाहिए।

उदाहरण के लिए, इनपुट 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]]

इसे ऑनलाइन आज़माएँ: प्रदर्शन

यह कोड पूरी तरह से उलम के सर्पिल को उत्पन्न करता है, सभी लाइनों को जोड़ता है और primes के लिए फ़िल्टर करता है।

स्पष्टीकरण:

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

MATLAB, 48

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

मूल रूप से यह आवश्यक आकार (उपयोगकर्ता से अनुरोध) का एक सर्पिल बनाता है, फिर इसे व्यवस्थित करता है ताकि यह सही पंक्ति क्रम में दिखाई दे। यह एक में संग्रहीत है। इसके बाद यह उन सभी मूल्यों को प्रदर्शित करता है जो प्रमुख हैं।

जैसा कि आपने कोई पठनीय प्रारूप कहा है, मैंने एक बाइट को बचाया और डिफॉल्ट आउटपुट ऑफ़ डिसप्ले () के लिए चला गया जो कि (आपके परीक्षण मामले में, n = 3) है:

 5
 3
 2
 7

अतिरिक्त बोनस के रूप में, यह सम संख्याओं सहित, किसी भी n> 0 के लिए काम करता है। उदाहरण के लिए, n = 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

CJam, 42 33 बाइट्स

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

इसे ऑनलाइन आज़माएं

नवीनतम संस्करण में @Martin द्वारा सुझाए गए पर्याप्त सुधार शामिल हैं।

सर्पिल के निर्माण की विधि प्रत्येक चरण में, उस मैट्रिक्स को घुमाती है, जिसे हमने अब तक 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*, या क्या आपने इसे उद्देश्य पर छोड़ दिया है?
ETHproductions

@ETHproductions यह समतुल्य नहीं है क्योंकि यह पूर्णांक विभाजन है। उदाहरण के लिए, इनपुट 3 के लिए, परिणाम की आवश्यकता है 4. वास्तव में, अब जब मैं इसके बारे में सोचता हूं, तो मेरा मानना ​​है कि सहेजने के लिए एक बाइट है। (2*सही होना चाहिए।
रेटो कोराडी

5

गणितज्ञ 223

यह उलम सर्पिल के लिए कुबा के कोड को विनियोजित करता है । इसलिए मैं इसे एक समुदाय विकि के रूप में प्रस्तुत कर रहा हूँ। मैंने केवल इसे गढ़ा है और उन primes को चुना है, जो उस पंक्ति से सूचीबद्ध हैं जिसमें वे रहते हैं।

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}, {103, 37, 31, 89, 179}, {149, 67, 42 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}}

प्रदर्शन में सुधार करने के लिए:

 %// MatrixForm

आव्यूह


4

गणितज्ञ, ११hem बाइट्स

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 और M * M के बीच की संख्याओं के माध्यम से पुनरावृत्ति करता है और fn ulamIdx द्वारा दिए गए idx के साथ अपराधों की एक सरणी बनाता है

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);

इस तरह दिखता है छोटा :

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 पंक्तियों के साथ प्रत्येक (मुख्य डॉकब्लॉक देखें) तो मैं ll & llt लाइनों द्वारा 4 ब्लॉक को प्रतिस्थापित करूंगा और यदि पंक्ति पंक्ति या स्तंभ है तो वापसी लाइन तय करती है। S (2) s (3,2) (ऊपरी और बाएँ खंड) में सच है; s <3, s (1,2) दाएं और ऊपरी हिस्से के लिए। S & 1, s के लिए (1,3) यह निर्धारित करेगा कि ll और llt में मान पंक्ति और कॉल या कॉलोनी और पंक्ति और M (सर्पिल क्रम) × पंक्ति + कॉल है ओवरलैपिंग इंडेक्स को रोकता है (जैसे मैट्रिक्स को ठीक करना लेकिन गलत लिनेक्स आईडी के साथ, शुद्धता होगा आवश्यकता होगी 1
juanmf

मुख्य लूप (रन) में (केवल) अगर मैं प्राइम है (जो fn कम हो गया था जैसा कि <2 और न ही% 1 के लिए परीक्षण करने की आवश्यकता नहीं है) यह सर्पिल में i के सूचकांक (ll, llt) के लिए पूछता है, जो ठीक हो गया। फिर बस परिणाम सरणी प्रिंट करें।
जुआनम्फ

3 वैचारिक रूप से महत्वपूर्ण मेट्रिसेस हैं। पूर्ण पंक्ति और कर्नल की गणना के लिए इनर, क्यूरेट और एम। उपयोगी। वर्तमान में एक रिश्तेदार int (जिसमें n गिरता है) सर्पिल दौर के साथ आंतरिक n को छोड़ देता है। और एम और वर्तमान के आदेश के बीच अंतर निरपेक्ष लोगों को प्राप्त करने के लिए मौजूदा दौर में पंक्ति और कॉल के लिए ऑफसेट के रूप में खेलता है।
जुआनम्फ

364 -> 240 fn लॉजिक इनलाइन लिखकर और अप्रयुक्त परीक्षणों को हटाकर।
जुआनम्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.