สร้างผลรวมกริด


15

สร้างกริด 7 x 7 เต็มไปด้วยตัวเลขสุ่ม อย่างไรก็ตามในเซลล์ที่มีจำนวนแถวและคอลัมน์คี่ (เริ่มต้นที่ 0) คุณต้องใช้ผลรวมของเซลล์โดยรอบ นี่คือตัวอย่างเล็ก ๆ ที่มีตารางขนาด 3 คูณ 3 (ตัวหนาเป็นสี่เหลี่ยมจัตุรัส):

2 2  2
2 16 2
2 2  2

และนี่คือตัวอย่างขนาด 7 คูณ 7 ตาราง:

6 5  4 3  7 2  5
6 43 3 50 8 43 8
4 7  8 8  9 3  1
4 36 1 43 6 40 5
3 3  6 1  4 7  5
4 35 3 45 9 42 1
2 6  8 6  8 5  3

กฎระเบียบ

  • ตัวเลขที่ไม่ใช่ผลรวมต้องอยู่ระหว่าง 1 ถึง 9 เสมอ

  • ต้องสร้างกริดแบบสุ่ม สำหรับแต่ละผลรวมที่ไม่ใช่ตัวเลขทุกหลักจะต้องมีโอกาสเท่ากันในการปรากฏโดยไม่คำนึงว่าจะมีเซลล์ใด

  • ตัวเลขจะต้องสอดคล้อง ซึ่งหมายความว่าตัวเลขตัวแรกหรือตัวสุดท้ายของแต่ละหมายเลขในคอลัมน์จะต้องเรียงกันในแนวตั้ง (คุณอาจคิดว่าตัวเลขกลางจะเป็นเลขสองหลักเสมอ)

  • เซลล์โดยรอบมีเส้นทแยงมุม ดังนั้นแต่ละสี่เหลี่ยมจัตุรัสจะมีตัวเลขแปดตัวล้อมรอบซึ่งคุณต้องเพิ่ม

  • ที่สั้นที่สุดชนะรหัสตั้งแต่นี้เป็นรหัสกอล์ฟ


3
มันต้องเป็นตัวเลขตัวแรกที่เข้าแถวกันหรือไม่? คือมันสามารถเป็นครั้งสุดท้าย?
ความผันผวน

@ ความผันผวนฉันคิดว่าการจัดตำแหน่งที่ถูกต้องจะใช้งานได้ แก้ไขแล้ว
Doorknob

เกิดอะไรขึ้นถ้าภาษาไม่มีตัวสร้างตัวเลขสุ่ม?
Heimdall

คำตอบ:


14

APL, 53 49 43 42 40 39 36

ฉันจัดการเพื่อทำซ้ำ J ;.ใน APL และใช้วิธีการของ Garethประหยัด 13 ตัวอักษร

{×5⌷⍵:5⌷⍵⋄+/⍵}¨3,⌿3,/×∘?∘9¨∘.∨⍨9⍴0 1

วิ่งตัวอย่าง:

      {×5⌷⍵:5⌷⍵⋄+/⍵}¨3,⌿3,/×∘?∘9¨∘.∨⍨9⍴0 1
9  9 6  1 7  5 6
7 55 5 39 9 54 9
9  8 2  1 8  1 9
2 43 8 41 6 42 5
7  3 4  4 8  3 2
2 29 1 26 2 35 8
6  4 2  3 2  3 7

คำอธิบาย:

  • ∘.∨⍨9⍴0 1 สร้างหน้ากากเล็กน้อย
  • ×∘?∘9¨ คูณแต่ละบิตด้วยค่าสุ่มจาก 1 ถึง 9 โดยสร้างกริดมาสก์ของตัวเลขสุ่ม
  • 3,⌿3,/ใช้สิ่งที่สามารถอธิบายได้ว่าเป็นแฮ็กเกอร์เท่านั้นที่จะคืนค่ากล่องที่ซ้อนกันทั้ง 3 โดย 3 ในอาร์เรย์ที่สวมหน้ากาก สิ่งเหล่านี้แบนในกระบวนการ
  • {×5⌷⍵:5⌷⍵⋄+/⍵}¨iterates มากกว่าอาร์เรย์กำหนดองค์ประกอบแต่ละ สำหรับการทำซ้ำแต่ละครั้งจะใช้เวลาห้า (กลางจำได้ว่าการจัดทำดัชนี APL เป็น 1-based) และส่งกลับสัญญาณของมัน ในกรณีนี้สิ่งนี้เทียบเท่ากับการทดสอบว่าจำนวนมากกว่า 0 ถ้าสิ่งนี้ส่งกลับ 1 (สำหรับจริง) แล้วส่งคืนองค์ประกอบนั้น มิฉะนั้นส่งคืนผลรวมขององค์ประกอบในกล่อง 3 คูณด้วย 3 มันใช้:⋄ผู้ประกอบการที่สามซึ่งเทียบเท่า?:ในหลายภาษา

เอ่อโอ้. ดูเหมือนว่าฉันจะต้องค้นหาตัวละครที่ประหยัดมากขึ้น : -S
Gareth

@Gareth ดีดูสิ่งที่เรามีที่นี่ ฉันกลับมาเป็นผู้นำ: P
ความผันผวน

noooooooooo !!!!!!! :-(
Gareth

13

J, 63 61 59 55 52 51 49 47 39 39ตัวอักษร

3 3(4&{+4{*|+/)@,;._3(**1+?)+./~9$0 9

ด้วยความขอบคุณสำหรับความผันผวนสำหรับการประหยัด 10 ตัวละครของเขา

คำอธิบาย (แต่ละขั้นตอนจะมีตัวเลขสุ่มต่างกัน ... ):

สร้างมาสก์สำหรับสร้างหมายเลขสุ่ม (ใช้$:

   9 9$9$0 9
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0

ตอนนี้เรามีเบ็ด นี่เป็นอุบัติเหตุที่เกิดจากความสุขตั้งแต่ตอนที่ฉันเริ่มทำเวอร์ชั่นก่อนหน้านี้ มันตั้งใจที่จะไขว้|:และหรือ+.กับต้นฉบับ มันสมเหตุสมผลแล้วตั้งแต่ตอนที่ฉันใช้มันและเป็นศูนย์ แต่ตอนนี้ฉันมีเก้าและศูนย์ +.มันเกิดขึ้นเพียงเพื่อที่จะทำงานในลักษณะเดียวกันกับความหมายของ GCD โชคดีสำหรับฉัน :-)

   (+.|:)9 9$9$0 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0

ดังนั้นตอนนี้เรามีตารางของ 9s และ 0s เราต้องการสร้างตัวเลขสุ่มบางอย่าง ?สร้างตัวเลขสุ่มตั้งแต่ 0 ถึง (แต่ไม่รวม) จำนวนที่กำหนด รับรายการมันจะสร้างตัวเลขสุ่มหนึ่งวิธีด้วยวิธีนี้สำหรับสมาชิกแต่ละคนของรายการ ดังนั้นในกรณีนี้มันจะสร้างตัวเลขจาก 0 ถึง 8 สำหรับทุก ๆ 9 ในตารางและจำนวนจุดลอยตัวจาก 0 ถึง 1 สำหรับแต่ละ 0

   ?(+.|:)9 9$9$0 9
 0.832573 7 0.926379 7 0.775468 6 0.535925 3  0.828123
        7 0        5 5        4 3        4 5         4
0.0944584 2 0.840913 2 0.990768 1 0.853054 3  0.881741
        3 8        7 0        8 3        3 4         8
 0.641563 4 0.699892 7 0.498026 1 0.438401 6  0.417791
        6 8        7 5        2 3        6 6         3
 0.753671 6 0.487016 4 0.886369 7 0.489956 5  0.902991
        3 4        7 8        1 4        8 0         8
0.0833539 4 0.311055 4 0.200411 6 0.247177 5 0.0464731

แต่เราต้องการตัวเลขตั้งแต่ 1 ถึง 9 ไม่ใช่ 0 ถึง 8 ดังนั้นเราจึงบวก 1

   (1+?)(+.|:)9 9$9$0 9
 1.4139 4  1.7547 7 1.67065 4 1.52987 1 1.96275
      2 8       2 4       3 9       6 9       9
1.15202 7 1.11341 5  1.0836 1 1.24713 2 1.13858
      9 3       3 2       4 7       3 8       6
1.06383 9 1.67909 4 1.09801 8  1.4805 6  1.0171
      9 5       5 5       9 5       9 4       3
1.22819 1 1.85259 4 1.95632 6 1.33034 3 1.39417
      4 2       5 1       3 7       2 5       6
1.06572 5  1.9942 5 1.78341 5 1.16516 6 1.37087

นี่เป็นสิ่งที่ดีมาก แต่เราได้สูญเสียศูนย์ที่ฉันต้องการดังนั้นเราจะคูณด้วยรูปแบบดั้งเดิมหลังจากเปลี่ยนเก้าทั้งหมดให้เป็นรูปแบบเดิม ฉันทำเช่นนี้โดยการตรวจสอบถ้าค่ามากกว่า 1 (1&<*1+?)ที่ช่วยให้เรา:
มีบางสิ่งเกิดขึ้นที่นี่:

  • เราได้สร้างทางแยกซึ่งช่วยให้เราสามารถบรรจุงานจำนวนมากเป็นตัวละครน้อยมาก
  • เราได้ผูกมัด ( &) 1 กับ<คำกริยา

ดังนั้นการรวมกันทั้งหมด(1&<*1+?)คือการสร้างตัวเลขสุ่มและ zeroing ตัวเลขทั้งหมดที่สร้างขึ้นโดยศูนย์ในกริดเดิม

   (1&<*1+?)(+.|:)9 9$9$0 9
0 3 0 2 0 7 0 1 0
9 5 2 7 7 1 4 5 7
0 6 0 8 0 3 0 1 0
4 8 7 5 9 7 7 9 4
0 9 0 6 0 9 0 9 0
6 1 2 1 4 6 8 9 4
0 3 0 8 0 6 0 6 0
2 5 2 2 2 2 3 9 3
0 9 0 3 0 5 0 3 0

บิตถัดไปคือ (ในความคิดของฉันแล้ว :-) บิตที่ฉลาด กริยาที่
ตัด;.มีรูปแบบx u;._3 yที่ตัดอินพุตในกล่องที่อธิบายโดยxใช้กริยาuเหล่านั้น 3 3(4&{++/*0=4&{)@,;._3ในกรณีนี้เรามี

  • 3 3คืออธิบายกล่องที่เราต้องการ - 3x3
  • (4&{++/*0=4&{)@,เป็นรถไฟกริยาซึ่งอธิบายถึงสิ่งที่เราต้องการจะทำอย่างไรให้แต่ละกล่อง

เพื่อแสดง;.คำกริยาฉันจะใช้<เพื่อแสดงแต่ละช่อง:

   3 3(<);._3(1&<*1+?)(+.|:)9 9$9$0 9
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 8 0│8 0 7│0 7 0│7 0 4│0 4 0│4 0 3│0 3 0│
│9 1 3│1 3 2│3 2 3│2 3 8│3 8 5│8 5 5│5 5 9│
│0 6 0│6 0 1│0 1 0│1 0 2│0 2 0│2 0 4│0 4 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│9 1 3│1 3 2│3 2 3│2 3 8│3 8 5│8 5 5│5 5 9│
│0 6 0│6 0 1│0 1 0│1 0 2│0 2 0│2 0 4│0 4 0│
│7 1 6│1 6 7│6 7 1│7 1 2│1 2 1│2 1 6│1 6 1│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 6 0│6 0 1│0 1 0│1 0 2│0 2 0│2 0 4│0 4 0│
│7 1 6│1 6 7│6 7 1│7 1 2│1 2 1│2 1 6│1 6 1│
│0 7 0│7 0 5│0 5 0│5 0 9│0 9 0│9 0 7│0 7 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│7 1 6│1 6 7│6 7 1│7 1 2│1 2 1│2 1 6│1 6 1│
│0 7 0│7 0 5│0 5 0│5 0 9│0 9 0│9 0 7│0 7 0│
│7 9 9│9 9 7│9 7 1│7 1 9│1 9 4│9 4 9│4 9 5│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 7 0│7 0 5│0 5 0│5 0 9│0 9 0│9 0 7│0 7 0│
│7 9 9│9 9 7│9 7 1│7 1 9│1 9 4│9 4 9│4 9 5│
│0 3 0│3 0 2│0 2 0│2 0 7│0 7 0│7 0 9│0 9 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│7 9 9│9 9 7│9 7 1│7 1 9│1 9 4│9 4 9│4 9 5│
│0 3 0│3 0 2│0 2 0│2 0 7│0 7 0│7 0 9│0 9 0│
│3 1 6│1 6 1│6 1 7│1 7 6│7 6 8│6 8 9│8 9 9│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 3 0│3 0 2│0 2 0│2 0 7│0 7 0│7 0 9│0 9 0│
│3 1 6│1 6 1│6 1 7│1 7 6│7 6 8│6 8 9│8 9 9│
│0 9 0│9 0 3│0 3 0│3 0 4│0 4 0│4 0 3│0 3 0│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┘

สิ่งที่ควรสังเกต:

  • กล่องซ้อนทับกัน - คอลัมน์ที่สองและสามในกล่องด้านซ้ายบนเป็นกล่องแรกและคอลัมน์ที่สองที่อยู่ทางขวาของกล่อง
  • มี 7x7 กล่อง นั่นเป็นสาเหตุที่เรามีกริด 9x9 ในตอนแรก
  • แต่ละสถานที่ที่เราต้องการผลรวมมี0ที่ตรงกลางของกล่อง

ตอนนี้เราแค่ต้องส่งค่าที่กึ่งกลางด้านหลัง (ถ้าไม่ใช่ศูนย์) หรือรวมตัวเลขในกล่อง 3x3 (ถ้ากึ่งกลางเป็นศูนย์)
ในการทำเช่นนี้เราจำเป็นต้องเข้าถึงหมายเลขกลางได้ง่าย ,ช่วยที่นี่ มันจะเปิดตาราง 3x3 ในรายการ 9 รายการที่มีจำนวนศูนย์ที่บ้านเลขที่ 4
4&{จะใช้{ที่จะดึงออกค่าศูนย์แล้วเปรียบเทียบกับ 0=4&{0: ผลตอบแทนนี้0หรือสำหรับจริงหรือเท็จซึ่งเราแล้วคูณด้วยผลรวม1 +/ถ้ามันเป็นศูนย์ที่ศูนย์ตอนนี้เรามีผลรวมของเราตามที่ต้องการ ถ้ามันไม่ใช่เรามีศูนย์ดังนั้นเราจะเพิ่มค่ากลางให้4&{+เสร็จ
สิ่งนี้ทำให้รถไฟคำกริยา(4&{++/*0=4&{)@,

   3 3(4&{++/*0=4&{)@,;._3(1&<*1+?)(+.|:)9 9$9$0 9
2  6 9  3 7  9 7
3 47 6 51 5 49 5
3  9 9  6 6  2 8
7 48 6 47 1 37 5
5  4 5  7 7  2 6
5 35 3 49 8 51 9
1  6 6  6 7  4 8

โค้ดหนึ่งบรรทัดของคุณทำสิ่งนั้นทั้งหมดรวมถึงการสร้างตัวเลขสุ่มหรือไม่? สร้างความมั่นใจให้ฉัน แค่หามันยากที่จะเชื่อ
DavidC

ใช่ยากอย่างที่มันอาจจะเชื่อ บิตแบบสุ่มจะทำโดย?บิตแบบสุ่มจะกระทำโดยฉันจะเปลี่ยนคำอธิบายเพื่อสะท้อนถึงรุ่นล่าสุด
Gareth

@DavidCarraher คำกริยาส่วนใหญ่ใน J เป็น 1 หรือ 2 ตัวอักษรดังนั้น 47 ตัวอักษรสามารถบรรจุได้มาก
Gareth

การตัดกล่องขนาด 9x9 เป็นสี่เหลี่ยมจัตุรัสซ้อนกันขนาด 7x7 เป็นบิตที่ฉลาดแน่นอน ในเวลาน้อยกว่า 10 นาทีฉันสามารถนำไปใช้เพื่อเอาชนะ GolfScript ปัจจุบันของฉัน 7.5%
Peter Taylor

โอ้ดีดูเหมือนว่ามันจะกลับไปที่กระดานวาดภาพสำหรับฉัน
ความผันผวน

5

ทับทิม (135 ตัวอักษร)

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.each_slice(7){|r|puts"%-3s"*7%r}

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

2  1  6  9  4  5  1  
9  34 4  37 2  31 3  
7  2  3  1  8  1  7  
5  42 4  40 2  47 9  
3  9  9  4  9  4  7  
3  44 4  41 2  47 4  
6  9  1  5  7  6  8  

ชำรุด

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

รุ่นที่ไร้เดียงสา

ไม่เหมือนกับโซลูชัน Ruby อื่น ๆที่ใช้อาร์เรย์สองมิติคุณสามารถ (ในที่สุด) รับรุ่นที่สั้นกว่าโดยเริ่มต้นด้วยอาร์เรย์ 1 มิติและทำงานกับค่าออฟเซ็ตเนื่องจากรูปแบบซ้ำกัน

ary=(0..48).map { rand(9) + 1 }

offsets = [-8,-7,-6,-1,1,6,7,8]

3.times do |i|
  [8,10,12].each do |j|
    ary[j + 14*i] = ary.values_at(*offsets.map { |e| j+14*i + e }).inject(:+)
  end
end

ary.each.with_index do |e,i|
  $> << ("%-3s" % e)
  $> << ?\n if i % 7==6
end

หลักการสำคัญที่นี่คือเรากำลังทำงานที่ตำแหน่งดัชนี 8, 10, 12, เพียงแค่ชดเชยด้วยทวีคูณของ 14 ตำแหน่ง 8, 10 และ 12 เป็นศูนย์กลางของกริด 3x3 ที่เรากำลังสรุป ในการแสดงผลตัวอย่าง 34 เป็นตำแหน่งที่ 8 42 คือตำแหน่ง 8 + 14 * 1 ฯลฯ เราแทนตำแหน่งที่ 8 กับ 34 โดยตำแหน่งชดเชยจากตำแหน่ง 8 [-8,-7,-6,-1,1,6,7,8]- 34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])ในคำอื่น หลักการเดียวกันนี้มีไว้สำหรับค่าทั้งหมดของ[8 + 14*i, 10 + 14*i, 12 + 14*i]เนื่องจากรูปแบบซ้ำ

เพิ่มประสิทธิภาพมัน

ก่อนอื่นการเพิ่มประสิทธิภาพอย่างรวดเร็ว:

  • แทน 3.times { ... }และการคำนวณj + 14*iในแต่ละครั้ง "อินไลน์" [8,10,12,22,24,26,36,38,40]ตำแหน่ง
  • offsetsอาร์เรย์จะใช้ครั้งเดียวดังนั้นแทนที่ตัวแปรที่มีตัวอักษร
  • แทนที่do ... endด้วยและสลับรอบพิมพ์เพื่อ{...} $> << foo(มีเคล็ดลับเกี่ยวกับที่นี่puts nilและ() == nil )
  • ชื่อตัวแปรที่สั้นกว่า

รหัสหลังจากนี้คือ177ตัวอักษร:

a=(0..48).map{rand(9)+1}
[8,10,12,22,24,26,36,38,40].each{|j|a[j]=a.values_at(*[-8,-7,-6,-1,1,6,7,8].map{|e|j+e}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

สำหรับการลดถัดไปโปรดทราบว่าinjectไม่จำเป็นต้องมีอาร์เรย์ออฟเซ็ต เราสามารถมีได้[-8,-7,-6,-1,1,6,7,8]หรือสั่งซื้ออื่น ๆ เนื่องจากการเพิ่มเป็นคอมมิชชัน

ดังนั้นคู่แรกขึ้นบวกและเชิงลบที่จะได้รับ [1,-1,6,-6,7,-7,8,-8]ดังนั้นคู่แรกขึ้นบวกและเชิงลบที่จะได้รับ

ตอนนี้คุณสามารถร่น

[1,-1,6,-6,7,-7,8,-8].map { |e| j+e }.inject(:+)

ถึง

[1,6,7,8].flat_map { |e| [j+e, j-e] }

ผลลัพธ์นี้ใน

a=(0..48).map{rand(9)+1}
[8,10,12,22,24,26,36,38,40].each{|j|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

ซึ่งคือ176ตัวอักษร

เลื่อนไป 8 และย้ายไปที่ความแตกต่าง

ดูเหมือนว่าค่าตัวอักษรสองตัวที่ดูเหมือนว่าจะสั้นลงไปได้ดังนั้นรับ[8,10,12,22,24,26,36,38,40]และเลื่อนทุกอย่างลงไปโดย8อัพเดทjที่จุดเริ่มต้นของลูป (โปรดทราบว่า+=8หลีกเลี่ยงการจำเป็นต้องอัปเดตค่าออฟเซ็ตของ1,6,7,8)

a=(0..48).map{rand(9)+1}
[0,2,4,14,16,18,28,30,32].each{|j|j+=8;a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

นี่คือ 179 ซึ่งใหญ่กว่า แต่ j+=8สามารถลบออกได้จริง

การเปลี่ยนแปลงครั้งแรก

[0,2,4,14,16,18,28,30,32]

ไปยังอาร์เรย์ของความแตกต่าง:

[2,2,10,2,2,10,2,2]

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

โปรดทราบว่าเราจะเพิ่มค่าตัวอย่างของ9999ไปยังจุดสิ้นสุดของอาร์เรย์ความแตกต่างและเพิ่มjในตอนท้ายไม่ใช่จุดเริ่มต้นของลูป เหตุผลก็คือว่า2,2,10,2,2,10,2,2รูปลักษณ์ชะมัดใกล้เคียงกับการเดียวกันตัวเลข 3 ซ้ำแล้วซ้ำอีก 3 ครั้งและโดยการคำนวณj+differenceในตอนท้ายของวงมูลค่าสุดท้ายของการ9999จะไม่ส่งผลกระทบต่อการส่งออกจริงเนื่องจากไม่มีa[j]การเรียกร้องที่jเป็นค่าบางอย่าง 10000มากกว่า

a=(0..48).map{rand(9)+1}
j=8
[2,2,10,2,2,10,2,2,9999].each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

ด้วยความแตกต่างนี้อาร์เรย์j+=8ตอนนี้เป็นเพียงj=8แน่นอนเพราะมิฉะนั้นเราจะเพิ่ม8จำนวนมากเกินไปซ้ำแล้วซ้ำอีก เราได้เปลี่ยนยังตัวแปรบล็อกจากไปjl

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

a=(0..48).map{rand(9)+1}
j=8
([2,2,10]*3).each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

นี่คือ170ตัวอักษร

แต่ตอนนี้มันj=8ดูค่อนข้างจะ clunky และคุณสามารถบันทึก 2 ตัวอักษรโดยเลื่อน[2,2,10]ลง 2 เพื่อให้ได้สิ่งที่8คุณสามารถใช้ในการมอบหมาย นี้ยังมีความต้องการที่จะกลายเป็นj+=lj+=l+2

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l+2}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

นี่คือ169ตัวอักษร วิธีการบีบตัวอักษร 7 รอบโดยรอบ แต่ก็เรียบร้อย

ปรับแต่งสุดท้าย

การvalues_atโทรนั้นซ้ำซ้อนจริง ๆ และเราสามารถArray#[]โทรเข้าได้ ดังนั้น

a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)

กลายเป็น

[1,6,7,8].flat_map{|e|[a[j+e],a[j-e]]}.inject(:+)

นอกจากนี้คุณยังสามารถมองเห็นว่าflat_map+ j+e/j-e+ injectสามารถลดลงสู่การสรุปโดยตรงได้มากขึ้น0ในอาร์เรย์

สิ่งนี้ทำให้คุณมี152ตัวอักษร:

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

สุดท้าย:

  • map.with_indexeach_sliceจะกลายเป็น
  • เปลี่ยนวิธีการพิมพ์

135 :

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.each_slice(7){|r|puts"%-3s"*7%r}

คุณสามารถแทนที่eachด้วยmapหนึ่งไบต์
Jordan

3

Python, 132

สิ่งนี้ไม่เป็นไปตามกฎในทางเทคนิคเพราะตัวเลขสุดท้ายของแต่ละตัวเลขนั้นเรียงตัวกันมากกว่าตัวเลขแรก แต่ฉันคิดว่าฉันจะแบ่งปันต่อไป:

import numpy
G=numpy.random.randint(1,10,(7,7))
G[1::2,1::2]=sum(G[i:6+i:2,j:6+j:2]for i in[0,1,2]for j in[0,1,2]if i&j!=1)
print G

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

[[ 8  9  8  3  8  5  8]
 [ 6 53  4 45  8 53  8]
 [ 8  2  8  1  5  3  8]
 [ 2 40  6 34  1 32  7]
 [ 4  1  9  1  3  3  2]
 [ 4 35  7 35  6 31  1]
 [ 1  7  2  5  2  8  6]]

3

Mathematica, 108

s=#-1;;#+1&;g=1+8~RandomInteger~{7,7};Column/@
ReplacePart[g,{i_?EvenQ,j_?EvenQ}:>g〚s@i,s@j〛~Total~2-g〚i,j〛]

result

สำหรับเอาต์พุตที่สวยกว่าColumn/@สามารถถูกแทนที่ด้วยTableForm@ค่าใช้จ่าย 2 ตัวอักษร


ฉลาดมาก ๆ Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]ให้เอาต์พุตที่สะอาดและบันทึกอักขระสองตัวถ้าคุณนับ Transpose เป็นอักขระตัวเดียวซึ่งอยู่ใน Mathmatica Btw เทมเพลต OneLinerSubmission ของ Wolfram นับ 106 ตัวอักษร 105 ด้วย Transpose หนึ่งตัว
DavidC

@DavidCarraher ขอบคุณ จำนวนถ่านเกิดจากการขึ้นบรรทัดใหม่โดยไม่จำเป็นและ:>เป็นสัญลักษณ์เดียวแม้ว่าจะอยู่ในพื้นที่ใช้งานส่วนตัวของยูนิโค้ดก็ตาม เราสามารถลบทรานสโพสได้เนื่องจากกฎการรวมของความถูกต้องจะยังคงอยู่แม้หลังการขนย้าย แต่ดูเหมือนว่าGridจะไม่จัดรายการโดยไม่มีตัวเลือกเพิ่มเติม (V8)
ssch

Gridจัดกึ่งกลางตัวเลขภายในคอลัมน์ ในทางเทคนิคแล้วมันจะไม่ตอบสนองต่อความท้าทาย แต่มันดูดีกว่าการมีรายการปรากฏในตารางที่แสดง
DavidC

ดีมาก. ฉันเพียงแค่ใช้เวลามากในการสร้างสิ่งเดียวกันเพียง แต่ผมใช้และPart Tuplesโพสต์เร็ว ๆ นี้
Mr.Wizard

คุณสามารถบันทึกอักขระสองตัวด้วยสิ่งนี้:p=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
Mr.Wizard

3

GolfScript ( 79 78 72 70 68 66 65 60 ตัวอักษร)

56,{13%5<,~9rand)}%9/`{>3<zip`{>3<(*(+(\{+}*or' '}+7,%n}+7,/

NB นี้มีแท็บตัวอักษรซึ่ง Markdown อาจแตกได้ดี

บิตที่ฉลาดนั้นเกิดจาก Gareth: ดูวิธีแก้ปัญหา J ของเขา

การสาธิตออนไลน์


3

R: 114 ตัวอักษร

a=array(sample(1:9,49,r=T),c(7,7))
for(i in 2*1:3){for(j in 2*1:3)a[i,j]=sum(a[(i-1):(i+1),(j-1):(j+1)])-a[i,j]}
a

บรรทัดแรกสร้างอาร์เรย์ 7 x 7 ที่เต็มไปด้วยตัวเลขที่เลือกแบบสุ่มจาก 1 ถึง 9 (การกระจายแบบเดียวกับการแทนที่ดังนั้นจึงr=Tหมายถึงreplace=TRUE ) บรรทัดที่สองคำนวณผลรวมของ 3 โดย 3 กริดศูนย์ย่อยและแทนที่ด้วยผลลัพธ์ บรรทัดที่สามพิมพ์ตารางผลลัพธ์ (โดยค่าเริ่มต้นคอลัมน์เมทริกซ์และแถวลำดับจะจัดชิดขวา)

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

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    8    5    6    4    3    2    2
[2,]    1   37    6   41    7   38    8
[3,]    5    3    3    3    9    4    3
[4,]    4   31    3   41    3   44    9
[5,]    3    5    5    9    6    7    3
[6,]    3   32    2   40    4   37    5
[7,]    8    2    4    1    9    1    2

2

J, 67 65 ไบต์

วิธีการแก้ปัญหาที่ไร้เดียงสาและ verbose ใน J มันเป็นงานที่ตรงไปตรงมา

(+/^:_"2((,&.>/@(<:,],>:)"0)&.>m){0 m}a)(m=.{;~1 3 5)}a=.>:?7 7$9

ครั้งแรกที่ฉันสร้างอาร์เรย์ 7 x 7 ของจำนวนเต็มระหว่าง 1 และ 9 ในความเป็นจริง J's? คำกริยาสร้างตัวเลขได้มากตามอาร์กิวเมนต์นั่นคือสาเหตุที่เราต้องเพิ่มแต่ละองค์ประกอบ>> ใน J

a=.>:?7 7$9 
2 8 7 4 4 5 1 1
4 5 4 1 6 7 9
3 8 3 6 5 3 3
6 8 6 3 7 7 1
7 7 4 4 5 9 9
2 3 6 5 2 2 9
2 2 6 8 8 1 3

ฉันเตรียมหน้ากากที่จะใช้สำหรับ zeroing ของเซลล์แถว / col คี่คู่ของดัชนีแถว / คอลัมน์คี่:

m=.{;~1 3 5
┌───┬───┬───┐
│1 1│1 3│1 5│
├───┼───┼───┤
│3 1│3 3│3 5│
├───┼───┼───┤
│5 1│5 3│5 5│
└───┴───┴───┘

แค็ตตาล็อกกริยา {รวมไอเท็มจากอะตอมภายในรายการที่บรรจุอยู่

┌─────┬─────┐
│1 3 5│1 3 5│
└─────┴─────┘

ในการสร้างแคตตาล็อกตาราง 3x3 ของคู่ด้านบน

จากนั้นฉันก็เตรียมตารางแถว / ดัชนีคอลัมน์ที่จะใช้สำหรับการเลือกแต่ละ 3x3 subarrays

s=.(,&.>/@(<:,],>:)"0)&.>m
┌─────────────┬─────────────┬─────────────┐
│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
││0 1 2│0 1 2│││0 1 2│2 3 4│││0 1 2│4 5 6││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
├─────────────┼─────────────┼─────────────┤
│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
││2 3 4│0 1 2│││2 3 4│2 3 4│││2 3 4│4 5 6││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
├─────────────┼─────────────┼─────────────┤
│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
││4 5 6│0 1 2│││4 5 6│2 3 4│││4 5 6│4 5 6││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
└─────────────┴─────────────┴─────────────┘

สำหรับแต่ละคู่ในอาเรย์มฉันทำทริปเปิลโดยมีศูนย์กลางอยู่ที่แต่ละคู่ของม:

        ┌─────┬─────┐
 1 3 -> │0 1 2│2 3 4│
        └─────┴─────┘

คู่สามคู่เหล่านี้ถูกใช้โดย J จากกริยา {ซึ่งสามารถเลือกหลายแถวและคอลัมน์พร้อมกัน 0 1 2/2 3 4 หมายความว่าฉันเลือกแถว 0, 1 และ 2 พร้อมกับคอลัมน์ 2, 3 และ 4 ดังนั้นจึงเลือก subarray 3x3 ที่สองที่ด้านบน

ในที่สุดฉันสามารถใช้อาร์เรย์ 7x7 และมาสก์เพื่อทำงาน: ขั้นแรกฉันใช้ m เป็นหน้ากากเพื่อตั้งค่าองค์ประกอบที่สอดคล้องกันเป็น 0:

0 m}a

จากนั้นฉันก็ใช้ 3x3 subarrays ทั้งหมดโดยใช้ s เป็นตัวเลือกและค้นหาผลรวม:

+/^:_"2 s{0 m}a

จากนั้นฉันก็ใส่ตัวเลขเหล่านี้กลับเข้าไปในอาร์เรย์เริ่มต้น

 (+/^:_"2 s{0 m}a)m}a 
2 8 7 4 4 5 1 1
4 39 4 39 6 36 9
3 8 3 6 5 3 3
6 44 6 40 7 42 1
7 7 4 4 5 9 9
2 36 6 43 2 46 9
2 2 6 8 8 1 3

ลองออนไลน์!



1

ทับทิม, 207

ฉันจะนำเสนอวิธีแก้ปัญหาของฉันก่อน (เหมือนที่เคยทำ):

a=Array.new(7){Array.new(7){rand(9)+1}}
s=[-1,0,1]
s=s.product s
s.slice!4
r=[1,3,5]
r.product(r).map{|x|u=0
s.map{|y|u+=a[x[0]+y[0]][x[1]+y[1]]}
a[x[0]][x[1]]=u}
puts a.map{|x|x.map{|y|y.to_s.ljust 3}.join

1

ทับทิม 150 ตัวอักษร

v=(a=0..6).map{a.map{rand(9)+1}}
(o=[1,3,5]).map{|i|o.map{|j|v[i][j]=0
(d=[0,-1,1]).map{|r|d.map{|c|v[i][j]+=v[i+r][j+c]}}}}
puts v.map{|r|"%-3d"*7%r}

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

Array.new(7){...}อย่าใช้ (0..6).map{...}สั้นกว่าและอ่านได้มากกว่าและคุณจะได้รับช่วงที่กำหนดได้ฟรี

สาย # 3 แรงบันดาลใจจากการแก้ปัญหาของ Doorknob


1

GolfScript, 87 ตัวอักษร

49,{.1&\7/1&!|9rand)*}%.7/{[..1>@0\+]zip{{+}*}%);}:^%zip{^~}%]zip{.0=!=}%{'  '+3<}%7/n*

มีรหัสไปรษณีย์มากเกินไปในนั้น ... (ดูออนไลน์ )

3  9  9  3  3  9  8  
6  46 2  50 3  39 8  
7  3  7  2  4  7  3  
8  33 9  51 8  49 5  
4  3  9  9  3  9  2  
1  45 9  41 6  33 2  
4  3  6  1  6  1  4  

1

J, 58/64/67 ตัวอักษร

0j_1":(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

ในขณะที่ข้อมูลจำเพาะต้องการตัวเลขที่จะจัดชิดซ้ายไม่มีความต้องการที่จะใช้สัญกรณ์ทศนิยมดังนั้นฉันเดาว่านี่เป็นผลลัพธ์ที่ถูกต้อง:

1.0e0 8.0e0 9.0e0 6.0e0 2.0e0 9.0e0 6.0e0
6.0e0 3.9e1 8.0e0 4.0e1 2.0e0 3.8e1 4.0e0
1.0e0 4.0e0 2.0e0 8.0e0 3.0e0 9.0e0 3.0e0
2.0e0 2.4e1 5.0e0 4.1e1 9.0e0 4.7e1 8.0e0
1.0e0 3.0e0 6.0e0 5.0e0 3.0e0 5.0e0 7.0e0
4.0e0 3.0e1 1.0e0 2.3e1 1.0e0 3.1e1 1.0e0
6.0e0 5.0e0 4.0e0 2.0e0 1.0e0 5.0e0 8.0e0

หากการจัดตำแหน่งขวาแทนการจัดตำแหน่งซ้ายเป็นที่ยอมรับเราอยู่ที่58 ตัวอักษร

(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

J's ":(รูปแบบ) มีสามโหมดการจัดรูปแบบ:

  • จัดตำแหน่งชิดขวาด้วยตัวเลข n หรือด้วยตัวย่อการหด (จอแสดงผลเริ่มต้น)
  • สัญกรณ์ทางวิทยาศาสตร์ที่จัดชิดซ้ายที่มีตัวเลข n และตัวอักษรรวม m
  • จอแสดงผลแบบหดห่อกล่องพร้อม (ซ้าย / กลาง / ขวา) - (ด้านบน / กลาง / ล่าง) การจัดตำแหน่ง (ด้านล่าง, 69 ตัวอักษร)

verbose มากที่สุด แต่ก็มีความหลากหลายมากที่สุดและมีเพียงคนเดียวที่สามารถสร้างผลลัพธ์ตามตัวอย่างคือการ8!:2จัดรูปแบบต่างประเทศซึ่งใช้สตริงการจัดรูปแบบเป็นอาร์กิวเมนต์ด้านซ้าย นอกจากนี้67 ตัวอักษร :

'l3.'8!:2(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

นี่คือรูปแบบกล่อง:

 0 0":<"0(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

 ┌─┬──┬─┬──┬─┬──┬─┐
 │2│6 │5│7 │5│7 │6│
 ├─┼──┼─┼──┼─┼──┼─┤
 │8│40│4│35│9│49│6│
 ├─┼──┼─┼──┼─┼──┼─┤ 
 │6│7 │2│2 │1│9 │6│
 ├─┼──┼─┼──┼─┼──┼─┤
 │8│41│9│35│3│45│7│
 ├─┼──┼─┼──┼─┼──┼─┤
 │3│1 │5│6 │7│8 │4│
 ├─┼──┼─┼──┼─┼──┼─┤
 │7│37│4│45│6│48│8│
 ├─┼──┼─┼──┼─┼──┼─┤
 │8│4 │5│4 │8│1 │6│
 └─┴──┴─┴──┴─┴──┴─┘

1

Perl, 117 ตัวอักษร

print$_,++$j%7?$":$/for map{++$i/7&$i%7&1?
eval join"+",@x[map{$i+$_,$i-$_}1,6,7,8]:" $_"}@x=map{1+int rand 9}$i--..48

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

เดี๋ยวก่อนมันแย่ลง: มีข้อผิดพลาดในสคริปต์ มันมีโอกาสน้อยกว่าหนึ่งในหนึ่งล้านที่จะถูกทริกเกอร์ แต่ฉันก็ยังไม่ได้แก้ไขมัน


อย่ารั้งเราไว้จุดบกพร่องคืออะไร

คะแนนโบนัสสำหรับคนแรกที่พบเห็น!
breadbox

1

มาติกา , 106/100

ฉันมากับสิ่งที่คล้ายกับรหัสของ ssch ก่อนที่จะเห็นมัน Columnฉันกำลังยืมความคิดของเขาในการใช้ ด้วย ASCII เท่านั้น106 :

s=#-1;;#+1&
a=8~RandomInteger~{7,7}+1
a[[##]]=a[[s@#,s@#2]]~Total~2-a[[##]];&@@@{2,4,6}~Tuples~2
Column/@a

ด้วยอักขระ Unicode (ตามที่ใช้โดย ssch), 100 :

s=#-1;;#+1&
a=8~RandomInteger~{7,7}+1
a〚##〛=a〚s@#,s@#2〛~Total~2-a〚##〛;&@@@{2,4,6}~Tuples~2
Column/@a

1

Excel VBA ขนาด 74 ไบต์

VBE [B2:H9]ฟังก์ชั่นได้ทันทีว่าจะเอาท์พุท

[B2:H9]="=IF(ISODD(ROW()*COLUMN()),SUM(A1:C1,A2,C2,A3:C3),INT(RAND()*8)+1)

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

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


1

Powershell, 149 148 ไบต์

-1 ไบต์ขอบคุณ @AdmBorkBork มันเย็น!

$i=-1
($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
-join($a|%{if(!(++$i%7)){"
"};'{0,3}'-f$_})

คำอธิบาย:

$i=-1                       # let $i store -1
($a=                        # let $a is array of random numbers with zero holes
    (,1*8+0,1*3)*3+,1*7|    # the one-dimension array equals
                            # 1 1 1 1 1 1 1
                            # 1 0 1 0 1 0 1
                            # 1 1 1 1 1 1 1
                            # 1 0 1 0 1 0 1
                            # 1 1 1 1 1 1 1
                            # 1 0 1 0 1 0 1
                            # 1 1 1 1 1 1 1
    %{                      # for each element
        $_*(1+(Random 9))   # multiply 0 or 1 element to random digit from 1 to 9
    }                       # now $a stores values like (* is a random digit from 1 to 9)
                            # * * * * * * *
                            # * 0 * 0 * 0 *
                            # * * * * * * *
                            # * 0 * 0 * 0 *
                            # * * * * * * *
                            # * 0 * 0 * 0 *
                            # * * * * * * *
)|?{++$i;!$_                # calc index $i and passthru values == 0 only
}|%{                        # for each zero value cell with index $i
    6..8+1|%{               # offsets for the surrounding cells
                            #  .  .  .
                            #  .  x +1
                            # +6 +7 +8  
        $_,-$_              # add the mirror offsets 
                            # -8 -7 -6
                            # -1  x +1
                            # +6 +7 +8  
    }|%{                    # for each offset 
        $a[$i]+=$a[$i+$_]   # add surrounding values to the cell
    }
}
                            # display the $a
-join(
    $a|%{                   # for each value of $a
        if(!(++$i%7)){"`n"} # line break for each 7 cells
        '{0,3}'-f$_         # formatted value of $a with width = 3 char and align right
    }
)                           # join all values to string

1
คุณสามารถกำจัดไบต์ (ขึ้นบรรทัดใหม่) โดยห่อหุ้มการ$aมอบหมายของคุณใน parens และย้ายบรรทัดถัดไปขึ้นเพื่อสร้างบรรทัดใหญ่หนึ่งบรรทัด -($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
AdmBorkBork

ไม่มันไม่ทำงาน $a[$i+$_]อาร์เรย์จะต้องมีประชากรอย่างเต็มที่ก่อน ดังนั้นนี่คือสองขั้นตอน ฉันมีความพยายามหลายครั้งที่จะแค็ปซูลในท่อเดียว :)
mazzy

1
มันไม่ทำงานถ้าคุณไม่วาง parens รอบ ๆ ที่ได้รับมอบหมาย ด้วย($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))}), $aมีการเติมเต็มก่อนเช่นท่อต่อไป มันควรจะทำงาน (อย่างน้อยมันก็ทำเพื่อฉัน)
AdmBorkBork

0

Mathematica 142 151 172 179

รหัส

z = (m = RandomInteger[{1, 9}, {7, 7}]; s = SparseArray; o = OddQ; e = EvenQ; i = {1, 1, 1};
(m + ArrayPad[ListCorrelate[{i, i, i}, m] s[{{i_, j_} /; o@i \[And] o@j -> 1}, {5, 5}], 1]
- 2 m s[{{i_, j_} /; e@i \[And] e@j -> 1}, {7, 7}]) // Grid)

การใช้

z

M8


คุณมี0s; กฎบอกว่า 1-9
Doorknob

ขอบคุณ ฉันแก้ไขข้อมูลและรูปภาพ ฟังก์ชั่นยังคงไม่เปลี่ยนแปลง
DavidC

นอกจากนี้ตัวเลขจะไม่จัดแนวตามที่ระบุในคำถาม
Doorknob

ความมึนงงของ Mathematica (หรือถูกต้องมากขึ้นยืนยันการใช้คำใหญ่) กลายเป็นชัดเจน
DavidC

0

Julia 0.6 , 127 (89) ไบต์

x=rand(1:9,7,7);[x[i,j]=sum(!(0==k==l)*x[i+k,j+l]for k=-1:1,l=-1:1)for i=2:2:7,j=2:2:7]
Base.showarray(STDOUT,x,1<1;header=1<1)

ลองออนไลน์!

89ไบต์โดยใช้จอแสดงผลแบบเนทีฟซึ่งอาจยอมรับได้หากสามารถพิมพ์บรรทัดเพิ่มเติมได้:

7×7 Array{Int64,2}:
6   6  8   2  3   2  3
7  44  5  33  4  23  5
3   8  1   9  1   3  2
4  41  2  37  5  22  2
7   8  8   8  3   4  2
9  53  6  44  7  36  3
7   7  1   9  2   6  9

0

Java 10, 262 260 248 239 ไบต์

v->{int a[][]=new int[7][7],i=49,j,k;for(;i-->0;)a[i/7][i%7]+=Math.random()*9+1;var r="";for(;++i<7;r+="\n")for(j=0;j<7;r+=(k=a[i][j])>9|j++%2<1?k+" ":k+"  ")if(i*j%2>0)for(a[i][j]=k=0;k<9;k++)a[i][j]+=k!=4?a[i+k/3-1][j+k%3-1]:0;return r;}

-12 ไบต์ขอบคุณที่@ceilingcat

คำอธิบาย:

ลองที่นี่

v->{                        // Method with empty unused parameter and String return-type
  int a[][]=new int[7][7],  //  Integer-matrix with 7x7 zeroes
      i=49,j,k;             //  Index integers (`i` starting at 49)
  for(;i-->0;)              //  Loop `i` in the range (49, 0]:
    a[i/7][j%7]+=Math.random()*9+1;
                            //   Fill the current cell with a random 1..9 integer
  var r="";                 //  Result-String, starting empty
  for(;++i<7;               //  Loop `i` in the range [0, 7):
      r+="\n")              //    After every iteration: append a new-line to the result
    for(j=0;j<7;            //   Inner loop `j` in the range [0, 7):
        r+=                 //     After every iteration: append the result-String with:
           (k=a[i][j])>9    //      If the current number has 2 digits,
           |j++%2<1?        //      or it's an even column (indices 0/2/4/6)
            k+" "           //       Append the current number appended with one space
           :                //      Else:
            k+"  ")         //       Append the current number appended with two spaces
      if(i*j%2>1)           //    If both indexes `i` and `j` are odd
        for(a[i][j]=k=0;    //     Reset both the current item and index `k` to 0
            k<9;k++)        //     Inner loop `k` in the range [0, 9):
          a[i][j]+=         //      Sum the item at location `i,j` with:
           k!=4?            //       If `k` is not 4 (the current item itself)
            a[i+k/3-1][j+k%3-1]
                            //        Sum it with the numbers surrounding it
           :                //       Else:
            0;              //        Leave it the same by adding 0
  return r;}                //  Return the result-String

@ceilingcat ขอบคุณ! และฉันได้รับสามารถที่จะบันทึกอีกไม่กี่ไบต์ที่มีvarแทนStringและแทน+=Math.random()*9+1; =(int)(Math.random()*9+1);ที่จริงแล้วมันมีประโยชน์สำหรับคุณที่จะเยี่ยมชมคำตอบเก่า ๆ ของฉันฮ่าฮ่า! : D
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.