Выведите Пирамиду (или Шоссе)


39

Учитывая непустую строку s с четной длиной и положительное целое число n, представляющее ее высоту, составьте пирамиду, используя следующие правила:

Пирамида должна содержать n непустых строк; в конце допускаются переводы строки. Для каждого 1 <= i <= n i-я строка должна содержать строку, в которой каждый отдельный символ повторяется i раз; abcd повторяется 3 раза, как таковой становится aaabbbcccddd. Каждая строка должна быть центрирована пробелами так, чтобы середина каждой строки была выровнена по вертикали. Пробелы в конце каждой строки разрешены. У вас также может быть до одной новой строки, но нет других пробелов перед первой строкой.

Входная строка не обязательно является палиндромом.

Прецедент

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
Песочница Пост, созданный user42649, который был моей учетной записью, пока не был удален.
— HyperNeutrino

Может ли вывод для функции по этому вопросу быть списком строк, каждая из которых представляет строку, или к нему должны присоединяться символы новой строки?
— Notjagan

7
Выведите пирамиду Вы наверняка имеете в виду шоссе !
— Луис Мендо

Похоже на ацтекскую пирамиду!
— QBrute

3
@QBrute Na. Сделано Гоа'улдом :)
— theblitz

Ответы:


12

05AB1E , 9 байтов

γ².D)ƶJ.C

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


γбыл, во многом, вдохновлен ответом Аднана; но Sтакже будет работать.


γ          # 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.

Я не могу поверить, что кто-то на самом деле опроверг ваш ошибочный пост: /
— Джонатан Аллан

1
@JonathanAllan частота моих ошибок, которых можно избежать, в определенной степени заслуживает негатива.
— Волшебная Урна Осьминога

12

05AB1E , 11 байт

F²γN>×J}».C

Использует кодировку 05AB1E . Попробуйте онлайн!


Он начинает работать в стиле фанк со значениями выше 168. В остальном здорово!
— Tuskiomi

@carusocomputing »объединяет внутренние массивы пробелами. Замена на это Jдолжна работать (и я думаю, что вы должны опубликовать это как другой ответ).
— Аднан

Ах! Так было всегда? Если так, круто, если нет, я, должно быть, пропустил это. Спасибо, сделаю.
— Волшебная Урна Осьминога

8

Желе , 14 13 байтов

LH×Ḷ}Ṛ⁶ẋżxЀY

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

Как это работает

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

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

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

Возвращает перечисление strings с линиями чертежа. После того, как присоединился, результат выглядит так:

                        ಠ_ಠ  ಠ_ಠ
                    ಠಠ__ಠಠ    ಠಠ__ಠಠ
                ಠಠಠ___ಠಠಠ      ಠಠಠ___ಠಠಠ
            ಠಠಠಠ____ಠಠಠಠ        ಠಠಠಠ____ಠಠಠಠ
        ಠಠಠಠಠ_____ಠಠಠಠಠ          ಠಠಠಠಠ_____ಠಠಠಠಠ
    ಠಠಠಠಠಠ______ಠಠಠಠಠಠ            ಠಠಠಠಠಠ______ಠಠಠಠಠಠ
ಠಠಠಠಠಠಠ_______ಠಠಠಠಠಠಠ              ಠಠಠಠಠಠಠ_______ಠಠಠಠಠಠಠ
  • 2 байта сэкономлено благодаря Кевину Круйссену!
  • 1 байт сохранен благодаря Value Ink!
  • 6 байтов сэкономлено благодаря LiefdeWen!

1
Вы можете сохранить два байта, удалив скобки в (n-i-1)*s.Length/2. И мне нравятся твои тесты. +1 :)
— Кевин Круйссен

10
ಠ_ಠусиливается
— Волшебная Урна Осьминога

1
Обязательный « ~iэквивалентен -i-1», поэтому вы можете сохранить байт, изменив (n-i-1)на (n+~i).
— Value Ink

1
и вы можете использовать карри s=>n=>...для другого байта
— LiefdeWen

1
@CarlosAlejo Извините за публикацию отдельных изменений, но вы также можете заменить new string(' '...на"".PadLeft(...
— LiefdeWen

7

Чеддер , 71 64 байта

Сохранено 7 байт благодаря @ValueInk

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

Попробуйте онлайн! Я добавлю объяснение немного

объяснение

(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

Нет проблем! Интересно, есть ли в Cheddar centerфункция, которую вы можете использовать так же, как и я, в своем ответе на Ruby, потому что она потенциально может также сохранить байты.
— Чернила стоимости


5

Ява 8, 188 186 185 183 181 173 байта

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 байта (185 → 183) из-за исправления ошибки ( n+1вместо него выводились строки n). Не часто случается, что исправление ошибки сохраняет байты. :)
-2 байта (183 → 181) благодаря @ OlivierGrégoire

Объяснение:

Попробуй это здесь.

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
Если вы сначала переместите свои целые, вы можете объявить, r="",q=s.format("%"+x+"s",r)что сохранили 2 байта. Много движения только для двух байтов :(
— Оливье Грегуар

1
@ OlivierGrégoire Спасибо! Используя s.format("%"+x+"s",r)напрямую, я смог сэкономить еще 8 байтов после вашего гольфа. :)
— Кевин Круйссен

4

JavaScript (ES6), 85 байт

Принимает ввод в синтаксисе карри (string)(height). Включает ведущий перевод строки.

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

демонстрация


Перед последней строкой есть пробелы, это разрешено?
— Чарли

@CarlosAlejo О, это был непреднамеренный побочный эффект последнего обновления. Сейчас исправлено. Спасибо за сообщение об этом!
— Arnauld

4

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

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

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

Нам нужны строки повторяются 1..nраз. Самый простой способ добиться этого - это цикл от 0 до n, поскольку цикл 0 в основном не работает.

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

Поместите курсор так, чтобы результирующая линия была в центре.

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

И это то, как просто печатать каждый символ многократно i.


4

Python 2 , 75 77 байт

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

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


Черт, у меня был почти такой же ответ, но я не был уверен, может ли функция вернуть список строк. Если это так, я опубликую свой отдельный ответ, но если нет, он будет слишком похож на пост.
— Notjagan

3
Вау, есть centerвстроенный? Мне действительно нужно иногда читать документы: P
— HyperNeutrino

Возвращает неправильный вывод; это имеет начальную пустую строку, за которой следуют n-1строки.
— Чернила стоимости

У вас также есть несколько ведущих пробелов перед последней строкой, это разрешено?
— Чарли

@FryAmTheEggman, это может быть правдой, но он по-прежнему возвращает 9строки пирамиды, когда ввод 10...
— Ink Value


4

Javascript, 105 байт

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

После нескольких лет отпуска Stretch Maniac возвращается, надеюсь, на этот раз немного более образованным.


У вас слишком много пробелов в каждой строке.
— Лохматый

Вот 99-байтовая версия ES8 этого метода, который я придумал до того, как увидел ваш: s=>n=>[...Array(x=n)].reduce(a=>a+'\n'.padEnd(--x*s.length/2+1)+s.replace(/./g,c=>c.repeat(n-x)),'')- вам нужно заменить 's на backticks, а на \nбуквальный перевод строки.
— Лохматый


3

APL (Dyalog) , 33 31 байт

2 байта в гольфе благодаря @ZacharyT, удалив ненужные скобки

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

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

объяснение

Правый аргумент ⍵- это строка, а левый аргумент ⍺- это число.

{↑((' '/⍨(.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

Тебе нужны парни вокруг ⍺-⊢?
— Захари

@ZacharyT Ты прав, они мне не нужны. Спасибо :)
— Kritixi Lithos

3

SWI Пролог, 398 байт

Это не самое компактное решение (может быть, где-то изобретать велосипед вместо использования встроенных процедур), но оно работает.

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).

Тест:

?- 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 .

Объяснение:

w и s пишет правильное количество ведущих пробелов:

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 управляет «дублированием» символы и е является его рекурсивным объектом:

//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 и l добавить к результату (возможно, существует встроенная процедура?):

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 создает вывод:

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

и, наконец, p является основным методом :

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

Выводит массив строк - добавьте 2 байта, если это не разрешено.

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

Попробуй это


объяснение

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

Я думаю , что вы можете изменить , SpUlчтобы ... ждать, фигу :( Вы можете сохранить байт , хотя путем замены (V-Xс XnV, если я не ошибаюсь.
— ETHproductions

Ах да, забыл о n; спасибо @ETHproductions.
— Лохматый

2

PHP, 113 байт:

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

Запустите php -nr '<code>' '<string>' <N>или протестируйте его онлайн .

сломать

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

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

Ввод осуществляется с уже существующей таблицей т с колонкой s и п , в соответствии с нашими стандартами IO .

Объяснять особо нечего, это довольно простой вложенный цикл, использующий @iдля строк и @jдля обхода символов строки, которые являются REPLICATED @iвременами:

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

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

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

Объяснение:

Это довольно просто, разбивая строку и повторяя элементы iкаждый раз rep(s,e=i)( eсокращенно each), пока мы выполняем цикл. Сложная часть есть rep('',(n-i)/2*length(s)+1). Это строка заполнения, но это куча пустых строк. Мне нужно добавить 1, потому что в противном случае получается character(0)вектор нулевой длины, catкоторый, по умолчанию разделяет его элементы пробелами, смещает последнюю строку.


1

Mathematica, 97 байт

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


вход

["оо оо", 10]


1

Tcl, 143 142 141 138 байт

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}

Тест:

% 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

Примечание: «cd» в конце процедуры не позволяет распечатать результат времени ниже пирамиды, но меняет текущий каталог - побочный эффект, который явно не запрещен.

Спасибо sergiol за подсказку для сохранения одного байта .... и другую подсказку для сохранения еще одного байта.

Благодаря аспекту (в чате tcl) еще 3 байта сохранены!


1

Swift, 232 байта

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

В этом ответе используется Swift 4, поэтому его нельзя запустить в Интернете.

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

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

Попробуйте код на FMSLogo интерпретаторе.

Определите функцию, fкоторая принимает два входа, :sи :nзатем напечатайте результат.


1

Java 8, 164 148 байт

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

Объяснение:

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

Ржавчина, 107 байт

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

ссылка на манеж

Определяет анонимную функцию, которая принимает строковый фрагмент и номер, печатая нужный шаблон в стандартный вывод. Предполагается, что фрагмент строки содержит только символы ASCII, но в запросе никогда не указывается, что необходима полная поддержка юникода. Для корректной работы с юникодом также потребуется 117 байт:

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

∫dč*∑}¹╚

Попробуй здесь!

Объяснение:

∫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

Мне не хотелось обновлять мой старый ответ здесь, так как он использует другой метод и использует новую (не сложную) функцию - ╚


1

Python 2 , 79 77 байт

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

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

Редактировать: -2 байта любезно предоставлено @FlipTack


Вы можете убрать квадратные скобки вокруг [i*(n-m)for i in s], так как .joinспособен взять генератор, который должен иметь два байта.
— FlipTack

0

Excel VBA, 98 байт

Функция анонимного непосредственного окна VBE, которая принимает входные данные в виде строки из [A1]и из int, а [B1]затем выводит их в непосредственное окно VBE

For i=1To[B1]:?Spc([Len(A1)/2]*([B1]-i));:For j=1To[Len(A1)]:?String(i,Mid([A1],j,1));:Next:?:Next
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.