Tạo một lưới tổng


15

Tạo lưới 7 x 7, chứa đầy các số ngẫu nhiên. Tuy nhiên, trong các ô có số hàng và số cột lẻ (bắt đầu từ 0), bạn phải sử dụng tổng của các ô xung quanh. Đây là một ví dụ nhỏ với lưới 3 x 3 (in đậm tổng bình phương):

2 2  2
2 16 2
2 2  2

Và đây là một ví dụ 7 trong 7 lưới:

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

Quy tắc

  • Các số không phải là tổng phải luôn nằm trong khoảng từ 1 đến 9.

  • Lưới phải được tạo ngẫu nhiên. Đối với mỗi số không, mỗi chữ số phải có cơ hội xuất hiện như nhau, bất kể nó nằm trong ô nào.

  • Các số phải được căn chỉnh. Điều này có nghĩa là chữ số đầu tiên hoặc chữ số cuối của mỗi số trong một cột phải thẳng hàng. (Bạn có thể cho rằng các số ở giữa sẽ luôn có hai chữ số.)

  • Các ô bao quanh bao gồm các đường chéo. Do đó, mỗi ô vuông tổng sẽ có tám số bao quanh nó, bạn phải thêm.

  • Mã ngắn nhất thắng, vì đây là .


3
phải là chữ số đầu tiên xếp hàng không? tức là nó có thể là cái cuối cùng không?
Biến động

@Volatility Tôi cho rằng căn chỉnh đúng sẽ hoạt động. đã chỉnh sửa
Doorknob

Điều gì xảy ra nếu một ngôn ngữ không có trình tạo số ngẫu nhiên?
Heimdall

Câu trả lời:


14

APL, 53 49 43 42 40 39 36

Tôi đã xoay sở để sao chép J ;.trong APL và sử dụng phương pháp của Gareth , tiết kiệm 13 ký tự.

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

Chạy mẫu:

      {×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

Giải trình:

  • ∘.∨⍨9⍴0 1 tạo ra một mặt nạ bit.
  • ×∘?∘9¨ nhân mỗi bit với một giá trị ngẫu nhiên từ 1 đến 9, bao gồm, tạo ra một lưới các mặt số ngẫu nhiên.
  • 3,⌿3,/sử dụng những gì chỉ có thể được mô tả là hackery để trả về cả 3 hộp 3 chồng chéo trong mảng bị che. Những điều này cũng được làm phẳng trong quá trình.
  • {×5⌷⍵:5⌷⍵⋄+/⍵}¨lặp qua mảng, gán từng phần tử cho . Đối với mỗi lần lặp, phải mất lần thứ năm (giữa, ghi nhớ rằng lập chỉ mục APL là dựa trên 1) và trả về dấu của nó. Trong trường hợp này, điều này tương đương với kiểm tra nếu số lớn hơn 0. Nếu điều này trả về 1 (cho đúng), thì trả về phần tử đó. Nếu không, trả về tổng của các phần tử trong hộp 3 x 3. Nó sử dụng :⋄toán tử ternary, tương đương với ?:nhiều ngôn ngữ.

Uh-oh. Có vẻ như tôi sẽ phải tìm thêm tiết kiệm nhân vật. : -S
Gareth

@Gareth tốt, hãy nhìn những gì chúng tôi có ở đây. Tôi trở lại vị trí dẫn đầu: P
Biến động

NOOOOOOOOOO !!!!!!! :-(
Gareth

13

J, 63 61 59 55 52 51 49 47 39 37 ký tự

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

Cảm ơn Biến động cho 10 tiết kiệm nhân vật của mình.

Giải thích (mỗi bước sẽ có các số ngẫu nhiên khác nhau ...):

Tạo mặt nạ để tạo các số ngẫu nhiên (sử dụng $:

   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

Bây giờ chúng tôi có một cái móc . Đây thực sự là một tai nạn hạnh phúc từ khi tôi đang đưa ra một phiên bản trước đó. Nó có nghĩa là hoán vị |:và HOẶC +.với bản gốc. Nó có ý nghĩa vì tôi đã sử dụng những cái và số 0 vào thời điểm đó, nhưng bây giờ tôi có số không và số không. Nó chỉ xảy ra rằng nó hoạt động theo cùng một cách với ý nghĩa GCD của +.. May mắn cho tôi. :-)

   (+.|:)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

Vì vậy, bây giờ chúng ta có một lưới 9 và 0, chúng ta muốn tạo ra một số số ngẫu nhiên. ?tạo một số ngẫu nhiên từ 0 đến (nhưng không bao gồm) một số đã cho. Đưa ra một danh sách, nó sẽ tạo ra một số ngẫu nhiên theo cách này cho mỗi thành viên của danh sách. Vì vậy, trong trường hợp này, nó sẽ tạo ra một số từ 0 đến 8 cho mỗi 9 trong bảng và một số dấu phẩy động từ 0 đến 1 cho mỗi 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

Nhưng chúng tôi muốn các số từ 1 đến 9 chứ không phải 0 đến 8. Vì vậy, chúng tôi thêm 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

Điều này rất hay nhưng chúng tôi đã mất các số 0 mà tôi muốn, vì vậy chúng tôi sẽ nhân nó với mặt nạ ban đầu sau khi biến tất cả các số liệu thành số. Tôi làm điều này bằng cách kiểm tra xem giá trị có lớn hơn 1. Điều đó cho chúng ta : (1&<*1+?).
Có một vài điều đang diễn ra ở đây:

  • Chúng tôi đã tạo ra một ngã ba cho phép chúng tôi đóng gói rất nhiều công việc thành rất ít nhân vật.
  • Chúng tôi đã liên kết ( &) 1 với <động từ.

Vì vậy, tất cả kết hợp lại (1&<*1+?)đang tạo ra các số ngẫu nhiên và bỏ qua tất cả các số được tạo bởi các số 0 trong lưới ban đầu.

   (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

Bit tiếp theo là (theo ý kiến ​​của tôi, dù sao đi nữa :-) bit thông minh. Động từ
cắt ;.có một hình thức x u;._3 ycắt đầu vào thành các hộp được mô tả bởi x, và sau đó áp dụng động từ ucho chúng. Trong trường hợp này, chúng tôi có3 3(4&{++/*0=4&{)@,;._3 .

  • Các 3 3 là mô tả các hộp chúng ta muốn - 3x3.
  • Đây (4&{++/*0=4&{)@,là một động từ mô tả những gì chúng ta muốn làm cho mỗi hộp.

Để thể hiện ;.động từ tôi sẽ sử dụng <để hiển thị mỗi hộp:

   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│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┘

Một số điều cần chú ý:

  • Các hộp trùng nhau - cột thứ hai và thứ ba trong hộp trên cùng bên trái là cột thứ nhất và thứ hai trong hộp ở bên phải của nó.
  • Có 7x7 hộp. Đó là lý do tại sao chúng tôi có lưới 9x9 ban đầu.
  • Mỗi nơi chúng tôi yêu cầu một khoản tiền có một 0trung tâm của hộp.

Bây giờ chúng ta chỉ cần chuyển giá trị ở trung tâm trở lại (nếu nó khác không) hoặc tính tổng các số trong hộp 3x3 (nếu tâm bằng 0).
Để làm điều này, chúng ta cần dễ dàng truy cập vào số trung tâm. ,giúp ở đây Nó biến lưới 3x3 thành một danh sách gồm 9 mục với số trung tâm ở số 4.
4&{sẽ sử dụng {để kéo ra giá trị trung tâm và sau đó so sánh nó với 0 : 0=4&{. Điều này trả về một 0hoặc 1cho đúng hoặc sai, sau đó chúng ta nhân với tổng +/. Nếu nó bằng không tại trung tâm, bây giờ chúng tôi có số tiền của chúng tôi theo yêu cầu. Nếu không phải là chúng ta có số không, vì vậy để kết thúc, chúng ta chỉ cần thêm giá trị trung tâm 4&{+.
Điều này mang lại cho động từ xe lửa(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

Có một dòng mã của bạn làm tất cả điều đó, bao gồm cả việc tạo các số ngẫu nhiên? Trấn an tôi. Chỉ thấy khó tin.
DavidC

Đúng, khó có thể tin được. Các bit ngẫu nhiên được thực hiện bởi ?. Tôi sẽ thay đổi lời giải thích để phản ánh phiên bản mới nhất.
Gareth

@DavidCarraher Hầu hết các động từ trong J là 1 hoặc 2 ký tự để 47 ký tự có thể đóng gói trong rất nhiều công việc.
Gareth

Việc cắt một hộp 9x9 thành các ô vuông chồng lên nhau 7x7 chắc chắn là một chút thông minh. Trong vòng chưa đầy 10 phút, tôi đã có thể áp dụng nó để đánh bại việc triển khai GolfScript hiện tại của mình bằng 7,5%.
Peter Taylor

Ồ, có vẻ như nó trở lại bảng vẽ cho tôi.
Biến động

5

Ruby (135 ký tự)

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}

Sản lượng mẫu

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  

Phá vỡ

Nó không quá rõ ràng làm thế nào điều này hoạt động, vì vậy đây là một sự cố nhanh chóng. GHI CHÚ: Bạn có thể có thể bỏ qua một số bước này và chuyển sang các phiên bản ngắn hơn nhanh hơn, nhưng tôi nghĩ rằng nó đủ giáo dục để xem các cách khác nhau để tôi loại bỏ các ký tự, đặc biệt là bằng cách phát hiện các mẫu trong chữ để biến các số có 2 chữ số thành phiên bản 1 chữ số .

Phiên bản ngây thơ

Không giống như các giải pháp Ruby khác dựa trên mảng hai chiều, cuối cùng, bạn có thể có được phiên bản ngắn hơn bằng cách bắt đầu với mảng 1 chiều và làm việc với các giá trị offset, do các mẫu lặp lại.

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

Nguyên tắc chính ở đây là chúng tôi làm việc tại các vị trí chỉ số 8, 10, 12, chỉ cần bù cho bội số của 14. Vị trí 8, 10 và 12 là trung tâm của các lưới 3x3 mà chúng tôi đang tổng hợp. Trong đầu ra mẫu, 34 là vị trí 8, 42 là vị trí 8 + 14 * 1, v.v. Chúng tôi thay thế vị trí 8 bằng 34 bằng vị trí bù từ vị trí 8 bằng [-8,-7,-6,-1,1,6,7,8]- nói cách khác 34 = sum(ary[8-8], ary[8-7], ..., ary[8+8]). Nguyên tắc tương tự này đúng với tất cả các giá trị của [8 + 14*i, 10 + 14*i, 12 + 14*i], vì mẫu lặp lại.

Tối ưu hóa nó

Đầu tiên, một số tối ưu hóa nhanh chóng:

  • Thay vì 3.times { ... }và tính toán j + 14*imỗi lần, "nội tuyến" các vị trí [8,10,12,22,24,26,36,38,40].
  • Các offsetsmảng được sử dụng một lần, vì vậy thay thế các biến với các chữ.
  • Thay thế do ... endbằng {...}và chuyển đổi xung quanh in $> << foo. (Có một mẹo ở đây liên quan đến puts nil() == nil .)
  • Tên biến ngắn hơn.

Mã sau này là 177 ký tự:

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

Đối với lần giảm tiếp theo, lưu ý rằng injectkhông cần mảng bù theo thứ tự. Chúng tôi có thể có [-8,-7,-6,-1,1,6,7,8]hoặc một số thứ tự khác, vì bổ sung là giao hoán.

Vì vậy, trước tiên hãy kết hợp các mặt tích cực và tiêu cực để có được [1,-1,6,-6,7,-7,8,-8].

Bây giờ bạn có thể rút ngắn

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

đến

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

Kết quả này trong

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

đó là 176 ký tự.

Thay đổi 8 và di chuyển đến sự khác biệt

Các giá trị theo nghĩa đen gồm hai ký tự có vẻ như chúng có thể được rút ngắn, vì vậy hãy lấy [8,10,12,22,24,26,36,38,40]và dịch chuyển mọi thứ xuống 8, cập nhật jkhi bắt đầu vòng lặp. (Lưu ý rằng +=8cần tránh cập nhật các giá trị bù của 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)}

Đây là 179, lớn hơn, nhưng j+=8thực sự có thể được gỡ bỏ.

Thay đổi đầu tiên

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

đến một loạt các khác biệt:

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

và tích lũy thêm các giá trị này vào ban đầu j=8. Điều này cuối cùng sẽ bao gồm các giá trị tương tự. (Có lẽ chúng ta có thể bỏ qua điều này thay vì thay đổi 8 lần đầu tiên.)

Lưu ý rằng chúng tôi cũng sẽ thêm một giá trị giả 9999vào cuối mảng khác biệt và thêm jvào cuối , không phải bắt đầu vòng lặp. Lý do là 2,2,10,2,2,10,2,2trông rất giống với 3 số giống nhau được lặp lại 3 lần và bằng cách tính toán j+differenceở cuối vòng lặp, giá trị cuối cùng 9999sẽ không thực sự ảnh hưởng đến đầu ra, vì không có a[j]cuộc gọi nào jcó giá trị trên 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)}

Với mảng khác biệt này , tất nhiên j+=8bây giờ chỉ là j=8vì nếu không chúng ta sẽ liên tục thêm 8quá nhiều. Chúng tôi cũng đã thay đổi biến khối từ jđến l.

Vì vậy, 9999phần tử không có ảnh hưởng đến đầu ra, chúng ta có thể thay đổi nó 10và rút ngắn mảng.

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

Đây là 170 ký tự.

Nhưng bây giờ j=8trông có vẻ hơi lộn xộn, và bạn có thể lưu 2 ký tự bằng cách chuyển [2,2,10]xuống 2 để thuận tiện lấy một cái 8bạn có thể sử dụng để gán. Điều này cũng cần j+=lphải trở thành j+=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)}

Đây là 169 ký tự. Một cách xoay quanh để ép 7 ký tự, nhưng nó gọn gàng.

Tinh chỉnh cuối cùng

Cuộc values_atgọi này thực sự là dư thừa và chúng ta có thể thực hiện Array#[]cuộc gọi. Vì thế

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

trở thành

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

Bạn cũng có thể nhận ra rằng flat_map+ j+e/j-e+ injectcó thể được giảm xuống thành một tổng kết trực tiếp hơn với một chữ cái đầu tiên 0trong mảng.

Điều này để lại cho bạn 152 ký tự:

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

Cuối cùng:

  • map.with_indexcó thể trở thành each_slice.
  • Thay đổi cách tiếp cận in ấn.

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}

Bạn có thể thay thế eachbằng mapmột byte.
Jordan

3

Con trăn, 132

Điều này về mặt kỹ thuật không thỏa mãn các quy tắc, bởi vì các chữ số cuối của mỗi số được căn chỉnh thay vì số đầu tiên. Nhưng tôi nghĩ dù sao tôi cũng muốn chia sẻ:

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

Đầu ra mẫu:

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

Toán học, 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〛]

kết quả

Đối với đầu ra đẹp hơn Column/@có thể được thay thế với TableForm@chi phí 2 ký tự.


Rất, rất thông minh. Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]cung cấp một đầu ra sạch hơn và lưu một vài ký tự nếu bạn tính Transpose là một ký tự đơn, có trong Mathmatica. Btw, mẫu OneLinerSubmission của Wolfram đếm 106 ký tự, 105 với một ký tự Transpose.
DavidC

@DavidCarraher Cảm ơn. Số lượng char là do dòng mới không cần thiết và :>là một ký hiệu, mặc dù nó nằm trong khu vực sử dụng riêng của unicode. Người ta thậm chí có thể loại bỏ chuyển vị, vì quy tắc tổng hợp hiệu lực giữ ngay cả sau khi chuyển vị. Nhưng có vẻ như Gridkhông căn chỉnh các mục mà không có tùy chọn khác (v8)
ssch

Gridtrung tâm các số trong cột. Về mặt kỹ thuật, điều đó sẽ không thỏa mãn thách thức, nhưng có vẻ tốt hơn là có một danh sách xuất hiện trong bảng được hiển thị.
DavidC

Rất đẹp. Tôi chỉ dành thời gian đáng kể để tạo ra điều tương tự, chỉ có tôi sử dụng PartTuples. Đăng sớm.
Mr.Wizard

Bạn có thể lưu hai ký tự bằng cách này: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 ký tự)

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

NB Điều này có chứa một tab theo nghĩa đen, mà Markdown có thể phá vỡ.

Một chút thông minh là do Gareth: xem giải pháp J của anh ấy.

Bản demo trực tuyến


3

R: 114 ký tự

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

Dòng đầu tiên tạo một mảng 7 x 7 chứa đầy các số được chọn ngẫu nhiên từ 1 đến 9 (phân phối đồng đều với thay thế, do r=Tđó là viết tắt của replace=TRUE). Dòng thứ hai, tính tổng 3 của 3 lưới, trừ trung tâm và thay thế nó bằng kết quả. Dòng thứ ba in lưới kết quả (theo mặc định, cột ma trận và mảng được căn phải).

Ví dụ đầu ra:

     [,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 byte

Một giải pháp ngây thơ và dài dòng trong J. Đó là một cách thực hiện đơn giản của nhiệm vụ.

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

Đầu tiên tôi tạo một mảng 7 x 7 số nguyên trong khoảng từ 1 đến 9. Trong thực tế J là gì? động từ tạo ra các số theo đối số của nó, đó là lý do tại sao chúng ta cần tăng từng phần tử,>: trong J

a=.>:?7 7$9 
2 8 7 4 4 5 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

Tôi chuẩn bị một mặt nạ được sử dụng để zeroing các ô hàng / col lẻ, một cặp chỉ số hàng / cột lẻ:

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

Động từ Danh mục {kết hợp các mục từ các nguyên tử trong danh sách được đóng hộp

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

để tạo thành một danh mục, bảng 3x3 của các cặp ở trên

Sau đó, tôi chuẩn bị một bảng các chỉ số hàng / col sẽ được sử dụng để lựa chọn từng phân đoạn 3x3.

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││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
└─────────────┴─────────────┴─────────────┘

Đối với mỗi cặp trong mảng m tôi tạo một cặp ba, tập trung xung quanh mỗi số của cặp m:

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

Các cặp bộ ba này được sử dụng bởi J From verb {, có thể chọn nhiều hàng và cột cùng một lúc. 0 1 2/2 3 4 có nghĩa là tôi chọn các hàng 0, 1 và 2 cùng với các cột 2, 3 và 4, do đó chọn phân đoạn 3x3 thứ hai ở trên cùng.

Cuối cùng, tôi có thể sử dụng mảng 7x7 và mặt nạ để đạt được nhiệm vụ: Đầu tiên tôi sử dụng m làm mặt nạ để đặt các phần tử tương ứng thành 0:

0 m}a

Sau đó, tôi lấy tất cả các tập con 3x3 bằng cách sử dụng s làm bộ chọn và tìm tổng của chúng:

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

Sau đó, tôi đặt những con số này trở lại mảng bắt đầu.

 (+/^:_"2 s{0 m}a)m}a 
2 8 7 4 4 5 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

Hãy thử trực tuyến!



1

Ruby, 207

Tôi sẽ trình bày giải pháp của mình trước (như tôi luôn làm):

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

Ruby, 150 ký tự

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}

nếu biện minh yêu cầu biện minh bên trái chỉ là ljustsẽ phải được sử dụng ... tốt, không. Tôi yêu khả năng định dạng của Ruby.

Không sử dụng Array.new(7){...}. (0..6).map{...}vừa ngắn vừa dễ đọc hơn bạn có được một phạm vi có thể gán miễn phí.

Dòng số 3 lấy cảm hứng từ giải pháp của Doorknob .


1

GolfScript, 87 ký tự

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

Có quá nhiều khóa trong đó ... (xem trực tuyế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 ký tự

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

Mặc dù đặc tả yêu cầu các số được căn trái, nhưng không có yêu cầu sử dụng ký hiệu thập phân, vì vậy tôi đoán đây là đầu ra hợp lệ:

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

Nếu căn lề phải thay vì căn lề trái được chấp nhận, chúng tôi có 58 ký tự

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

J's ":(định dạng) có ba chế độ định dạng:

  • căn phải với n chữ số hoặc với thu nhỏ (hiển thị mặc định)
  • ký hiệu khoa học liên kết trái với tổng số n chữ số và m ký tự
  • Hiển thị hình hộp thu nhỏ với (trái / giữa / phải) - căn chỉnh (trên / giữa / dưới) (bên dưới, 69 ký tự)

Dài dòng nhất nhưng cũng linh hoạt nhất và là người duy nhất có thể tạo đầu ra theo ví dụ là 8!:2định dạng nước ngoài, lấy một chuỗi định dạng làm đối số bên trái của nó. Ngoài ra 67 ký tự :

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

Đây là định dạng đóng hộp:

 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 ký tự

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

Đây là một trong những tập lệnh Perl trong đó tất cả trừ một trong các vòng lặp đã được thu gọn thành mapcác lệnh gọi để mọi thứ có thể được thực hiện trong một câu lệnh. Biến toàn cầu cũng làm cho một số sự xuất hiện quan trọng trong cái này. Tôi đoán những gì tôi đang cố gắng nói ở đây là, chương trình này hơi thô thiển.

Đợi đã, nó trở nên tồi tệ hơn: Có một lỗi đã biết trong kịch bản! Tuy nhiên, nó có ít hơn một triệu cơ hội được kích hoạt, vì vậy tôi vẫn chưa khắc phục được.


Đừng giữ chúng tôi, lỗi là gì?

Điểm thưởng cho người đầu tiên phát hiện ra nó!
hộp bánh mì

1

Toán học , 106/100

Tôi đã nghĩ ra một cái gì đó rất giống với mã của ssch, trước khi nhìn thấy nó. Tôi đang mượn ý tưởng của anh ấy về việc sử dụng Column. Chỉ với 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

Với các ký tự Unicode (như được sử dụng bởi 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

VBA Excel, 74 byte

VBE chức năng ngay lập tức mà đầu ra [B2:H9].

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

Đầu ra mẫu

nhập mô tả hình ảnh ở đây


1

Quyền hạn, 149 148 byte

-1 byte nhờ @AdmBorkBork. Nó tuyệt thật!

$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$_})

Giải trình:

$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
Bạn có thể loại bỏ một byte (một dòng mới) bằng cách đóng gói $abài tập của bạn trong parens và di chuyển dòng tiếp theo lên để tạo một dòng lớn -($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
admBorkBork

Không. Nó không hoạt động. Các mảng phải được điền đầy đủ trước $a[$i+$_]. Vì vậy, đây là hai bước. Tôi đã có một vài lần cố gắng gói gọn trong một đường ống. :)
mê mẩn

1
Nó không hoạt động nếu bạn không đặt parens xung quanh bài tập. Với ($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))}), $ađược điền đầy đủ trước phiên bản đường ống tiếp theo. Nó nên hoạt động (ít nhất, nó làm cho tôi).
admBorkBork

0

Toán học 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)

Sử dụng

z

m8


Bạn có 0s; các quy tắc nói 1-9
Doorknob

Cảm ơn. Tôi đã sửa dữ liệu và bức ảnh. Các chức năng vẫn không thay đổi.
DavidC

Ngoài ra, các số không được căn chỉnh như được chỉ định trong câu hỏi.
Doorknob

Sự khéo léo của Mathematica (hay chính xác hơn là sự khăng khăng sử dụng những từ ngữ lớn) trở nên rõ ràng.
DavidC

0

Julia 0,6 , 127 (89) byte

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)

Hãy thử trực tuyến!

89 byte sử dụng hiển thị gốc, có thể được chấp nhận nếu các dòng bổ sung có thể được in:

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 byte

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 byte nhờ @ceilingcat .

Giải trình:

Hãy thử nó ở đây.

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 Cảm ơn! Và tôi đã có thể lưu thêm một vài byte varthay vì String+=Math.random()*9+1;thay vì =(int)(Math.random()*9+1);. Nó thực sự khá hữu ích cho bạn để truy cập tất cả các câu trả lời cũ của tôi, haha! : D
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.