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


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.