สร้างบันไดปราสาทให้ฉัน!


13

คุณจะได้รับสตริงที่ประกอบด้วย ASCII ที่พิมพ์ได้ (โดยไม่ต้องขึ้นบรรทัดใหม่) งานของคุณคือสร้างบันไดที่ดีสำหรับปราสาทของฉัน

วิธีการสร้างบันไดที่ดี?

  • ก่อนอื่นคุณควรจะได้การหมุนทั้งหมดของ String ตัวอย่างเช่นสตริงabcdมีการหมุนต่อไปนี้: abcd, bcda, cdab, dabc(อักขระแต่ละตัวจะถูกย้ายไปยังจุดสิ้นสุดจนกว่าเราจะไปถึงอักขระสุดท้าย)

  • ตอนนี้เราวางแต่ละการหมุนไว้ด้านบนของกันและกัน:

    abcd
    bcda
    cdab
    dabc
    
  • เราปีนขึ้นไปบนกำแพงตรงไม่ได้ดังนั้นเราต้องสร้างบันได นั่นหมายความว่าคุณควรเพิ่มช่องว่างก่อนหมุนแต่ละครั้งที่สอดคล้องกับดัชนีในรายการการหมุน:

    abcd
     bcda
      cdab
       dabc
    
  • คุณต้องมีบันไดที่เชื่อมโยงไปยังอีกด้านหนึ่งของปราสาทของฉันดังนั้นคุณควรสร้างสิ่งหนึ่งดังต่อไปนี้ย้อนกลับการหมุนแต่ละครั้งและเพิ่มระยะห่าง:

    abcd      dcba
     bcda    adcb
      cdab  badc
       dabccbad
    

นี่คือดังนั้นจึงใช้รหัสสั้นที่สุดเป็นไบต์ชนะและใช้กฎมาตรฐานสำหรับแท็ก


กรณีทดสอบ

  • อินพุต: abcd, เอาต์พุต:

    abcd      dcba
     bcda    adcb
      cdab  badc
       dabccbad
    
  • อินพุต: aaaa, เอาต์พุต:

    aaaa      aaaa
     aaaa    aaaa
      aaaa  aaaa
       aaaaaaaa
    
  • อินพุต: Code golf, เอาต์พุต (สังเกตช่องว่าง):

    Code golf                flog edoC
     ode golfC              Cflog edo 
      de golfCo            oCflog ed  
       e golfCod          doCflog e   
         golfCode        edoCflog     
         golfCode        edoCflog     
          olfCode g    g edoCflo      
           lfCode go  og edoCfl       
            fCode gollog edoCf
    


บันไดไม่ควรเริ่มขึ้นแล้วลงไปแทนที่จะลงแล้วขึ้นหรือไม่ : P
Stephen

@StepHen สำหรับจุดประสงค์ของการท้าทายนี้ไม่ควร: p
Mr. Xcoder


dabค. -------
Oliver Ni

คำตอบ:


8

05AB1E , 12 ไบต์

รหัส:

vDNúsÀ}\».B∞

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย:

v     }        # Length input times, do.. (N = iteration count)
 DNú           #   Duplicate and prepend N spaces
    sÀ         #   Swap and rotate one to the left
       \       # Discard the top of the stack
        »      # Join the stack by newlines
         .B    # Pad with spaces into a rectangle
           ∞   # Mirror the string


4

เยลลี่ขนาด 16 ไบต์

J’ɓ⁹⁶ẋ;"ṙz⁶Zm€0Y

ลองออนไลน์!

แน่นอน -1 ใช้โจนาธานอัลลัน 's ɓ!


วิธีการแก้ปัญหาของฉันคือ methinks ที่คล้ายกันเกินไปที่นี่คุณไป: J’ɓ⁹⁶ẋ;"ṙz⁶Zm€0Y(หรือLḶสำหรับJ’)
Jonathan Allan

@JonathanAllan Heh
Erik the Outgolfer

3

เรติน่า 47 ไบต์

.
$.`$* $&$'$`$.'$* ¶
%(`^
$_¶
O$^`.(?=.*$)

¶

ลองออนไลน์! คำอธิบาย: ขั้นตอนแรกสร้างบันไดด้านซ้ายโดยพิจารณาอักขระแต่ละตัวและสร้างช่องว่างเท่ากับตำแหน่งปัจจุบันตามด้วยส่วนที่เหลือของสตริงจากนั้นเริ่มต้นของสตริงจากนั้นเว้นวรรคเท่ากับส่วนที่เหลือของสตริง ส่วนที่เหลือของสคริปต์จะทำงานในแต่ละบรรทัดที่สร้างขึ้นตามลำดับ บรรทัดแรกจะถูกทำซ้ำจากนั้นอักขระในรายการที่ซ้ำกันจะถูกกลับรายการจากนั้นบรรทัดและรายการที่ซ้ำกันจะถูกต่อกัน




2

ถ่าน , 23 21 20 ไบต์

FLθ«FLθ§θ⁺κι↘MLθ←»‖C

ลองออนไลน์!

อาจจะตีมากกว่านี้ แต่ฉันโพสต์จากแอพมือถือ เชื่อมโยงไปยังรุ่นอย่างละเอียด


โอ้ btw ถ้าคุณไม่เพิ่มคำอธิบายอย่างน้อยก็ใช้-a flagกรุณา
ASCII- เท่านั้น

@ ASCII เท่านั้นขออภัยฉันคิดว่าเวอร์ชัน verbose นับเป็นคำอธิบาย
Charlie

รอสิ่งที่ nvm ไม่เห็น
ASCII-only

ผมไม่คิดว่ามันเป็นความจริงในเวลานั้น แต่วันนี้คุณสามารถกรอกรูปหลายเหลี่ยมที่มีสตริงโดยพลการและได้รับสิ่งผลที่คุณต้องการสำหรับ 9 G→↘←Lθθ‖Cไบต์:
Neil

2

Haskell, 80 79 ไบต์

(s:u)#t|q<-(t>>" ")++s:u++t++(u>>" ")=q++reverse q++'\n':u#(t++[s])
u#_=u
(#"")

ลองออนไลน์!

มันทำงานอย่างไร

(#"")                      -- start with the input string and an empty accumulator

(s:u)#t                    -- let s be the first char and u the rest of the input
                           -- string, and t the accumulator
    |q<-                   -- let q be half of the current line, i.e.
        (t>>" ")++         --   length of t times spaces
        s:u++              --   s and u (aka the input string)
        t++                --   the accumulator
        (u>>" ")           --   length of u times spaces
    = q ++ reverse q ++    -- the current line is q and q reversed
        '\n' :             -- and a newline
        u#(t++[s])         -- and a recursive call with u as the new input
                           -- string and s put at the end of t
_#_=[]                     -- base case: stop if the input string is empty

แก้ไข: ขอบคุณ @ Ørjan Johansen สำหรับ byte


u#_=uบันทึกเป็นไบต์
Ørjan Johansen

@ ØrjanJohansen: ก่อนอื่นฉันมีรายการของสตริงและunlinesที่u#_=uไม่พิมพ์ตรวจสอบและต่อมาเปลี่ยนเป็นสายเดียว ... ขอบคุณ!
nimi




1

PHP, 95 ไบต์

for($e=strlen($s=$argn);$i<$e;$s.=$s[$i],$s[$i++]=" ")echo$t=str_pad($s,2*$e-1),strrev($t),"
";

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

ชำรุด

for($e=strlen($s=$argn);    # import input
    $i<$e;                  # loop length times
    $s.=$s[$i],                 # 2. append current character
    $s[$i++]=" ")               # 3. set current character to space
    echo$t=str_pad($s,2*$e-1),  # 1. print string padded with length-1 spaces
        strrev($t),             #    print reverse
        "\n";                   #    print newline

1

Japt , 22 ไบต์


l
VÇç +UéZn)+´Vç)ê1÷

ขึ้นบรรทัดใหม่เป็นส่วนหนึ่งของโปรแกรม

ลองออนไลน์!

เรียกใช้กรณีทดสอบทั้งหมดโดยใช้ WIP CodePen ของฉัน

คำอธิบาย

โดยนัย: U= สตริงอินพุต Uบรรทัดแรกจะว่างเปล่าที่จะไม่เขียนทับ

บรรทัดที่สองโดยปริยายกำหนดความยาว ( l) ของการUV

บรรทัดที่สาม:

VÇç +UéZn)+´Vç)ê1÷
VoZ{Zç +UéZn)+--Vç)ê1} · Ungolfed
VoZ{                 }   Create array [0, V) and map by...
    Zç                      The current value (Z) times " "
       +UéZn)               Concatenated with U rotated Z times left
             +--Vç)         Concatenated with --V times " ". This decrements V
                   ê1       Palindromize with repeated last char
                       · Join with newlines and implicitly output


1

Javascript (ES6), 118 ไบต์

s=>[...s].map((_,y)=>Array(l=(j=s.length)*4-2).fill().map((_,x)=>(x=x<l/2?x:l-x-1)>=y&y+j>x?s[x%j]:" ").join``).join`
`

ตัวอย่างข้อมูลโค้ด:

f=
s=>[...s].map((_,y)=>Array(l=(j=s.length)*4-2).fill().map((_,x)=>(x=x<l/2?x:l-x-1)>=y&y+j>x?s[x%j]:" ").join``).join`
`
o.innerText=f("Code golf")
<pre id=o>


1

Python 2 , 85 83 ไบต์

  • ขอบคุณ @ovs สำหรับ 2 ไบต์: l+~iและช่วยให้ฉันมองเห็นพื้นที่ที่ไม่ต้องการ
x=input()
l=len(x)
for i in range(l):r=i*' '+x[i:]+x[:i]+(l+~i)*' ';print r+r[::-1]

ลองออนไลน์!


1
l-1-iสามารถl+~iเป็น~i == -i-1
ovs

1

8th , 173 168 ไบต์

รหัส

s:len n:1- ( >r dup s:len n:1- "" ( " " s:+ ) rot times dup 0 r@ s:slice -rot r> -1 s:slice s:+ s:+ dup s:rev swap . . cr null s:/ a:shift a:push "" a:join ) 0 rot loop

เวอร์ชันที่ไม่ดีพร้อมความคิดเห็น

: shifter \ s -- s
  null s:/     \ convert string into array
  a:shift      \ remove the first item in the array and put it on TOS
  a:push       \ append the former 1st item to array
  "" a:join    \ convert array into string
;

: stairway \ s -- s
  s:len n:1-
  (
    >r                       \ save loop index
    dup                      \ duplicate input string 
    s:len n:1-               \ get string length
    "" ( " " s:+ ) rot times \ make filler
    dup                      \ duplicate filler 
    0 r@ s:slice             \ make left filler
    -rot                     \ put left filler at proper position
    r> -1 s:slice            \ make right filler
    s:+ s:+                  \ build string ( 1st half of stairway )
    dup s:rev                \ build 2nd half 
    swap . . cr              \ print it
    shifter                  \ shift rotate 1st character
  ) 0 rot loop               \ loop from 0 to len(string)-1
;

การใช้งานและตัวอย่าง

ok> "abcd" s:len n:1- ( >r dup s:len n:1- "" ( " " s:+ ) rot times dup 0 r@ s:slice -rot r> -1 s:slice s:+ s:+ dup s:rev swap . . cr null s:/ a:shift a:push "" a:join ) 0 rot loop
abcd      dcba
 bcda    adcb 
  cdab  badc  
   dabccbad 

หรือชัดเจนขึ้น

ok> "Code golf" stairway
Code golf                flog edoC
 ode golfC              Cflog edo 
  de golfCo            oCflog ed  
   e golfCod          doCflog e   
     golfCode        edoCflog     
     golfCode        edoCflog     
      olfCode g    g edoCflo      
       lfCode go  og edoCfl       
        fCode gollog edoCf 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.