Saída de uma pirâmide (ou rodovia)


39

Dada uma seqüência de caracteres não vazia s, com comprimento par e um número inteiro positivo n, representando sua altura, componha uma pirâmide usando as seguintes regras:

A pirâmide deve conter n linhas não vazias; novas linhas finais são permitidas. Para cada 1 <= i <= n, a i-ésima linha deve conter a sequência com cada caractere individual repetido no local i vezes; abcd repetido 3 vezes, como tal, torna-se aaabbbcccddd. Cada linha deve ser centralizada com espaços de preenchimento para que o meio de cada linha fique alinhado verticalmente. Espaços à direita no final de cada linha são permitidos. Você também pode ter até uma nova linha de frente, mas nenhum outro espaço em branco antes da primeira linha.

Não é garantido que a sequência de entrada seja um palíndromo.

Caso de teste

s = 'o-o  o-o', n = 10:

                                    o-o  o-o                                    
                                oo--oo    oo--oo                                
                            ooo---ooo      ooo---ooo                            
                        oooo----oooo        oooo----oooo                        
                    ooooo-----ooooo          ooooo-----ooooo                    
                oooooo------oooooo            oooooo------oooooo                
            ooooooo-------ooooooo              ooooooo-------ooooooo            
        oooooooo--------oooooooo                oooooooo--------oooooooo        
    ooooooooo---------ooooooooo                  ooooooooo---------ooooooooo    
oooooooooo----------oooooooooo                    oooooooooo----------oooooooooo

1
Sandbox Post criado por user42649, que era a minha conta até ser excluída.
precisa saber é o seguinte

A saída para uma função nesta questão pode ser uma lista de cadeias, cada uma representando uma linha, ou deve ser unida por novas linhas?
precisa saber é o seguinte

7
Saída de uma pirâmide Você certamente quer dizer uma estrada !
Luis Mendo

Parece uma pirâmide asteca!
QBrute

3
@QBrute Na. Foi feita por um Goa'uld :)
TheBlitz

Respostas:


12

05AB1E , 9 bytes

γ².D)ƶJ.C

Experimente online!


γfoi, em pouco tempo, inspirado pela resposta de Adnan; mas Stambém funcionaria.


γ          # Split into runs.    | ['0','-','0']
 ².D)      # Push n times.       | [['0','-','0'],['0','-','0'],['0','-','0']]
     ƶ     # Lift by index.      | [['0','-','0'],['00','---','00'],['000','---','000']]
      J    # Inner join.         | ['0-0','00--00','000---000']
       .C  # Center.             | Expected output.

Eu não posso acreditar que alguém realmente tenha rebaixado sua mensagem errada: /
Jonathan Allan

1
@ JonathanAllan, a frequência dos meus erros evitáveis ​​merece, até certo ponto, a negatividade.
Magic Octopus Urn

12

05AB1E , 11 bytes

F²γN>×J}».C

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


Ele começa a ficar estranho com entradas acima de 168. caso contrário, ótimo!
tuskiomi

@carusocomputing »une as matrizes internas por espaços. Substituí-lo por Jdeve funcionar (e acho que você deve postar isso como uma resposta diferente).
21417 Adnan

Ah! Sempre foi assim? Se assim for, legal, se não, eu devo ter perdido isso. Obrigado, vai fazer.
Magic Octopus Urn

8

Geléia , 14 13 bytes

LH×Ḷ}Ṛ⁶ẋżxЀY

Experimente online!

Como funciona

LH×Ḷ}Ṛ⁶ẋżxЀY  Main link. Arguments: s (string), n (integer)

L              Get the length l of s.
 H             Halve it, yielding l/2.
   Ḷ}          Unlength right; yield [0, ... n-1].
  ×            Compute [0, l/2, ..., l(n-1)/2].
     Ṛ         Reverse; yield [l(n-1)/2, ..., l/2, 0].
      ⁶ẋ       Space repeat; create string of that many spaces.
         xЀ   Repeat in-place each; repeat the individual characters of s
               1, ..., n times, yielding an array of n strings.
        ż      Zipwith; pair the k-th string of spaces with the k-th string of 
               repeated characters of s.
            Y  Sepatate the resulting pairs by linefeeds.

8

C # (.NET Core) , 139 137 136 130 bytes

using System.Linq;s=>n=>Enumerable.Range(0,n).Select(i=>"".PadLeft((n+~i)*s.Length/2)+string.Concat(s.Select(c=>new string(c,i))))

Experimente online!

Retorna uma enumeração de strings com as linhas do desenho. Uma vez ingressado, o resultado é o seguinte:

                        _  _
                    ಠಠ__ಠಠ    ಠಠ__ಠಠ
                ಠಠಠ___ಠಠಠ      ಠಠಠ___ಠಠಠ
            ಠಠಠಠ____ಠಠಠಠ        ಠಠಠಠ____ಠಠಠಠ
        ಠಠಠಠಠ_____ಠಠಠಠಠ          ಠಠಠಠಠ_____ಠಠಠಠಠ
    ಠಠಠಠಠಠ______ಠಠಠಠಠಠ            ಠಠಠಠಠಠ______ಠಠಠಠಠಠ
ಠಠಠಠಠಠಠ_______ಠಠಠಠಠಠಠ              ಠಠಠಠಠಠಠ_______ಠಠಠಠಠಠಠ
  • 2 bytes salvos graças a Kevin Cruijssen!
  • 1 byte economizado graças ao Value Ink!
  • 6 bytes salvos graças ao LiefdeWen!

1
Você pode salvar dois bytes removendo o parêntese em (n-i-1)*s.Length/2. E eu gosto dos seus casos de teste. +1 :)
Kevin Cruijssen

10
ಠ_ಠintensifica
Magic Octopus Urn

1
Obrigatório " ~ié equivalente a -i-1", para que você possa salvar um byte, alterando (n-i-1)para (n+~i).
Valor de tinta

1
e você pode usar currying assim s=>n=>...por mais um byte
LiefdeWen

1
@CarlosAlejo Desculpe por postar edições separadas, mas você também pode substituir new string(' '...com"".PadLeft(...
LiefdeWen

7

Queijo Cheddar , 71 64 bytes

Guardado 7 bytes graças a @ValueInk

(s,n)->(1|>n=>i->(s.len*(n-i)/2)*" "+s.sub(/./g,"$&"*i)).asLines

Experimente online! Vou adicionar uma explicação daqui a pouco

Explicação

(string, count)->(
   1 |> count          // 1..count, the amount of rep/char per line
     => i -> (         // Map over the range       
        s.len*(n-i)/2  // Calculate amount of spaces and repeat by it.
     )*" "
     + s.sub(/./g,"$&"*i) // replace each character, duplicate the amount of times `*i`
).asLines              // return the above joined with newlines

Sem problemas! Gostaria de saber se Cheddar tem uma centerfunção que você pode usar como eu tenho na minha resposta Ruby, porque isso poderia potencialmente salvar bytes também.
Value Ink


5

Java 8, 188 186 185 183 181 173 bytes

s->n->{String r="";int l=s.length()/2,x=l*n,i,j;for(i=0;i++<n;r+="\n"){r+=s.format("%"+x+"s",r).substring(0,x-i*l);for(char c:s.toCharArray())for(j=0;j++<i;r+=c);}return r;}

-2 bytes (185 → 183) devido a uma correção de bug (estava produzindo n+1linhas em vez de n). Não acontece frequentemente que uma correção de bug salva bytes. :)
-2 bytes (183 → 181) graças a @ OlivierGrégoire

Explicação:

Experimente aqui.

s->n->{                          // Method with String and integer parameter and String return-type
  String r="";                   //  Return-String
  int l=s.length()/2,            //  Halve the length of the input-String
      x=l*n,                     //  Halve the length * the input integer
      i,j;                       //  Some temp integers
  for(i=0;i++<n;                 //  Loop (1) `n` times
      r+="\n"){                  //    And after every iteration, add a new-line
    r+=s.format("%"+x+"s",r).substring(0,x-i*l);
                                 //   Add the appropriate trailing spaces
    for(char c:s.toCharArray())  //   Loop (2) over the characters of the String
      for(j=0;j++<i;r+=c);       //    And repeat each one more than in the previous row
                                 //   End of loop (2) (implicit / single-line body)
  }                              //  End of loop (1)
  return r;                      //  Return the result-String
}                                // End of method

1
Se você mover suas entradas primeiro, poderá declarar r="",q=s.format("%"+x+"s",r)salvar 2 bytes. Muita movimentação por apenas dois bytes :(
Olivier Grégoire

1
@ OlivierGrégoire Obrigado! Ao usar s.format("%"+x+"s",r)diretamente, pude salvar mais 8 bytes após o seu golfe. :)
Kevin Cruijssen

4

JavaScript (ES6), 85 bytes

Recebe entrada na sintaxe de currying (string)(height). Inclui uma nova linha líder.

s=>g=(n,p=`
`)=>n?g(n-1,p+' '.repeat(s.length/2))+p+s.replace(/./g,c=>c.repeat(n)):''

Demo


Existem espaços em branco antes da última linha, isso é permitido?
Charlie

@CarlosAlejo Ah, esse foi um efeito colateral não intencional de uma atualização de última hora. Agora consertado. Obrigado por denunciar isso!
precisa

4

Carvão , 19 bytes

F⁺¹N«J±×ι÷Lη²ιFηFικ

Experimente online! Link é a versão detalhada do código. Explicação:

F⁺¹N«       for (Plus(1, InputNumber())) {

Precisamos de linhas repetidas 1..nvezes. A maneira mais fácil de conseguir isso é fazer um loop de 0 a n, pois o loop 0 é basicamente um no-op.

J±×ι÷Lη²ι       JumpTo(Negate(Times(i, IntDivide(Length(h), 2))), i);

Posicione o cursor para que a linha resultante seja centralizada.

FηFικ           for (h) for (i) Print(k);

E é assim que é simples a impressão de cada caractere repetido ivezes.


4

Python 2 , 75 77 bytes

s,n=input()
for i in range(n):print''.join(c*-~i for c in s).center(len(s)*n)

Experimente online!


Dang, eu tinha quase a mesma resposta, mas não tinha certeza se uma função poderia retornar uma lista de linhas. Nesse caso, postarei o meu como uma resposta separada, mas, caso contrário, seria muito semelhante ao post.
precisa saber é o seguinte

3
Uau, tem um centerembutido? Às vezes, eu realmente preciso ler os documentos: P
HyperNeutrino 21/17/17

Retorna a saída errada; isso tem uma linha em branco à esquerda seguida por n-1linhas.
Value Ink

Você também tem alguns espaços em branco antes da última linha, isso é permitido?
Charlie

@FryAmTheEggman isso pode ser verdade, mas ainda está retornando 9linhas de pirâmide quando a entrada é 10...
Valor de tinta


4

Javascript, 105 bytes

(s,n)=>Array(N=n).fill().reduce(a=>a+'\n'+' '.repeat(--n*s.length/2)+s.replace(/./g,_=>_.repeat(N-n)),'')

Depois de alguns anos de folga, o Stretch Maniac está de volta, esperançosamente um pouco mais educado dessa vez.


Você tem muitos espaços à esquerda em cada linha.
Shaggy

Aqui está uma versão ES8 de 99 bytes desse método que eu criei antes de ver a sua: s=>n=>[...Array(x=n)].reduce(a=>a+'\n'.padEnd(--x*s.length/2+1)+s.replace(/./g,c=>c.repeat(n-x)),'')- você precisará substituir os 's por backticks e \npor uma nova linha literal.
Shaggy


3

APL (Dyalog) , 33 31 bytes

2 bytes de golfe graças a @ZacharyT removendo parênteses desnecessários

{↑((' '/⍨(.5×≢⍵)×⍺-⊢),⍵/⍨⊢)¨⍳⍺}

Experimente online!

Explicação

O argumento da direita é a string e o argumento da esquerda é o número.

{↑((' '/⍨(.5×≢⍵)×⍺-⊢),⍵/⍨⊢)¨⍳⍺}
                             ⍳⍺      Range 1 .. 
  (                                For each element (let's call it i) do:
                      ⍵/⍨⊢          Replicate ⍵ i times
  (                 ),               Concatenated with
         (.5×≢⍵)×⍺-⊢                (⍺-i)×(len(⍵)×0.5)
   ' '/⍨                                spaces
 ↑                                    Convert the resulting array to a 2D matrix

Você precisa das parênteses ⍺-⊢?
Zachary

@ZacharyT Você está certo, eu não preciso deles. Obrigado :)
Kritixi Lithos

3

Prolog SWI, 398 bytes

Não é a solução mais compacta (talvez em algum lugar reinventando a roda em vez de usar procedimentos internos), mas é conveniente trabalhar.

w(0).
w(X):-write(' '),Y is X-1,w(Y).
s(S,N):-string_length(S,X),Y is div(X,2)*N,w(Y).
d(S,N,R):-atom_chars(S,A),e([],A,N,R).
e(B,[H|T],N,R):-l(B,H,N,I),e(I,T,N,R).
e(B,[],_,B).
a([], L, L).
a([H|T],L,[H|R]):-a(T,L,R).
l(L,_,0,L).
l(L,I,N,R):-M is N-1,l(L,I,M,T),a(T,[I],R).
o([]):-nl.
o([H|T]):-write(H),o(T).
p(S,N):-p(S,N,N).
p(_,0,_).
p(S,N,L):-Q is N-1,p(S,Q,L),d(S,N,R),W is L-N,s(S,W),o(R).

Teste:

?- p("o-o  o-o",10).
                                    o-o  o-o
                                oo--oo    oo--oo
                            ooo---ooo      ooo---ooo
                        oooo----oooo        oooo----oooo
                    ooooo-----ooooo          ooooo-----ooooo
                oooooo------oooooo            oooooo------oooooo
            ooooooo-------ooooooo              ooooooo-------ooooooo
        oooooooo--------oooooooo                oooooooo--------oooooooo
    ooooooooo---------ooooooooo                  ooooooooo---------ooooooooo
oooooooooo----------oooooooooo                    oooooooooo----------oooooooooo
true .

Explicação:

w e s escreve quantidade adequada de espaços à esquerda:

w(0).
w(X):-write(' '),Y is X-1,w(Y).
s(S,N):-string_length(S,X),Y is div(X,2)*N,w(Y).

d gere a "duplicação" de caracteres e e é de instalação recursiva:

//d(String, Number of repetitions, Result)
d(S,N,R):-atom_chars(S,A),e([],A,N,R).
e(B,[H|T],N,R):-l(B,H,N,I),e(I,T,N,R).
e(B,[],_,B).

a e l acrescentamos ao resultado (talvez exista um procedimento interno?):

a([], L, L).
a([H|T],L,[H|R]):-a(T,L,R).
l(L,_,0,L).
l(L,I,N,R):-M is N-1,l(L,I,M,T),a(T,[I],R).

o cria a saída:

o([]):-nl.
o([H|T]):-write(H),o(T).

e finalmente ep é o método principal :

p(S,N):-p(S,N,N).
p(_,0,_).
//p(String, Current level, Number of levels) :- go to the bottom, create pyramide level, write whitespaces, write the level
p(S,N,L):-Q is N-1,p(S,Q,L),d(S,N,R),W is L-N,s(S,W),o(R).

3

Japt , 20 + 1 = 21 19 + 1 = 20 14 bytes

Produz uma matriz de linhas - adicione 2 bytes se isso não for permitido.

Võ@®pXÃù°V*UÊz

Teste-o


Explicação

      :Implicit input of string U & integer V
Võ    :Generate an array of integers from 1 to V, inclusive
@     :Map over the elements of the array
®     :Map over the characters of U
p     :Repeat the current character ...
X     :  X (the current element) times.
à    :End string mapping.
ù     :Left pad each line with spaces to length...
°V    :  V incremented by one...
*     :  multiplied by...
UÊ    :  the length of U...
z     :  divided by 2.
      :Implicit output of resulting array.

Eu acho que você pode mudar SpUla ... espera, deixa pra lá :( Você pode salvar um byte embora substituindo (V-Xcom XnV, se não me engano.
ETHproductions

Ah, sim, esqueci n; obrigado @ETHproductions.
Shaggy

2

PHP, 113 bytes:

for([,$s,$n]=$argv;$i++<$n;)for(print($f=str_pad)("
",($n-$i)*strlen($s)/2+!$p=0);~$c=$s[$p++];)echo$f($c,$i,$c);

Execute php -nr '<code>' '<string>' <N>ou teste on-line .

demolir

# import input, loop $i from 1 to $n
for([,$s,$n]=$argv;$i++<$n;)
    # 1. print newline and padding, reset $p
    for(print($f=str_pad)("\n",($n-$i)*strlen($s)/2+!$p=0);
    # 2. loop $c through string
        ~$c=$s[$p++];)
        # print repeated character
        echo$f($c,$i,$c);


2

T-SQL, 223 bytes

DECLARE @ char(99),@n INT,@i INT=1,@j INT,@p varchar(max)SELECT @=s,@n=n FROM t
R:SET @j=0SET @p=SPACE((@n-@i)*len(@)/2)C:SET @j+=1SET @P+=REPLICATE(SUBSTRING(@,@j,1),@i)IF @j<LEN(@)GOTO C
PRINT @p SET @i+=1IF @i<=@n GOTO R

A entrada é via tabela preexistente t com colunas s e n , de acordo com nossos padrões de IO .

Não há muito a explicar, é um loop aninhado bastante simples, que utiliza @ias linhas e @jpercorre os caracteres da string que são REPLICATED @itimes:

DECLARE @ char(99),@n INT,@i INT=1,@j INT,@p varchar(max)
SELECT @=s,@n=n FROM t
R:
    SET @j=0
    SET @p=SPACE((@n-@i)*len(@)/2) 
    C:
        SET @j+=1
        SET @P+=REPLICATE(SUBSTRING(@,@j,1),@i)
    IF @j<LEN(@)GOTO C
    PRINT @p
    SET @i+=1
IF @i<=@n GOTO R

2

R , 125 bytes 95

function(S,n)for(i in 1:n)cat(rep(' ',(n-i)/2*nchar(S)),rep(el(strsplit(S,'')),e=i),sep="",'
')

Experimente online!

Explicação:

É bem simples, dividir a string e repetir os elementos ivezes cada rep(s,e=i)( eé a abreviação de each) enquanto fazemos o loop. A parte complicada é rep('',(n-i)/2*length(s)+1). Esta é a corda do preenchimento, mas é um monte de cordas vazias. Preciso adicionar 1 porque, caso contrário, o resultado será character(0)um vetor de comprimento zero e cat, que por padrão separa seus elementos com espaços, desalinha a linha final.


1

Mathematica, 97 bytes

(c=Characters@#;T=Table;Column[T[""<>T[""<>T[c[[i]],j],{i,Length@c}],{j,#2}],Alignment->Center])&


entrada

["oo oo", 10]


1

Tcl, 143 142 141 138 bytes

proc p s\ n {set p [expr [set w [expr [string le $s]/2]]*$n];time {incr p $w;puts [format %$p\s [regsub -all . $s [append r \\0]]]} $n;cd}

Teste:

% p "o-o  o-o" 5
                o-o  o-o
            oo--oo    oo--oo
        ooo---ooo      ooo---ooo
    oooo----oooo        oooo----oooo
ooooo-----ooooo          ooooo-----ooooo

Observação: o "cd" no final do procedimento impede que o resultado do tempo seja impresso abaixo da pirâmide, mas altera o diretório atual - um efeito colateral que não é explicitamente proibido.

Obrigado ao sergiol por uma dica para salvar um byte .... e outra para salvar mais um byte.

Graças ao aspecto (no chat tcl) por mais 3 bytes salvos!


1

Rápido, 232 bytes

Provavelmente poderia ser melhor, mas não tenho muito tempo para refatorar.

Esta resposta usa o Swift 4, portanto, não pode ser executado online no momento.

var p:(String,Int)->String={s,i in let r=(1...i).map{n in return s.map{return String(repeating:$0,count:n)}.joined()};return(r.map{return String(repeating:" ",count:(r.last!.count-$0.count)/2)+$0}as[String]).joined(separator:"\n")}

1

LOGO, 97 95 bytes

to f :s :n
for[i 1 :n][repeat(:n-:i)/2*count :s[type "\ ]foreach :s[repeat :i[type ?]]pr "]
end

Experimente o código no interpretador FMSLogo.

Defina uma função fque aceite duas entradas :se :n, em seguida, imprima o resultado.


1

Java 8, 164 148 bytes

s->n->{String o="";for(int i=0,m,j;i++<n;){o+="\n";for(m=0;m++<(n-i)*s.length()/2;)o+=" ";for(char c:s.toCharArray())for(j=0;j++<i;)o+=c;}return o;}

Explicação:

s->n->{
    String o = "";                                  //empty output string
    for (int i = 0, m, j; i++ < n; ) {              //for each row
        o += "\n";                                  //append a new line
        for (m = 0; m++ < (n - i)*s.length()/2; )   //for amount of spaces = inversed row_number * half length
            o += " ";                               //append a space
        for (char c : s.toCharArray())              //for each char of the string
            for (j = 0; j++ < i; )                  //row_number times
                o+=c;                               //append char
    }
    return o;
}

1

Ferrugem, 107 bytes

|a:&str,b|for i in 0..b{println!("{:^1$}",a.split("").map(|s|s.repeat(i+1)).collect::<String>(),a.len()*b)}

cercadinho

Define uma função anônima que recebe uma fatia e um número de sequência, imprimindo o padrão desejado na saída padrão. Ele pressupõe que a fatia de cadeia contenha apenas caracteres ASCII, mas o desafio nunca especifica que o suporte total a Unicode é necessário. Para estar correto também para o Unicode, seria necessário 117 bytes:

|a:&str,b|for i in 0..b{println!("{:^1$}",a.split("").map(|s|s.repeat(i+1)).collect::<String>(),a.chars().count()*b)}

A explicação é bastante simples:

|a:&str,b|                             // arguments, compiler can't infer the type of a unfortunately
    for i in 0..b {                    // iterate from row 0 to row b - 1
        println!(
            "{:^1$}",                  // print a line containing arg 0, centered with the width specified as arg 1
            a.split("")                // split the string into slices of one character
                .map(|s|s.repeat(i+1)) // for each slice, yield a string containing row+1 times that slice
                .collect::<String>(),  // concatenate each of the strings into one string
            a.len()*b                  // total length should be the length of the string times the amount of rows
        )
    }

1

SOGL V0.12 , 8 bytes

∫dč*∑}¹╚

Experimente aqui!

Explicação:

∫dč*∑}¹╚
∫    }    iterate over 1..input, pushing counter
 d        push the variable D, which sets itself to the next input as string
  č       chop into characters - a vertical array
   *      multiply horizontally by the counter
    ∑     join the array together
      ¹   wrap all that in an array
       ╚  center horizontally

Não estava com vontade de atualizar minha resposta antiga aqui, pois usa um método diferente e usa um novo recurso (mais que o desafio) -


1

Python 2 , 79 77 bytes

s,n=input();m=n
while m:m-=1;print' '*(m*len(s)/2)+''.join(i*(n-m)for i in s)

Experimente online!

Edit: -2 bytes de cortesia @FlipTack


Você pode remover os colchetes ao redor [i*(n-m)for i in s], como .joiné capaz de levar um gerador, que deve ter dois bytes.
FlipTack

0

Excel VBA, 98 bytes

Função de janela imediata VBE anônima que recebe entrada como string de [A1]e int a partir de [B1]então, para a janela imediata VBE

For i=1To[B1]:?Spc([Len(A1)/2]*([B1]-i));:For j=1To[Len(A1)]:?String(i,Mid([A1],j,1));:Next:?:Next
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.