输出金字塔(或公路)


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
输出金字塔您一定是在说高速公路
Luis Mendo

看起来像阿兹台克人的金字塔!
QBrute17年

3
@QBrute Na。由果
阿尔德(

Answers:


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.

我简直无法相信有人对您的错误发帖表示反对:/
Jonathan Allan

1
@JonathanAllan我可以避免的错误发生的频率在某种程度上值得否定。
Magic Octopus Urn

12

05AB1E,11个字节

F²γN>×J}».C

使用05AB1E编码。在线尝试!


输入超过168时它开始变得时髦。否则很棒!
tuskiomi

@carusocomputing »通过空格连接内部数组。替换它J应该起作用(我认为您应该将其发布为其他答案)。
阿德南(Adnan)

啊! 一直都是那样吗?如果是这样,很酷,否则我一定会错过的。谢谢,会的。
Magic Octopus Urn

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
您可以通过删除括号来节省两个字节(n-i-1)*s.Length/2。我喜欢您的测试用例。+1 :)
Kevin Cruijssen

10
ಠ_ಠ加剧
Magic Octopus Urn

1
必填项“ ~i等同于-i-1”,因此您可以通过更改(n-i-1)为来保存一个字节(n+~i)
价值墨水

1
并且您可以将currying 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答案中一样使用的功能,因为这也可能节省字节。
Value Ink 2015年


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个字节。仅两个字节就大量移动了:(
OlivierGrégoire17年

1
@OlivierGrégoire谢谢!通过s.format("%"+x+"s",r)直接使用,我可以在打完高尔夫球后再节省8个字节。:)
Kevin Cruijssen

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哦,那是最新更新的意外副作用。现在已修复。感谢您举报!
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)

在线尝试!


Dang,我的答案几乎相同,但是我不确定函数是否可以返回行列表。如果是这样,我将把我的问题作为一个单独的答案发布,但如果不是,它将与发布太相似。
notjagan

3
哇,有center内置的吗?我有时确实需要阅读文档:P
HyperNeutrino

返回错误的输出;它有一个前导空白行,后跟n-1行。
价值墨水

最后一行之前还有一些前导空格,这是允许的吗?
查理

@FryAmTheEggman可能是正确的,但是9当输入为10... 时,它仍然返回金字塔线。–
Value Ink


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

说明:

ws写入适当数量的前导空格:

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-XXnV,如果我没有记错的话。
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标准,输入是通过预先存在的带有snt进行

不需要太多解释,这是一个非常简单的嵌套循环,@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)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])&


输入

[“ 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)}

游戏围栏链接

定义一个采用字符串切片和数字的匿名函数,将所需的模式打印到标准输出。它假定字符串切片仅包含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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.