पुनरावर्ती ASCII सर्पिल


21

यह प्रतियोगिता समाप्त हो गई है। दिलचस्प गैर-एसोलांग प्रविष्टियों के लिए धन्यवाद, और जकूजी को अपने जावास्क्रिप्ट जावास्क्रिप्ट प्रस्तुत करने के लिए बधाई ।

इस साइट पर एएससीआईआई आर्ट चैलेंज की महान परंपरा में, यहां एक और एक है। एक इनपुट को देखते हुए, एक सर्पिल खींचें।

&>----v
||>--v|
|||>v||
|||@|||
||^-<||
|^---<|
^-----<

सरल, हाँ? हे, हे, हे ... हाँ ...

( ASCII ड्रेगन वक्र पोस्ट से प्रेरित , और ऑप्टिमाइज़र ASCII आर्ट ऑफ़ द डे पोस्ट)

इनपुट

इनपुट मापदंडों की एक श्रृंखला के रूप में होगा, जो सामान्य एसटीडीआईएन / फ़ंक्शन तर्क / आदि से लिया जाता है। आपकी भाषा के समतुल्य, जिसमें चार भाग शामिल हैं। इन भागों में चार अलग-अलग तर्क हो सकते हैं, एक चौगुनी, आकार 4 की एक सरणी, आदि चुनौती के दौरान सादगी और स्थिरता के लिए, मैं एक शब्द के रूप में इनपुट का प्रतिनिधित्व करूंगा।

  • एक पूर्णांक 2 ≤ x ≤ 20जो "वर्ग" के रूप में सर्पिल के आकार को निर्दिष्ट करता है, प्रत्येक मुद्रित चरित्र के साथ आकार में एक "वर्ग" का प्रतिनिधित्व करता है। सैद्धांतिक रूप से यह कार्यक्षेत्र में भारी हो सकता है, लेकिन यह देखते हुए कि हम ASCII कला का निर्माण कर रहे हैं, इस पर एक सुरक्षित ऊपरी सीमा 20 होगी ताकि यह स्क्रीन पर कुछ हद तक फिट हो।
  • का एक अक्षर d u rया l, "स्क्वायर" (नीचे, ऊपर, दाएं, बाएं) से प्रारंभिक आंदोलन को इंगित करता है।
  • एक वैकल्पिक c, "काउंटर-क्लॉकवाइज" दर्शाता है। यदि cछोड़ दिया जाता है, तो सर्पिल के लिए दक्षिणावर्त रोटेशन मान लें।
  • एक अंतिम पूर्णांक 1 ≤ y ≤ 10जो निर्दिष्ट करता है कि नए सर्पिल के शुरुआती "वर्ग" के रूप में पिछले सर्पिल के खत्म "वर्ग" का उपयोग करते हुए, सर्पिल ड्राइंग को कितने समय में फिर से भरना है। मैं 10 की ऊपरी सीमा चुन रहा हूं क्योंकि मैं चाहता हूं कि ड्राइंग किसी बिंदु पर समाप्त हो जाए।
  • कुछ उदाहरण इनपुट: 20lc5 13d2 2rc1

रुचि के अनुसार, ध्यान दें कि आकार के इनपुट के लिए विषम मानों का परिणाम @हमेशा सर्पिल के सटीक केंद्र के रूप में होगा, लेकिन यहां तक ​​कि मानों में चार विकर्ण दिशाओं में प्रारंभिक "वर्ग" ऑफसेट हो सकते हैं, जो प्रारंभिक दिशा पर निर्भर करते हैं यात्रा। यह कुछ ... दिलचस्प ... पैटर्न में परिणाम कर सकता है। नीचे दिए गए दो उदाहरण भी देखें।

इनपुट जो इनपुट विनिर्देश (उदाहरण के लिए 11q#s) का पालन ​​नहीं करता है, अपरिभाषित है और मैं पूरी तरह से प्रोग्राम को उचित रूप से बारफ करने की उम्मीद करता हूं। :)

उत्पादन

आउटपुट निम्नलिखित विनिर्देशों के साथ भाषा-समतुल्य STDOUT के माध्यम से एक ASCII प्रिंट करने योग्य आउटपुट है:

  • प्रारंभिक "वर्ग" (प्रत्येक पुनरावृत्ति का) को एक साइन-इन के साथ चिह्नित किया जाना चाहिए @
  • अंतिम "वर्ग" को एम्परसेंड के साथ चिह्नित किया जाना चाहिए &। कई पुनरावृत्तियों के मामले में, केवल बहुत ही अंतिम "वर्ग" को चिह्नित किया जाना चाहिए &
  • सर्पिल पथ के कोनों को यात्रा, उपयोग की दिशा में "बिंदु" की आवश्यकता होती है < > v ^
  • ऊर्ध्वाधर यात्रा को पाइप द्वारा खींचने की आवश्यकता है |
  • क्षैतिज यात्रा को डैश के साथ खींचा जाना चाहिए -
  • "स्क्वायर" जो बाद की पुनरावृत्ति द्वारा अधिलेखित हैं, उन्हें यात्रा की सबसे हालिया दिशा प्रदर्शित करनी चाहिए। इसके परिणामस्वरूप "नए" पुनरावर्ती "पुराने" पुनरावर्ती के शीर्ष पर स्तरित होने लगते हैं। देखें 4rc3नीचे दिए गए उदाहरण।
  • एक अंतिम अनुगामी न्यूलाइन ठीक है, अग्रणी स्थान एक होना चाहिए और इसलिए अनुमति दी जाती है, लेकिन अनुगामी रिक्त स्थान की अनुमति नहीं है।
  • यदि आप ASCII कला को STDOUT पर जाने के लिए आकर्षित करने के लिए एस्केप सीक्वेंस का उपयोग करते हैं, तो मैं आपको डॉक नहीं करूंगा, लेकिन मैं चुपचाप आप में निराश हो जाऊंगा। (यदि आप उनका उपयोग करते हैं तो आप फिर भी इनाम के पात्र होंगे)

उदाहरण

2d4 = 2 का व्यास, नीचे जाकर, दक्षिणावर्त, 4 पुनरावृत्ति से शुरू होता है

&@@@@
^<<<<

इस उदाहरण में, ड्राइंग ऊपरी-दाएं में शुरू होता @है, एक नीचे जाता है, एक बाएं, एक ऊपर। इस बिंदु पर, हमने 2dभाग समाप्त कर लिया है , और इसलिए 2 पुनरावृत्ति शुरू करते हैं, इसलिए हमारे पास एक @, एक नीचे, एक ऊपर, एक ऊपर है; फिर 3 पुनरावृत्ति; फिर 4 और अंत में हमारा &

4rc3 = 4 का व्यास, दाएं, वामावर्त, 3 पुनरावृत्तियों पर जाकर शुरू होता है

&--<
v-<|
|@^|<
>--^|
 |@^|<
 >--^|
  |@^|
  >--^

इस उदाहरण में, ड्राइंग नीचे में शुरू होता है @, एक के ऊपर एक, एक के ऊपर सर्पिल तक जाता है, जब तक कि यह मध्य तक नहीं पहुंचता है @और 4rcभाग को खत्म कर देता है। इसके बाद अनुरोध किए गए पूर्ण 3 पुनरावर्तन प्राप्त करने के लिए दो बार दोहराता है। ध्यान दें कि 4rc1इस उदाहरण के ऊपरी-बाएँ 4x4 ब्लॉक होगा।

7u1 = 7 का व्यास, ऊपर जाकर शुरू होता है, दक्षिणावर्त, 1 पुनरावृत्ति (ध्यान दें कि इंट्रो के समान है)

&>----v
||>--v|
|||>v||
|||@|||
||^-<||
|^---<|
^-----<

जीत और प्रतिबंध

यह कोड गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा जवाब है। प्रस्तुतियाँ कार्यक्रम / समारोह / सीजेएम कोड ब्लॉक / आदि के सामान्य रूप में होनी चाहिए। स्टैंडर्ड लोफोल प्रतिबंध लागू होते हैं। बंद कोर्स पर पेशेवर चालक। यदि जलन बनी रहती है, तो अपने चिकित्सक से उपयोग बंद करें और परामर्श करें।


3
बारीकियाँ बिलकुल अलग हैं, लेकिन सिर्फ संदर्भ के लिए, यहाँ एक पहले की सर्पिल ड्राइंग चुनौती है: codegolf.stackexchange.com/questions/52494/…
रेटो कोराडी

2
अच्छी चुनौती है। "बंद कोर्स पर व्यावसायिक ड्राइवर" के लिए +1
jrich

3
यह एक> <> जवाब मांगता है।
The_Basset_Hound

2
"चलो, दोस्तों ... क्या आप कॉमन लिस्प को जीतने देंगे? ;-)" जो मैंने कभी देखा है उसके लिए सबसे प्रफुल्लित करने वाला कारण है। धन्यवाद
coredump

1
मैं यहाँ बैठकर गुहार लगा रहा हूँ कि कॉमन लिस्प और लुआ एक कोड-गोल्फ प्रश्न पर शीर्ष स्थान के लिए लड़ने वाली दो भाषाएँ हैं। :)
AdmBorkBork

जवाबों:


6

जावास्क्रिप्ट, 578, 575, 553, 478, 377 बाइट्स

पीटा लुआ के बाद मैं कुछ और कॉम्पैक्ट भाषा में बदल गया और प्रतियोगिता को जावास्क्रिप्ट में स्थानांतरित कर दिया:

s=function(w,d,c,r){d="dlur".indexOf(d)
j=i=G=H=I=J=w*r;o=[];for(x=0;x<J*2;x++){o[x]=[]
for(y=0;y<J*2;)o[x][y++]=' '}for(;r--;){a=d;m=l=z=1;o[i][j]="@"
for(k=w*w-1;k--;){G=G<i?G:i;H=H>i?H:i;I=I<j?I:j;J=J>j?J:j
o[i+=(1-a)%2][j+=a?a-2:0]=l++==m?(a+=c=="c"?3:1,m+=z=!z,l=1,"v<^>"[a%=4]):k?"|-"[a%2]:"&"}}for(i=G;i<=H;)console.log(o[i++].slice(I,J+1).join("").replace(/\s+$/g,''))}

एल्गोरिथ्म एक ही है, लेकिन अधिक कॉम्पैक्ट भाषा में लिखा गया है, इसलिए मैं बुराई लिस्प को हराने में कामयाब रहा :)

संपादित करें: लिस्प के तहत फिर से पहुंचने और अनुगामी व्हाट्सएप को खत्म करने के लिए कुछ संरचनात्मक परिवर्तनों की आवश्यकता थी। लेकिन हम यहां फिर से हैं।

Edit2: 500 के तहत प्राप्त करने के लिए कुछ सार ध्यान में रखा गया। आशा है कि यह पर्याप्त होगा :)

Edit3: Thanks @Timwi, कोड एक और 100 वर्ण स्लिमर है। मैंने स्पष्टीकरण अभी तक अपडेट नहीं किया है।

टेस्ट ( ऑनलाइन संस्करण , Chrome में परीक्षण किया गया):

----| 2d4 |---
s.js:9 &@@@@
s.js:9 ^<<<<
ss.html:7 ----| 4rc3 |---
s.js:9 &--<
s.js:9 v-<|
s.js:9 |@^|<
s.js:9 >--^|
s.js:9  |@^|<
s.js:9  >--^|
s.js:9   |@^|
s.js:9   >--^
ss.html:9 ----| 7u1 |---
s.js:9 &>----v
s.js:9 ||>--v|
s.js:9 |||>v||
s.js:9 |||@|||
s.js:9 ||^-<||
s.js:9 |^---<|
s.js:9 ^-----<
ss.html:11 ----| 8r3 |---
s.js:9       >------v
s.js:9       |>----v|
s.js:9       ||>--v||
s.js:9       |||@v|||
s.js:9    >------v|||
s.js:9    |>----v|<||
s.js:9    ||>--v||-<|
s.js:9    |||@v|||--<
s.js:9 >------v|||
s.js:9 |>----v|<||
s.js:9 ||>--v||-<|
s.js:9 |||@v|||--<
s.js:9 ||^-<|||
s.js:9 |^---<||
s.js:9 ^-----<|
s.js:9 &------<
ss.html:13 ----| 8rc3 |---
s.js:9 &------<
s.js:9 v-----<|
s.js:9 |v---<||
s.js:9 ||v-<|||
s.js:9 |||@^|||--<
s.js:9 ||>--^||-<|
s.js:9 |>----^|<||
s.js:9 >------^|||
s.js:9    |||@^|||--<
s.js:9    ||>--^||-<|
s.js:9    |>----^|<||
s.js:9    >------^|||
s.js:9       |||@^|||
s.js:9       ||>--^||
s.js:9       |>----^|
s.js:9       >------^

और निष्पक्ष होने के लिए, निष्पक्ष व्याख्या है:

s = function(w, d, c, r) {
    // width, direction, "c" as counter-clockwise and number of repetition
    // transfer direction to internal numerical representation
    d=d=="d"?0:d=="u"?2:d=="l"?1:3;
    // output strings
    x="v<^>"
    y="|-"
    // this is size of our canvas. Could be smaller, but this is shorter
    M = w * r * 2;
    // fill canvas with spaces to have something to build upon
    o = [];
    for (i = 0; i < M; i++) {
        o[i] = [];
        for (j = 0; j < M; j++)
            o[i][j] = ' '
    }
    // i,j is starting position
    // G,H,I,J are current boundaries (maximum and minimum values of i and j during the time)
    j = i = G = H = I = J = M / 2
    for (q = 0; q < r; q++) { // number of repeats
        a = d; // reset original direction
        // m is the expected length of side
        // l counts the of current side length
        m = l = 1;
        z = 0; // counts occurrences of the length
        o[i][j] = "@" // write initial character
        for (k = w * w; k > 1; k--) { // cycle over the whole spiral
            // update boundaries
            G = G < i ? G : i;
            H = H > i ? H : i;
            I = I < j ? I : j;
            J = J > j ? J : j;
            // move to the next position according to direction
            i+=a<3?1-a:0;
            j+=a>0?a-2:0
            if (k == 2) // we reached the end
                o[i][j] = "&"
            else if (l == m) {
                // we reached the corner so we need to count next direction
                a=(c=="c"?a+3:a+1)%4;
                // and write according sign
                o[i][j]=x[a]
                // first occurrence of this length
                if (z == 0)
                    z = 1; // wait for finish of the other
                else {
                    m++; // increase length of side
                    z = 0 // wait again for the first one
                }
                l = 1 // start the side counter over
            } else {
                l++ // another part of this side
                // according side character
                o[i][j] = y[a%2]
            }
        }
    }
    // blow it all out
    for (i = G; i <= H; i++)
        console.log(o[i].slice(I, J + 1).join("").replace(/\s+$/g, ''))
}

बहुत अच्छा। नियमों के अनुसार और आपके उदाहरण का पालन करते हुए, मैंने &optional10 बाइट्स को बचाने के लिए कीवर्ड (और एक स्थान) को हटाने का फैसला किया , जो 576 देता है ... दुष्ट हँसी (अच्छा, आपने कहा कि आप थोड़ा और गोल्फ कर सकते हैं, इसलिए यह हरा करने के लिए मुश्किल नहीं होना चाहिए; जब तक कोई Pyth में 60-बाइट्स का उत्तर नहीं लिखता, निश्चित रूप से)।
coredump

@ कोर्डम्प चैलेंज स्वीकार किया गया :) यह मेरी अपेक्षा से अधिक कठिन है, लेकिन फिर भी संभव है :) मेरा मानना ​​है कि आप इसे अजगर में कर सकते हैं, लेकिन कोई भी कभी भी इसे समझ नहीं पाएगा, इसलिए मेरा मानना ​​है कि ऐसी भाषा की संभावनाओं पर जटिलता अधिक है।
जकूजी सेप

3
आप कार्य श्रृंखला अगर i=M/2;j=i;G=i;H=i;I=i;J=i;में i=j=G=H=I=J=M/2;और m=1;l=1;में m=l=1;आप 12 बाइट्स बचा सकता है
SLuck49

2
यह समाधान बहुत चालाक है। : लेकिन, मैं कई और स्थानों है कि golfed किया जा सकता है पाया 377 बाइट्स
Timwi

1
@ जाकुज मुझे विश्वास है कि यह 377 बाइट संस्करण लेने के लिए टिमवी का इरादा था और इसका उपयोग करने के लिए अपने उत्तर को संपादित करें। ;) (अन्यथा उसने सिर्फ एक अलग उत्तर पोस्ट किया होगा।)
मार्टिन एंडर

7

आम लिस्प, 649 617 605 586 576 565 554 527 518

(lambda(r v z c &aux(m 0)s(c(if c 1 -1))o p(x 0)i(y 0)j u)(#8=dotimes(_ z)(#7=setf p(aref"ruld"v)i(1-(abs(- p 2)))j(- 1(abs(1- p)))s'@)(#8#($(1- r))#5=(#7#m(min m x)o(cons`(,x,y,s)o)s(aref"-|-|"p)x(+ x i)y(+ y j))#2=(#7#s(*(- c)j)j(* i c)i s p(mod(+ p c)4)s(aref">^<v"p)u(#8#(_(1+ $))#5#))#2#))(#7#s'& u #5#o(#4=stable-sort(#4#o'< :key'car)'> :key'cadr)y(cadar o)x m)(dolist(k o)(do()((>=(cadr k)y))(#7#y(1- y)x m)(terpri))(do()((<=(car k)x))#9=(incf x)(princ" "))(and(=(cadr k)y)(=(car k)x)#9#(princ(caddr k)))))

सभी परीक्षण अभी भी पास हैं। टिप्पणियों के रूप में, परिवर्तन को प्रतिबिंबित करने के लिए अन-गोल्ड फ़ंक्शन को भी अपडेट किया गया था। remove-duplicatesकोड को छोटा करने के लिए मुझे आखिरकार छुटकारा मिल गया , लेकिन अब मुझे नहीं पता कि अधिक बाइट्स कहां मिलें। अच्छा किया जकुजे।

उदाहरण

(funcall *fun* 8 #\r 3 nil)

      >------v
      |>----v|
      ||>--v||
      |||@v|||
   >------v|||
   |>----v|<||
   ||>--v||-<|
   |||@v|||--<
>------v|||
|>----v|<||
||>--v||-<|
|||@v|||--<
||^-<|||
|^---<||
^-----<|
&------<

(funcall *fun* 8 #\r 3 t) ;; counter-clockwise

&------<
v-----<|
|v---<||
||v-<|||
|||@^|||--<
||>--^||-<|
|>----^|<||
>------^|||
   |||@^|||--<
   ||>--^||-<|
   |>----^|<||
   >------^|||
      |||@^|||
      ||>--^||
      |>----^|
      >------^

(funcall *fun* 7 #\u 1 nil)

&>----v
||>--v|
|||>v||
|||@|||
||^-<||
|^---<|
^-----<

(funcall *fun* 2 #\d 4 nil)

&@@@@
^<<<<

20lc10(पास्टबिन) भी देखें ।

Ungolfed

यहाँ कोई पुनरावृत्ति शामिल नहीं है, बस लूप्स के साथ एक बुनियादी कछुआ ग्राफिक्स दृष्टिकोण है:

  1. (x y char)एक स्टैक में त्रिकोणीय भंडारण करके स्मृति में सर्पिल खींचें ।
  2. के अनुसार स्थिर प्रकार तत्वों yऔरx
  3. डुप्लिकेट (पिछले निशान) से परहेज करते हुए उस सूची पर इरेट करें और ऊपर-बाएं से नीचे-दाएं तक प्रिंट करें।
(lambda
    (r v z c
     &aux
       (m 0)       ; minimal x
       s           ; symbol to print (a character)
       (c          ; 1 if clockwise, -1 otherwise
        (if c
            1
            -1))
       o           ; stack of (x y char) traces
       p           ; position of s in ">^<v"
       i           ; move direction of x
       j           ; move direction of y
       (x 0)       ; position in x
       (y 0)       ; position in y
       u           ; auxiliary variable
       )
  ;; repeat for each recursive step
  (dotimes (_ z)
    ;; initialize spiral parameters
    (setf s '@            ; start spiral with @
          p (position v"ruld") ; initialize p according to input V

          ;; Set initial direction in I and J.
          i (1-(abs(- p 2))) ; i(0..3) = ( 1, 0, -1, 0 )
          j (- 1(abs(1- p))) ; j(0..3) = ( 0, 1, 0, -1 )

    ;; Iterate with increasing diameter $. For each iteration, draw a
    ;; "L"-shape that extends previous shape. Here is roughly what
    ;; happens at each step:
    ;;
    ;;   3334
    ;;   3124
    ;;   3224
    ;;   4444
    ;;
    (dotimes($(1- r))

      ;;
      ;; Assign the form to the reader variable #1# in order to
      ;; copy-paste later. This is like declaring a local function,
      ;; but shorter: push trace into list O and move forward.
      ;;
      #1=(setf m (min m x)
               o (cons `(,x ,y ,s) o)
               s (aref "-|-|" p)
               x (+ x i)
               y (+ y j))

      ;;
      ;; Helper function #2#: rotate and draw a line of length $.
      ;;

      #2=(setf u (* (- c) j) ; rotation as a vectorial                   
               j (* i c)     ; product of (i j 0) with (0 0 c).
               u i           ; At first I used PSETF, but now I reuse
                             ; the existing SETF with an auxiliary 
                             ; variable U to shorten the code and get
                             ; rid of PROGN. That's also why I affect
                             ; the result of DOTIMES to U (no need
                             ; for two forms and a PROGN, just SETF).

               p (mod(+ p c)4)   ; ">^<v" is sorted counter-clockwise, which 
               s (aref ">^<v" p) ; means that adding P and C (modulo 4) gives 
                                 ; the next symbol after rotation.

               ;; trace a line by repeatedly invoking code snippet #1#
               u (dotimes(_(1+ $)) #1#))
      ;; 
      ;; Rotate and draw a second line, hence drawing a "L"-shape.
      ;;
      #2#))

  ;; Finally, draw the final symbol &
  (setf s '&)
  #1#

  (setf o

        ;; From inside-out:
        ;;
        ;; - stable sort O according to X
        ;;   (from lowest (left) to highest (right))
        ;;
        ;; - stable sort the result according to Y
        ;;   (from highest (top) to lowest (bottom))
        ;;
        (stable-sort (stable-sort o '< :key 'car) '> :key 'cadr)

        ;; initialize Y with the first Y in O, which is also the
        ;; minimum of all Y.
        y (cadar o)

        ;; initialize X with the minimum of all X
        x m) 

  ;; For each trace in O
  (dolist (k o)

    ;; Add as many lines as needed to advance Y to current trace's Y.
    (do ()
      ((<= y (cadr k)))
      (setf y (1- y)
            x m)
      (terpri))

    ;; Add as many spaces as needed to advance X to current trace's X.
    (do () ((>= x (car k))) (incf x) (princ " "))

    ;; Then, print current trace's character and increment X.
    ;; This happens only when we have a "new" trace, not another
    ;; trace at the same point (which was being overwritten).
    (and(=(car k)x)(=(cadr k)y)(incf x)(princ(caddr k)))

4

लुआ 5.2, 740 बाइट्स

s=io.read W=io.write Z=math.max A=math.min
D="d"U="u"L="l"R="r"function n()G=A(G,i)H=Z(H,i)I=A(I,j)J=Z(J,j)i=(a==D and i+1 or a==U and i-1 or i)j=(a==R and j+1 or a==L and j-1 or j)end
w=s"*n"d=s(1)c=s(1)r=(c=="c")and s"*n"or c
c=c=="c"M=w*(r+1)o={}for i=1,M do o[i]={}for j=1,M do o[i][j]=" "end end
i=M/2 j=i G=i H=i I=i J=i
for q=1,r do a=d m=1 l=1 z=0
o[i][j]="@"for k=3,w^2 do
n()if l==m then
a=c and(a==D and R or a==U and L or a==L and D or a==R and U)or(a==D and L or a==U and R or a==L and U or a==R and D)o[i][j]=(a==D and"v"or a==U and"^"or a==L and"<"or a==R and">")
if z==0 then z=1 else m=m+1;z=0 end
l=1
else
l=l+1
o[i][j]=(a==D or a==U)and"|"or"-"end end
n()o[i][j]="&"end
for i=G,H do for j=I,J do
W(o[i][j])end W("\n")end

हालांकि मुझे लगता है कि लिस्प को हराने के लिए कुछ एल्गोरिदम को लागू करने की कोशिश करना मज़ेदार होगा, लेकिन लुआ शायद सबसे अच्छा विकल्प नहीं है। मैं इस पर बहुत अधिक समय बिताता हूं, कुछ हिस्सों को इस ugly एक के साथ समाप्त करने के लिए, लेकिन काम कर रहे समाधान। संभवत: मैं बाद में लिस्प को हराने के लिए अलग-अलग भाषा की कोशिश करूंगा क्योंकि कुछ 90 अक्षर हैं जिन्हें मैं इस एल्गोरिथम से दूर नहीं कर सकता।

परीक्षण आउटपुट:

jakuje@E6430:/tmp$ echo "2d4" | lua s.lua 
&@@@@
^<<<<
jakuje@E6430:/tmp$ echo "4rc3" | lua s.lua 
&--<  
v-<|  
|@^|< 
>--^| 
 |@^|<
 >--^|
  |@^|
  >--^
jakuje@E6430:/tmp$ echo "7u1" | lua s.lua 
&>----v
||>--v|
|||>v||
|||@|||
||^-<||
|^---<|
^-----<

2

PHP, 524 बाइट्स

मैं इस पार्टी में देरी से पहुंचा। मेरा PHP समाधान न तो सबसे छोटा है, और न ही सबसे स्मार्ट। यह सिर्फ काम करता है।

$a=$argv;
$b=[['|','^',0,-1],['-','>',1,0],['|',v,0,1],['-','<',-1,$x=$y=$o=$p=$q=$r=0]];
for($t=$a[4];$t;$t--){$d=strpos(urdl,$a[2]);$c=$b[$d];$m[$y][$x]='@';
for($s=0;++$s<$a[1];){for($k=3;--$k;){for($i=$s;--$i;)
$m[$y+=$c[3]][$x+=$c[2]]=$c[0];$x+=$c[2];$y+=$c[3];$c=$b[$d=($d+($a[3]==c?3:1))%4];
$m[$y][$x]=$c[1];}$o=min($x,$o);$p=max($p,$x);$q=min($y,$q);$r=max($r,$y);}
for($i=$s;--$i;)$m[$y+=$c[3]][$x+=$c[2]]=$c[0];$m[$y][$x]='&';}
for($y=$q;$y<=$r;$y++){$l='';for($x=$o;$x<=$p;$x++)$l.=$m[$y][$x]?:' ';
echo rtrim($l)."\n";}

इसे कैसे चलाएं:

$ php -d error_reporting=0 recursive-ascii-spirals.php 4 r c 3
&--<
v-<|
|@^|<
>--^|
 |@^|<
 >--^|
  |@^|
  >--^
$ php -d error_reporting=0 recursive-ascii-spirals.php 7 u '' 1
&>----v
||>--v|
|||>v||
|||@|||
||^-<||
|^---<|
^-----<

परीक्षण, स्पष्टीकरण और अन्य उपहारों के साथ विस्तृत संस्करण जीथब पर पाया जा सकता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.