Я большой поклонник теории чисел. Большая вещь в теории чисел - модульная арифметика; определение является тогда и только тогда, когда . Забавная вещь, которую нужно сделать, это подняться до степеней, особенно когда модуль является простым числом. В частности, было доказано, что если и относительно простые (не имеют общих общих факторов, кроме ), то существует число такое, что .
Я объясню, что упражнение на примере. Давайте возьмем модуль . Возможный вывод программы или функции будет:
3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1
Каждая строка представляет собой список степеней первого числа в этой строке: первая строка , что эквивалентно по модулю . Второй ряд квадрата выше - это степени , и так далее, до последнего ряда, которые являются степенями .
Это волшебный квадрат по модулю, потому что:
- Квадрат симметричный; то есть й столбец такой же, как и й ряд.
- Все значения от до появляются как минимум один раз.
Ниже приведен единственный другой действительный выход для , начиная с степеней :
5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1
Соревнование
Создайте функцию или программу, которая при заданном простом числе p
выводит магический квадрат по модулю, то есть квадрат с длинами сторон p-1
, так что каждая строка является списком последовательных степеней первого элемента в строке и одинаковой для столбцов. Все числа между 0
и p
должны встречаться, и квадрат может содержать только числа в этом диапазоне.
Входные данные - это число или строка, а выходными данными могут быть ascii, матрица, массив массивов (любой приемлемый формат).
Это код-гольф, поэтому выигрывает самый короткий код.
источник
Ответы:
Желе ,
1310 байт-3 спасибо Нику Кеннеди
По ощущению какповторный коддолжен бытьв гольф-состоянии, но ябыне удавалисьdэто ...Попробуйте онлайн! (нижний колонтитул довольно форматирует как сетка)
Как?
источник
Древесный уголь , 36 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Примечание: конечный пробел. Объяснение:
Создание с
p-1
помощьюp-1
массива полномочий по1..p-1
индексам1..p-1
( по модулюp
).Карта над одной из строк, которая имеет ровно одну
1
.Расположите строки в порядке, заданном выбранной строкой, и отформатируйте вывод.
источник
J ,
353231 байтПопробуйте онлайн!
источник
Wolfram Language (Mathematica) ,
4643 байтаПопробуйте онлайн!
-3 благодаря алефале
источник
JavaScript (ES7),
9186 байтЭта версия пытается вычислить степени перед применением по модулю и потерпит неудачу приp≥11 из-за потери точности. В противном случае используется та же логика, что и в комментариях ниже.
Попробуйте онлайн!
JavaScript (ES6),
9287 байтЭта версия использует модульное возведение в степень для поддержки (намного) более высоких входных значений.
Попробуйте онлайн!
Как?
Нахождение первого ряда
Это работает даже в лексикографическом порядке - что является поведением по умолчанию
sort()
- потому что:Пример:
Построение матрицы
Эта часть может быть просто написана как:
источник
.indexOf(1)>p-3
экономит 3 байта.every
.Zsh ,
11790 байтПопробуйте онлайн!Попробуйте онлайн!Пусть Бог помилует мою душу. Здесь есть много плохой практики, позвольте мне объяснить, по крайней мере, самого крупного преступника:
Пример для
b=4
:Наконец, где
$c
появляется в остальной части программы, элементы массива оцениваются какeval set -- ....
.Наконец,
${#${(u)@}}
подсчитывает уникальные элементы в позиционных параметрах (т.е. есть ли цикл / есть1
s?)Комментарии, относящиеся к 117-байтовому ответу ниже.
Проблемы, которые мы должны преодолеть:
${#${(M)a:#1}
::#
удаляет совпадение и(M)
отменяет совпадение. Таким образом, это расширится до числа (${# }
)1
s в массиве. К сожалению, это расширение плохо сочетается с арифметикой цикла for, которую мы здесь используем. Если это так, он потенциально может сохранить байт.${${:-1}:*a}
Это пересечение набора между синглтоном1
и наборомa
. Это расширится до единственного,1
если это будет найдено в массиве. Используя эту опцию, мы сохраняем здесь один символ, но в целом теряем 1, откладывая добавление1
s в последнюю строку и столбец до конца.источник
Perl 6 ,
6557 байтПопробуйте онлайн!
Возможно, есть какой-то способ просто вывести сам квадрат, но он выполняет тот же процесс, описанный в вопросе, сортируя списки по их позициям в первом списке, который представляет собой просто перестановку от 1 до input-1. Возвращает в виде списка списков.
Кстати, есть много шуток, пытающихся обойти некоторые раздражающие ограничения Perl 6, связанные с последовательностями против массивов и анонимными переменными.
Объяснение:
источник
Python 2 , 108 байт
Попробуйте онлайн!
источник
print
вместо возвращения?05AB1E ,
1916 байт-3 байта благодаря @Emigna .
Попробуйте онлайн (нижний колонтитул - просто распечатать 2D-список).
Объяснение:
источник
LεI<LmI%}ÐΘOÏн<è
для 16 байтов.<è
было бы достаточно вместо того, чтоUΣXyk
я имел.Wolfram Language (Mathematica) , 67 байт
Попробуйте онлайн!
источник
Пари / ГП , 48 байт
Попробуйте онлайн!
источник
APL (NARS), 29 символов, 58 байтов
тест:
источник