इस सवाल के अपने उतार-चढ़ाव हैं


33

इनपुट में निम्नलिखित वर्ण शामिल होंगे:

  • ^: एक ऊपर जाओ
  • v: एक नीचे जाओ
  • या k: दो ऊपर जाओ
  • या j: दो नीचे जाओ

उदाहरण के लिए, निम्नलिखित इनपुट:

^^▲^v▼▲^^v

निम्नलिखित उत्पादन का उत्पादन होगा:

        ^
   ^   ^ v
  ▲ v ▲

 ^   ▼
^

एस्केप सीक्वेंस जो कर्सर को ले जाते हैं जैसे कि \e[B हैं अनुमति नहीं है। आपको रिक्त स्थान और newlines का उपयोग करके आउटपुट का उत्पादन करना होगा।

यहाँ कुछ और परीक्षण मामले हैं।

▲v^v^v^v^v^v^v^v▲

                ▲
▲ ^ ^ ^ ^ ^ ^ ^ 
 v v v v v v v v

^^^^^^^▲▲▲▼▼▼vvvvvv

         ▲

        ▲ ▼

       ▲   ▼

      ^     ▼
     ^       v
    ^         v
   ^           v
  ^             v
 ^               v
^                 v

v^^vv^^vvv^v^v^^^vvvv^^v^^vv

  ^   ^         ^
 ^ v ^ v       ^ v       ^
v   v   v ^ ^ ^   v   ^ ^ v
         v v v     v ^ v   v
                    v

1
ट्रेलिंग स्पेस की अनुमति है? खाली लाइनें?
xnor

2
उन भाषाओं के बारे में क्या जो यूनिकोड का समर्थन नहीं करती हैं? क्या वैकल्पिक पात्रों का उपयोग किया जा सकता है?
दरवाज़े

1
@xnor आपको रिक्त स्थान और / या खाली लाइनों की अनुमति है।
अनुपम

2
@Doorknob मैं jदो बार नीचे kजाने के लिए और साथ ही दो बार ऊपर जाने की अनुमति दूंगा ।
अनुपम

1
@xnor मेरा बुरा: / टिप्पणी सही है और मैंने नियमों को गलत संपादित किया है। अब ठीक कर देंगे।
अनुपस्थित

जवाबों:


9

पायथ, 27 बाइट्स

jCm.<.[*5lzd\ =+Ztx"v ^k"dz

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

मैं का उपयोग करें kऔर jके बजाय और । खाली लाइनों के बहुत सारे प्रमुख और अनुगामी हैं। छवि को खोजने के लिए आपको काफी खोज करनी होगी। यहाँ एक 34 बाइट संस्करण है, जो सभी प्रमुख और खाली लाइनों को पीछे हटा देता है।

j.sCm.<.[*5lzd\ =+Ztx"v ^k"dz]*lzd

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

स्पष्टीकरण:

jCm.<.[*5lzd\ =+Ztx"v ^k"dz  implicit: Z = 0
  m                       z  map each char d from input string z to:
                  x"v ^k"d     find d in the string "v ^k", -1 if not found
                 t             -1, that gives -2 for j, -1 for v, 1 for ^ and 2 for k
              =+Z              add this number to Z
     .[*5lzd\                  append spaces on the left and on the right of d, 
                               creating a 5*len(input_string) long string
   .<           Z              rotate this string to the left by Z chars
jC                           transpose and print on lines

16

अपठनीय , 2199 2145 2134 2104 2087 2084 बाइट्स

दोनों का समर्थन करता है k/ jसाथ ही साथ / सिंटैक्स ।

अच्छी अपठनीय परंपरा में, यहां कार्यक्रम आनुपातिक और दोहरे उद्धरण चिह्नों के बीच अंतर को आगे बढ़ाने के लिए आनुपातिक फ़ॉन्ट में स्वरूपित है:

' "" "" "" "" "" "" "" "" "'" " '" "'" " '" "'" "" ' "" "" "'" "" "" " ' "" ' ""' "" ' ""' "" "" " '" "" "" "'" "" "" " '" "" "" "" "" ""' "" ' " " '" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "' "" "" "" "" "" "" ""' "" ' ""' "" ' ""' "" ' "" "'" " '" "" "" "" "" ' ""' "" ' ""' "" ' "" "'" "" "" "" "" ' "" "" "" "" "" "'" " '" "'" " '" " '" ""' "" "" "" "" "" "" "" "" " '" "'" " '" "'" "" ' "" "" "" "" "" '" "'" " '" "'" " '" "'" "" ' "" "" "" "" "'" "" "" "" "" ' ""' "" ' "" ' ""' "" "" "" "" "" "" "" "" "" "" ' ""' "" ' ""' "" ' "" "'" " '" "' "" "" "" "" " '" ""' "" "" "" "" " '" "" "" "" "" "'" " '" "" "" ""'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" ' "" "" "" "" "'" " '" "" "" "" "" "'" "" "" "" "" ' ""' "" ' ""' "" " "" "" "" " '" "" ""' "" ' "" "'" " '" "" "" "" "" "" "" "" "" ""' ""' "" ' ""' "" ' ""' "" " '" ""' "" ' ""' "" "" "" "" " '" ""' "" "" " "" "" "" "" "" "" "" ' "" "" "" "" "'" " '" "'" "" "" "" "" " '" "" "" "" "" "" ' ""' "" ' ""' "" "" "" "" "" ' "" "" "'" " '" ""' "" ' """ '" "" "" "" "" "" "" "" "" "'" " '" "'" " '" "'" "" ' ""' "" ' "" "'" "" ' "" "" "'" "" "" " '" "'" " '" "'" " '" ""' "" "" "" "" "" "" "" " '" " '" "'" " '" "'" "" ' "" "" "" "" "" "" "" "" "" "" "" "" ""' ""' ""' "" "" "" "" " '" "'" " '" "'" "" ' ""' "" "" "" "" " '" "'" " '" " " '" ""' "" "" "" "" ' ""' "" " '" "'" "" "" "" "" ' ""' "" " '" "" "" " ' ""' "" "" "" "" "" "" "" "" "" ' ""' "" "" "" "" "" "" "" ' "" "'"" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" ""' "" ' ""' "" ' "" " ' "" "" "" "" "" "" "" "" "'" " '" "'" "" ' "" "" "" "" "'" "" "" "" ' " " '" "'" "" ' "" "" "" ""' "" ' "" "'" "" "" "" "" "" "" "" "" ' ""' "" "" ""' "" "" "" "" ' "" "'" " '" "" "" "" ""' "" " '" "" "" "" " ' "" "" "" "" "" "" "" "" ""' "" ' "" "" "" "" "'" "" ' "" "" "'" "" " "" "" "" "" "" ' ""' "" ' ""' "" " '" "'" "" "" "" "" ' ""' "" ' "" "' "" "" "" "" ""' "" ' "" "'" "" "" "" "" "" "" "" ' ""' "" "" "" "" " ' ""' "" ' "" "'" " '" "" "" "" ""' "" ' "" "'" "" "" ' "" "" "" "" "" " "" "" " '" ""' "" ' "" "" "" "" "'" "" ' "" "" "" "" ""' "" " '" "'"" "" "" "" "" "" "" "" "" ' "" "" "'" "" "" "" "" "" "" "" "" "" "" " '" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" " ' "" "'" " '" "" "" "" "" "" "" "" ""' "" "" " '" "'" " '" "" "" "'"" ' ""' "" "" "" "" "" "" "" "" "" "" ' ""' "" " '" "" "" "" "" "" " '" "" "" "'" " '" ""' "" ' ""' "" ' ""' "" ' "" "" ""' "" " '" "'" " '" " ' ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '" "" "" "" "" "" "" "'" "" "" "" "" "" ' "" "" "" "" "" "" "" ""' " "" "" "" "" "" "" "" "" " '"' "" "" "" "" "" "" "" " '" "'" "" "" " '" "" ' ""' "" ' "" "" "" "" ""' "" "" "" "" "" "" "" " '" "'" "" "" "" '" ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" "" "" " '" "'" "" "" "" "" "" "" "" "" ' "" "" "" "" "'" "" "" "" "" "" ' ""' "" ' "" "" "" "" ""' " '" """ "" " '" "'" ""

यह एक अद्भुत चुनौती थी। पोस्ट करने के लिए धन्यवाद!

व्याख्या

यह जानने के लिए कि अपठनीय क्या कर सकता है और क्या नहीं कर सकता, दोनों दिशाओं में एक अनंत टेप के साथ ब्रेनफक की कल्पना करें, लेकिन एक समय में एक सेल को चलाने वाले मेमोरी पॉइंटर के बजाय, आप किसी भी मेमोरी सेल को एक पॉइंटर को डेरेफेर करके एक्सेस कर सकते हैं। इस समाधान में यह काफी काम आता है, हालांकि अन्य अंकगणितीय संचालन - जिसमें मोडुलो भी शामिल है - हाथ से किया जाना है।

यहाँ निर्देशक की टिप्पणी के साथ छद्मकोश के रूप में कार्यक्रम है:

// Initialize memory pointer. Why 5 will be explained at the very end!
ptr = 5

// FIRST PASS:
// Read all characters from stdin, store them in memory, and also keep track of the
// current line number at each character.

// We need the +1 here so that EOF, which is -1, ends the loop. We increment ptr by 2
// because we use two memory cells for each input character: one contains the actual
// character (which we store here); the other will contain the line number at which the
// character occurs (updated at the end of this loop body).
while ch = (*(ptr += 2) = read) + 1:

    // At this point, ch will be one more than the actual value.
    // However, the most code-economical way for the following loop is to
    // decrement inside the while condition. This way we get one fewer
    // iteration than the value of ch. Thus, the +1 comes in handy.

    // We are now going to calculate modulo 4 and 5. Why? Because
    // the mod 4 and 5 values of the desired input characters are:
    //
    //  ch  %5  %4
    //  ^   1
    //  v   2
    //  k   3
    //  j   4
    //  ▲   0   2
    //  ▼   0   0
    //
    // As you can see, %5 allows us to differentiate all of them except ▲/▼,
    // so we use %4 to differentiate between those two.

    mod4 = 0      // read Update 2 to find out why mod5 = 0 is missing
    while --ch:
        mod5 = mod5 ? mod5 + 1 : -4
        mod4 = mod4 ? mod4 + 1 : -3

    // At the end of this loop, the value of mod5 is ch % 5, except that it
    // uses negative numbers: -4 instead of 1, -3 instead of 2, etc. up to 0.
    // Similarly, mod4 is ch % 4 with negative numbers.

    // How many lines do we need to go up or down?
    // We deliberately store a value 1 higher here, which serves two purposes.
    // One, as already stated, while loops are shorter in code if the decrement
    // happens inside the while condition. Secondly, the number 1 ('""") is
    // much shorter than 0 ('""""""""'""").
    up = (mod5 ? mod5+1 ? mod5+3 ? 1 : 3 : 2 : mod4 ? 3 : 1)
    dn = (mod5 ? mod5+2 ? mod5+4 ? 1 : 3 : 2 : mod4 ? 1 : 3)

    // As an aside, here’s the reason I made the modulos negative. The -1 instruction
    // is much longer than the +1 instruction. In the above while loop, we only have
    // two negative numbers (-3 and -4). If they were positive, then the conditions in
    // the above ternaries, such as mod5+3, would have to be mod5-3 etc. instead. There
    // are many more of those, so the code would be longer.

    // Update the line numbers. The variables updated here are:
    // curLine = current line number (initially 0)
    // minLine = smallest linenum so far, relative to curLine (always non-positive)
    // maxLine = highest linenum so far, relative to curLine (always non-negative)
    // This way, we will know the vertical extent of our foray at the end.

    while --up:
        curLine--
        minLine ? minLine++ : no-op
        maxLine++

    while --dn:
        curLine++
        minLine--
        maxLine ? maxLine-- : no-op

    // Store the current line number in memory, but +1 (for a later while loop)
    *(ptr + 1) = curLine + 1

// At the end of this, minLine and maxLine are still relative to curLine.
// The real minimum line number is curLine + minLine.
// The real maximum line number is curLine + maxLine.
// The total number of lines to output is maxLine - minLine.

// Calculate the number of lines (into maxLine) and the real minimum
// line number (into curLine) in a single loop. Note that maxLine is
// now off by 1 because it started at 0 and thus the very line in which
// everything began was never counted.
while (++minLine) - 1:
  curLine--
  maxLine++

// Make all the row numbers in memory positive by adding curLine to all of them.
while (++curLine) - 1:
  ptr2 = ptr + 1
  while (ptr2 -= 2) - 2:    // Why -2? Read until end!
    *ptr2++

// Finally, output line by line. At each line, we go through the memory, output the
// characters whose the line number is 0, and decrement that line number. This way,
// characters “come into view” in each line by passing across the line number 0.
while (--maxLine) + 2:    // +2 because maxLine is off by 1
  ptr3 = 5
  while (ptr -= 2) - 5:
    print (*((ptr3 += 2) + 1) = *(ptr3 + 1) - 1) ? 32 : *ptr3   // 32 = space
  ptr = ptr3 + 2
  print 10  // newline

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

वेरिएबल्स को हमेशा संख्यात्मक रूप से अपठनीय (जैसे a = 1कुछ हो जाता है *(1) = 1) में विभाजित किया जाता है । कुछ संख्यात्मक शाब्दिक दूसरों की तुलना में लंबे हैं; सबसे कम 1 है, 2 से पीछा किया जाता है, आदि यह दिखाने के लिए कि नकारात्मक संख्या कितनी लंबी है, यहां संख्या -1 से 7 है:

-1  '""""""""'""""""""'"""  22
 0  '""""""""'"""           13
 1  '"""                     4
 2  '""'"""                  7
 3  '""'""'"""              10
 4  '""'""'""'"""           13
 5  '""'""'""'""'"""        16
 6  '""'""'""'""'""'"""     19
 7  '""'""'""'""'""'""'"""  22

स्पष्ट रूप से, हम उस चर # 1 को आवंटित करना चाहते हैं जो सबसे अधिक बार होता है जो कोड में । पहली बार लूप में, यह निश्चित रूप से है mod5, जो 10 बार आता है। लेकिन mod5पहले लूप के बाद हमें अब और ज़रूरत नहीं है, इसलिए हम उसी मेमोरी लोकेशन को दूसरे वेरिएबल्स पर फिर से आबंटित कर सकते हैं जो हम बाद में इस्तेमाल करते हैं। ये हैं ptr2और ptr3। अब चर को कुल 21 बार संदर्भित किया जाता है। (यदि आप स्वयं घटनाओं की संख्या की गणना करने की कोशिश कर रहे हैं, तो a++दो बार कुछ गणना करना याद रखें , एक बार मूल्य प्राप्त करने के लिए और एक बार इसे सेट करने के लिए।)

केवल एक अन्य चर है जिसे हम फिर से उपयोग कर सकते हैं; हमने modulo मानों की गणना के बाद,ch अब जरूरत नहीं है। upऔर dnकई बार एक ही संख्या में आते हैं, इसलिए या तो ठीक है। के chसाथ विलय करते हैं up

यह कुल 8 अद्वितीय चर छोड़ता है। हम चर 0 से 7 आवंटित कर सकते हैं और फिर मेमोरी ब्लॉक (अक्षर और लाइन नंबर से युक्त) को 8 पर शुरू कर सकते हैं। लेकिन! चूंकि length1 के रूप में कोड में 7 की लंबाई है, इसलिए हम वैरिएबल the1 से 6 का उपयोग कर सकते हैं और मेमोरी ब्लॉक को 7. पर शुरू कर सकते हैं। इस तरह, मेमोरी ब्लॉक की शुरुआत की स्थिति का हर संदर्भ कोड में थोड़ा छोटा है! यह हमें निम्नलिखित कार्य के साथ छोड़ देता है:

-1    dn
 0                      ← ptr or minLine?
 1    mod5, ptr2, ptr3
 2    curLine
 3    maxLine
 4                      ← ptr or minLine?
 5    ch, up
 6    mod4
 7... [data block]

अभी व यह बहुत ऊपर से इनिशियलाइज़ेशन की व्याख्या करता है: यह 5 है क्योंकि यह 7 (मेमोरी ब्लॉक की शुरुआत) माइनस 2 (पहली स्थिति में अनिवार्य वेतन वृद्धि) है। वही पिछले लूप में 5 की अन्य दो घटनाओं के लिए जाता है।

ध्यान दें कि, 0 और 4 कोड में समान लंबाई हैं, ptrऔरminLine उन्हें किसी भी तरह से आवंटित किया जा सकता है। ... या वे कर सकते थे?

लूप के दौरान दूसरे-आखिरी में रहस्यमय 2 के बारे में क्या?यह एक 6 नहीं होना चाहिए? हम केवल डेटा ब्लॉक में संख्याओं को कम करना चाहते हैं, है ना? एक बार जब हम 6 तक पहुँच जाते हैं, तो हम डेटा ब्लॉक से बाहर हो जाते हैं और हमें रुक जाना चाहिए! यह एक बफर अतिप्रवाह बग त्रुटि विफलता सुरक्षा भेद्यता होगी!

ठीक है, सोचें कि अगर हम नहीं रुकते हैं तो क्या होगा। हम 6 और 4 चर चर करते हैं mod4। यह केवल पहली बार लूप में उपयोग किया जाता है और अब इसकी आवश्यकता नहीं है, इसलिए कोई नुकसान नहीं हुआ है। चर 4 के बारे में क्या? आपको क्या लगता है, चर 4 होना ptrचाहिए या यह होना चाहिए minLine? यह सही है, minLineअब इस बिंदु पर भी उपयोग नहीं किया जाता है! इस प्रकार, चर # 4 हैminLine और हम सुरक्षित रूप से इसे घटा सकते हैं और कोई नुकसान नहीं कर सकते हैं!

अद्यतन 1! 2199 से 2145 तक बाइट्स को यह महसूस करके गोल्फिंग किया जाता है कि dnइसके साथ विलय भी किया जा सकता है mod5, भले ही इसके mod5लिए अभी भी मूल्य की गणना में उपयोग किया जाता है dn! नया चर असाइनमेंट अब है:

 0    ptr
 1    mod5, dn, ptr2, ptr3
 2    curLine
 3    maxLine
 4    minLine
 5    ch, up
 6    mod4
 7... [data block]

अद्यतन 2! 2145 से 2134 बाइट्स के लिए गोल्फ को साकार करने के बाद, चूंकि mod5अब एक ही चर में है dn, जिसे कुछ समय में 0 पर गिना जाता है, mod5अब इसे स्पष्ट रूप से 0 से शुरू करने की आवश्यकता नहीं है।

अद्यतन 3! दो चीजों को साकार करके 2134 से 2104 बाइट तक पहुंचा। सबसे पहले, हालांकि "नकारात्मक मोडुलो" विचार इसके लिए लायक था mod5, वही तर्क लागू नहीं होता है mod4क्योंकि हम कभी भी mod4+2आदि के खिलाफ परीक्षण नहीं करते हैं , इसलिए हमें 2110 बाइट्स में बदलना mod4 ? mod4+1 : -3चाहिए mod4 ? mod4-1 : 3। दूसरा, चूँकि mod4हमेशा 0 या 2 होता है, हम mod40 के बजाय 2 को इनिशियलाइज़ कर सकते हैं और दो टर्नरीज़ ( mod4 ? 3 : 1बदले में mod4 ? 1 : 3) को उल्टा कर सकते हैं ।

अद्यतन 4! 2104 से 2087 बाइट्स तक यह महसूस करते हुए कि मॉड्युलो मानों की गणना करने वाला लूप हमेशा कम से कम एक बार चलता है, और इस तरह के मामले में, अपठनीय आपको अंतिम कथन के मूल्य को दूसरी अभिव्यक्ति में फिर से उपयोग करने की अनुमति देता है। इस प्रकार, हमारे बजाय while --ch: [...]; up = (mod5 ? mod5+1 ? [...]अब up = ((while --ch: [...]) ? mod5+1 ? [...](और अंदर है कि लूप करते समय, हम mod4पहले गणना करते हैं , इसलिए यह mod5अंतिम कथन है)।

अद्यतन 5! २० from that से २० by४ बाइट्स तक यह महसूस करते हुए कि मुझे स्थिरांक 32और 10(स्पेस और न्यूलाइन) लिखने के बजाय , मैं १० नंबर (अब अप्रयुक्त) चर # २ में स्टोर कर सकता हूं (चलो इसे कॉल करें ten)। इसके बजाय ptr3 = 5हम लिखते हैं ten = (ptr3 = 5) + 5, फिर 32बन जाता है ten+22और print 10बन जाता है print ten


यह है ...
गज़ब

6

सीजेएम, 37 बाइट्स

r_,2*:L3*S*f{\_iImd8-g\8>)*L+:L\t}zN*

यह वांछित आउटपुट से पहले और बाद में खाली लाइनों को प्रिंट करता है, जिसे ओपी द्वारा अनुमति दी गई है

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

यह काम किस प्रकार करता है

r_     e# Read a token from STDIN and push a copy.
,2*:L  e# Compute its length, double it and save it in L.
3*S*   e# Push a string of 6L spaces.
f{     e# For each character C in the input, push C and the string of spaces; then
  \    e#   Swap C with the string of spaces.
  _i   e#   Push a copy of C and cast it to integer.
  Imd  e#   Push quotient and remainder of its division by 18.
  8-g  e#   Push the sign((C%18) - 8). Gives -1 for ^ and ▲, 1 for v and ▼.
  \    e#   Swap the result with the quotient.
  8>)  e#   Push ((C/18) > 1) + 1. Gives 2 for ▲ and ▼, 1 for ^ and v.
  *    e#   Multiply both results. This pushes the correct step value.
  L+:L e#   Add the product to L, updating L.
  \t   e#   Replace the space at index L with C.
}      e# We've built the columns of the output.
z      e# Zip; transpose rows with columns.
N*     e# Join the rows, separating by linefeeds.

मुझे लगता है कि यह केवल स्पष्ट रूप से एक चेतावनी के रूप में बताना उचित होगा कि आपका समाधान वांछित आउटपुट से पहले और बाद में अतिरिक्त न्यूलाइन्स की प्रचुर मात्रा में उत्पादन करता है ...
टिम्पी

जोड़ा गया। (मुझे नहीं लगा कि ओपी स्पष्ट रूप से खाली लाइनों की अनुमति के बाद से यह आवश्यक था।)
डेनिस

3

अजगर 2, 102

s=input()
j=3*len(s)
exec"w='';i=j=j-1\nfor c in s:i-='kv_^j'.find(c)-2;w+=i and' 'or c\nprint w;"*2*j

प्रिंट लाइन द्वारा लाइन।

इनपुट में पात्रों के माध्यम से लूप्स और वर्तमान ऊंचाई को ट्रैक करता है। ऊँचाई को एक +2, +1, -1, -2गणना द्वारा अद्यतन किया जाता है 'kv_^j'.find(c)-2। शायद एक मॉड चेन है जो छोटी है

जब वर्तमान ऊंचाई लाइन संख्या (जो नकारात्मक हो सकती है) के बराबर होती है, तो हम वर्तमान चरित्र को लाइन में जोड़ते हैं, और अन्यथा एक स्थान को जोड़ते हैं। फिर, हम लाइन प्रिंट करते हैं। दरअसल, यह वर्तमान लाइन नंबर पर ऊंचाई शुरू करने और ऊंचाई में बदलाव को कम करने के लिए छोटा है, जब मूल्य हिट होता है तो चरित्र को जोड़ते हैं0

लाइन संख्या में एक बड़ी पर्याप्त सीमा शामिल है कि अप-टू या डाउन-टू का एक क्रम इसके भीतर रहेगा। वास्तव में, अतिरिक्त मात्रा अच्छी है। यदि हमारे पास इनपुट लंबाई पर ऊपरी सीमा है, तो यह लिखना कम होगा, कहते हैं j=999

हैरानी की बात है, i and' 'or cसामान्य से कम था [' ',c][i==0]। ध्यान दें कि iनकारात्मक हो सकता है, जो कुछ सामान्य चाल को काट देता है।


2

MATLAB, 116

function o=u(a)
x=0;y=1;o='';for c=a b=find(c=='j^ vk')-3;y=y+b;if y<1 o=[zeros(1-y,x);o];y=1;end
x=x+1;o(y,x)=c;end

यह एक शुरुआत है। jऔर kयह गर्दन में दर्द बनाने के रूप में मैं एक तरह से गणितीय से मैप करने के लिए नहीं मिल रहा है j^vkकरने के लिए [-2 -1 1 2]और MATLAB यूनिकोड पहचान नहीं के साथ (जाहिरा तौर पर दोनों ऊपर और नीचे MATLAB। जाओ आंकड़े में 26 के एक मूल्य है!), देखते हैं मैपिंग करते-करते बहुत सारे बाइट बर्बाद हो गए।

@Xnors समाधान से प्रेरणा लेकर, लूप के लिए नियंत्रण वर्ण को मैप करके कोड को अन्य 14 वर्णों से कम किया जा सकता है।

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

और इसके पठनीय रूप में:

function o=u(a)
%We start in the top left corner.
x=0; %Although the x coordinate is 1 less than it should be as we add one before storing the character
y=1;
o=''; %Start with a blank array
for c=a
    %Map the current character to [-2 -1 1 2] for 'j^vk' respectively.
    b=find(c=='j^ vk')-3;
    y=y+b; %Offset y by our character
    if y<1 %If it goes out of range of the array
        o=[zeros(1-y,x); o]; %Add enough extra lines to the array. This is a bit of a hack as 0 prints as a space in MATLAB.
        y=1; %Reset the y index as we have now rearranged the array
    end
    x=x+1; %Move to the next x coordinate (this is why we start at x=0
    o(y,x)=c; %Store the control character in the x'th position at the correct height.
end

चाहेंगे b=[-2 -1 1 2](a==[106 107 94 118])काम करते हैं? यह ऑक्टेव में काम करता है। या यहां तक ​​कि b=[-2 -1 1 2](a-94==[12 13 0 24])अगर आप एक और बाइट दाढ़ी करना चाहते हैं!
व्रजगिन

@Chargin MATLAB में काम नहीं करता है। दुर्भाग्य से उस ==स्टॉप का व्यवहार जो काम कर रहा है, और MATLAB में भी आप एक के ()बाद एक नहीं डाल सकते []
टॉम कारपेंटर

हम्म ... आप भाषा को ऑक्टेव में बदल सकते हैं! :) (ऑक्टेव में भी है +=, fwiw।)
wchargin

@Chargin जो धोखा दे रहा है = पी लेकिन मैं सहमत हूं, ऑक्टेव में बहुत सारे शॉर्टकट हैं जो मतलब के पास नहीं हैं।
दोष

2

जावास्क्रिप्ट (ईएस 6), 140

EcmaScript 6 अनुरूप ब्राउज़र (फ़ायरफ़ॉक्स पर परीक्षण) में नीचे स्निपेट चलाने का परीक्षण करें।

f=s=>[...s].map(c=>{for(t=r[y+=c>'▲'?2:c>'v'?-2:c>'^'?1:-1]||x;y<0;y++)r=[,...r];r[y]=t+x.slice(t.length)+c,x+=' '},y=0,r=[x=''])&&r.join`
`

// Less golfed

f=s=>(
  y=0,
  x='',
  r=[],
  [...s].forEach( c =>
    {
      y += c > '▲' ? 2 : c > 'v' ? -2 : c > '^' ? 1 : -1;
      t = r[y] || x;
      while (y < 0)
      {
        y++;
        r = [,...r]
      }  
      r[y] = t + x.slice(t.length) + c;
      x += ' '
    }
  ),
  r.join`\n`
)  


//Test

;[
  '^^▲^v▼▲^^v'
, '▲v^v^v^v^v^v^v^v▲'
, '^^^^^^^▲▲▲▼▼▼vvvvvv'
, 'v^^vv^^vvv^v^v^^^vvvv^^v^^vv'  
].forEach(t=>document.write(`${t}<pre>${f(t)}</pre>`))
pre { border:1px solid #777 }


1

जीएस 2, 34 बाइट्स

यह एक सही ढंग से आउटपुट सीमा की गणना करता है ताकि कोई अतिरिक्त व्हाट्सएप का उत्पादन न हो। यहाँ हेक्स में मेरा समाधान है

5e 20 76 6a 05 3e 26 ea 30 e0 6d 40 28 26 cf d3
31 e9 d0 4d 42 5e e2 b1 40 2e e8 29 cf d3 5c e9
9a 54

थोड़ा स्पष्टीकरण क्रम में है। स्टैक पर हमारे पास ascii कोड की एक सरणी के रूप में उपयोगकर्ता इनपुट है। कार्यक्रम एक स्ट्रिंग शाब्दिक में शुरू होता है क्योंकि 05। ये रहा।

  5e 20 76 6a      # ascii for "^ vj"
  05               # finish string literal and push to stack
  3e               # index - find index in array or -1 if not found
  26               # decrement
ea                 # map array using block of 3 instructions (indented)

  30               # add 
e0                 # create a block of 1 instruction
6d                 # scan (create running total array of array using block)
40                 # duplicate top of stack
28                 # get minimum of array
26                 # decrement
cf                 # pop from stack into register D (this is the "highest" the path goes)

  d3               # push onto stack from register D
  31               # subtract
e9                 # map array using block of 2 instructions

d0                 # push onto stack from register A (unitialized, so it contains stdin)

  4d               # itemize - make singleton array (also is single char string)
  42               # swap top two elements in stack
  5e               # rjust - right justify string
e2                 # make block from 3 instructions
b1                 # zipwith - evaluate block using parallel inputs from two arrays
40                 # duplicate top of stack

  2e               # get length of array/string
e8                 # map array using block of 1 instruction
29                 # get maximum of array
cf                 # pop from stack into register D (this is the "lowest" the path goes)

  d3               # push from register D onto stack
  5c               # ljust - left justify string
e9                 # map array using block of two instructions
9a                 # transpose array of arrays
54                 # show-lines - add a newline to end of each element in array

जीएस 2, 24 बाइट्स

मेरे पास एक 24 बाइट समाधान भी है जो आउटपुट आकार की गणना करने में उतना ध्यान नहीं रखता है, और अतिरिक्त व्हाट्सएप के साथ समाप्त होता है। मैं व्हॉट्सएप वाले को कम से कम हालांकि रखना पसंद करता हूं।

5e 20 76 6a 05 3e 26 ea 30 e0 6d d0 08 4d 42 d1
30 5e d1 5c 09 b1 9a 54

1

क्रेयॉन , 13 बाइट्स (गैर-प्रतिस्पर्धात्मक)

O"^ vj"\CynIq

इसे ऑनलाइन आज़माएं! असली तीरों का उपयोग करता है क्योंकि क्यों नहीं।

गैर-प्रतिस्पर्धात्मक क्योंकि क्रेयॉन इस चुनौती की तुलना में नया है।

यह काम किस प्रकार करता है

क्रेयॉन एक स्टैक-आधारित भाषा है जिसे ASCII- कला चुनौतियों पर हत्यारा बनाया गया है। इसे 2-आयामी आउटपुट "कैनवास", और "क्रेयॉन" के आधार पर बनाया गया है, एक कर्सर जो इस कैनवास के चारों ओर घूमता है। कुछ भी जो आउटपुट में भेजा जाता है, वह क्रेयॉन की स्थिति पर कैनवास पर खींचा जाता है, और जिस दिशा में क्रेयॉन का सामना करना पड़ रहा है। डिफ़ॉल्ट रूप से, क्रेयॉन पूर्व (दाईं ओर) को इंगित करता है।

O"^ v▼"\CynIq   Implicit: input string is on top of the stack
O               For each char I in the input string:
 "^ v▼"          Push this string.
       \         Swap the top two items (so I is on top).
        C        Take the index of I in the string.
                 This returns 3 for ▼, 2 for v, 0 for ^, and -1 for ▲.
         y       Move the crayon by this number of spaces on the Y-axis (south).
          n      Move the crayon one position north.
                 The crayon has now been translated 2 positions south for ▼,
                 1 south for v, 1 north for ^, and 2 north for ▲.
           Iq    Draw I at the crayon. This automatically moves the crayon forward
                 by the length of I, which is 1 in this case.

0

पीबी - 136 बाइट्स

^w[B!0]{>}v[3*X]<[X]<b[1]^[Y]^>w[B!0]{t[B]<vw[B=0]{v}>w[T=107]{^^b[T]t[0]}w[T=94]{^b[T]t[0]}w[T=118]{vb[T]t[0]}w[T!0]{vvb[T]t[0]}^[Y]^>}

उपयोग kऔर jके बजाय और

नोटों की एक जोड़ी:

  • Escape sequences that move the cursor such as \e[B are not allowed. You must produce the output using spaces and newlines.मैं इस नियम का पालन करता हूँ! pb आउटपुट वर्णों के लिए "ब्रश" की अवधारणा का उपयोग करता है। ब्रश "कैनवास" के चारों ओर घूमता है और इसके नीचे एक चरित्र को तुरंत प्रिंट कर सकता है। हालांकि, वास्तविक कार्यान्वयन रिक्त स्थान और newlines का उपयोग करके चरित्र को प्रिंट करता है।
  • मैं इस चुनौती से परेशान नहीं था, हालांकि मुझे लगा कि जब तक मैं सत्तारूढ़ नहीं होता, तब तक यह पीबी के साथ मज़ेदार होगा You are allowed trailing spaces and/or empty lines। यह कुछ कारणों से है:
    • पंजाब में अनुगामी स्थान नहीं हो सकते । यह हमेशा आयताकार आउटपुट का उत्पादन करता है, यदि आवश्यक हो तो रिक्त स्थान के साथ पैडिंग।
    • यह प्रोग्राम बहुत सारी खाली लाइनें पैदा करता है। यह नहीं पता है कि जब यह इसे बनाना शुरू करता है तो उत्पादन कितना लंबा होता है, इसलिए लंबाई के इनपुट के लिए nयह शुरू होता है Y=3n+1-1क्योंकि यह नीचे जा रहा है है 3nसे Y=-1, और पर शुरू Y=2n-1सभी के इनपुट के लिए विफल रहता है k

आप YouTube पर इस कार्यक्रम को एक्शन में देख सकते हैं! इस संस्करण को थोड़ा संशोधित किया गया है कि यह केवल नीचे जाता है n-1। यह इस इनपुट के लिए काम करता है, लेकिन दूसरों के लिए विफल हो जाएगा। हालाँकि, यह बहुत अच्छे लोगों को पकड़ लेता है।

टिप्पणियों के साथ:

^w[B!0]{>}             # Go to the end of the input
v[3*X]                 # Go down 3 times the current X value
<[X]<                  # Go to X=-1 (off screen, won't be printed)
b[1]                   # Leave a non-zero value to find later
^[Y]^>                 # Back to the beginning of the input
w[B!0]{                # For every byte of input:
    t[B]                 # Copy it to T
    <vw[B=0]{v}>         # Go 1 to the right of the character to the left
                         # (either the last one printed or the value at X=-1)
                         # Move the correct amount for each character and print it:
    w[T=107]{^^b[T]t[0]} # k
    w[T=94]{^b[T]t[0]}   # ^
    w[T=118]{vb[T]t[0]}  # v
    w[T!0]{vvb[T]t[0]}   # j (Every other possibility sets T to 0, so if T is not 0
                         #    it must be j. T!0 is shorter than T=106)
    ^[Y]^>               # To the next byte of input to restart the loop
}

0

सीलोन, 447 बाइट्स

import ceylon.language{o=null,v=variable,s=shared}s void y(){v L c;v L f;v L l;v Integer i=0;class L(v L?p,v L?n){s v String t="";s L u=>p else(f=p=L(o,this));s L d=>n else(l=n=L(this,o));s void a(Character c)=>t=t+" ".repeat(i-t.size)+c.string;}f=l=c=L(o,o);for(x in process.readLine()else""){switch(x)case('^'){c=c.u;}case('v'){c=c.d;}case('▲'|'k'){c=c.u.u;}case('▼'|'j'){c=c.d.d;}else{}c.a(x);i++;}print(f.t);while(f!=l){f=f.d;print(f.t);}}

या "पठनीयता" के लिए लाइन ब्रेक के साथ: import ceylon.language{o=null,v=variable,s=shared}s void y(){v L c;v L f;v L l;v Integer i=0;class L(v L?p,v L?n){s v String t="";s L u=>p else(f=p=L(o,this));s L d=>n else(l=n=L(this,o));s void a(Character c)=>t=t+" ".repeat(i-t.size)+c.string;}f=l=c=L(o,o);for(x in process.readLine()else""){switch(x)case('^'){c=c.u;}case('v'){c=c.d;}case('▲'|'k'){c=c.u.u;}case('▼'|'j'){c=c.d.d;}else{}c.a(x);i++;}print(f.t);while(f!=l){f=f.d;print(f.t);}}

यह ▲ / ▼ और j / k दोनों इनपुट के साथ काम करता है (यदि हमें उनमें से सिर्फ एक का समर्थन करना था, तो कार्यक्रम 8 बाइट्स छोटा होगा)। अंतिम आउटपुट लाइन खाली है जब शुरुआती स्थिति उस पर थी (यानी पहला इनपुट एक था या ^हम बाद में फिर कभी नीचे नहीं मिला)। इनपुट जो निर्दिष्ट वर्णों में से एक नहीं है, बस लाइन को स्विच किए बिना, जैसा कि मुद्रित किया जाएगा:

v^^vv^^vvv^v^v^^^Hellovvvv^^v^^vv

  ^   ^         ^Hello
 ^ v ^ v       ^      v       ^
v   v   v ^ ^ ^        v   ^ ^ v
         v v v          v ^ v   v
                         v

यहाँ एक स्वरूपित संस्करण (753 बाइट्स) है:

shared void y() {
    variable L c;
    variable L f;
    variable L l;
    variable Integer i = 0;
    class L(variable L? p, variable L? n) {
        shared variable String t = "";
        shared L u => p else (f = p = L(null, this));
        shared L d => n else (l = n = L(this, null));
        shared void a(Character c) => t = t + " ".repeat(i - t.size) + c.string;
    }
    f = l = c = L(null, null);
    for (x in process.readLine() else "") {
        switch (x)
        case ('^') { c = c.u; }
        case ('v') { c = c.d; }
        case ('▲' | 'k') { c = c.u.u; }
        case ('▼' | 'j') { c = c.d.d; }
        else {}
        c.a(x);
        i++;
    }
    print(f.t);
    while (f != l) {
        f = f.d;
        print(f.t);
    }
}

यह लगभग सीधा-आगे का "ऑब्जेक्ट-ओरिएंटेड" प्रोग्राम है ... (लोकल) क्लास L(लाइन बफर) टेक्स्ट की एक लाइन (इन t), साथ ही साथ (nullable) पॉइंटर्स को अगले ( n) और पिछले ( p) स्टोर करता है। लाइन। (अशक्त नहीं) विशेषताएँu अप करने (ऊपर और dनीचे) के लिए (यदि आवश्यक हो तो खुद के लिए एक रिवर्स पॉइंटर के साथ) को इनिशियलाइज़ करें, और इस मामले में भी पहली और अंतिम पंक्ति का समग्र (इन fऔर lवैरिएबल्स) ट्रैक रखें ।

a(संलग्न) विधि इस लाइन के लिए एक चरित्र जोड़ देती है, अंत में आवश्यक कुछ रिक्त स्थान सहित।

cवर्तमान लाइन है। हम इनपुट स्ट्रिंग का उपयोग करते हैंreadLine एक स्विच स्टेटमेंट का इनपुट का एक लाइन पर होना चाहिए) को जो वर्तमान लाइन को अपडेट करता है, और फिर एपेंड विधि को कॉल करता है।

पार्सिंग किए जाने के बाद, हम उनमें से प्रत्येक को प्रिंट करते हुए, पहले से आखिरी तक की रेखाओं पर पुनरावृति करते हैं। (यह नष्ट करता हैf सूचक , अगर बाद में इसकी आवश्यकता थी, तो हमें इसके लिए एक अलग चर का उपयोग करना चाहिए था।)

गोल्फ के लिए कुछ प्रयोग की जाने वाली ट्रिक्स:

  • कुछ सामान जो अन्य भाषाओं में होंगे वे वास्तव में ceylon.languageपैकेज में केवल पहचानकर्ता हैं , और एक उपनाम आयात के साथ इसका नाम बदला जा सकता है - हमने इसका उपयोग एनोटेशन shared(5 × प्रयोग किया जाता है) और variable(6 × का उपयोग किया), साथ ही ऑब्जेक्ट के लिए भी किया है। null(उपयोग 4 ×):

    import ceylon.language{o=null,v=variable,s=shared}
    

    (ट्रिविया: सीलोन आईडीई में प्रारूप कुछ अंतर्निहित भाषा एनोटेशन को प्रारूपित करता है, उनके बीच variableऔर shared, उन्हें एनोटेट घोषित के रूप में एक ही पंक्ति में डालकर, कस्टम एनोटेशन के विपरीत, जिसे घोषणा से ऊपर एक अलग लाइन पर रखा जाता है। यह गोल्फ कार्यक्रम के स्वरूपित संस्करण को अपठनीय बनाता है, इसलिए मैंने इस संस्करण के लिए उपनाम-आयात वापस बदल दिया है।)

    this, void, case, elseवास्तविक कीवर्ड हैं और इस तरह से नाम नहीं बदला जा सकता है, और Integer, Stringऔर Characterबस हर एक बार दिखाई देगा, इसलिए कुछ भी नहीं आयात करके प्राप्त किया जा करने के लिए नहीं है।

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

  • उस स्क्रीनबफ़र वर्ग की भी विधियाँ upऔर downविधियाँ थीं, जिन्हें पार्सर से बुलाया गया था (और currentLine = currentLine.upक्रमशः किया गया था currentLine = currentLine.down)। यह दर्शाता है कि सीधे पार्सर के स्विच में ऐसा करना कम है। इसके बजाय लिखने की अनुमति दी गई currentLine = currentLine.up.up(जो बाद में बन गई c = c.u.u) currentLine = currentLine.up;currentLine = currentLine.up

  • मूल रूप से हमने परिशिष्ट विधि में एक तर्क के रूप में वर्तमान सूचकांक को पारित किया था (और यहां तक ​​कि लूप से पार्सर के लिए) - इसमें होने वाले फ़ंक्शन में एक चर कम है।

  • मूल रूप से मेरे प्रिंटअल पद्धति ने वर्तमान पॉइंटर का उपयोग किया और इसे तब तक ऊपर ले जाया गया जब तक कि वर्तमान लाइन खाली नहीं हो गई, और फिर प्रत्येक लाइन को प्रिंट करते समय नीचे। लाइनों पर कूदने के लिए so और ▲ का उपयोग करते समय यह टूट गया, इसलिए हमें स्पष्ट रूप से इसके बजाय उन कूद लाइनों में कुछ जोड़ना था। पहली / अंतिम पंक्ति पर नज़र रखना आसान साबित हुआ (हालाँकि इसने दो प्रिंट स्टेटमेंट्स का उपयोग करना आवश्यक बना दिया, क्योंकि सीलोन में डू-ए-लूप नहीं है)।

  • मूल रूप से मेरे पास कुछ ऐसा था:

      String? input = process.readLine();
      if(exists input) {
         for(x in input) {
             ...
         }
      }
    

    process.readLineरिटर्न nullअगर कोई लाइन नहीं है जिसे पढ़ा जा सकता है (क्योंकि इनपुट बंद हो गया है), और सीलोन कंपाइलर को मुझे जांचने की आवश्यकता है कि मैं पहुंचने से पहले input। जैसा कि इस मामले में मैं कुछ भी नहीं करना चाहता हूं, मैं उस elseऑपरेटर का उपयोग कर सकता हूं जो अपना पहला तर्क लौटाता है यदि अशक्त नहीं है, और अन्यथा इसका दूसरा तर्क, चर और अगर-स्टेटमेंट को बचाता है। (यह भी हमारे परीक्षण के लिए एक डिफ़ॉल्ट इनपुट सांकेतिक शब्दों में बदलना करने की अनुमति होगी: for (x in process.readLine() else "^^▲^v▼▲^^v") {)


0

जावास्क्रिप्ट (ईएस 6), 228 बाइट्स

E=(r,p=(' '[M='repeat'](Z=r.length)+',')[M](Z*4),i=Z*2,k=0)=>Z>k?E(r,(p.split(',').map((o,q)=>q==i?o.slice(0,k)+r[k]+o.slice(k++):o)).join`,`,i+(H={'^':-1,k:-2,j:2,v:1})[r[k]],k):p.split(',').join`
`.replace(/\s+\n$|^\s+\n/g,'')

खैर, यहां एक (बल्कि लंबा) पुनरावर्ती समाधान है जो दिए गए सभी परीक्षण मामलों को पास करता है। यह एक अच्छी चुनौती थी। यह उपयोग करता हैk और jके स्थान पर और

टेस्ट स्निपेट

हालाँकि सबमिशन केवल संभाल सकता है k,j, निम्नलिखित स्निपेट दोनों को संभाल सकता है k,jऔर ▼,▲

E=(r,p=(' '[M='repeat'](Z=r.length)+',')[M](Z*4),i=Z*2,k=0)=>Z>k?E(r,(p.split(',').map((o,q)=>q==i?o.slice(0,k)+r[k]+o.slice(k++):o)).join`,`,i+(H={'^':-1,k:-2,j:2,v:1})[r[k]],k):p.split(',').join`
`.replace(/\s+\n$|^\s+\n/g,'')
Input: <input type="text" oninput=o.textContent=E(this.value.replace(/▲/g,'k').replace(//g,'j'))></input>
<pre id='o'></pre>

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