แสดงให้เห็นถึงสแควร์ของทวินาม


28

ได้รับ (โดยวิธีการใด ๆ ) สองจำนวนธรรมชาติที่แตกต่างกัน (ขนาดใด ๆ ที่เหมาะสม), เอาท์พุท (โดยวิธีการใด ๆ ) กำลังสองของผลรวมของพวกเขาดังในตัวอย่างด้านล่าง:

รับ 4 และ 3 ผลลัพธ์:

12 12 12 12  9  9  9
12 12 12 12  9  9  9
12 12 12 12  9  9  9
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12

รับ 1 และ 3 ผลลัพธ์:

3 9 9 9
3 9 9 9
3 9 9 9
1 3 3 3

ช่องว่างอาจแตกต่างกันด้วยเหตุผล แต่คอลัมน์จะต้องชิดซ้ายชิดขวาหรือ (หลอก) - กึ่งกลาง

ขึ้นบรรทัดใหม่ตามปกติ แต่ช่องโหว่มาตรฐานไม่ใช่

นี่คือดังนั้นควรรวมหัวข้อเช่นเดียวกับ# LanguageName, 123ในคำตอบของคุณโดยที่ตัวเลขเป็นตัวอักษร (ไบต์สำหรับภาษาที่ไม่ใช่ข้อความ) ไม่อนุญาตให้ใช้รหัสการบรรจุหีบห่อ Unicode ขนาดใหญ่


โบนัส: -3 หากรหัสของคุณแสดงผลเพียงหนึ่งตารางเมื่อตัวเลขใดตัวเลขหนึ่งเป็น 0 เช่นได้รับ 0 และ 3 ผลลัพธ์:

9 9 9
9 9 9
9 9 9

ค่าสูงสุดของหมายเลขอินพุตคืออะไร? ขอบคุณ
ดอนสดใส

1
@donbright ไม่มีขีด จำกัด เทียม ข้อ จำกัด เพียงอย่างเดียวคือสิ่งที่คอมพิวเตอร์และภาษาของคุณสามารถจัดการได้เมื่อมีการนำเสนอการคำนวณ (ด้วยอัลกอริทึมที่คุณเลือก) และผลลัพธ์ อาจเป็นคอมพิวเตอร์ที่ทันสมัยพร้อมกับเครื่องพิมพ์ที่รับสายข้อมูลทีละบรรทัดแทบจะไม่ จำกัด ... :-)
58

การปฐมนิเทศเป็นรูปสี่เหลี่ยมกำหนดหรือเราหมุน 90 องศาได้ไหม?
John Dvorak

1
ทำไมโบนัสสำหรับค่า 0 ถึงแม้ว่า สิ่งที่คาดหวังเอาท์พุทจะเป็นถ้าไม่ได้เป็นเพียงหนึ่งตาราง?
March Ho

@MarchHo นั่นเป็นเหตุผลที่โบนัสมีขนาดเล็กมาก ถึงกระนั้นบางภาษาอาจไม่สามารถจัดการกับอาร์เรย์ที่ว่างเปล่า
58

คำตอบ:


14

J, 9 ไบต์ - 3 = 6

#~@|.*/#~

ได้รับแรงบันดาลใจจากคำตอบ APL ของ @ NBZซึ่งส่งถึง @randomra สิ่งนี้นิยามคำกริยาที่ใช้ในอาร์เรย์ของตัวเลข มันถูกใช้ดังนี้:

   (#~@|.*/#~) 4 3
12 12 12 12  9  9  9
12 12 12 12  9  9  9
12 12 12 12  9  9  9
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12

ฉันยังอ้างสิทธิ์โบนัส 3 ไบต์เนื่องจากอินพุต 0 สร้างเมทริกซ์ย่อยที่มีขนาดเป็นศูนย์:

   (#~@|.*/#~) 4 0
16 16 16 16
16 16 16 16
16 16 16 16
16 16 16 16
   (#~@|.*/#~) 0 3
9 9 9
9 9 9
9 9 9

คำอธิบาย

J มีความชัดเจนในความท้าทายนี้ นอกจากปัญหาการจัดการอาเรย์สำหรับอาหารเช้าแล้วมันพิมพ์เมทริกซ์ 2D ในรูปแบบที่ถูกต้องตามค่าเริ่มต้น

       #~  Replicate each number n in input n times
#~@|.      The same for reversed input
     */    Compute their multiplication table

ทำให้ฉันรู้สึกเหมือนอยู่บ้าน
อดัม

3
โซลูชันนี้ดูเหมือนว่าtable flipperอิโมติคอนแบบ ASCII ที่คลุมเครือ(╯°□°) ╯︵ ┻━┻)
Pete TNT

10

อ็อกเทฟ 45 ไบต์ - 3 = 42

s=@(m,n)[a=ones(n,1)*n;b=ones(m,1)*m].*[b;a]'

คำอธิบาย

สิ่งนี้สร้างสองเวกเตอร์ (ลองสมมุติm = 4และn = 3):

ones(n, 1)สร้างอาเรย์ของขนาดn x 1ดังนั้นคูณด้วยnเราได้:

ones(n, 1) * n => [3 3 3]' (where ' is transpose... n x 1 is a column vector)

a = [3 3 3  4 4 4 4]'   %// a is a column vector
b = [4 4 4 4  3 3 3]    %// b is a row vector

จากนั้นเวกเตอร์จะถูกคูณด้วยองค์ประกอบที่ชาญฉลาดด้วยการขยายการออกอากาศอัตโนมัติเพื่อให้เวกเตอร์ 7 องค์ประกอบสร้างเมทริกซ์ 7x7 องค์ประกอบ:

    [3] .* [4 4 4 4 3 3 3]
    [3]
    [3]
    [4]
    [4]
    [4]
    [4]

ตัวอย่างเช่นการคูณแถวแรกaด้วยการbให้:

    [3] .* [4 4 4 4 3 3 3] = [12 12 12 12  9  9  9]

aและในทำนองเดียวกันสำหรับแถวที่เหลืออยู่ของ

เอาท์พุท:

>> s(4,3)
ans =

   12   12   12   12    9    9    9
   12   12   12   12    9    9    9
   12   12   12   12    9    9    9
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12

>> s(3,0)
ans =

   9   9   9
   9   9   9
   9   9   9

คุณสามารถลองได้ที่นี่บนideone


s=คุณสามารถลบ เรามีการประชุมที่ไม่ระบุชื่อฟังก์ชั่น / lambdas ในตัวแปร
ข้อบกพร่อง

6
@flawr แต่คำตอบจะไม่ 42 ...
บีกเกอร์

ตกลง.
อดัม

9

Dyalog APL , 10-3 = 7

Inspired * โดยคำตอบนี้เมื่อข้อโต้แย้งถูกจำลองแบบแล้วใช้ในตารางสูตรคูณ:

⊖∘.×⍨(/⍨⎕)

ออกพรอมต์ ( ⎕:) และประเมินการแสดงออกใด ๆ ที่ป้อนแล้ว (เพื่อเหตุผลด้านความปลอดภัยนี่ใช้ไม่ได้กับTryAPLแต่ใช้ได้กับNGN / APL )
/⍨ทำซ้ำอาร์กิวเมนต์ของตัวเองเวลา ( /⍨4 33 3 3 4 4 4 4)
∘.×⍨สร้างตารางสูตรคูณ
พลิกคว่ำ

สิ่งนี้เกิดขึ้นกับการทำงานกับอินพุตที่มีความยาวใด ๆ (อินพุตถูกเยื้อง 6 ช่องว่างเอาต์พุตอยู่ที่ระยะขอบซ้าย):

      ⊖∘.×⍨(/⍨⎕)
⎕:
      ⍬      ⍝ Empty list (the square of nothing)
      ⊖∘.×⍨(/⍨⎕)
⎕:
      0      ⍝ 0​² = 0
      ⊖∘.×⍨(/⍨⎕)
⎕:
      0 1      ⍝ (0+1)​² = 1²
1
      ⊖∘.×⍨(/⍨⎕)
⎕:
      2 3      ⍝ (2+3)​² = 2² + 3²
6 6 9 9 9
6 6 9 9 9
6 6 9 9 9
4 4 6 6 6
4 4 6 6 6
      ⊖∘.×⍨(/⍨⎕)
⎕:
      1 2 3      ⍝ (1+2+3)​² = 1² + 2(1×2) + 2(1×3) + 2² + 2(2×3) + 3²
3 6 6 9 9 9
3 6 6 9 9 9
3 6 6 9 9 9
2 4 4 6 6 6
2 4 4 6 6 6
1 2 2 3 3 3
      ⊖∘.×⍨(/⍨⎕)
⎕:
      ⍳4    ⍝ Integers 1 through 4
4 8 8 12 12 12 16 16 16 16
4 8 8 12 12 12 16 16 16 16
4 8 8 12 12 12 16 16 16 16
4 8 8 12 12 12 16 16 16 16
3 6 6  9  9  9 12 12 12 12
3 6 6  9  9  9 12 12 12 12
3 6 6  9  9  9 12 12 12 12
2 4 4  6  6  6  8  8  8  8
2 4 4  6  6  6  8  8  8  8
1 2 2  3  3  3  4  4  4  4

* ในขั้นต้นฉันมีวิธีแก้ไขปัญหาที่แตกต่างกันในใจ: แต่ละสี่เหลี่ยมผืนผ้าถูกสร้างแยกต่างหากโดยการสร้างตารางการคูณสำหรับการรวมกันของสองข้อโต้แย้ง จากนั้นสี่เหลี่ยมทั้งสี่จะรวมกันในแนวตั้งและแนวนอน ดูเหมือนว่านี้:

,/⍪⌿⊖∘.(,⍴×)⍨⎕

พรอมต์ดังกล่าวข้างต้น
,⍴×<รวม ( ,) args และใช้เพื่อกำหนด ( ) สี่เหลี่ยมที่เต็มไปด้วยผลิตภัณฑ์ของพวกเขา ( ×)
∘.(... )⍨สร้างตารางที่แต่ละเซลล์มีสิ่งที่ระบุไว้ใน(... )
พลิกในแนวตั้ง
⍪⌿รวมเซลล์ในแนวตั้ง
,/รวมเซลล์ในแนวนอน


1
ดี! แนวคิดเดียวกันใน J ที่มีคะแนนเท่ากัน:(|.*/])@#~
Zgarb

@Zgarb อัปเดตคำตอบของคุณแล้วใส่เชิงอรรถเหมือนของฉัน เจสมควรได้รับมัน!
58

7

R, 31 - 3 = 28

rev(b<-rep(a<-scan(),a))%*%t(b)

คำอธิบาย:

           a<-scan()            # take numeric input and store as vector a
    b<-rep(         ,a)         # repeat each numeric input by itself and store as vector b
rev(                   )        # the reverse of vector b
                        %*%     # matrix multiplication
                           t(b) # the transposed of vector b

นอกจากนี้ยังใช้งานได้มากกว่าสองตัวเลข ตัวอย่างเช่นผลลัพธ์สำหรับ (5,3,2) มีลักษณะดังนี้:

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   10   10   10   10   10    6    6    6    4     4
 [2,]   10   10   10   10   10    6    6    6    4     4
 [3,]   15   15   15   15   15    9    9    9    6     6
 [4,]   15   15   15   15   15    9    9    9    6     6
 [5,]   15   15   15   15   15    9    9    9    6     6
 [6,]   25   25   25   25   25   15   15   15   10    10
 [7,]   25   25   25   25   25   15   15   15   10    10
 [8,]   25   25   25   25   25   15   15   15   10    10
 [9,]   25   25   25   25   25   15   15   15   10    10
[10,]   25   25   25   25   25   15   15   15   10    10

คุณอาจจะต้องใส่มันเข้าไปcatหรือwriteเพื่อให้มันเป็นคำตอบที่ถูกต้อง
David Arenburg

@DavidArenburg ฉันไม่เห็นว่าทำไม มันบอกว่า "เอาท์พุท (โดยวิธีใด ๆ )" เอาฉันเพียงหนึ่งหมายถึงการส่งออกที่ทำให้ฉันอยู่ในความต้องการ
freekvd

ใช่บางทีคุณพูดถูก ไม่แน่ใจว่าพวกเขาหมายถึงอะไร
David Arenburg

@DavidArenburg ใช่แล้วมันก็ดี นี่คือการท้าทายข้อมูล / ข้อความไม่ใช่ความท้าทายอินพุต / เอาต์พุต
58

5

Haskell, 153 125 ไบต์ - 3 = 122

(#)=replicate
d=length.show
y%x=unlines$(>>= \n->(1+d(x*x+y*y)-d n)#' '++show n)<$>x#(y#(x*y)++x#(x*x))++y#(y#(y*y)++x#(x*y))

ครึ่งหนึ่งของรหัสใช้สำหรับการจัดรูปแบบผลลัพธ์ มันทำงานสำหรับจำนวนเต็มขนาดใหญ่โดยพลการ ตัวอย่างผลลัพธ์:

> putStrLn $ 4 % 3
12 12 12 12  9  9  9
12 12 12 12  9  9  9
12 12 12 12  9  9  9
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12

> putStrLn $ 6 % 0
36 36 36 36 36 36
36 36 36 36 36 36
36 36 36 36 36 36
36 36 36 36 36 36
36 36 36 36 36 36
36 36 36 36 36 36

บางครั้งมีช่องว่างเพิ่มเติมระหว่างตัวเลขเพราะฉันคำนวณพื้นที่ที่จำเป็นโดยใช้x*x+y*yแทนmax (x*x) (y*y)เช่น

> putStrLn $ 2 % 3
  6  6  9  9  9
  6  6  9  9  9
  6  6  9  9  9
  4  4  6  6  6
  4  4  6  6  6

แต่มันก็เป็นหนึ่งในช่องว่างมากที่สุด


4

Mathematica 56-3 = 53

อัปเดต : ฉันเพิ่มวิธีที่สองซึ่งมีขนาดรหัสเท่ากันอย่างแม่นยำซึ่งใช้ฟังก์ชันที่ระบุชื่อ มันใช้Arrayมากกว่าTableแต่ตามตรรกะเดียวกัน (ดูด้านล่าง)

วิธีที่ 1

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

Grid@Table[If[r>#2,#,#2]If[c>#,#2,#],{r,#+#2},{c,#+#2}]&

แต่ละปัจจัยคือคำสั่ง If-then:

  • If[r>#2,#,#2] หมายถึง "ถ้าหมายเลขแถวมากกว่าอินพุตที่สองให้ใช้อินพุตแรกเป็นตัวประกอบหรือใช้อินพุตที่สอง
  • If[c>#,#2,#] หมายถึง "ถ้าหมายเลขคอลัมน์มากกว่าอินพุตแรกให้ใช้อินพุทที่สองเป็นตัวประกอบหรือใช้อินพุตแรก

ตัวอย่างที่ 1

 Grid@Table[If[r>#2,#,#2]If[c>#,#2,#],{r,#+#2},{c,#+#2}]&@@{5,3}

EX1


ตัวอย่างที่ 2

Grid@Table[If[r>#2,#,#2]If[c>#,#2,#],{r,#+#2},{c,#+#2}]&@@{0,3}

EX2


วิธีที่ 2 (เช่น 56-3 = 53)

วิธีนี้คล้ายกับวิธีที่ 1 แต่จะต้องใช้รหัสน้อยลงเมื่อเรียกใช้ และเซลล์สามารถกำหนดแอดเดรสได้ซึ่งแตกต่างจากเซลล์ในตาราง วิธีนี้จะดีกว่าถ้าใช้ฟังก์ชั่นมากกว่าหนึ่งครั้ง

a_~f~b_:=Grid@Array[If[#>a,a,b]If[#2>a,b,a]&,{a+b,a+b}]

ตัวอย่างจากด้านบนผลิตโดยต่อไปนี้:

อดีต 1:

f[4,3]

อดีต 2:

f[0,3]

1
นั่นคือความคิดสร้างสรรค์ ด้วยวิธีการนั้นฉันสามารถลดโซลูชันของตัวเองลงได้ 4 ตัว
58

ขอบคุณ ฉันเพิ่งรู้ว่าวิธีการเดียวกันทำงานกับฟังก์ชั่นที่มีชื่อ ดูวิธีที่ 2 ด้านบน
DavidC

4

อ็อกเทฟ, 34 - 3 = 31

@(a)rot90(b=repelems(a,[1,2;a]))*b

ตัวอย่าง:

octave:1> f = @(a)rot90(b=repelems(a,[1,2;a]))*b;
octave:2> f([4,3])
ans =

   12   12   12   12    9    9    9
   12   12   12   12    9    9    9
   12   12   12   12    9    9    9
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12

octave:3> f([0,3])
ans =

   9   9   9
   9   9   9
   9   9   9

ว้าวผมได้ความคิดที่ไม่มีrepelemsตัวตน ! น่ากลัว
บีกเกอร์

4

CJam, 27 ไบต์ - 3 = 24

q:L~_]ze~_ff{*sL,2*Se[}W%N*

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

ทดสอบที่นี่

คำอธิบาย

q:L    e# Read the input and store it in L.
~_     e# Evaluate the input, pushing [A B] onto the stack and duplicate it.
]z     e# Wrap both in an array and transpose it to get [[A A] [B B]].
e~     e# Run-length decode, getting A copies of A and B copies of B.
_ff{   e# Double map over each pair of entries in this new array...
  *s   e#   Multiply the two values.
  L,2* e#   Push twice the length of the input string.
  Se[  e#   Pad the result to this width with spaces (from the left).
}
W%     e# Reverse the resulting matrix to get the correct orientation.
N*     e# Join the rows with linefeed characters.

ดี แต่สิ่งที่ทำให้พื้นที่สีขาวมากและสิ่งที่จะต้องลดมัน?
Adám

1
@NBZ วิธีที่สั้นที่สุดที่ฉันพบเพื่อคำนวณขอบเขตบนที่เชื่อถือได้บนความกว้างของเซลล์คือการใช้ความยาวสองเท่าของสตริงอินพุต (เนื่องจากจำนวนที่มีขนาดใหญ่กว่ากำลังสองจะไม่มีตัวเลขมากกว่าสองหลักมากกว่าตัวเลข ตัวเอง) แน่นอนว่าฉันสามารถคำนวณจำนวนเงินจริงที่จำเป็นตามจำนวนผลลัพธ์ที่ได้ แต่นั่นจะค่อนข้างนานกว่านี้
Martin Ender

4

ฟังก์ชัน C (ใช้ glibc), 122 ไบต์ - 3 = 119

ส่วนใหญ่นำไปใช้งานตรงไปตรงมากับ 2 ลูป ฉันคาดหวังว่าจะมีโอกาสตีกอล์ฟที่ฉันพลาดได้ที่นี่:

f(n,m,x,y){for(x=0;x<n+m;x+=puts(""))for(y=0;y<n+m;y++)printf(" %*d",snprintf(0,0,"%d",n>m?n*n:m*m),(x<m?m:n)*(y<n?n:m));}

อินพุตถูกส่งผ่านไปยังพารามิเตอร์สองฟังก์ชันแรกและอีกสองพารามิเตอร์เป็นฟังก์ชัน คอลัมน์จัดชิดขวา

หมายเหตุ glibc puts()ดูเหมือนจะส่งคืนจำนวนไบต์ที่เขียนเสมอรวมถึงการขึ้นบรรทัดใหม่โดยนัยซึ่งเป็นสิ่งที่เราต้องการที่นี่ ไม่มีการรับประกันนี้จะทำงานร่วมกับ libc อื่น ๆ

ในโปรแกรมเต็มรูปแบบ:

f(n,m,x,y){for(x=0;x<n+m;x+=puts(""))for(y=0;y<n+m;y++)printf(" %*d",snprintf(0,0,"%d",n>m?n*n:m*m),(x<m?m:n)*(y<n?n:m));}

int main (int argc, char **argv) {
    if (argc == 3) {
        f(atoi(argv[1]),atoi(argv[2]));
    }
}

คอมไพล์เป็นgcc sqrbin.c -o sqrbin(หรือmake sqrbin) คำเตือนอาจถูกละเว้นอย่างปลอดภัย

ตัวอย่างผลลัพธ์:

$ ./sqrbin 4 3
 12 12 12 12  9  9  9
 12 12 12 12  9  9  9
 12 12 12 12  9  9  9
 16 16 16 16 12 12 12
 16 16 16 16 12 12 12
 16 16 16 16 12 12 12
 16 16 16 16 12 12 12
$ ./sqrbin 4 0
 16 16 16 16
 16 16 16 16
 16 16 16 16
 16 16 16 16
$ 

จากประสบการณ์ของฉันค่าส่งคืนของputs()ขึ้นอยู่กับเครื่อง มันเป็น 10 ในเหมืองเช่น นี่คือเคล็ดลับ: โดยปกติคุณสามารถบีบอัดลูปสองลูปเป็นหนึ่งถ้าคุณเพิ่มตัวนับตามเงื่อนไขในลูปภายนอก วิธีการแก้ปัญหาของฉันแสดงให้เห็นว่ามันสามารถทำได้
xsot

@xsot ใช่puts()รหัสส่งคืนรับประกันว่าจะเป็น + ve เท่านั้นสำหรับความสำเร็จ อย่างไรก็ตามการทดสอบกับ glibc ของฉันดูเหมือนว่าแสดงว่าค่าส่งคืนเป็นจำนวนไบต์ที่เขียน สำหรับการรวมแบบวนรอบ - ใช่ฉันรู้เทคนิคนี้และได้ลองที่นี่จนถึงตอนนี้โดยไม่มีการย่อในกรณีนี้
Digital Trauma

2

Ruby, (133 - 3) = 130 ไบต์

s=1
a=ARGV.map{|e|s*=(e=e.to_i);[e]*e}.flatten
s=s.to_s.size
a.reverse.each{|i|a.each{|j|print (i*j).to_s.rjust(s).ljust(s+3)};puts}

สำหรับ 4,3

12   12   12   12    9    9    9   
12   12   12   12    9    9    9   
12   12   12   12    9    9    9   
16   16   16   16   12   12   12   
16   16   16   16   12   12   12   
16   16   16   16   12   12   12   
16   16   16   16   12   12   12

สำหรับ 1,3

3   9   9   9   
3   9   9   9   
3   9   9   9   
1   3   3   3

สำหรับ 0,3

9   9   9   
9   9   9   
9   9   9

2
ยินดีต้อนรับสู่ PPCG! ฉันไม่คิดว่าช่องว่างภายในของคุณเพียงพอสำหรับคนจำนวนมาก พิจารณามีและเป็นจำนวนมากเช่น1 9999กว่าsจะออกมาเป็น4ดังนั้นคุณจะขยายความกว้างs+3 = 7แต่9999^2ต้องการ 8 หลัก คุณอาจต้องการใช้2*sแทน
Martin Ender

2
โดยไม่คำนึงถึงนี่คือบางส่วนเคล็ดลับการเล่นกอล์ฟ: ผมไม่เห็นเหตุผลที่คุณต้องการก่อนที่จะทำrjust ljustคุณสามารถย่อprintให้สั้นลงเพื่อ$><<(และกำจัดพื้นที่หลังจากนั้น) มีนามแฝงARGV $*คุณอาจจะสามารถที่จะหลีกเลี่ยงflattenโดยการสร้างอาร์เรย์ของคุณกับบางสิ่งบางอย่างเช่นนี้codegolf.stackexchange.com/a/19493/8478 นอกจากนี้ยังมีคำตอบเฉพาะฟังก์ชั่นเท่านั้นที่ได้รับอนุญาตที่นี่ (แม้แต่ฟังก์ชั่นที่ไม่มีชื่อ) ดังนั้นฟังก์ชั่นนี้สามารถใช้จำนวนเต็มเป็นอินพุตและคุณไม่ต้องทำอะไร.to_iเลย
Martin Ender

@ MartinBüttnerขอบคุณสำหรับเคล็ดลับ
Harsh Gupta

2

Python 2, 176 ไบต์ - 3 = 173

def g(m,n):
 y,x,z,l,f='y','x','z','l','%'+str(len(str(max(m*m,n*n))))+'s'
 d={y:m*n,x:n*n,z:m*m,l:'\n'}
 for i in map(lambda x:d[x],(y*m+x*n+l)*n+(z*m+y*n+l)*m): print f % i,

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


วิธีการที่น่าสนใจ
58

1

Matlab, 58 - 3 = 55

ใช้ฟังก์ชั่นที่ไม่ระบุชื่อ:

@(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)

ตัวอย่าง:

>> @(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)
ans = 
    @(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)
>> ans(4,3)
ans =
    12    12    12    12     9     9     9
    12    12    12    12     9     9     9
    12    12    12    12     9     9     9
    16    16    16    16    12    12    12
    16    16    16    16    12    12    12
    16    16    16    16    12    12    12
    16    16    16    16    12    12    12

>> @(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)
ans = 
    @(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)
>> ans(0,3)
ans =
     9     9     9
     9     9     9
     9     9     9

(สารละลายเก่า) 59 - 3 = 56

ใช้ฟังก์ชั่นที่ไม่ระบุชื่อ:

@(a,b)[b*a*ones(b,a) b^2*ones(b);a^2*ones(a) a*b*ones(a,b)]

1

C, (125 - 3) ไบต์

i,j,a;main(b,s){for(sscanf(gets(s),"%d %d",&a,&b);j<a+b;)printf(++i>a+b?i=!++j,"\n":"%*d",strlen(s)*2,(i<a?a:b)*(j<b?b:a));}

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


ฉันมีปัญหาในการทำให้มันคอมไพล์ด้วย gcc (4.8.4) ...
don bright

1
ฉันทดสอบสิ่งนี้บนgolf.shinh.org/check.rbซึ่งใช้แพ็คเกจ debian gcc-4.6.1-2 คุณได้รับข้อผิดพลาดในการรวบรวมอะไร
xsot

ขอโทษที่ฉันลองอีกครั้งเพราะเป็นหนึ่งบรรทัดและมันใช้งานได้ ... แต่เมื่อฉันรันฉันจะได้รับ segfault ฉันป้อนสตริง 2 3 และตีกลับมาและกล่าวว่าความผิดของการแบ่งส่วน (หลักทิ้ง)
ดอนสดใส

ขออภัยฉันไม่รู้ว่าทำไมมันถึงไม่เหมาะกับคุณ อย่างน้อยคุณยังสามารถลองใช้รหัสที่เว็บไซต์ฉันเชื่อมโยงก่อนหน้านี้ :)
xsot

1

Pyth, 39 - 3 = 36

Pyth ไม่มีการจัดรูปแบบเมทริกซ์ในตัวซึ่งเพิ่มขนาดอย่างมากเนื่องจากต้องมีการบีบตัวเลขผลลัพธ์ด้วยตนเอง นี่คือสิ่งที่ฉันมาด้วย

JAQL*b]jdm.[`d\ l`eS^R2Jsm*d]*bdJj+yHyG

ลองออนไลน์


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