Construa-me um castelo Stairway!

13

Você receberá uma String consistindo em ASCII imprimível (sem novas linhas). Sua tarefa é construir uma escada agradável para o meu castelo.

Como construir uma escada agradável?

  • Primeiro, você deve obter todas as rotações da String. Por exemplo, a String abcdtem as seguintes rotações: abcd, bcda, cdab, dabc(cada caractere é movido para o final até atingirmos o último caractere).

  • Agora, colocamos cada rotação uma sobre a outra:

    abcd
    bcda
    cdab
    dabc
    
  • Não podemos realmente subir em uma parede reta, por isso precisamos construir escadas. Isso significa que você deve adicionar um número de espaços antes de cada rotação correspondente ao seu índice na lista de rotações:

    abcd
     bcda
      cdab
       dabc
    
  • Você também precisa de uma escada que se conecte ao outro lado do meu castelo, portanto, você deve construir uma como abaixo, invertendo cada rotação e adicionando algum espaçamento:

    abcd      dcba
     bcda    adcb
      cdab  badc
       dabccbad
    

Isso é , portanto, o código mais curto em bytes vence e aplicam-se regras padrão para a tag.


Casos de teste

  • Entrada abcd:, Saída:

    abcd      dcba
     bcda    adcb
      cdab  badc
       dabccbad
    
  • Entrada aaaa:, Saída:

    aaaa      aaaa
     aaaa    aaaa
      aaaa  aaaa
       aaaaaaaa
    
  • Entrada:, Code golfSaída (Observe os espaços):

    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
    
Mr. Xcoder
fonte
Sandbox
Mr. Xcoder
A escada não deveria começar a subir e depois descer, em vez de descer e subir? : P
Stephen
@StepHen Para efeitos deste desafio, não deve: p
Mr. Xcoder
dabc. -------
Oliver Ni

Respostas:

8

05AB1E , 12 bytes

Código:

vDNúsÀ}\».B∞

Usa a codificação 05AB1E . Experimente online!

Explicação:

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
Adnan
fonte
4

Gelatina , 16 bytes

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

Experimente online!

Claro, -1 usando Jonathan Allan 's ɓ!

Erik, o Outgolfer
fonte
Minha solução é methinks muito semelhantes, aqui vai: J’ɓ⁹⁶ẋ;"ṙz⁶Zm€0Y(ou LḶpara J’)
Jonathan Allan
@JonathanAllan Heh.
Erik the Outgolfer
3

Retina , 47 bytes

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

¶

Experimente online! Explicação: O primeiro estágio cria a escada esquerda considerando cada caractere e criando espaços iguais à posição atual, o restante da sequência, o início da sequência e os espaços iguais ao restante da sequência. O restante do script é executado em cada linha gerada por sua vez. Primeiro, a linha é duplicada, os caracteres na duplicata são revertidos e a linha e sua duplicata são concatenadas.

Neil
fonte
3

Python 3 , 89 bytes

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

Experimente online!

-1 byte graças a ovs

-1 byte graças a Lynn

HyperNeutrino
fonte
l-i-1pode ser apenas l+~icomo~i == -i-1
ovs 22/07
' '*(l+~i)*2é igual a '  '*(l+~i), que é um byte mais curto!
Lynn
2

C (gcc) , 126 bytes

i,j,k,l;f(char*s){for(l=strlen(s),i=0;i<l;i++,puts(""))for(j=0;j<4*l-2;j++,putchar(i<=k&k<i+l?s[k%l]:32))k=j<2*l-1?j:4*l-3-j;}

Experimente online!

Freira Furada
fonte
2

Carvão , 23 21 20 bytes

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

Experimente online!

Provavelmente, você pode jogar mais, mas estou postando no aplicativo para dispositivos móveis. Link para a versão detalhada .

Charlie
fonte
Ah, se você não adicionar uma explicação, pelo menos use -a flag pls
ASCII-only
@ Só ASCII desculpe, eu pensei que a versão detalhada contava como uma explicação.
27717 Charlie
Espere, o que a nvm não viu?
ASCII-only
Eu não acho que isso era verdade na época, mas hoje em dia você pode preencher um polígono com uma cadeia arbitrária e obter exatamente o resultado que você precisa para 9 bytes: G→↘←Lθθ‖C.
Neil
2

Haskell, 80 79 bytes

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

Experimente online!

Como funciona

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

Edit: Obrigado a Ørjan Johansen por um byte.

nimi
fonte
u#_=usalva um byte.
Ørjan Johansen
@ ØrjanJohansen: Eu tive uma lista de strings pela primeira vez e unlinesonde u#_=unão digita check e depois mudei para a construção de uma única string ... Obrigado!
N
2

J, 34 bytes

([,.|.)@(i.@#((' '#~[),[|.])"0 1])

destroçado

([,.|.) @ (i.@# ((' '#~[) , [|.])"0 1 ])

Experimente online!

Jonah
fonte
1

Mathematica, 119 bytes

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

PHP, 95 bytes

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

Execute como pipe -nRou experimente on-line .

demolir

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
Titus
fonte
1

Japonês , 22 bytes


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

A nova linha líder faz parte do programa.

Experimente online!

Execute todos os casos de teste usando o meu WIP CodePen.

Explicação

Implícito: U= sequência de entrada. A primeira linha está em branco para não sobrescrever U.

A segunda linha atribui implicitamente o comprimento ( l) de Ua V.

Terceira linha:

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
Justin Mariner
fonte
1

Javascript (ES6), 118 bytes

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

Exemplo de trecho de código:

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>

Herman L
fonte
1

Python 2 , 85 83 bytes

  • Obrigado @ovs por 2 bytes: l+~ie me ajudou a identificar um espaço indesejado
x=input()
l=len(x)
for i in range(l):r=i*' '+x[i:]+x[:i]+(l+~i)*' ';print r+r[::-1]

Experimente online!

officialaimm
fonte
1
l-1-ipode ser apenas l+~icomo~i == -i-1
ovs 22/07
1

8th , 173 168 bytes

Código

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

Versão ungolfed com comentários

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

Uso e exemplos

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 

Ou mais claramente

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 
Chaos Manor
fonte