कालीन को रोल करें


15

यह प्रश्न केविन क्रूज़सेन के प्रश्न से प्रेरित है ।

अब जब कालीन बिछाया गया है, हम इसे रोल करना चाहते हैं। आपका कार्य एक प्रोग्राम लिखना है जो एक स्ट्रिंग लेता है और इस स्ट्रिंग से बना एक सर्पिल लौटाता है (एक तरफ से देखे गए लुढ़का कालीन का प्रतिनिधित्व करता है)।

कालीन को रोल करने के एक चरण की प्रक्रिया निम्नलिखित है। इसका एक उदाहरण है कि मेरा क्या मतलब है। ध्यान दें कि उदाहरण बेहतर समझ के लिए आंशिक रूप से लुढ़के कालीन से शुरू होता है:

ac
rpet
  • "सिर" को कालीन की "पूंछ" से अलग करें: सिर वह है जो अब तक लुढ़का हुआ है, पूंछ वह है जो लुढ़का हुआ है।
Head: ac   Tail:
      rp          et
  • सिर को 90 °, दक्षिणावर्त घुमाएँ।
Rotated head: ra   Tail (unchanged):
              pc                       et
  • यदि नए सिर की चौड़ाई (यहां 2) पूंछ की लंबाई से कम या बराबर है (यहां 2)
    • फिर, इसे पूंछ के ऊपर रखें
    • दूसरा, कालीन (जैसा कि यह कदम की शुरुआत में था) लुढ़का हुआ था
New carpet: ra
            pc
            et

आवश्यकतानुसार प्रक्रिया को कई बार दोहराएं।


कारपेट रोलिंग के सभी चरणों को दिखाने वाले दो उदाहरण:

carpet

 c
 arpet

  ac
  rpet

    ra
    pc
    et
0123456789

 0
 123456789

  10
  23456789

    21
    30
    456789

      432
      501
      6789

कुछ पूर्वाग्रह:

  • आपको सभी मध्यवर्ती चरणों को दिखाने की आवश्यकता नहीं है, केवल लुढ़का हुआ कालीन (जैसे यदि आप परिणाम की गणना करने के लिए एक गैर-पुनरावृत्ति तरीका पाते हैं, तो यह सही है)। इसके अलावा, आपको किसी भी प्रमुख व्हाट्सएप को प्रिंट करने की आवश्यकता नहीं है, ऊपर दिए गए उदाहरणों में, मैं केवल उन्हें सामान संरेखित करने के लिए दिखाता हूं।
  • इनपुट एक स्ट्रिंग, एक सूची / सरणी है
  • आउटपुट को stdout या किसी फ़ाइल में प्रिंट किया जाता है।
  • इनपुट अच्छा है: लंबाई कम से कम 1 char है, और कम से कम एक निरंतर पर्याप्त रूप से छोटा है ताकि यह समस्या पैदा न करे, लेकिन आप अपने प्रोग्राम में उस निरंतर का उपयोग नहीं कर सकते हैं; स्ट्रिंग की सामग्री केवल अच्छे वर्ण ([a-zA-Z0-9]) है, जो आपकी प्राथमिकता पर एन्कोडिंग है।
  • यह , इसलिए बाइट्स जीत में सबसे छोटा जवाब है। कोड-गोल्फ भाषाओं को गैर-कोडगॉल्फिंग भाषाओं के साथ उत्तर पोस्ट करने से हतोत्साहित न करें। 'किसी भी' प्रोग्रामिंग भाषा के लिए यथासंभव संक्षिप्त उत्तर के साथ आने का प्रयास करें।
  • डिफ़ॉल्ट लूपोल्स वर्जित हैं।
  • यदि संभव हो, तो कृपया अपने कोड के लिए एक परीक्षण के साथ एक लिंक जोड़ें।
  • यदि आपको लगता है कि इसकी आवश्यकता है, तो अपने उत्तर के लिए स्पष्टीकरण भी जोड़ें।


2
यह भी एक: codegolf.stackexchange.com/questions/125966/… , लेकिन समाप्ति चेक में कोई भी शामिल नहीं है।
ब्रोइंड

3
सुझाए गए परीक्षण के मामले: ProgrammingPuzzlesAndCodeGolf- अंतिम पूंछ की लंबाई 1 से अधिक है।
सोक

1
मुझे लगता है कि आपने "सिर" और "पूंछ" शब्दों को यहां स्वैप किया है: "यदि नए सिर की चौड़ाई [...] पूंछ की लंबाई से अधिक या बराबर है [...]"।
आउटगोल्फर

1
अत्यधिक प्रतिबंधात्मक इनपुट / आउटपुट नियमों के कारण डाउनवोट किया गया; मैंने अपना पायथन 2 उत्तर हटा दिया क्योंकि कोई printअंदर उपयोग नहीं कर सकता lambda
चास ब्राउन

जवाबों:


7

चारकोल , 15 बाइट्स

FS«F¬℅§KV⁰⟲⁶→Pι

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण:

FS«

कालीन पर लूप।

F¬℅§KV⁰

जांचें कि कर्सर के ऊपर कुछ भी है या नहीं।

⟲⁶

यदि नहीं, तो कालीन को रोल करें।

→Pι

सही ले जाएँ और वर्तमान वर्ण आउटपुट करें।

उदाहरण: इनपुट के लिए 0123456789, निम्नलिखित क्रियाएं होती हैं:

0

0 छपा है।

01

कर्सर सही चलता है और 1मुद्रित होता है।

0
1

चूंकि 1, ऊपर कुछ भी नहीं है , इसलिए कैनवास को घुमाया जाता है।

0
12

कर्सर दाएं चलता है और 2मुद्रित होता है।

10
2

चूंकि 2, ऊपर कुछ भी नहीं है , इसलिए कैनवास को घुमाया जाता है।

10
23

कर्सर दाएं चलता है और 3मुद्रित होता है।

10
234

कर्सर दाएं चलता है और 4मुद्रित होता है।

21
30
4

चूंकि 4, ऊपर कुछ भी नहीं है , इसलिए कैनवास को घुमाया जाता है।

21
30
45

कर्सर दाएं चलता है और 5मुद्रित होता है।

21
30
456

कर्सर दाएं चलता है और 6मुद्रित होता है।

432
501
6

चूंकि 6, ऊपर कुछ भी नहीं है , इसलिए कैनवास को घुमाया जाता है।

432
501
67

कर्सर दाएं चलता है और 7मुद्रित होता है।

432
501
678

कर्सर दाएं चलता है और 8मुद्रित होता है।

432
501
6789

कर्सर दाएं चलता है और 9मुद्रित होता है।


वह तो कमाल है। तो मूल रूप से चारकोल में एक अंतर्निहित "रोल" ऑपरेटर है ?
योना

1
@ जोना खैर, मेरे लिए यह रोल नहीं होगा क्योंकि यह चल रहा है, लेकिन स्ट्रिंग कैरेक्टर-बाय-कैरेक्टर को आउटपुट करके मैं रोल कर सकता हूं जैसे मैं जाता हूं, हां।
नील

3

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

.U+j;bZ.WgleHJlhH,+_MChZ<eZJ>eZJ,]hQt

इसे यहाँ ऑनलाइन आज़माएँ , या यहाँ पर सभी परीक्षण मामलों को सत्यापित करें

.U+j;bZ.WgleHJlhH,+_MChZ<eZJ>eZJ,]hQtQ   Implicit: Q=eval(input())
                                         Trailing Q inferred
                                 ]hQ     First character of Q, wrapped in an array
                                    tQ   All but the first character of Q
                                ,        2-element array of the two previous results
                                           This yields array with rolled carpet (as array of strings) followed by the tail
       .W                                While condition function is truthy, execute inner function, with initial value of the above:
         gleHJlhH                          Condition function, input H
             JlhH                            Number of layers in the current rolled carpet, store in J
          leH                                Lenth of the tail
         g   J                               Is the above greater than or equal to J?
                 ,+_MChZ<eZJ>eZJ           Inner function, input Z
                   _MChZ                     Rotate the current rolled carpet (transpose, then reverse each row)
                  +     <eZJ                 Append the first J characters of the tail as a new row
                 ,                           Pair the above with...
                            >eZJ             ... all but the first J characters of the tail - this is the new tail
.U+j;bZ                                  Join the carpet roll on newlines and append the tail, implicit print

3

हस्क , 24 बाइट्स

►S=ÖLmFȯ:T↔ø§z:oΘḣĠ+CṘ2N

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

व्याख्या

Implicit input, say s="carpets"

CṘ2N  Break s into chunks:
   N   Natural numbers: [1,2,3,4,..
 Ṙ2    Repeat each twice: [1,1,2,2,3,3,4,4,..
C      Break s into chunks of these lengths: ["c","a","rp","et","s"]
       The last chunk is shorter if we run out of characters.

§z:oΘḣĠ+  Attempt to merge suffix of chunks:
      Ġ    Cumulative reduce chunk list from right
       +   by concatenation: ["carpets","arpets","rpets","ets","s"]
   oΘḣ     Prefixes of chunk list (empty and nonempty): [[],["c"],..,["c","a","rp","et","s"]]
§z         Zip these by
  :        appending: [["carpets"],["c","arpets"],..,["c","a","rp","et","s"]]
           These are all versions of the chunk list where some suffix has been merged.

mFȯ:T↔ø  Roll each list:
m         Map
 F        reduce from left
      ø   starting from empty character matrix
  ȯ:T↔    by this function:
    T↔     Reverse and transpose (rotating by 90 degrees)
  ȯ:       then append next chunk as new row.
         Result: [["carpets"],["c","arpets"],..,["epr","tca","s"]]

►S=ÖL  Select the matrix rolled by the correct amount:
►       Find element that maximizes
 S=     being equal to
   ÖL   sort by length.
        This selects a matrix whose rows have non-decreasing lengths.
        Ties are broken by choosing the rightmost one.
       Result: ["ra","pc","ets"]

Implicitly print each row separated by newlines.

2

जे , 69 बाइट्स

-3 बाइट्स FrownyFrog के लिए धन्यवाद

[:(}:@[,{:@[,])&>/[:((|:@|.@[,#@[$]);#@[}.])&>/^:(<:&#&>/)^:_,.@{.;}.

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

व्याख्या

[: (}:@[ , {:@[ , ])&>/ [: ((|:@|.@[ , #@[ {. ]) ; #@[ }. ])&>/^:(<:&#&>/)^:_ }. ;~ 1 1 $ {.

जे के लिए थोड़ा वर्बोज़ होने के बावजूद एल्गोरिदम सीधा है।

कुल मिलाकर रणनीति: (संभवतः खाली) बचे हुए टुकड़े के साथ एक वर्ग तालिका में इनपुट को कम करें।

जैसे ही हम कम करते हैं, हम बॉक्स के 2 तत्व सूची का उपयोग करेंगे। हमारा "अब तक का परिणाम" पहला बॉक्स होगा, और "संसाधित होने के लिए शेष आइटम" दूसरा बॉक्स होगा। पहला बॉक्स इनपुट के सिर पर आरंभीकृत किया जाएगा (लेकिन एक तालिका में परिवर्तित):

1 1 $ {.

और "संसाधित होने के लिए शेष आइटम" इनपुट की पूंछ होगी:

}. ;~

अब हमारे पास है:

┌─┬─────┐
│c│arpet│
└─┴─────┘

जहां 'c' वास्तव में 1x1 टेबल है।

हम एक J Do का उपयोग करते हुए इसे कम करते हैं ... जबकि लूप:

^:(...)^:_

जहां कोष्ठक में हिस्सा "चालू रखना" स्थिति है:

<:&#&>/

जो कहता है "चलते रहो जबकि दाएं बॉक्स की लंबाई बाएं बॉक्स की लंबाई से अधिक या उसके बराबर है (यानी, वर्ग मैट्रिक्स की तरफ की लंबाई)

"चलते रहो" का क्या मतलब है? इसे क्रिया में पहले के बाईं ओर परिभाषित किया गया है ^:, जो हमें बताता है कि वर्तमान परिणाम को कैसे लिया जाए और अगली पुनरावृत्ति का उत्पादन किया जाए। वह क्रिया है:

((|:@|.@[ , #@[ {. ]) ; #@[ }. ])&>/

चलो इसे तोड़ दो:

((|:@|.@[ , #@[ {. ]) ; #@[ }. ])&>/
(  verb in parens               )&>/ NB. put the verb in parens
                                     NB. between the two items
                                     NB. of our list, and unbox
                                     NB. them into left / right
                                     NB. args ([ / ]) for the verb
 (|:@|.@[ , #@[ {. ]) ; #@[ }. ]     NB. breaking down verb in 
                                     NB. parens...
                      ; ....         NB. new "remaining items":
                            }. ]     NB. remove from remaining
                        #@[          NB. the size of a side of
                                     NB. the result matrix
                ....  ;              NB. new "result":
  |:@|.@[                            NB. rotate existing result
          ,                          NB. and put it on top of
            #@[ {. ]                 NB. the items we removed
                                     NB. from remaining items

यही है, यह सिर्फ ओ में शाब्दिक रूप से अनुवादित ओपी में वर्णित एल्गोरिदम है।

अंत में हम (संभवतः 0) बचे हुए आइटम, हमारे कालीन रोल की पूंछ से निपटते हैं:

(}:@[ , {:@[ , ])&>/

यह कहता है "परिणाम के सभी लेकिन अंतिम एल्म ले":

}:@[ 

और ,परिणाम {:@[के अंतिम आइटम पर उस अंतिम आइटम के साथ संलग्न आइटम के लिए इसे संलग्न करें, ]


आह, जे ... अक्षर नोब्स के लिए हैं
आरके।

,.क्या कर सकता 1 1$]है और $इसका उपयोग किया जा सकता है {.
फ्रॉन्फ्रॉग में

@FrownyFrog ty मैं समझ गया अपने पहले सुझाव के साथ 70 बाइट्स में था, लेकिन अगर मुझे समझ में नहीं आया $ can be used as {.- क्या आप स्पष्ट कर सकते हैं?
योना

1
स्पष्टीकरण की अंतिम पंक्ति, आप {का उपयोग करते हैं। कम करने के लिए, कि मैं जितना समझ सकता हूं, वह एक $ हो सकता है।
फ्रॉन्फ्रॉग

इसके अलावा आप सही [: @ @ के साथ
FrownyFrog

1

आर , 146 132 बाइट्स

function(s){m=F[F]
while({m=rbind(t(m)[,F:0],s[1:F])
s=s[-1:-F]
length(s)>sum(F<-dim(m))})0
write(m[F:1,],1,F[1],,"")
cat(s,sep="")}

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

कालीन-रोलिंग प्रक्रिया को लागू करता है। पात्रों की सूची के रूप में इनपुट लेता है और स्टडआउट को प्रिंट करता है।

एक do-whileलूप का उपयोग करने का एक तरीका खोजने और उपयोग को प्रारंभ करने के द्वारा 14 बाइट्स सहेजे गए F

function(s){
m=F[F]					# logical(0); create an empty array (this gets automatically promoted to character(0) later
while(					# do-while loop
      {m=rbind(t(m)[,F:0],s[1:F])	# rotate m counterclockwise and add the first F characters of s to the bottom
       s=s[-1:-F]			# remove those characters
       length(s)>sum(F<-dim(m))})0	# while the number of characters remaining is greater than the sum of m's dimensions
write(m[F:1,],1,F[1],,"")		# write the rolled portion write writes down the columns, we reverse each column
cat(s,sep="")				# and write the remaining characters
}

1

जेली , 30 बाइट्स

बहुत लंबा लगता है ...

ḢW,ðZU;Ls@¥©ḢWɗ,®Ẏ¤ð/ẈṢƑ$¿ḢY;Ɗ

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

कैसे?

ḢW,ðZU;Ls@¥©ḢWɗ,®Ẏ¤ð/ẈṢƑ$¿ḢY;Ɗ - Main Link: list of characters
Ḣ                              - pop and yield head
 W                             - wrap in a list
  ,                            - pair with (the remaining list after Ḣ)
                         ¿     - while...
                        $      - ...condition: last two links as a monad:
                     Ẉ         -   length of each
                       Ƒ       -   is invariant under:
                      Ṣ        -     sort
                    /          - ...do: reduce by:
   ð               ð           -   the enclosed dyadic chain -- i.e. f(head, tail):
    Z                          -     transpose
     U                         -     reverse each (giving a rotated head)
              ɗ                -     last three links as a dyad:
          ¥                    -       last two links as a dyad:
       L                       -         length (i.e. number of rows in current roll)
         @                     -         with swapped arguments:
        s                      -           split (the tail) into chunks of that length
           ©                   -       (copy to register for later)
            Ḣ                  -       pop and yield head (Note register "copy" is altered too)
             W                 -       wrap in a list
      ;                        -     concatenate (the rotated head with the first chunk of the tail)
                  ¤            -     nilad followed by link(s) as a nilad:
                ®              -       recall from register (other chunks of tail, or an empty list)
                 Ẏ             -       tighten (the chunks to a flat list)
               ,               -     pair (the concatenate result with the tightened chunks)
                             Ɗ - last three links as a monad:
                          Ḣ    -   pop and yield head
                           Y   -   join with newline characters
                            ;  -   concatenate (the remaining tail)
                               - when running as a full program implicitly prints

1

05AB1E , 41 बाइट्स

g©L¦€DD2šηO®>‹Ï©IŽ8OS®g4α._.ΛðÜI®O®g->.$«

रास्ता बहुत लंबा है, लेकिन मैं कैनवस का उपयोग करना चाहता था .. जो शायद अब एक बुरा विकल्प था कि मैंने इसे समाप्त कर दिया है और यह इस तरह का हो गया है।

इसे ऑनलाइन आज़माएं । (कोई परीक्षण सूट नहीं है, क्योंकि बिल्टिन के साथ एक अजीब मुद्दा लगता है ..)

स्पष्टीकरण:

मुझे कैनवस की एक सामान्य व्याख्या देकर और जो मैं चाहता था कि मेरा कोड पूरा हो जाए। इस विस्तृत 05AB1E टिप में अधिक विस्तृत जानकारी मिल सकती है , लेकिन इस चुनौती के लिए मैं निम्नलिखित कार्य करना चाहता था:

कैनवस बिलिन में तीन पैरामीटर होते हैं:

  • : रेखा का आकार (ओं) का। इस चुनौती के लिए, यह एक सूची होगी [2,2,3,3,4,4,5,5,...]
  • : जिस चरित्र को हम प्रदर्शित करना चाहते हैं। इस चुनौती के लिए, यह केवल इनपुट-स्ट्रिंग होगी।
  • सी: जिस दिशा में हम इन चरित्र-रेखाओं को खींचना चाहते हैं। इस चुनौती के लिए यह निर्देश होगा[2,0,6,4] ([,,,]) घुमाया गया nअलग-अलग प्रारंभिक दिशा (यानी इनपुट carpetहै) के लिए इनपुट-स्ट्रिंग के आधार पर समय की मात्रा[0,6,4,2]इसके बजाय और इनपुट 0123456789ABCDEFGHIहै[6,4,2,0] बजाय)।

कोड के लिए के रूप में:

g                # Get the length of the (implicit) input-string
 ©               # Store it in the register (without popping)
  L              # Create a list in the range [1,length]
   ¦             # Remove the first item to make the range [2,length]
    D           # Duplicate each to get the list [2,2,3,3,4,4,5,5,...]
      D2š        # Create a copy and prepend a 2: [2,2,2,3,3,4,4,5,5,...]
         η       # Get the prefixes: [[2],[2,2],[2,2,2],[2,2,2,3],...]
          O      # Sum each prefix: [2,4,6,9,12,16,20,...]
           ®     # Push the length from the register again
            >‹   # Check for each summed prefix if it's <= length
              Ï  # And only leave the truthy values
               © # And store this in the register (without popping)
                 # (This is our `a` for the Canvas builtin)
I                # Push the input-string
                 # (This is our `b` for the Canvas builtin)
Ž8O              # Push compressed integer 2064
   S             # Converted to a list of digits: [2,0,6,4]
    ®g           # Push the list from the register, and get its length
      4α         # Get the absolute difference with 4
        ._       # And rotate the [2,0,6,4] that many times towards the left
                 # (This is our `c` for the Canvas builtin)
               # Now use the Canvas builtin, without printing it yet
  ðÜ             # Remove any trailing spaces (since the Canvas implicitly makes a rectangle)
     ®O          # Push the sum of the list from the register
       ®g-       # Subtract the length of the list from the register
          >      # And add 1
    I      .$    # Remove that many leading characters from the input-string
             «   # And append it at the end of the roll created by the Canvas
                 # (after which the result is output implicitly)

मेरा 05AB1E टिप देखें (यह समझने के लिए कि बड़े पूर्णांकों को कैसे संपीड़ित करें? ) क्यों Ž8Oहै 2064


0

पायथन 3 , 112 बाइट्स

r=lambda t,h=[[]]:len(h)>len(t)and h[:-1]+[h[-1]+list(t)]or r(t[len(h):],list(zip(*h[::-1]))+[list(t)[:len(h)]])

इस मामले में, आउटपुट फ़ंक्शन का मूल्य है।

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

यदि आप पसंद करते हैं, तो यहां एक और (लंबा, 129 बाइट्स ) समाधान है जो सीधे रोल किए गए इनपुट को प्रिंट करता है:

r=lambda t,h=['']:len(h)>len(t)and set(map(print,h[:-1]+[h[-1]+t]))or r(t[len(h):],list(map(''.join,zip(*h[::-1])))+[t[:len(h)]])

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


1
इसे प्रिंट करने की आवश्यकता है
केवल

@ ASCII- केवल: प्रश्न के लेखक का उद्धरण: "यदि मुद्रण के बजाय वापस आना एक महान कामचलाऊ या अच्छी चाल दिखाता है, तो एक उत्तर (और स्पष्ट रूप से बताएं कि आप वापस लौट रहे हैं, मुद्रण नहीं)" । तो मुझे लगता है कि यह ठीक है।
पीकॉट

0

Matlab / ऑक्टेव , 154 बाइट्स

सबसे छोटा नहीं है, लेकिन MATLAB / ऑक्टेव में गोल्फ हमेशा मजेदार है :)

function h=r(t,h);n=fliplr(h');s=size(n,2);q=numel(t);if s<=q h=r(t(max(s,1)+1:end),[n; t(1:max(s,1))]);elseif q>0 h(:,end+q)=' ';h(end,end-q+1:end)=t;end

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


1
दुख की बात है, सेशन में कहा गया है कि आपको प्रिंट करना होगा
ASCII-only

@ ASCII- केवल यहाँ बताया गया है ( it.mathworks.com/matlabcentral/answers/… ), Matlab दुनिया में stdout कमांड विंडो को संदर्भित करता है। यह देखते हुए कि प्रत्येक कमांड के मूल्यांकन का परिणाम स्वचालित रूप से कमांड विंडो पर मुद्रित होता है, मुझे लगता है कि इस उत्तर को प्रश्न की आवश्यकताओं के अनुरूप माना जा सकता है।
पाईकॉट


@ ASCII- केवल मुझे वह नहीं मिलता है जिसका आपको वास्तव में मतलब है। यह एक फ़ंक्शन है, आप इसे कॉल करते हैं, परिणाम स्वचालित रूप से कमांड विंडो (यानी स्टडआउट) पर मुद्रित किया जाएगा। इसमें गलत क्या है? यहाँ तक कि R उत्तर भी इस तरह से काम करता है ...
PieCot

1
अभी आप dispयह, मैं यह कहना चाहता हूँ कि आप को दूर करना चाहिए dispलोगों की है कि आर पता नहीं है कि यह बताने के लिए करता है डिफ़ॉल्ट रूप से STDOUT करने के लिए लिखने
ASCII-केवल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.