เอาท์พุตปิรามิด (หรือทางหลวง)


39

รับสตริงที่ไม่ว่างเปล่า s, มีความยาวเท่ากัน, และเลขจำนวนเต็มบวก n, แทนความสูง, เขียนพีระมิดโดยใช้กฎต่อไปนี้:

ปิรามิดควรมีเส้นที่ไม่เว้นว่าง ขึ้นบรรทัดใหม่ที่ได้รับอนุญาต สำหรับแต่ละ 1 <= i <= n บรรทัด i-th ควรมีสตริงที่มีอักขระแต่ละตัวซ้ำแล้วซ้ำอีกในสถานที่ที่ฉันครั้ง; abcd ทำซ้ำ 3 ครั้งกลายเป็น aaabbbcccddd แต่ละบรรทัดควรอยู่กึ่งกลางด้วยช่องว่างภายในเพื่อให้กึ่งกลางของแต่ละบรรทัดอยู่ในแนวตั้ง อนุญาตให้เว้นวรรคที่ส่วนท้ายของแต่ละบรรทัด คุณยังสามารถขึ้นบรรทัดใหม่ได้สูงสุดหนึ่งบรรทัด แต่ไม่มีช่องว่างอื่นก่อนบรรทัดแรก

สตริงอินพุตไม่ได้รับการรับประกันว่าเป็นแบบ palindrome

กรณีทดสอบ

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
โพสต์ Sandboxสร้างโดย user42649 ซึ่งเป็นบัญชีของฉันจนกว่าจะถูกลบ
HyperNeutrino

เอาต์พุตสำหรับฟังก์ชันในคำถามนี้จะเป็นรายการของสตริงแต่ละอันแสดงถึงบรรทัดหรือควรมีการขึ้นบรรทัดใหม่ด้วยหรือไม่
notjagan

7
สร้างพีระมิดคุณหมายถึงทางหลวง !
Luis Mendo เมื่อ

ดูเหมือนพีระมิด Aztec!
QBrute

3
@QBrute Na ถูกสร้างขึ้นโดย Goa'uld :)
theblitz

คำตอบ:


12

05AB1E , 9 ไบต์

γ².D)ƶJ.C

ลองออนไลน์!


γได้รับแรงบันดาลใจจากคำตอบของ Adnan ในไม่ช้า แต่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
@ โจนาธานและความถี่ของความผิดพลาดที่หลีกเลี่ยงได้ของฉันควรได้รับการปฏิเสธในระดับหนึ่ง
Magic Octopus Urn

12

05AB1E , 11 ไบต์

F²γN>×J}».C

ใช้การเข้ารหัส05AB1E ลองออนไลน์!


มันเริ่มต้นขี้ขลาดด้วยอินพุตที่สูงกว่า 168 ดีมาก!
tuskiomi

@carusocomputing »รวมอาร์เรย์ภายในด้วยช่องว่าง แทนที่ด้วยJควรทำงาน (และฉันคิดว่าคุณควรโพสต์ที่เป็นคำตอบที่แตกต่างกัน)
Adnan

Ah! มันเป็นอย่างนั้นมาตลอด? ถ้าเป็นเช่นนั้นเจ๋งถ้าไม่ฉันต้องพลาดแน่ ขอบคุณจะทำ
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) , 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 :)
Kevin Cruijssen

10
ಠ_ಠทวีความรุนแรง
Magic Octopus Urn

1
บังคับ " ~iเทียบเท่ากับ-i-1" เพื่อให้คุณสามารถบันทึกไบต์โดยการเปลี่ยนไป(n-i-1) (n+~i)
ค่าหมึก

1
และคุณสามารถใช้การs=>n=>...
แกงกะหรี่

1
@CarlosAlejo ขออภัยที่โพสต์การแก้ไขแยกต่างหาก แต่คุณยังสามารถแทนที่new string(' '...ด้วย"".PadLeft(...
LiefdeWen

7

Cheddar , 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

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
หากคุณย้าย ints ก่อนคุณสามารถประกาศr="",q=s.format("%"+x+"s",r)เพื่อบันทึก 2 ไบต์ มีการเคลื่อนไหวมากมายในเวลาเพียงสองไบต์ :(
Olivier Grégoire

1
@ OlivierGrégoireขอบคุณ! ด้วยการใช้งานs.format("%"+x+"s",r)โดยตรงฉันสามารถบันทึก 8 ไบต์ได้อีกหลังจากกอล์ฟของคุณ :)
Kevin Cruijssen

4

JavaScript (ES6), 85 ไบต์

(string)(height)จะเข้าในไวยากรณ์ currying รวมถึงการขึ้นบรรทัดใหม่ชั้นนำ

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

การสาธิต


มีช่องว่างนำหน้าบรรทัดสุดท้ายจะอนุญาตหรือไม่
Charlie

@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
ว้าวมีcenterbuiltin หรือไม่? บางครั้งฉันต้องอ่านเอกสารจริงๆ: P
HyperNeutrino

ส่งคืนเอาต์พุตไม่ถูกต้อง นี่คือบรรทัดว่างนำหน้าตามด้วยn-1แถว
มูลค่าหมึก

คุณมีช่องว่างนำหน้าด้วยก่อนบรรทัดสุดท้ายนั่นเป็นสิ่งที่อนุญาตหรือไม่?
Charlie

@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 ก็กลับมาอีกครั้งหวังว่าจะได้รับการศึกษาเพิ่มขึ้นเล็กน้อย


คุณมีช่องว่างนำหน้ามากเกินไปในแต่ละบรรทัด
Shaggy

นี่เป็นวิธี 998 ไบต์ 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บรรทัดใหม่ตามตัวอักษร
Shaggy


3

APL (Dyalog) , 33 31 ไบต์

2 ไบต์ golfed ด้วย @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จัดการ "การซ้ำซ้อน" ของตัวละครและ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).

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

Japtap , 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
Shaggy

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

CJam , 36 ไบต์

l_,2/:T;]li:F{[_U)*zSTFU)-**\N]\}fU;

ลองออนไลน์!


ยินดีต้อนรับสู่ PPCG! การส่งครั้งแรกที่ดี :)
HyperNeutrino

@HyperNeutrino ดีฉันมีความรู้สึกรหัสของฉันค่อนข้างไกลจากการเพิ่มประสิทธิภาพ แต่ ... ขอบคุณ :)
Siguza

4
แต่มันมีSTFU :-D
Luis Mendo

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และn , ตามมาตรฐาน 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])&


อินพุต

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

โลโก้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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.