Виведіть піраміду (або шосе)


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
Пісочниця повідомлення створена користувачем42649, яка була моїм обліковим записом, поки її не видалили.
HyperNeutrino

Чи може висновок функції для цього питання являти собою список рядків, кожен з яких представляє собою рядок, або він повинен бути об'єднаний новими рядками?
notjagan

7
Виведіть піраміду Ви напевно маєте на увазі шосе !
Луїс Мендо

Схоже на піраміду ацтеків!
QBrute

3
@QBrute Na. Зробив
Гоа'улд

Відповіді:


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 частота моїх помилок, які можна уникнути, до певної міри заслуговує негативу.
Magic Octopus Urn

12

05AB1E , 11 байт

F²γN>×J}».C

Використовує кодування 05AB1E . Спробуйте в Інтернеті!


Він починає дивовижно з введеннями вище 168. інакше чудово!
тускіоми

@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 байти збережено завдяки Kevin Cruijssen!
  • 1 байт збережено завдяки Value Ink!
  • 6 байт збережено завдяки LiefdeWen!

1
Ви можете зберегти два байти, видаливши дужки в (n-i-1)*s.Length/2. І мені подобаються ваші тестові справи. +1 :)
Кевін Круїссен

10
ಠ_ಠпосилюється
Magic Octopus Urn

1
Обов’язковий " ~iеквівалент -i-1", тому ви можете зберегти байт, змінивши (n-i-1)на (n+~i).
Значення чорнила

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

Без проблем! Цікаво, чи є у Чеддара centerфункцію, яку ви можете використовувати, як я, у моїй відповіді на Рубі, бо це також може зберегти байти.
Значення чорнила


5

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

Здійснює введення в синтаксис currying (string)(height). Включає провідний новий рядок.

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

Демо


Перед останнім рядком є ​​провідні пробіли, це дозволено?
Чарлі

@CarlosAlejo О, це було ненавмисним побічним ефектом оновлення в останню хвилину. Тепер виправлено. Дякуємо, що повідомили про це!
Арнольд

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...
Значення чорнила


4

Javascript, 105 байт

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

Після кількох років відпустки маніяк Стретч повернувся, сподіваємось, цього разу трохи освіченішим.


У вас є занадто багато провідних пробілів у кожному рядку.
Кудлатий

Ось 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 на задній план, а на \nбуквальний новий рядок.
Кудлатий


3

APL (Діалог) , 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

Вам потрібні парени навколо ⍺-⊢?
Zacharý

@ZacharyT Ти маєш рацію, мені вони не потрібні. Дякую :)
Kritixi Lithos

3

SWI Prolog, 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(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

Математика, 97 байт

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


вхід

["oo oo", 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

Свіфт, 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)}

playpen посилання

Визначає анонімну функцію, яка приймає фрагмент рядка та число, друкуючи потрібний візерунок на стандартний вихід. Він передбачає, що фрагмент рядка містить лише символи ASCII, але виклик ніколи не вказує, що необхідна повна підтримка unicode. Щоб бути правильним і для unicode, знадобиться 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.