พิมพ์เพชรนี้


76

คำถามนี้แพร่กระจายอย่างไวรัสในที่ทำงานของฉัน มีวิธีการที่หลากหลาย:

พิมพ์ต่อไปนี้:

        1
       121
      12321
     1234321
    123454321
   12345654321
  1234567654321
 123456787654321
12345678987654321
 123456787654321
  1234567654321
   12345654321
    123454321
     1234321
      12321
       121
        1

คำตอบจะได้คะแนนเป็นตัวอักษรโดยมีจำนวนอักขระน้อยกว่า


4
เกณฑ์การชนะคืออะไร? และนี่คือความท้าทายหรือกอล์ฟ?
Paul R

21
ฉันอ่าน "kolmogorov-complex" เป็น "code-golf"
DavidC

1
@DavidCarraher "kolmogorov-complex" ถูกแก้ไขหลังจากคำถามถูกถาม ผู้ถามต้นฉบับยังไม่ได้ระบุเกณฑ์การชนะ
Gareth

@Gareth ความคิดเห็นของฉันถูกสร้างขึ้นหลังจากที่เพิ่มแท็ก "kolmogorov-complex" แต่ก่อนที่จะเพิ่มแท็ก "code-golf" ในเวลานั้นผู้คนยังคงถามว่ามันเป็นคำถามกอล์ฟ
DavidC

3
perlmonks.com/?node_id=891559มีวิธีแก้ไขปัญหา perl
b_jonas

คำตอบ:


24

J, 29 26 24 23 22 21 ตัวอักษร

,.(0&<#":)"+9-+/~|i:8

ขอบคุณFUZxxlสำหรับ"+เคล็ดลับ (ฉันไม่คิดว่าฉันเคยใช้มาu"vก่อนเลย)

คำอธิบาย

                  i:8  "steps" vector: _8 _7 _6 ... _1 0 1 ... 7 8
                 |     magnitude
              +/~      outer product using +
            9-         inverts the diamond so that 9 is in the center
  (      )"+           for each digit:
      #                  copy
   0&<                   if positive then 1 else 0
       ":                copies of the string representation of the digit
                         (in other words: filter out the strictly positive
                          digits, implicitly padding with spaces)
,.                     ravel each item of the result of the above
                       (necessary because the result after `#` turns each
                        scalar digit into a vector string)

แทนการเขียน"0] "+
FUZxxl

สำหรับอักขระที่น้อยกว่าหนึ่งตัวให้เขียน,.0(<#":)"+9-+/~|i:8
FUZxxl

1
นี่คือโซลูชันของคุณแปลเป็น 25 ตัวอักษรของ APL:⍪↑{(0<⍵)/⍕⍵}¨9-∘.+⍨|9-⍳17
FUZxxl

25

APL ( 33 31)

A⍪1↓⊖A←A,0 1↓⌽A←⌽↑⌽¨⍴∘(1↓⎕D)¨⍳9

หากอนุญาตให้มีการเว้นวรรคคั่นตัวเลข (เช่นเดียวกับในรายการ Mathematica) ก็สามารถตัดให้สั้นลงเป็น28 26:

A⍪1↓⊖A←A,0 1↓⌽A←⌽↑⌽∘⍕∘⍳¨⍳9

คำอธิบาย:

  • (โปรแกรมยาว :)
  • ⍳9: รายการหมายเลข 1 ถึง 9
  • 1↓⎕D: ⎕Dเป็นสตริง '0123456789' 1↓ลบองค์ประกอบแรก
  • ⍴∘(1↓⎕D)¨⍳9: สำหรับแต่ละองค์ประกอบของ N ⍳9ใช้องค์ประกอบ N 1↓⎕Dแรกจาก นี่เป็นรายการ: ["1", "12", "123", ... "123456789"] เป็นสตริง
  • ⌽¨: ย้อนกลับแต่ละองค์ประกอบของรายการนี้ ["1", "21", "321" ... ]

  • (โปรแกรมสั้น ๆ :)

  • ⍳¨⍳9: รายการ 1 ถึง N สำหรับ N [1..9] นี่จะให้รายการ [[1], [1,2], [1,2,3] ... [1,2,3,4,5,6,7,8,9] เป็นตัวเลข
  • ⌽∘⍕∘: การย้อนกลับของการแสดงสตริงของแต่ละรายการเหล่านี้ ["1", "2 1" ... ]
  • (เหมือนกันจากนี้เป็นต้นไป :)
  • A←⌽↑: สร้างเมทริกซ์จากรายการลิสต์ด้านขวามีช่องว่างแล้วย้อนกลับ สิ่งนี้จะช่วยให้ด้านบนของเพชร มันถูกเก็บไว้ใน A.
  • A←A,0 1↑⌽A: A โดยมีการย้อนกลับของ A ลบคอลัมน์แรกติดกับด้านขวา นี่จะทำให้ครึ่งบนของสี่เหลี่ยม นี่จะถูกเก็บไว้ใน A อีกครั้ง
  • A⍪1↓⊖A: ⊖Aเป็นมิเรอร์ในแนวตั้ง (ให้ครึ่งล่าง) 1↓เอาแถวบนสุดของครึ่งล่างและเป็นครึ่งบนด้านบนของA⍪1↓⊖A

5
+1 น่าทึ่ง คุณช่วยแปลให้คนไม่รู้หนังสือ APL ให้เราได้ไหม
DavidC

3
ไม่ควรนับรหัสที่ไม่ใช่ ascii เป็น UTF-8 แทนที่จะเป็นรหัสจุด นี่จะทำให้ APL ใกล้ชิดกับญาติทางโลกของเขามากขึ้น
John Dvorak

5
@JanDvorak ไม่เนื่องจากมีหน้ารหัส APLซึ่งเหมาะกับอักขระทั้งหมดที่ตั้งค่าไว้ในไบต์เดียว แต่ฉันคิดว่าคุณอาจจะคิดได้ในบางจุดตั้งแต่ปี 2013;)
Martin Ender

23

Clojure, 191 179 bytes

#(loop[[r & s](range 18)h 1](print(apply str(repeat(if(< r 8)(- 8 r)(- r 8))\ )))(doseq[m(concat(range 1 h)(range h 0 -1))](print m))(println)(if s(recur s((if(< r 8)inc dec)h))))

-12 ไบต์โดยเปลี่ยนด้านนอกdoseqเป็น a loop, ซึ่งทำให้ฉันสามารถกำจัดatom(yay)

คู่ "for-loop" ลูปด้านนอก ( loop) ไปที่แต่ละแถวในขณะที่วงใน ( doseq) ไปที่แต่ละหมายเลขในแถวซึ่งอยู่ในช่วง(concat (range 1 n) (range n 0 -1))โดยที่nเป็นหมายเลขสูงสุดในแถว

(defn diamond []
  (let [spaces #(apply str (repeat % " "))] ; Shortcut function that produces % many spaces
    (loop [[row-n & r-rows] (range 18) ; Deconstruct the row number from the range
           high-n 1] ; Keep track of the highest number that should appear in the row
      (let [top? (< row-n 8) ; Are we on the top of the diamond?
            f (if top? inc dec) ; Decided if we should increment or decrement
            n-spaces (if top? (- 8 row-n) (- row-n 8))] ; Calculate how many prefix-spaces to print
        (print (spaces n-spaces)) ; Print prefix-spaces
        (doseq [m (concat (range 1 high-n) (range high-n 0 -1))] ; Loop over the row of numbers
          (print m)) ; Print the number
        (println)

        (if r-rows
          (recur r-rows (f high-n)))))))

เนื่องจากข้อบกพร่องในตรรกะในความพยายามครั้งแรกของฉัน (โดยไม่ได้ตั้งใจแทรกช่องว่างระหว่างแต่ละหมายเลขแทน) ฉันจัดการเพื่อรับนี้:

1
1       2       1
1      2      3      2      1
1     2     3     4     3     2     1
1    2    3    4    5    4    3    2    1
1   2   3   4   5   6   5   4   3   2   1
1  2  3  4  5  6  7  6  5  4  3  2  1
1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
12345678987654321
1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1
1  2  3  4  5  6  7  8  9  8  7  6  5  4  3  2  1
1   2   3   4   5   6   7   8   7   6   5   4   3   2   1
1    2    3    4    5    6    7    6    5    4    3    2    1
1     2     3     4     5     6     5     4     3     2     1
1      2      3      4      5      4      3      2      1
1       2       3       4       3       2       1
1        2        3        2        1
1         2         1

ไม่ถูกต้องแม้กระทั่งมองข้ามข้อผิดพลาดที่เห็นได้ชัด แต่มันก็ดูดี


20

Mathematica 83 49 43 54 51

Print@@#&/@(Sum[k~DiamondMatrix~17,{k,0,8}]/.0->" ")

formatting improved


ด้วย 3 ไบต์ที่บันทึกไว้ต้องขอบคุณ Kelly Lowder

การวิเคราะห์

ส่วนหลักของรหัสที่Sum[DiamondMatrix[k, 17], {k, 0, 8}]สามารถตรวจสอบWolframAlpha

ต่อไปนี้แสดงให้เห็นถึงตรรกะพื้นฐานของวิธีการในระดับที่เล็กกว่า

a = 0~DiamondMatrix~5;
b = 1~DiamondMatrix~5;
c = 2~DiamondMatrix~5;
d = a + b + c;
e = d /. 0 -> "";
Grid /@ {a, b, c, d, e}

grids


1
เดวิดคุณชนะฉันในครั้งนี้! :-)
Mr.Wizard

1
ลองอีกครั้ง (55 ตัวอักษร):f = Table[# - Abs@k, {k, -8, 8}] &; f[f[9]] /. n_ /; n < 1 -> "" // Grid
DavidC

ยังอีก (71 ตัวอักษร):Table[9 - ManhattanDistance[{9, 10}, {j, k}], {j, 18}, {k, 18}] /. n_ /; n < 1 -> "" // Grid
DavidC

2
Grid@#@#@9&[Table[#-Abs@k,{k,-8,8}]&]/.n_/;n<1->""50 ตัวอักษร
chyanog

การแสดงภาพของรหัส:ArrayPlot[Sum[k~DiamondMatrix~17, {k, 0, 8}], AspectRatio -> 2]
DavidC

15

Python 2, 72 69 67 61

ไม่ฉลาด:

s=str(111111111**2)
for i in map(int,s):print'%8s'%s[:i-1]+s[-i:]

1
ไม่ทำงานใน Python 3+ ซึ่งต้องการ parens รอบ ๆ อาร์กิวเมนต์เพื่อพิมพ์ :(
Griffin

7
@Griffin: ในรหัสกอล์ฟฉันเลือก Python 2 หรือ Python 3 ขึ้นอยู่กับว่าฉันต้องการพิมพ์เพื่อใช้เป็นฟังก์ชันหรือไม่
Steven Rumbalski

3
s=`0x2bdc546291f4b1`
gnibbler

1
@gnibbler ข้อเสนอแนะที่ฉลาดมาก แต่น่าเสียดายที่ Repr 'L'ของเลขฐานสิบหกที่มีต่อท้าย
Steven Rumbalski

1
@gnibbler: วิธีนี้ทำงานได้ใน Python ที่ทำงานบนแพลตฟอร์ม 64 บิต แต่ไม่ใช่ในแพลตฟอร์ม 32 บิต
Konrad Borowski

14

C, 79 ตัวอักษร

v;main(i){for(;i<307;putchar(i++%18?v>8?32:57-v:10))v=abs(i%18-9)+abs(i/18-8);}

4
กรุณาอธิบาย
Lucas Henrique

1
@LucasHenrique รวมทั้งสิ้น 307 ตัวอักษร i% 18-9 คือค่า x บนระนาบคาร์ทีเซียนที่สะท้อนตัวเองบนแกน y i / 18-8 คือค่า y บนระนาบคาร์ทีเซียนสะท้อนตัวเองบนแกน x รวมพวกเขาเข้าด้วยกันเพื่อให้ได้เส้นทแยงมุม 1: 1 (ซึ่งทำให้การเปลี่ยนตัวเลขเป็นรูปแบบบนเพชร 1: 1 (32:57) -v เป็นค่าตัวเลข unichar สำหรับ ASCII 0-9 10 บรรทัดใหม่
Albert Renshaw

14

Python 2, 60 59

for n in`111111111**2`:print`int('1'*int(n))**2`.center(17)

การละเมิด backticks และการจ่ายคืน


inสามารถลบช่องว่างหลังจากคำหลักได้เช่นเดียวกับที่คุณใช้กับprintแป้นพิมพ์
Konrad Borowski

@GlitchMr: ขอบคุณ! Updated
nneonneo

ฉันได้รับเพิ่มLในเจ็ดบรรทัดกลางของเอาต์พุต
Steven Rumbalski

คุณไม่ควร ... คุณใช้ Python เวอร์ชันใดอยู่?
nneonneo

12

GolfScript, 33 31 30 ตัวอักษร

โซลูชัน GolfScript อื่น

17,{8-abs." "*10@-,1>.-1%1>n}%

ขอบคุณ@PeterTaylorสำหรับคนอื่น

เวอร์ชันก่อนหน้า:

17,{8-abs" "*9,{)+}/9<.-1%1>+}%n*

( วิ่งออนไลน์ )

17,{8-abs" "*9,{)+}/9<.-1%1>n}%

1
คุณไม่ต้องการช่องว่างต่อท้าย (ข้อความในคำถามไม่ได้มี) ดังนั้นคุณสามารถข้ามการเพิ่มตัวเลขลงในช่องว่างและบันทึกหนึ่งตัวอักษรเป็น17,{8-abs." "*10@-,1>.-1%1>n}%
Peter Taylor

12

Mathematica 55 50 45 41 38

(10^{9-Abs@Range[-8,8]}-1)^2/81//Grid

Grid[(10^Array[{9}-Abs[#-9]&,17]-1)^2/81]

กราฟิกทางคณิตศาสตร์


1
ทำงานได้ดีมาก
DavidC

@DavidCarraher ขอบคุณ: D
chyanog

ฉันพูดถึงคำพูดของเดวิด คุณคิดอย่างไรกับสิ่งนี้
Mr.Wizard

ฉันขออัปเดตคำตอบของคุณด้วยการดัดแปลงสั้นลงที่ฉันเขียนได้ไหม
Mr.Wizard

@ Mr.Wizard แน่นอน
chyanog

10

Javascript, 114

รายการแรกของฉันใน Codegolf!

for(l=n=1;l<18;n-=2*(++l>9)-1,console.log(s+z)){for(x=n,s="";x<9;x++)z=s+=" ";for(x=v=1;x<2*n;v-=2*(++x>n)-1)s+=v}

หากสามารถย่อให้สั้นลงได้อีกโปรดแสดงความคิดเห็น :)


เจ้ากรรมมัน !! ฉันพลาดพื้นที่และทำครึ่งเพชร ฉันต้องนอนแล้วตอนนี้
Joomler

9

PHP, 92 90 ตัวอักษร

<?for($a=-8;$a<9;$a++){for($b=-8;$b<9;){$c=abs($a)+abs($b++);echo$c>8?" ":9-$c;}echo"\n";}

คำนวณและพิมพ์ระยะห่างจากตำแหน่งแมนฮัตตันจากศูนย์กลาง พิมพ์ช่องว่างถ้าน้อยกว่า 1

ผู้ใช้ที่ไม่ระบุชื่อแนะนำการปรับปรุงต่อไปนี้ (84 ตัวอักษร):

<?for($a=-8;$a<9;$a++,print~õ)for($b=-8;$b<9;print$c>8?~ß:9-$c)$c=abs($a)+abs($b++);

อันที่สองไม่ทำงาน
Christian

ฉันรู้ว่ามันช้ามาก แต่ฉันก็จำเป็นต้องเล่นกอล์ฟเสมอเมื่อเห็นสคริปต์ PHP 83 ไบต์กับ<?ข้ามต่อเมตา นอกจากนี้คุณดูเหมือนจะมีปัญหาการเข้ารหัสในรหัสที่สอง
RedClover

@ Soaku คนที่สองไม่ใช่ของฉัน มันแนะนำว่าเป็นการแก้ไขคำตอบของฉันโดยผู้ใช้ที่ไม่ระบุชื่อ ฉันเพิ่งเพิ่มมันโดยไม่ตรวจสอบ - ไม่แน่ใจว่าทำไมผู้ใช้ไม่ได้โพสต์มันเป็นความพยายามของตนเอง คำถามเมตาโพสต์วันที่คำตอบนี้เกือบ 3 ปี
Gareth

ฉันหมายถึงว่าฉันไม่ได้รวม<?อยู่ใน bytecount ฉันได้ทำการปรับปรุงอื่น ๆ ด้วย
RedClover

8

เสียงกระเพื่อมสามัญ 113 ตัว

(defun x(n)(if(= n 0)1(+(expt 10 n)(x(1- n)))))(dotimes(n 17)(format t"~17:@<~d~>~%"(expt(x(- 8(abs(- n 8))))2)))

ครั้งแรกที่ฉันสังเกตเห็นว่าองค์ประกอบของเพชรสามารถแสดงเช่น:

  1   =   1 ^ 2
 121  =  11 ^ 2
12321 = 111 ^ 2

เป็นต้น

xซ้ำคำนวณฐาน (1, 11, 111, ฯลฯ ) formatซึ่งเป็นสี่เหลี่ยมแล้วพิมพ์เป็นศูนย์กลางโดย เพื่อให้ตัวเลขขึ้นไปถึงเทอมสูงสุดแล้วถอยกลับอีกครั้งฉันใช้(- 8 (abs (- n 8)))เพื่อหลีกเลี่ยงการวนซ้ำครั้งที่สอง


8

Charcoal (ไม่ใช่การแข่งขัน), 13 ไบต์

ไม่แข่งขันเพราะภาษานั้นใหม่กว่าคำถาม

F⁹«GX⁻⁹ιI⁺ι¹→

ลองออนไลน์!

อย่างไร?

ดึงเพชรขนาดเล็กจำนวนเก้าแต้มอย่างต่อเนื่องซ้อนทับกัน:

F⁹«   Loop ι from 0 to 8:
GX     Draw a (filled) polygon with four equilateral diagonal sides
⁻⁹ι      of length 9-ι
I⁺ι¹    using str(ι+1) as the character
→       Move right one space before drawing the next one

4
ตอนนี้ควรเป็นการแข่งขันที่สอดคล้องกับฉันทามติใหม่ในเมตาดาต้า
อย่างเป็นทางการ


6

PowerShell (2 ตัวเลือก): 92 84 45 ไบต์

1..8+9..1|%{' '*(9-$_)+[int64]($x='1'*$_)*$x}
1..9+8..1|%{' '*(9-$_)+[int64]($x='1'*$_)*$x}

ขอบคุณStrigoidesสำหรับคำใบ้ในการใช้ 1 ^ 2,11 ^ 2,111 ^ 2 ...


โกนหนวดบางตัวโดย:

  • $wขจัด
  • ซ้อนนิยาม$xของการใช้งานครั้งแรกแทน
  • รับเบาะแสจากโซลูชันของ Rynant :
    • รวมอาร์เรย์จำนวนเต็มเข้ากับ+แทนที่จะ,ช่วยให้สามารถกำจัดวงเล็บรอบ ๆ อาร์เรย์และเลเยอร์ของการซ้อนในลูป
    • ใช้9-$_ในการคำนวณความยาวของช่องว่างที่จำเป็นแทนการใช้คณิตศาสตร์และวิธีการที่ซับซ้อนมากขึ้น $yนอกจากนี้ยังตัดความจำเป็นสำหรับ

คำอธิบาย:

1..8+9..1หรือ1..9+8..1สร้างอาร์เรย์ของจำนวนเต็มจากน้อยไปมากตั้งแต่ 1 ถึง 9 จากนั้นเลื่อนกลับไปที่ 1

|%{... }ไพพ์อาร์เรย์จำนวนเต็มเป็นForEach-Objectลูปผ่าน alias ใน%ตัว

' '*(9-$_)+ ลบจำนวนเต็มปัจจุบันจาก 9 จากนั้นสร้างสตริงของช่องว่างจำนวนมากที่จุดเริ่มต้นของการส่งออกสำหรับบรรทัดนี้

[int64]($x='1'*$_)*$xกำหนด$xเป็นสตริงของ1ตราบเท่าที่จำนวนเต็มปัจจุบันมีขนาดใหญ่ จากนั้นจะถูกแปลงเป็น int64 (จำเป็นต้องใช้เอาต์พุต 111111111 2อย่างถูกต้องโดยไม่ใช้เครื่องหมาย E) และยกกำลังสอง

ป้อนคำอธิบายรูปภาพที่นี่


1
คุณสามารถบันทึกไบต์โดยการส่งไปยังlongแทนint64
Veskah

อีกวิธีในการประหยัด byte1..8+9..1|%{' '*(9-$_)+ +($x='1'*$_+'L')*$x}
mazzy

5

เป็นกลุ่ม62 39 38 กดแป้นพิมพ์

ขอบคุณ @DJMcMayhem สำหรับการบันทึกจำนวนหนึ่งไบต์!

คำตอบกลุ่มแรกของฉันน่าตื่นเต้นมาก!

i12345678987654321<ESC>qqYP9|xxI <ESC>YGpHq7@q

ฉันพยายามเขียนตัวเลขผ่านการบันทึก แต่มันก็นานกว่ามาก

ลองออนไลน์!

คำอธิบาย:

i123 ... 321<ESC>                   Write this in insert mode and enter normal mode
qq                                  Start recording into register q
  YP                                Yank this entire line and Paste above
    9|                              Go to the 9th column
      xx                            Delete character under cursor twice
        I <ESC>                     Go to the beginning of the line and insert a space and enter normal mode
               Y                    Yank this entire line
                G                   Go to the last line
                 p                  Paste in the line below
                  H                 Go to the first line
                   q                End recording
                    7@q             Repeat this 7 times

แก้ไข:

ฉันใช้Hแทนggและบันทึกไว้ 1 ไบต์


คุณสามารถลบmaและเปลี่ยนไป`ai<space> I<space>
DJMcMayhem

นอกจากนี้คุณอาจลบขั้นตอนที่ 3 หากคุณเปลี่ยนขั้นตอนที่ 1 เป็นการวางด้านบนและด้านล่าง
DJMcMayhem

@DJMcMayhem ขอขอบคุณสำหรับคำแนะนำ! ตอนแรกฉันคิดว่าจะแนะนำการลงทะเบียนใหม่สำหรับบิตที่คัดลอก แต่มันสั้นกว่ามาก!
Kritixi Lithos

5

APL (Dyalog Classic) , 20 19 ไบต์

(⍉⊢⍪1↓⊖)⍣2⌽↑,⍨\1↓⎕d

ลองออนไลน์!

⎕d เป็นตัวเลข '0123456789'

1↓วางแรก ( '0')

,⍨\ สลับการสแกน catenate คือส่วนนำหน้าที่กลับด้าน '1' '21' '321' ... '987654321'

ผสมลงในเมทริกซ์เบาะกับช่องว่าง:

1
21
321
...
987654321

กลับเมทริกซ์ในแนวนอน

(... )⍣2ทำสองครั้ง:

⍉⊢⍪1↓⊖การขนย้าย ( ) ของเมทริกซ์เอง ( ) ตัดแบ่งตามแนวตั้ง ( ) กับเมทริกซ์กลับหัวในแนวตั้ง ( ) โดยไม่ต้องแถวแรก ( 1↓)


4

R, 71 ตัวอักษร

สำหรับบันทึก:

s=c(1:9,8:1);for(i in s)cat(rep(" ",9-i),s[0:i],s[(i-1):0],"\n",sep="")

+1 - สามารถประหยัดได้ด้วยmessage(rep(" ",9-i),s[c(1:i,i:1-1)])
flodel

@flodel คุณจะต้องทราบว่าพิมพ์ไปที่ stderr และคุณสามารถทำfor(i in s<-c(1:9,8:1))...เพื่อบันทึก byte
Giuseppe


4

k ( 64 50 ตัวอักษร)

-1'(::;1_|:)@\:((|!9)#'" "),'$i*i:"J"$(1+!9)#'"1";

วิธีเก่า:

-1',/(::;1_|:)@\:((|!9)#\:" "),',/'+(::;1_'|:')@\:i#\:,/$i:1+!9;


(1+!9)#'"1"is,\9#"1"
ngn

4

CJam, 31 27 ไบต์

CJam ใหม่กว่าความท้าทายนี้มากดังนั้นคำตอบนี้จึงไม่มีสิทธิ์ได้รับการยอมรับ นี่เป็นความท้าทายเล็ก ๆ น้อย ๆ ในวันเสาร์ตอนเย็นที่เป็นระเบียบ ;)

8S*9,:)+9*9/2%{_W%1>+z}2*N*

ทดสอบที่นี่

แนวคิดคือสร้างจตุภาคบนซ้ายก่อน นี่คือวิธีการทำงาน:

ครั้งแรกในรูปแบบสตริงโดยใช้" 123456789" 8S*9,:)+สตริงนี้มีความยาว 17 อักขระ ตอนนี้เราทำซ้ำสตริง 9 ครั้งแล้วแยกไว้ในสตริงที่มีความยาว 9/9 การจับคู่ที่ไม่ตรงกันระหว่าง 9 ถึง 17 จะชดเชยแต่ละแถวของอักขระหนึ่งตัวทางซ้าย เราจะได้รับการพิมพ์สตริงย่อยแต่ละรายการในบรรทัดของมันเอง:

        1
23456789 
       12
3456789  
      123
456789   
     1234
56789    
    12345
6789     
   123456
789      
  1234567
89       
 12345678
9        
123456789

ดังนั้นถ้าเราปล่อยแต่ละแถวอื่น ๆ (ซึ่งทำงานได้สะดวกโดยทำ2%) เราจะได้หนึ่งจตุภาคตามที่ต้องการ:

        1
       12
      123
     1234
    12345
   123456
  1234567
 12345678
123456789

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

_      "Duplicate all rows.";
 W%    "Reverse their order.";
   1>  "Discard the first row (the centre row).";
     + "Add the other rows.";

N*สุดท้ายเราเพียงเข้าร่วมทุกสายที่มีการขึ้นบรรทัดใหม่ด้วย


3

GolfScript, 36 ตัวอักษร

สมมติว่าสิ่งนี้มีความหมายว่าเป็นความท้าทายของนี่เป็นโซลูชันพื้นฐานของ GolfScript:

9,.);\-1%+:a{a{1$+7-.0>\" "if}%\;n}%

3

Ruby, 76 ตัวอักษร

def f(a)a+a.reverse[1..-1]end;puts f [*1..9].map{|i|f([*1..i]*'').center 17}

ยินดีต้อนรับการปรับปรุง :)


1
69 chars:f=->x{[*1..x]+[*1...x].reverse};puts f[9].map{|i|(f[i]*'').center 17}
Patrick Oscity

ความคิดเห็นที่ดีฉันไม่รู้ '... ' และไม่เข้าใจว่ามันจะทำงานได้อย่างไร
GB

60 ตัวอักษร:[*-8..8].map{|i|puts' '*i.abs+"#{eval [?1*(9-i.abs)]*2*?*}"}
GB

3

Befunge-93 , 155 chars

9:v:<,+55<v5*88<v-\9:$_68v
> v>     ^>3p2vpv  -1<!  *
, 1^  2p45*3+9<4:    ,:  +
g -^_75g94+4pg7^!    +^ ,<
1 : ^ `0    :-1$_:68*^$
^1_$:55+\-0\>:#$1-#$:_^

ลองออนไลน์!

มันสามารถตีกอล์ฟได้มากกว่านี้ แต่มันเป็นโปรแกรม Funge แรกของฉันและหัวของฉันก็เจ็บอยู่แล้ว มีความสนุกสนานมากมาย


3

จาวาสคริปต์, 170 ไบต์

รหัสกอล์ฟครั้งแรกของฉัน :)

แข็งแรงเล่นกอล์ฟ

a="";function b(c){a+=" ".repeat(10-c);for(i=1;i<c;i++)a+=i;for(i=2;i<c;i++)a+=c-i;a+="\n";}for(i=2;i<11;i++)b(i);for(i=9;i>1;i--)b(i);document.write("<pre>"+a+"</pre>");

Ungolfed

var str = "";
function row(line) {
    str += " ".repeat(10 - line);
    for (var i = 1; i < line; i++) {
        str += i;
    }
    for (var i = 2; i < line; i++) {
        str += line - i;
    }
    str += "\n";
}
for (var line = 2; line < 11; line++) {
    row(line);
}
for (var line = 9; line > 1; line--) {
    row(line);
}
document.write("<pre>" + str + "</pre>");

ยินดีต้อนรับสู่ PPCG!
ЕвгенийНовиков

2

Perl 56 54 ตัวอักษร

เพิ่ม 1 ถ่านสำหรับ-pสวิตช์

ใช้ repunits กำลังสองเพื่อสร้างลำดับ

s//12345678987654321/;s|(.)|$/.$"x(9-$1).(1x$1)**2|eg


2

Python 65

for i in map(int,str(int('1'*9)**2)):print' '*(9-i),int('1'*i)**2

ลองเพิ่มI=int;รหัสของคุณและแทนที่อินสแตนซ์ที่ตามมาทั้งหมดintด้วยI
Cyoce

@Cyoce ฉันคิดอย่างนั้น มันจะประหยัด 2 ตัวอักษรในแต่ละครั้งที่intใช้และจะใช้ 3 ครั้งดังนั้นจึงช่วยประหยัด 6 ตัวอักษรที่ราคา 6 ตัวอักษร
cardboard_box

2

Groovy 77 75

i=(-8..9);i.each{a->i.each{c=a.abs()+it.abs();print c>8?' ':9-c};println""}

เวอร์ชั่นเก่า:

(-8..9).each{a->(-8..9).each{c=a.abs()+it.abs();print c>8?' ':9-c};println""}

เพิ่ม 57 char groovy solution คุณสามารถแทนที่ทั้งสองeachด้วยanyเพื่อบันทึกสองตัวอักษร
Matias Bjarland


2

Javascript, 137

ด้วยการเรียกซ้ำ:

function p(l,n,s){for(i=l;i;s+=" ",i--);for(i=1;i<=n;s+=i++);for(i-=2;i>0;s+=i--);return(s+="\n")+(l?p(l-1,n+1,"")+s:"")}alert(p(8,1,""))

ครั้งแรกกับ CG :)

หรือ 118

หากฉันสามารถหาการใช้งาน JS ที่ดำเนินการ111111111**2ด้วยความแม่นยำสูงขึ้น
(ที่นี่: 12345678987654320)

a="1",o="\n";for(i=0;i<9;i++,o+="         ".substr(i)+a*a+"\n",a+="1");for(i=8;i;i--)o+=o.split("\n")[i]+"\n";alert(o)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.