Создайте сетку 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 включительно.
Сетка должна быть сгенерирована случайным образом. Для каждой не суммы каждая цифра должна иметь одинаковую вероятность появления, независимо от того, в какой ячейке она находится.
Числа должны быть выровнены. Это означает, что либо первая, либо последняя цифра каждого числа в столбце должна располагаться вертикально. (Вы можете предположить, что средние числа всегда будут состоять из двух цифр.)
Окружающие клетки включают диагонали. Следовательно, каждый квадрат суммы будет иметь восемь чисел, окружающих его, которые вы должны добавить.
Самый короткий код выигрывает, так как это код-гольф .
источник
Ответы:
APL,
53 49 43 42 40 3936Мне удалось воспроизвести J
;.
в APL и использовать подход Гарета , сохранив 13 символов.Образец прогона:
Объяснение:
∘.∨⍨9⍴0 1
генерирует немного маски×∘?∘9¨
умножает каждый бит на случайное значение от 1 до 9 включительно, создавая замаскированную сетку случайных чисел.3,⌿3,/
использует то, что можно описать только как хакерство, чтобы вернуть все 3 на 3 перекрывающихся поля в замаскированном массиве. Они также сглаживаются в процессе.{×5⌷⍵:5⌷⍵⋄+/⍵}¨
перебирает массив, присваивая каждый элемент⍵
. Для каждой итерации берется пятая (средняя, помня, что индексирование APL основано на 1) и возвращает знак. В этом случае это эквивалентно тестированию, если число больше 0. Если это возвращает 1 (для истины), то вернуть этот элемент. В противном случае верните сумму элементов в сглаженном квадрате 3 на 3. Он использует:⋄
троичный оператор, который является эквивалентом?:
во многих языках.источник
J,
63615955525149473937 символовБлагодаря Волатильности за его сохранение 10 символов.
Пояснение (каждый шаг будет иметь разные случайные числа ...):
Генерация маски для генерации случайных чисел (использует
$
:Теперь у нас есть крюк . Это на самом деле счастливый случай, когда я сократил более раннюю версию. Он должен был быть транспонирован
|:
и ИЛИ+.
с оригиналом. Это имело смысл, так как я использовал единицы и нули в то время, но теперь у меня есть девятки и нули. Так уж сложилось, что он работает так же, как и в смысле GCD+.
. К счастью для меня. :-)Итак, теперь, когда у нас есть сетка из 9 и 0, мы хотим сгенерировать несколько случайных чисел.
?
генерирует случайное число от 0 до (но не включая) заданного числа. Получив список, он сгенерирует одно случайное число таким образом для каждого члена списка. Так что в этом случае он сгенерирует число от 0 до 8 для каждых 9 в таблице и число с плавающей запятой от 0 до 1 для каждого 0.Но нам нужны числа от 1 до 9, а не от 0 до 8. Поэтому мы добавляем 1.
Это очень хорошо, но мы потеряли нули, которые я хочу, поэтому мы умножим их на исходную маску, превратив все девятки в единицы. Я делаю это, проверяя , если значение больше 1. Это дает нам:
(1&<*1+?)
.Здесь происходит несколько вещей:
&
) 1 с<
глаголом.Таким образом, все вместе
(1&<*1+?)
генерирует случайные числа и обнуляет все числа, которые были сгенерированы нулями в исходной сетке.Следующий бит - это (на мой взгляд, в любом случае :-) умный бит.
Вырезанный
;.
глагол имеет форму,x u;._3 y
которая разрезает входные данные в поля, описанные с помощьюx
, и затем применяет глаголu
к ним. В этом случае мы имеем3 3(4&{++/*0=4&{)@,;._3
.3 3
Описывает коробки , которые мы хотим - 3x3.(4&{++/*0=4&{)@,
поезд глаголов, который описывает, что мы хотим сделать с каждой коробкой.Чтобы продемонстрировать
;.
глагол, я буду использовать,<
чтобы показать каждую коробку:Некоторые вещи, на которые стоит обратить внимание:
0
в центре бокса.Теперь нам просто нужно либо передать значение в центре назад (если оно не равно нулю), либо сложить числа в поле 3х3 (если центр равен нулю).
Для этого нам нужен легкий доступ к номеру центра.
,
помогает здесь Это превращает 3х3 в список 9 пунктов с номером центра под номером 4.4&{
будет использовать ,{
чтобы вытащить значение центра , а затем сравнить его с 0:0=4&{
. Это возвращает0
или1
для истины или ложи, которые мы затем умножаем на сумму+/
. Если в центре было ноль, то теперь у нас есть требуемая сумма. Если это не так, у нас есть ноль, поэтому, чтобы закончить, мы просто добавляем значение центра4&{+
.Это дает поезд глагола
(4&{++/*0=4&{)@,
источник
?
. Я изменю объяснение, чтобы отразить новейшую версию.Рубин (135 знаков)
Образец вывода
Сломать
Не слишком очевидно, как это работает, так что вот краткий анализ. НОТА: Вероятно, вы можете пропустить некоторые из этих шагов и перейти к более коротким версиям, но я думаю, что это достаточно познавательно, чтобы увидеть различные способы, которыми я сбрил символы, особенно, обнаруживая шаблоны в литералах, чтобы превратить двузначные числа в однозначные версии. ,
Наивная версия
В отличие от других решений Ruby, которые полагаются на двумерный массив, вы можете (в конечном итоге) получить более короткую версию, начав с одномерного массива и работая со значениями смещения, поскольку шаблоны повторяются.
Ключевой принцип здесь заключается в том, что мы работаем с индексными позициями 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 символов:
Для следующего сокращения обратите внимание, что
inject
массив смещений не должен быть в порядке. Мы можем иметь[-8,-7,-6,-1,1,6,7,8]
или другой порядок, так как сложение коммутативно.Итак, сначала объедините плюсы и минусы, чтобы получить
[1,-1,6,-6,7,-7,8,-8]
.Теперь вы можете сократить
в
Это приводит к
что 176 символов.
Сдвиг на 8 и переход к различиям
Кажется, что двухсимвольные литеральные значения могут быть сокращены, поэтому возьмите
[8,10,12,22,24,26,36,38,40]
и сдвиньте все вниз8
, обновляяj
в начале цикла. (Обратите внимание, что не+=8
нужно обновлять значения смещения1,6,7,8
.)Это 179, что больше, но на
j+=8
самом деле может быть удалено.Первая смена
к множеству различий:
и кумулятивно добавить эти значения к исходному
j=8
. Это в конечном итоге охватит те же значения. (Возможно, мы могли бы сразу перейти к этому, вместо того, чтобы сначала перейти на 8).Обратите внимание, что мы также добавим фиктивное значение
9999
в конец массива различий и добавимj
в конце , а не в начало цикла. Обоснование состоит в том, что2,2,10,2,2,10,2,2
выглядит очень похоже на то, что те же 3 числа повторяются 3 раза, и, вычисляяj+difference
в конце цикла, окончательное значение9999
фактически не повлияет на вывод, так как нетa[j]
вызова, гдеj
есть какое-то значение более10000
.С этим массивом различий,
j+=8
теперь это простоj=8
, конечно, поскольку в противном случае мы бы неоднократно добавляли8
слишком много. Мы также изменили переменную блока сj
наl
.Таким образом, поскольку
9999
элемент не влияет на вывод, мы можем изменить его10
и сократить массив.Это 170 символов.
Но теперь
j=8
выглядит немного неуклюже, и вы можете сохранить 2 символа, сдвинув их[2,2,10]
вниз на 2, чтобы удобно получить то, что8
вы можете использовать для назначения. Это тоже должноj+=l
статьj+=l+2
.Это 169 символов. Вокруг способ сжать 7 символов, но это аккуратно.
Финальные настройки
values_at
Вызов на самом деле своего рода излишними, и мы можем встраивать вArray#[]
вызов. Такстановится
Кроме того, можно заметить , что
flat_map
+j+e/j-e
+inject
может быть сведено к более прямому суммированию с начальным0
в массиве.Это оставляет вас с 152 символами:
В заключение:
map.with_index
может статьeach_slice
.135 :
источник
each
сmap
одного байта.Python, 132
Технически это не удовлетворяет правилам, потому что последние цифры каждого номера выровнены, а не первые. Но я думал, что поделюсь в любом случае:
Пример вывода:
источник
Математика, 108
Для более красивого вывода
Column/@
можно заменитьTableForm@
на 2 символа.источник
Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]
дает более чистый вывод и сохраняет пару символов, если вы считаете Transpose как один символ, который есть в Mathmatica. Кстати, шаблон Wolfram's OneLinerSubmission насчитывал 106 символов, 105 с одним символом Transpose.:>
является одним символом, хотя он находится в частной области юникода. Можно даже удалить транспонирование, поскольку правило суммирования справедливости сохраняется даже после транспонирования. Но, похожеGrid
, не выравнивает записи без дополнительных опций (v8)Grid
центрирует числа в столбцах. Технически это не решило бы проблему, но выглядит лучше, чем отображение списка в отображаемой таблице.Part
иTuples
. Скороp=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
GolfScript (
79 78 72 70 68 66 6560 символов)NB Это содержит буквенную вкладку, которую Markdown может сломать.
Умный бит принадлежит Гарету: посмотрите его решение J.
Онлайн демо
источник
R: 114 символов
Первая строка создает массив 7 на 7, заполненный случайно выбранными числами от 1 до 9 (равномерное распределение с заменой, следовательно,
r=T
расшифровкаreplace=TRUE
). Во второй строке вычислите суммы 3 на 3, вычтите центр и замените его результатом. В третьей строке выведите итоговую сетку (по умолчанию столбцы матрицы и массива выровнены по правому краю).Пример вывода:
источник
J,
6765 байтНаивное и многословное решение в J. Это прямая реализация задачи.
Сначала я создаю массив целых чисел 7 x 7 между 1 и 9. На самом деле J? глагол генерирует числа с точностью до аргумента, поэтому нам нужно увеличивать каждый элемент,>: в J
Я готовлю маску, которая будет использоваться для обнуления нечетных ячеек строки / столбца, пары нечетных индексов строки / столбца:
Глагол Catalog {объединяет элементы из атомов внутри упакованного списка
для формирования каталога, таблица 3х3 из пар выше
Затем я готовлю таблицу индексов строк / столбцов, которые будут использоваться для выбора каждого из подмассивов 3x3.
Для каждой пары в массиве m я делаю пару триплетов, центрированных вокруг каждого числа пары m:
Эти пары триплетов используются глаголом J From {, который может выбрать несколько строк и столбцов одновременно. 0 1 2/2 3 4 означает, что я выбираю строки 0, 1 и 2 вместе со столбцами 2, 3 и 4, таким образом выбирая второй подрешетку 3x3 сверху.
Наконец, я могу использовать массив 7x7 и маски для выполнения задачи: сначала я использую m в качестве маски, чтобы установить соответствующие элементы в 0:
Затем я беру все подмассивы 3x3, используя s в качестве селектора, и нахожу их суммы:
Затем я помещаю эти числа обратно в исходный массив.
Попробуйте онлайн!
источник
APL (Dyalog Unicode) ,
323130 байт SBCS-1 байт благодаря @jslip
Попробуйте онлайн!
источник
∧/¨~
->⍱/¨
Рубин, 207
Сначала я представлю свое решение (как я всегда делаю):
источник
Рубин, 150 знаков
если левое оправдание требует оправдания,
ljust
то оно должно быть использовано ... ну, нет. Я люблю возможности форматирования Руби.Не используйте
Array.new(7){...}
.(0..6).map{...}
и короче и более читабельным и вы получаете назначаемый диапазон бесплатно.Линия № 3, вдохновленная решением Doorknob .
источник
GolfScript, 87 символов
Там слишком много молний ... (см. Онлайн )
источник
J, 58/64/67 знаков
Хотя спецификация требует, чтобы числа были выровнены по левому краю, нет необходимости использовать десятичную нотацию, поэтому я предполагаю, что это правильный вывод:
Если допустимо выравнивание по правому краю вместо выравнивания по левому краю, то мы получим 58 символов
J's
":
(формат) имеет три режима форматирования:Наиболее многословным, но также и наиболее универсальным, и единственным, способным произвести выходные данные в соответствии с примером, является
8!:2
внешнее форматирование, которое принимает строку форматирования в качестве левого аргумента. Также 67 персонажей :Вот формат в штучной упаковке:
источник
Perl, 117 символов
Это один из тех сценариев Perl, где все циклы for, кроме одного, были объединены в
map
вызовы, так что все может быть сделано в одном выражении. Глобальные переменные также имеют некоторые важные появления в этом. Я думаю, что я пытаюсь сказать здесь, эта программа немного грубая.Подождите, становится хуже: в скрипте есть известная ошибка! Однако вероятность его срабатывания составляет менее одного на миллион, так что я пока не удосужился его исправить.
источник
Mathematica , 106/100
Я придумал что-то очень похожее на код ssch, прежде чем увидел это. Я заимствую его идею использования
Column
. Только с ASCII, 106 :С символами Unicode (как используется ssch), 100 :
источник
Excel VBA, 74 байта
VBE немедленная функция, которая выводит на
[B2:H9]
.Пример вывода
источник
Powershell,
149148 байт-1 байт благодаря @AdmBorkBork. Это круто!
Объяснение:
источник
$a
назначение в скобках и переместив следующую строку вверх, чтобы сделать одну большую строку -($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
$a[$i+$_]
. Итак, вот два шага. У меня было несколько попыток инкапсулировать в одну трубу. :)($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})
,$a
полностью заполняется перед следующим экземпляром конвейера. Это должно работать (по крайней мере, для меня).Mathematica
142 151 172179Код
использование
источник
0
с; правила говорят 1-9Юлия 0,6 , 127 (89) байт
Попробуйте онлайн!
89 байтов с использованием собственного отображения, что может быть допустимо, если можно напечатать дополнительные строки:
источник
Java 10,
262260248239 байт-12 байт благодаря @ceilingcat .
Объяснение:
Попробуй это здесь.
источник
var
вместоString
и+=Math.random()*9+1;
вместо=(int)(Math.random()*9+1);
. На самом деле это довольно полезно для вас, чтобы посетить все мои старые ответы, ха-ха! : D