Этот вдохновлен недавним вызовом Calvin's Hobbies для таблицы умножения .
Напишите функцию или программу, которая принимает целое число в N
качестве входных данных и печатает или возвращает уникальную спираль умножения N-на-N. Код должен (теоретически) работать для N между 0 и 1000 (хотя вывести это может быть сложно). Вывод должен быть эквивалентен таблице, созданной с помощью следующей процедуры:
Заполните таблицу умножения N на N. Например, для N = 3:
1 2 3 2 4 6 3 6 9
Следуйте по спирали по часовой стрелке от верхнего левого угла, отмечая цифры, которые вы посещаете. Когда вы посещаете номер, который вы уже посетили, замените его на 0.
Несколько примеров могут сделать это более ясным:
n = 0:
0
n = 1:
1
n = 2: // Spiral order:
1 2 // 1 2
0 4 // 4 3
n = 3:
1 2 3 // 1 2 3
0 4 6 // 8 9 4
0 0 9 // 7 6 5
n = 4:
1 2 3 4 // 1 2 3 4
0 0 6 8 // 12 13 14 5
0 0 9 12 // 11 16 15 6
0 0 0 16 // 10 9 8 7
n = 5:
1 2 3 4 5
0 0 6 8 10
0 0 9 12 15
0 0 0 16 20
0 0 0 0 25
n = 10:
1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 12 14 16 18 20
0 0 0 0 15 0 21 24 27 30
0 0 0 0 0 0 28 32 36 40
0 0 0 0 25 0 35 0 45 50
0 0 0 0 0 0 42 48 54 60
0 0 0 0 0 0 49 56 63 70
0 0 0 0 0 0 0 64 72 80
0 0 0 0 0 0 0 0 81 90
0 0 0 0 0 0 0 0 0 100
Числа найдены так:
Любой разумный формат вывода принимается, но это должна быть матрица N-N-N, это не может быть просто список. Форматы, подобные приведенным ниже, принимаются, поскольку имеется N легко различимых столбцов размером 1 на N или строк размером N на 1:
[[1 2 3][0 4 6][0 0 9]] <-- OK
[[1 0 0][2 4 0][3 6 9]] <-- OK
ans = <-- OK
1 2 3
0 4 6
0 0 9
Самый короткий код в байтах побеждает.
источник
n=0
где в таблицах умножения нет нуля? Я могу понять,n=1
будет ли вывод 1, но зачем включать ноль?n=0
должен быть матрицей 0 на 0, иначе вопрос будет противоречивым.Ответы:
J, 22 байта
Он выводит матрицу 0 на 0 для
n=0
.источник
Mathematica
123 122 117 98 9273 байтаБлагодаря 24 байтам, сохраненным благодаря LegionMammal978, и еще 19 байтов от alephalpha!
Удивительно, но в этой таблице несколько экземпляров любого целого числа
n
будут иметь такой же относительный порядок в спирали, как и в самой таблице! Первое появление числа происходитn
в той самой ячейке, где это число появляется первым в таблице (когда каждый заполняет таблицу построчно). Это означает, что подход может полностью игнорировать спиральное ограничение, поскольку он не имеет никакого отношения к результату. (См. Объяснение ниже.)пример
объяснение
Мы используем тот факт, что спиральный порядок позиций любой цифры n совпадает с порядком позиций строк-столбцов, возвращаемых функцией
Positions
,!Местоположение первого вхождения каждого числа (будь то один порядок по спирали или по позиции стола) будет первым возвращаемым элементом
Position
. Эта ячейка первого появления останется как есть. Остальные экземпляры числа заменяются на 0.Давайте посмотрим, как это работает, рассматривая для случая
n==18
. Идея состоит в том, чтобы начать с таблицы умножения:и найдите позиции строки-столбца каждого числа. Например, 18 находится в строке 2, столбец 9 (первый экземпляр); Ряд 3, столбец 6; Ряд 6, столбец 3; и строка 9, столбец 2. Они имеют соответствующие положения спирального порядка {44, 58, 68, 82}.
как показано в следующей таблице.
Последние 3 экземпляра 18 нужно заменить на 0. (Мы будем использовать большие жирные синие нули, чтобы их было легко заметить.)
источник
Function
?ReplacePart[t=1##&~Array~{#,#},Join@@(Rest[t~Position~#]&/@Union@@t)->0]&
Python,
99 95 90 89 8781 байтГольф-код:
Ungolfed:
Выход:
источник
MATLAB,
96 88 87 8679 байтовЭто 79-байтовый код, который следует за примерами выходных данных (особенно для n = 0)
Этот размер равен 75 байтам, и он имеет такое же поведение, за исключением того, что n = 0 приведет к созданию пустого массива согласно смыслу вопроса (N by N array = 0 по 0 = пустой массив).
Это также работает с Octave . Вы можете попробовать это онлайн здесь . Код уже добавлен в виде файла с именем «multspiral.m». Поэтому в приглашении Octave введите
multspiral
и нажмите клавишу ввода. Затем вы должны ввести размер таблицы (например, 4). Вывод будет распечатан.Как это работает?
Сначала для этого требуется ввод числа (например, 6, 4 и т. Д.)
Затем мы обрабатываем случаи для
n=0
иn=1
- к ним предоставляется особая обработка, поскольку они являются двумя, которые не следуют правилу, которое я использую для генерации массивов - на самом деле это может быть на 5 байт короче, если не для неясногоn=0
случая.Затем для всех значений
n>2
мы делаем некоторые циклы, пока матрица не будет увеличена до правильного размера.На самом деле есть только три простых различия между
n
иn+1
для всехn>=2
. Эти:Новый столбец добавляется справа в массиве, который содержит числа
n(1:n)
. Это легко рассчитывается с помощью:Любые элементы, которые будут добавлены в этот новый столбец, должны быть удалены из существующей матрицы (установлены в ноль), поскольку они всегда будут приходить позже по спирали, чем новый столбец. Это удаляется с помощью встроенного цикла for, чтобы установить все элементы в текущей матрице, которые в новом столбце, равны нулю.
В большинстве случаев есть новый нижний ряд, для которого каждый элемент, кроме того, который находится в новом столбце, будет равен нулю. Когда новый столбец добавлен, из-за преднамеренно созданных индексов «вне границ» автоматически добавляется 0. Одна из сильных сторон MATLAB заключается в том, что он может увеличивать массивы без какой-либо специальной обработки, поэтому мы можем просто добавить новую строку и столбец. с:
Наконец, у нас есть конец цикла for - который когда-то достигнут, матрица
m
содержит наш вывод. Поскольку вы гибки с форматом вывода, матрица отображается простоm
в виде новой строки без точки с запятойВ качестве примера, если мы запустим программу, введите число 10, мы получим следующий вывод:
источник
Haskell,
10399 байтПример использования:
f 4
->[[1,2,3,4],[0,0,6,8],[0,0,9,12],[0,0,0,16]]
.Я только что обнаружил
Data.Lists
модуль, который имеет хорошие функции в списках (таких какreplace
) и реэкспортеData.List
,Data.List.Split
иData.List.Extras
.источник
Рубин,
676361 байт63 байта
67 байт
Использование:
источник