Учитывая входное целое число n
, нарисуйте числовую змею, то есть сетку, n x n
состоящую из чисел, 1
проходящих через n^2
друг друга, следующим образом:
Вход n = 3
:
7 8 9
6 1 2
5 4 3
Вход n = 4
:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
Вход n = 5
:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
(Вдохновлен этой проблемой от Project Euler.)
Это код-гольф , выигрывает самый короткий ответ в байтах!
4
? Или любое четное число.Ответы:
MATL , 3 байта
Попробуйте онлайн!
объяснение
Встроенный ... ¯ \ _ (ツ) _ / ¯
источник
C #,
203202196193178 байтСохраненный байт благодаря @StefanDelport.
Сохранено 22 байта благодаря @FelipeNardiBatista.
Это работает следующим наблюдением за тем, как строятся квадраты:
Как вы можете видеть, каждый бит добавляется к предыдущему квадрату. Для четных чисел мы идем направо от того места, где мы находились, до тех пор, пока они не оказались на единицу ниже, чем у квадрата, а затем остались до конца. Нечетные числа, по сути, противоположны, мы идем налево, до тех пор, пока не окажемся на единицу выше текущей высоты, а затем до самого конца.
Полная / Отформатированная версия:
источник
++i<=n;
могу статьn>++i
, больше ничего не вижу, +1.n%2<1?2:1
к2-x%2
? Я не проверял это в C #, но в C и Python это работало.for(int o=n-2+n%2>>1,i=r[o,o]=1,c=2,w=o,h=o,j;n>i++;){var b=i%2<1; ....
немного поиграл в гольфvar b=1-2*(i%2);r[h,w+=b]=c++;for(j=0;j<i-1;++j)r[h+=b,w]=c++;for(j=0;j<i-1;++j)r[h,w-=b]=c++;
Dyalog APL,
70564541 байтПопробуйте онлайн!
Как?
рассчитывает разницу между показателями;
1
и¯1
направо и налево,¯⍵
и⍵
вверх и вниз.1,⊢,¯1,-
приходит как1 ⍵ ¯1 ¯⍵
,+⍨⍴
растягивает этот массив до длины⍵×2
, так что финал2/⍳
может повторить каждый из них с увеличением числа повторений каждого второго элемента:тогда,
добавляет верхний левый элемент спирали,
ограничить первые ⍵ 2 элемента этого списка расстояний,
выполняет накопительную сумму,
оценивает индексы (
⍵[i] = ⍵[⍵[i]]
), чтобы перевести исходную матрицу с индексами каждого элемента, и, наконец,формы в виде
⍵×⍵
матрицы.источник
C
321307295284283282 байтаСпасибо @Zachary T и @Jonathan Frech за игру в гольф!
Выделяет двумерный массив нулей, затем начинает заполнять его где-то посередине. Наконец, печатаются значения, которые больше нуля, но меньше или равны квадрату ввода.
Попробуйте онлайн!
отформатирован:
источник
i,j,k,a,b,m;f(n){n*=n;int**l=calloc(a=m=3*n,4);
на,i,j,k,a,b,m,**l;f(n){n*=n;l=calloc(a=m=3*n,4);
чтобы сохранить байт?k<=n;
на,n>k;
чтобы сохранить байт.PHP , 192 байта
Попробуйте онлайн!
Таким же образом построить строку вместо массива
PHP , 217 байт
Попробуйте онлайн!
источник
[-1,1][$d&1]
->$d&1?:-1
for(;$k<$a;print join($o)."\n")ksort($o=&$e[+$k++]);
. И еще один:"%$l".d
. И еще один:$x*$l*$a+$y*$l
->($x*$a+$y)*$l
.$s
с мягким подчеркиванием (или буквой или цифрой); этот символ будет перезаписан..d
свой собственный подход для сохранения 2 байтовPHP,
185 176174 байтаЗапустите как трубу с
-nR
или проверьте это онлайн .сломать
источник
APL (Dyalog Classic) ,
3229 байтПопробуйте онлайн!
Использует
⎕io←1
. Начинается с матрицы 0 на 1 (⍪⍬
). 2N times (⍣2⍣⍵
) добавляет высоту матрицы (≢⍵
) к каждому из ее элементов, помещает1 2...height
ее справа (,⌸
) и поворачивает (⌽⍉
). Когда это закончено, корректирует ориентацию результата (⊖∘⌽⍣⍵⌽
) и переворачивает числа, вычитая их из N 2 +1 (1+×⍨-
).источник
Mathematica, 177 байтов
источник
C ++,
245228 байтПопробуйте онлайн!
Функция вычисляет и печатает значение каждого номера матрицы в зависимости от ее положения x, y , применяя эту логику:
Отформатированная версия :
источник
Python 3 ,
249247 байтЯ инициализирую двумерный массив и нахожу начальную точку, которая является центром для нечетного n или смещения (-1, -1) для четного n, затем масштабирую шаблон заливки / курсора с текущим номером «кольца». Я чувствую, что мне не хватает уловки для интерпретации указаний, но я не придумал ничего более дешевого.
Попробуйте онлайн!
-2 спасибо Захари Т!
источник
\t
и\n
как 1 байт и все еще получаю 249 байтlen("def f(n): M=[n*[0]for a in range(n)] x=y=n//2-(n%2<1) M[x][y]=i=s=1 while 1: t=s*2 for d in'R'+'D'*(t-1)+'L'*t+'U'*t+'R'*t: if i==n*n:print(*M,sep='\n');return v=[1,-1][d in'LU'] if d in'UD':x+=v else:y+=v M[x][y]=i=i+1 s+=1") 223
Wolfram Language (Mathematica) ,
(...)83 байтаБайт, измеренный в UTF8,
\[LeftFloor]
(⌊
) и\[RightFloor]
(⌋
) стоит 3 байта каждый. Mathematica не имеет специального набора байтовых символов.Попробуйте онлайн!
Использует закрытую форму для каждого из 4 случаев, а затем максимально тщательно, чтобы получить желаемый результат.
Возвращает двумерный массив целых чисел. Я не уверен, разрешено ли это, и хотя об этом было сказано в комментариях , ФП не ответила.
источник
Clojure, 206 байтов
Я полагаю, это неплохое начало, он строит доску последовательно в хэш-карту и затем разбивает ее на
n x n
списки. Этоdefmacro
оказалось довольно длинным, но код все еще короче, чем без него. Существует ли более лаконичный синтаксис для его описания?Большая часть байтов вычисляет начальную точку и строит логику поиска следующей скорости
v
. Возможно, вложенноеvec
будет лучше, но тогда вам нужно следить за двумя показателями и скоростями.источник
J , 41 байт
Попробуйте онлайн!
Делает то же самое, что и представление APL в ngn, но начинается с матрицы 1 на 1 и повторяется 2 × N-2 раза.
источник
Python 165 (или 144)
Это создает массив пустышек, затем поворачивает его и добавляет сторону, пока не будет достигнут правильный размер. В вопросе не указано, нужно ли использовать одну и ту же начальную точку для четных и нечетных чисел, в противном случае
if n%2==0:a=r(r(a))
можно удалить строку , сэкономив 21 байт.источник
J , 41 байт
стандартное форматирование
Этот подход основан на игре с игрой J (APL Уриэля использует похожую технику).
«Это неожиданно и достаточно элегантно, чтобы оправдать второй ответ, - подумал я.
По сути, мы не делаем ничего процедурного или даже геометрического. Вместо этого мы арифметически создаем простую последовательность, которая при суммировании и сортировке сканирования дает правильный порядок спирального числа слева направо, сверху вниз. Затем мы формируем это в матрицу и все готово.
Я добавлю более подробное объяснение, когда позволит время, но связанная статья объясняет это подробно.
Попробуйте онлайн!
источник
Python 3 (Stackless) ,
192188179150 байтПопробуйте онлайн!
Сохранено 4 байта, поскольку поворот вектора на 90 градусов легко выполняется без комплексных чисел
источник
R 183 байта
Попробуйте онлайн!
Выход - это матрица змеи (или матрица змеи, что угодно). Вероятно, это не самый эффективный метод, и он может быть в гольф, но я подумал, что это стоит показать. Я горжусь этим на самом деле!
Метод строит матрицу изнутри, всегда добавляя дополнительное количество целых чисел, равное количеству столбцов в матрице перед добавлением. Приведенный ниже шаблон привязывается либо по столбцам, либо по строкам, а также обращает некоторые значения, чтобы они добавлялись в правильном порядке.
193 байта
Точно такой же , как и выше, но окончательные
b
естьПопробуйте онлайн!
что дает немного более чистый вывод, но я не видел никаких особых критериев для вывода, поэтому первый ответ должен работать, если я не ошибаюсь.
источник