Пирамидальная матрица - это квадратная матрица, в которой все числа увеличиваются или уменьшаются от центральной точки, как две матрицы ниже:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
Или:
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3
Если задано ненулевое целое число n
, создайте пирамидальную матрицу, в которой числа идут от одного 1
к n
другому в порядке возрастания (если n <0) или в порядке убывания (если n> 0) от центра. Если n
чёт, то будет 4 центральных номера (см. Примеры).
Как всегда:
- Дополнительный формат ввода и вывода
- Количество пробелов, разделитель и т. Д. Необязательно
Тестовые случаи:
1
1
-1
1
5
1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1
-5
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5
2
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
-2
2 2 2 2
2 1 1 2
2 1 1 2
2 2 2 2
-4
4 4 4 4 4 4 4 4
4 3 3 3 3 3 3 4
4 3 2 2 2 2 3 4
4 3 2 1 1 2 3 4
4 3 2 1 1 2 3 4
4 3 2 2 2 2 3 4
4 3 3 3 3 3 3 4
4 4 4 4 4 4 4 4
-10 < n < 10
?Ответы:
Желе ,
1817 байтПопробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
EXCEL: 126 байт
=MAX(MIN(MIN(CELL("row",RC)-1,CELL("col",RC)-1),MIN(((ABS(R1C1)-1)*2+3)-CELL("row",RC),((ABS(R1C1)-1)*2+3)-CELL("col",RC))),0)
Попробуйте онлайн *
Примечание: этот ответ использует нотацию R1C1. Если вы собираетесь попробовать это сами. Вы должны включить это в настройках Excel.
данная формула должна быть в каждой ячейке, присутствующей за пределами (2,2). Поместите желаемый размер пирамиды в (1,1).
быстрый экран-шапка формулы в действии:
Вот дополнительная картинка веселья с условным форматированием!
* Обновление занимает очень много времени.
источник
=MAX(MIN(MIN(ROW()-1,COLUMN()-1),MIN(((ABS(A1)-1)*2+3)-ROW(),((ABS(A1)-1)*2+3)-COLUMN())),0)
92 байт. Он все еще не обрабатывает случаи, и формула не может быть перемещена, так как ссылка на ячейку не заблокирована.=MEDIAN(MIN(ROW()-1,COLUMN()-1),ABS(A1)*2+1-MAX(ROW(),COLUMN()),0)
Range
или вам понадобится более 126 байтов.Python 2,
1099998Создать список
и поиграть с этим немного.
edit: новый способ создания списка + thx Lynn для двух байтов
источник
If n is even, then there will be 4 center numbers
MATL ,
2624 байтаПопробуйте онлайн! Или проверьте все контрольные примеры (слегка измененный код, служащий набором тестов).
объяснение
Код сначала строит выходной массив, предполагая положительный ввод
n
. Массив инициализируется как1
для нечетного ввода или как пустой массив для четного ввода (это создается как единичная матрица с размером, равным четности ввода). Затем повторяется следующееn
время для четного ввода иn-1
время для нечетного ввода: расширяйте массив, содержащий кадр0
, и добавляйте1
ко всем элементам.Например, шаги для ввода
n
:Начальный массив:
Расширить с рамкой:
Добавлять
1
:Расширить с рамкой:
Добавлять
1
:Это дает правильный вывод для положительного ввода. Если вход отрицательный, массив необходимо изменить, добавив минус
1
и приняв абсолютное значение:Вы можете наблюдать рост массива (модифицированный код для отображения промежуточных шагов) на MATL Online! Переводчик все еще бета. Если это не работает, нажмите «Выполнить» еще раз или перезагрузите страницу.
Код комментария
источник
.2
секундыPython 2.7:
123122120 байтпробники еще могут сохранить несколько байтов ...
edit1:
N=abs(n)
сохранить 1 байтedit2:
(i+1)*(n>0)or-n-i
сохранить 2 байтаисточник
Haskell,
119113110104102101 байтВозвращает матрицу в виде списка целых чисел, например:
f 2
->[[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]]
.Как это работает:
источник
Perl, 175 байт
Включает 1 байт для
-p
.(Есть завершающий символ новой строки, который я не знаю, как показать с уценкой, но он вам нужен).
Потребности
-p
, а также-M5.010
и-E
для запуска:Черт, это слишком долго ... Я попробую другие подходы, когда у меня будет время.
источник
eval
?y///
что не интерполирует, так что используйте двойные кавычки для интерполяции$w
и$k
затемeval
для выполненияy///
.Python 2, 109 байт
источник
J,
2926 байтиспользование
объяснение
i.
Глагол диапазона выводит[0, 1, ..., n-1]
для положительногоn
и[n-1, n-2, ..., 0]
отрицательного,n
что полезно здесь.источник
Mathematica, 78 байт
объяснение
Сделать исходную матрицу: 1x1, если нечетное, 2x2, если четное.
Создайте список от 1 до abs (вход) - 1.
Дополните исходный массив, используя вышеупомянутый список.
Добавьте 1 или -вход, в зависимости от того, что меньше.
Примените абсолютное значение ко всей матрице.
источник
PHP,
177157 байтбежать с
php -r '<code>
перебирает строки и столбцы, печатает значения в зависимости от их расстояния до центра.
$n=abs($z)+1
:+1
Спасает пару+1
и-1
в более поздних выражениях-$n+1
(предварительного увеличения в условии!) к$n-1
(-abs($z)
кabs($z)
)$n
: 1) пропускаются(
$n&1
верно для четных столбцов здесь! Помните+1
?)+1
.источник
Хаскелл,
191183173169168 байтИспользование:
Спасибо Ними за
2102024 байта!источник
negate
это(0-)
f
чтобы[id!id,tail!init]!!mod n 2
затем рядный его вg
и использовать1<2
охранник , чтобы связать промежуточный результат отрасли:g n| ... |q<-r<$>a n=([id!id,tail!init]!!mod n 2)q$a n
. Вам не нужно имя для основной функции.a
тоже можешь встроить (и переключиться обратно на1<2
охрану)g n| ... |1<2=[id!id,tail!init]!!mod n 2=<<map r$r$(\x->(x<$[1..x])++[x+1..n])<$>[1..n]
.m=map
в!
:...(++).m y
иg
:g n|n<0=m(m(abs.((n-1)+)))$g$abs n|1<2=[id!id,tail!init]!!mod n 2=<<m r$r$m(\x->(x<$[1..x])++[x+1..n])[1..n]
.JavaScript (ES6), 107 байт
l
это размер массива.n<0?-n-j:j+1
Кажется неуклюжим , но я не могу найти что - нибудь лучше.источник
Vim,
152143 байтаЯ уверен, что это может быть больше в гольфе, особенно те последние две строки, но мой мозг жарен.
Попробуйте онлайн!
Вот это в формате xxd с непечатными символами:
объяснение
Он строит пирамиду из центра, окружая номер центра
x
es:Затем он заменяет
x
es следующим числом иx
снова окружает его es:...и так далее. Для четных чисел это делает то же самое, но начинается с базы 2х2.
Вот код "без гольфа". Это несколько необычно в том смысле, что я «записываю» макрос, вводя его в буфер (следовательно, все
<C-v>
s), а затем удаляя его в регистр, что является лучшим способом, которым я нашел для создания макроса без фактического нажатия клавиш.источник
PHP, 215 байт
источник
R, 112 байт
Требуется целое число
n
в рабочей области, в противном случае запуститеn=scan()
дополнительные 8 байтов.источник