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
    


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:




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.


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


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

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 .


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.


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



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}]&

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

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


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>


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!


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 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.