Построй мне замочную лестницу!


13

Вам будет предоставлена ​​строка, состоящая из печатного ASCII (без перевода строки). Твоя задача - построить красивую лестницу для моего замка.

Как построить хорошую Лестницу?

  • Прежде всего, вы должны получить все вращения Струны. Например, строка 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 Для этой задачи не следует: p
Mr. Xcoder


dabс. -------
Оливер Ни

Ответы:


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



3

Сетчатка , 47 байт

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

¶

Попробуйте онлайн!Объяснение: Первый этап создает левую лестницу, рассматривая каждый символ и создавая пробелы, равные текущей позиции, затем остаток строки, затем начало строки, а затем пробелы, равные остатку строки. Остальная часть сценария выполняется по каждой строке, сгенерированной по очереди. Сначала строка дублируется, затем символы в дубликате меняются местами, затем строка и ее дубликат объединяются.




2

Древесный уголь , 23 21 20 байт

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

Попробуйте онлайн!

Возможно, можно играть в гольф больше, но я выкладываю из мобильного приложения. Ссылка на подробную версию .


О, кстати, если вы не добавите объяснение, по крайней мере, используйте -a flag pls
только для ASCII

@ ASCII-только извините, я думал, что подробная версия считается объяснением.
Чарли

Подождите, что nvm не увидел этого
только ASCII

Я не думаю , что это было правда в то время , но в эти дни вы можете заполнить многоугольник с произвольной строкой и получить именно результат вам нужно для 9 байт: G→↘←Lθθ‖C.
Нил

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 Йохансен за байт.


u#_=uсохраняет байт.
Эрджан Йохансен

@ ØrjanJohansen: у меня сначала был список строк, unlinesгде u#_=uне проверяется тип, а потом переключился на создание одной строки ... Спасибо!
Ними



1

Mathematica, 119 байт

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 байт

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) Uдля V.

Третья строка:

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

восьмых , 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 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.