ピラミッド(または高速道路)を出力する


39

長さが偶数で空の文字列sがなく、その高さを表す正の整数nが与えられた場合、次の規則を使用してピラミッドを構成します。

ピラミッドには、空でない行がn行含まれている必要があります。末尾の改行が許可されます。各1 <= i <= nについて、i番目の行には、個々の文字がインプレースでi回繰り返される文字列が含まれている必要があります。abcdは3回繰り返され、aaabbbcccdddになります。各行の中央が垂直に揃うように、各行の中央にパディングスペースを配置する必要があります。各行の末尾にスペースを追加できます。また、最初の行の前に最大1つの改行を含めることができますが、他の空白を含めることはできません。

入力文字列が回文であるとは限りません。

テストケース

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によって作成されたSandbox Post。これは、削除されるまで私のアカウントでした。
ハイパーニュートリノ

この質問の関数の出力は、それぞれが行を表す文字列のリストになりますか、それとも改行で結合する必要がありますか?
-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私の回避可能な間違いの頻度はある程度否定的であるに値する。
魔法のタコUr

12

05AB1E、11バイト

F²γN>×J}».C

05AB1Eエンコードを使用します。オンラインでお試しください!


入力が168を超えるとファンキーになります。
-tuskiomi

@carusocomputing »は、内部配列をスペースで結合します。で置き換えるJとうまくいくはずです(また、別の回答として投稿する必要があると思います)。
アドナン

あ!それはいつもそうでしたか?もしそうなら、クール、そうでなければ私はそれを見逃したに違いない。どうもありがとう。
魔法のタコUr

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)139137136130バイト

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

オンラインでお試しください!

string図面の線でsの列挙を返します。参加すると、結果は次のようになります。

                        _  _
                    ಠಠ__ಠಠ    ಠಠ__ಠಠ
                ಠಠಠ___ಠಠಠ      ಠಠಠ___ಠಠಠ
            ಠಠಠಠ____ಠಠಠಠ        ಠಠಠಠ____ಠಠಠಠ
        ಠಠಠಠಠ_____ಠಠಠಠಠ          ಠಠಠಠಠ_____ಠಠಠಠಠ
    ಠಠಠಠಠಠ______ಠಠಠಠಠಠ            ಠಠಠಠಠಠ______ಠಠಠಠಠಠ
ಠಠಠಠಠಠಠ_______ಠಠಠಠಠಠಠ              ಠಠಠಠಠಠಠ_______ಠಠಠಠಠಠಠ
  • Kevin Cruijssenのおかげで2バイト節約されました!
  • Value Inkのおかげで1バイト節約!
  • LiefdeWenのおかげで6バイト節約されました!

1
の括弧を削除することにより、2バイトを節約できます(n-i-1)*s.Length/2。そして、私はあなたのテストケースが好きです。+1 :)
ケビンクルーッセン

10
ಠ_ಠ激化
マジックタコop

1
必須の「~iと同等」は-i-1、に変更(n-i-1)することでバイトを節約できます(n+~i)
バリューインク

1
そして、あなたはそうカリー化を使用することができますs=>n=>...別のバイトのために
LiefdeWen

1
申し訳ありません@CarlosAlejo別々の編集を投稿していますが、置き換えることができnew string(' '..."".PadLeft(...
LiefdeWen

7

チェダー71 64バイト

@ValueInkのおかげで7バイト節約

(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
最初にintを移動するr="",q=s.format("%"+x+"s",r)と、2バイトの節約を宣言できます。わずか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ああ、それは土壇場での更新の意図しない副作用でした。修正されました。これを報告していただきありがとうございます!
アーナルド

4

、19バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

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

行を繰り返す必要があり1..nます。ループ0は基本的にノーオペレーションなので、これを達成する最も簡単な方法は0からnまでループすることです。

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

結果の行が中央にくるようにカーソルを置きます。

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

これは、各文字を繰り返して印刷するのがどれほど簡単かということiです。


4

パイソン275の 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)),'')

数年後、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をバックティックに置き換え、\nリテラルの改行に置き換える必要があります。
シャギー


3

APL(Dyalog)33 31バイト

@ZacharyTのおかげで、不要な括弧を削除して2バイトをゴルフ

{↑((' '/⍨(.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は文字の「複製」を管理し、eは再帰機能です。

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

結果にalを追加します(組み込みのプロシージャが存在する可能性があります)。

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

Japt20 + 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

入力は、IO規格に従って、列sおよびnを持つ既存のテーブルtを介して行われます。

説明することはあまりありませんが、これはかなり単純なネストされたループで@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

R125 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)(のeeach)繰り返します。トリッキーな部分は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])&


入力

["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」は、ピラミッドの下に時間の結果が出力されるのを防ぎますが、現在のディレクトリを変更します-明示的に禁止されていない副作用。

1バイトを保存するためのヒントを提供してくれたsergiol ....ともう1バイトを保存するための別のヒントをありがとう。

さらに3バイト保存されたアスペクト(tclチャット)に感謝します!


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

ロゴ、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インタープリターでコードを試してください。

機能の定義f2つの入力を受け取り、: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文字のみであると想定していますが、チャレンジでは、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

ここで古い回答を更新する気はありませんでした。これは、異なる方法を使用し、新しい(チャレンジよりも)機能を使用しているためです-



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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.