Створити сітку сум


15

Створіть сітку 7 на 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

Що робити, якщо мова не має генератора випадкових чисел?
Хеймдалл

Відповіді:


14

APL, 53 49 43 42 40 39 36

Мені вдалося повторити J ;.в APL і застосував підхід Гарета , заощадивши 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⌷⍵⋄+/⍵}¨ітераціює над масивом, присвоюючи кожному елементу . Для кожної ітерації вона займає п'яту (середину, пам'ятаючи, що індексація APL заснована на 1) і повертає свій знак. У цьому випадку це еквівалентно тестуванню, якщо число більше 0. Якщо це повертає 1 (для істинного), поверніть цей елемент. В іншому випадку поверніть суму елементів у сплющене 3 на 3 поле. Він використовує :⋄потрійний оператор, що є еквівалентом ?:багатьох мов.

Ой-ой. Схоже, мені доведеться знайти більше заощаджень персонажів. : -S
Гарет

@Gareth добре, подивись, що ми маємо тут. Я знову веду: P
Нестабільність

NOOOOOOOOOO !!!!!!! :-(
Гарет

13

J, 63 61 59 55 52 51 49 47 39 37 символів

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

Отже, тепер, коли у нас є сітка 9 і 0, ми хочемо генерувати деякі випадкові числа. ?генерує випадкове число від 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+?)генерують випадкові числа, і обнуляють всі числа, де генеруються нулями в початковій сітці.

   (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ящиків, які ми хочемо - 3х3.
  • Це (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. Тому ми спочатку мали сітку 9х9.
  • Кожне місце, на яке нам потрібна сума, має в 0центрі поля.

Тепер нам просто потрібно передати значення в центрі назад (якщо воно не нульове) або підсумовувати числа в полі 3х3 (якщо центр дорівнює нулю).
Для цього нам потрібен простий доступ до центрального номера. ,допомагає тут. Це перетворює 3х3 в список 9 пунктів з номером центру під номером 4.
4&{використовуватиме , {щоб витягнути значення центру , а потім порівняти його з 0: 0=4&{. Це повертає a 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

Так, важко, як це можна повірити. Випадковий біт робиться ?. Я зміню пояснення, щоб відобразити новітню версію.
Гарет

@DavidCarraher Більшість дієслів у J є або 1, або 2 символи, тому 47 символів можуть скласти багато роботи.
Гарет

Розрізання коробки 9x9 на квадрати 7x7, що перекриваються, безумовно, розумний біт. Менш ніж за 10 хвилин я зміг застосувати його, щоб перемогти мою поточну реалізацію GolfScript на 7,5%.
Пітер Тейлор

Ну добре, схоже, це повернулося до малювальної дошки для мене.
Волатильність

5

Ruby (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, які покладаються на двовимірний масив, ви можете (зрештою) отримати більш коротку версію, починаючи з одновимірного масиву та працюючи зі значеннями зміщення, оскільки шаблони повторюються.

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занадто багато. Ми також змінили змінну блоку з jна l.

Так як 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виглядає трохи незграбно, і ви можете зберегти 2 символи, змістивши [2,2,10]їх на 2, щоб зручно отримати припис, який 8ви можете використовувати для призначення. Це теж має j+=lстати 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)}

Це 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_indexможе стати each_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одного байта.
Йордан

3

Пітона, 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

Математика, 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〛]

результат

Для кращого виведення 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 Дякую Підрахунок знаків пояснюється непотрібним новим рядком і :>є одним символом, хоча він знаходиться в області приватного використання Unicode. Можна навіть видалити транспозицію, оскільки правило підсумовування дійсності дотримується навіть після транспозиції. Але, схоже 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,/

Примітка. Це містить буквальну вкладку, яку Markdown цілком може зламати.

Розумний біт пов'язаний з Гаретом: дивіться його 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 на 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 байт

Наївне та багатослівне рішення у Дж. Це прямолінійне виконання завдання.

(+/^:_"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
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

Я готую маску, яку потрібно використовувати для нулювання непарних комірок рядка / стовпця, пар непарних індексів рядків / стовпців:

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

сформувати каталог, 3х3 таблицю пар вище

Тоді я готую таблицю індексів рядків / стовпців, які будуть використані для вибору кожного з 3х3 підрисів.

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

Для кожної пари в m масиві я складаю пару трійки, орієнтовану навколо кожного числа m пари:

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

Ці пари триплетів використовуються дієсловом J From {, який може вибрати декілька рядків і стовпців одночасно. 0 1 2/2 3 4 означає, що я вибираю рядки 0, 1 і 2 разом із стовпцями 2, 3 і 4, вибираючи таким чином другий підрядок 3x3 вгорі.

Нарешті, я можу використовувати масив 7x7 та маски для досягнення завдання: Спочатку я використовую m як маску для встановлення відповідних елементів на 0:

0 m}a

Потім я беру всі підрядні масиви 3x3, використовуючи s як селектор, і знаходжу їхні суми:

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

Потім я повертаю ці числа назад у вихідний масив.

 (+/^:_"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

Спробуйте в Інтернеті!



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що потрібно було б використати ... ну, ні. Я люблю можливості форматування Рубі.

Не використовуйте Array.new(7){...}. (0..6).map{...}є і коротшими, і легшими для читання, і ви отримуєте доступний асортимент безкоштовно.

Рядок №3 натхненний рішенням Дорноба .


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

Дж ": (формат) має три режими форматування:

  • праворуч вирівняний з n цифрами або зі скороченням (зменшення за замовчуванням)
  • ліворівневе наукове позначення із загальною кількістю цифр та m символів
  • зменшити обгортання в коробці з (ліворуч / центр / праворуч) - (верх / середина / низ) вирівнювання (внизу, 69 символів)

Найбільш багатослівним, але також найбільш універсальним і єдиним, хто може отримати результат відповідно до прикладу, є 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, де всі, крім одного циклу for, були зведені у mapвиклики, так що все можна зробити в одному операторі. Глобальні змінні також вносять до цього важливі явища. Я здогадуюсь, що я намагаюся тут сказати, ця програма трохи груба.

Зачекайте, стає гірше: у сценарії відома помилка! Однак у нього менше шансу на мільйон шансів запуститись, тому я ще не намагався це виправити.


Не тримайте нас, що таке помилка?

Бонус вказує на першу людину, яка це помітила!
хлібниця

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завдання в паренах і перемістивши наступний рядок вгору, щоб зробити одну велику лінію -($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
Це не працює, якщо навколо завдання не розміщувати паролі. З ($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

м8


У вас є 0; правила говорять 1-9
Doorknob

Спасибі. Я виправив дані та фото. Функції залишаються незмінними.
DavidC

Також цифри не вирівняні, як зазначено в запитанні.
Дверна ручка

Виразність математики (або, точніше, наполягання на використанні великих слів) стає очевидною.
DavidC

0

Джулія 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
Кевін Круїссен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.