Bana bir kale merdiveni inşa et!


13

Size yazdırılabilir ASCII (yeni satırlar olmadan) içeren bir Dize verilecektir. Senin görevin benim kale için güzel bir merdiven inşa etmektir.

Güzel bir merdiven nasıl inşa edilir?

  • Öncelikle, String'in tüm rotasyonlarını almalısınız. Örneğin, String abcdşu dönüşlere sahiptir: abcd, bcda, cdab, dabc(her karakter son karaktere ulaşıncaya kadar sonuna kadar taşınır).

  • Şimdi her dönüşü üst üste yerleştiriyoruz:

    abcd
    bcda
    cdab
    dabc
    
  • Gerçekten düz bir duvara tırmanamayız, bu yüzden merdiven inşa etmeliyiz. Bu, her rotasyondan önce rotasyon listesindeki dizinine karşılık gelen bir dizi boşluk eklemeniz gerektiği anlamına gelir:

    abcd
     bcda
      cdab
       dabc
    
  • Ayrıca kalemin diğer tarafına bağlanan bir Merdivene ihtiyacınız var, bu yüzden her dönüşü tersine çevirip bir miktar boşluk ekleyerek aşağıdaki gibi bir tane inşa etmelisiniz:

    abcd      dcba
     bcda    adcb
      cdab  badc
       dabccbad
    

Bu , bu nedenle bayttaki en kısa kod kazanır ve etiket için standart kurallar geçerlidir.


Test Durumları

  • Giriş:, abcdÇıkış:

    abcd      dcba
     bcda    adcb
      cdab  badc
       dabccbad
    
  • Giriş:, aaaaÇıkış:

    aaaa      aaaa
     aaaa    aaaa
      aaaa  aaaa
       aaaaaaaa
    
  • Girdi:, Code golfÇıktı (Boşluklara dikkat edin):

    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
    


Merdiven yukarı çıkmaya başlayıp aşağı inmek yerine aşağı inmemeli mi? : P
Stephen

@StepHen Bu mücadelenin amacı için şunları yapmamalı: p
Bay Xcoder


dabc. -------
Oliver Ni

Yanıtlar:


8

05AB1E , 12 bayt

Kod:

vDNúsÀ}\».B∞

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

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



3

Retina , 47 bayt

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

¶

Çevrimiçi deneyin! Açıklama: İlk aşama, her bir karakteri göz önünde bulundurarak ve geçerli konuma eşit boşluklar, sonra dizenin geri kalanını, sonra dizenin başlangıcını, sonra dizenin geri kalanına eşit boşluklar oluşturarak sol merdiveni oluşturur. Betiğin geri kalanı, sırayla oluşturulan her satırın üzerinden geçer. İlk önce satır çoğaltılır, daha sonra yinelenen karakterler tersine çevrilir, daha sonra satır ve kopyası birleştirilir.


3

Python 3 , 89 bayt

x=input()
l=len(x)
for i in range(l):y=x[i:]+x[:i];j=' '*i;print(j+y+'  '*(l+~i)+y[::-1])

Çevrimiçi deneyin!

Ovs sayesinde -1 bayt

Lynn sayesinde -1 bayt


l-i-1Sadece olabilir l+~iolarak~i == -i-1
ovs

' '*(l+~i)*2eşittir '  '*(l+~i)bir byte daha kısa olan!
Lynn


2

Kömür , 23 21 20 bayt

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

Çevrimiçi deneyin!

Muhtemelen daha fazla golf olabilir, ancak mobil uygulamadan gönderiyorum. Bağlantı Ayrıntılı sürümü .


Oh btw bir açıklama eklemezseniz en azından -a bayrağı kullanın pls
ASCII-sadece

@ ASCII sadece üzgünüm, ayrıntılı sürüm bir açıklama olarak sayılır düşündüm.
Charlie

Ne nvm görmedim bekle
sadece ASCII sadece

O zamanlar gerçek olduğunu sanmıyorum ama bu gün sen keyfi bir dize ile bir çokgen doldurup tam 9 bayt için gerekli olan sonucu elde edebilirsiniz: G→↘←Lθθ‖C.
Neil

2

Haskell, 80 79 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

(#"")                      -- 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

Düzenleme: Bir bayt için @ Ørjan Johansen'a teşekkürler.


u#_=ubir bayt kaydeder.
Ørjan Johansen

@ ØrjanJohansen: İlk önce dizelerin bir listesi vardı ve unlinesnerede u#_=uçek yazmıyor ve daha sonra tek bir dize oluşturmaya geçtim ... Teşekkürler!
nimi



1

Mathematica, 119 bayt

b=StringRotateLeft;j=Table;Column@j[""<>{" "~j~i,b[s=#,i],j["  ",t-i],b[StringReverse@s,-i]},{i,0,t=StringLength@#-1}]&

1

PHP, 95 bayt

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

Pipo ile çalıştırın -nRveya çevrimiçi deneyin .

Yıkmak

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 bayt


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

Öncü yeni satır, programın bir parçasıdır.

Çevrimiçi deneyin!

Tüm test senaryolarını WIP CodePen'imi kullanarak çalıştır .

açıklama

Örtük: U= giriş dizesi. İlk satır üzerine yazmamak için boş U.

İkinci satır dolaylı uzunluğu (atar larasında) Uiçin V.

Üçüncü satır:

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 bayt

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`
`

Örnek kod snippet'i:

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 bayt

  • 2 bayt için @ovs teşekkürler: l+~ive istenmeyen bir alanı tespit etmeme yardımcı oldu
x=input()
l=len(x)
for i in range(l):r=i*' '+x[i:]+x[:i]+(l+~i)*' ';print r+r[::-1]

Çevrimiçi deneyin!


1
l-1-isadece olabilir l+~igibi~i == -i-1
ovs

1

8 , 173168 bayt

kod

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

Yorum yapılmamış yorumsuz sürüm

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

Kullanım ve örnekler

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 

Veya daha açık bir şekilde

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 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.