Отказ от ответственности: я не знаю ни о каких решениях, не брутфорс
Греко-латинский квадрат, для двух наборов той же длины , А расположение ячеек, каждая из которых содержит уникальный (по всей площади) пары элемента из первого набора и элемент второго набора, так что все первые элементы и все вторые элементы пар являются уникальными в своих строках и столбцах. Как можно догадаться, наиболее часто используемые наборы - это первые букв греческого и латинского алфавитов.
Вот изображение греко-латинского квадрата 4х4:
Греко-латинские квадраты так же полезны, как и звучат ( статья в Википедии упоминает «планирование экспериментов, планирование турниров и построение магических квадратов»). Ваша задача, учитывая положительное целое число , генерировать греко-латинский квадрат.
вход
Целое положительное число ; гарантируется, что существует греко-латинский квадрат (то есть ).
Выход
Греко-латинский квадрат с длиной стороны n в виде двумерного массива, массива массивов, уплощенного массива или выводимых напрямую.
Заметки
- Вам не нужно специально использовать греческий и латинский алфавиты; например, также разрешен вывод пар натуральных чисел.
- Если вы решите использовать алфавит, который не может быть произвольно расширен, вы должны (теоретически; ваш код не должен заканчиваться до тепловой смерти вселенной) поддерживать максимальную длину стороны не менее 20.
Это код-гольф , поэтому выигрывает самый короткий код!
Ответы:
Желе ,
2120 байт-1 благодаря Нику Кеннеди (опция плоского вывода позволяет сохранить в байтах )→
ż"þ`ẎẎQƑ$Ƈ
F€p`Z€QƑƇ
Попробуйте онлайн! (Слишком медленно в течение
4
60-х годов на TIO, но если мы заменим декартову мощностьṗ
на Комбинацииœc
, она завершится - хотя 5, конечно, не будет!)Как?
источник
05AB1E ,
262322 байта-3 байта благодаря Emigna
-1 байт благодаря Кевину Круйссену
Попробуйте онлайн!
источник
n<ÝI‰
может быть<Ýã
<Ý
может бытьL
. Благодарность!ê}DIùQ
можноÙgQ}P
сохранить байт.R ,
164148 байтМножество байтов благодаря Джузеппе.
Попробуйте онлайн!
Совершенно неэффективно - я думаю, что это даже хуже, чем другие методы грубой силы. Даже для
n=3
этого, вероятно, будет время ожидания на TIO. Вот альтернативная версия (155 байт), которая работаетn=3
примерно за 1 секунду.m
l
g
all(1:n^2%in%(n*l+g-n))
l
g
l
иg
латинские квадраты?!
l
g
2^l
l
t(l)
l
g
sd
И последнее замечание: как часто в R-гольфе, я использовал переменную
T
, которая инициализируется какTRUE
, чтобы получить несколько байтов. Но это означает, что когда мне нужно было указать фактическое значениеTRUE
в определенииm
(параметрreplace
вsample
), мне пришлось использовать1
вместоT
. Точно так же, поскольку я переопределяю!
функцию, отличную от отрицания, мне пришлось использовать1-all(...)
вместо!all(...)
.источник
JavaScript (ES6),
159 147140 байтЭто простой перебор, и поэтому он очень медленный.
Попробуйте онлайн! (с предварительно подтвержденным выводом)
комментарии
источник
o
, либо; Вы можете просто вернутьсяm
в конце для 141Haskell ,
207 143233 байтаПопробуйте онлайн!
Хорошо, я думаю, что наконец-то понял. Он отлично работает при n = 5, n = 6 раз на TIO, но я думаю, что это может быть просто потому, что этот новый алгоритм невероятно неэффективен и в основном проверяет все возможности, пока не найдет тот, который работает. Сейчас я использую n = 6 на своем ноутбуке, чтобы посмотреть, не закончится ли он еще через некоторое время.
Еще раз спасибо @someone за указание на ошибки в моих предыдущих версиях
источник
C #,
520506494484 байтаАлгоритм поиска квадрата очень прост. Это ... грубая сила. Да, это глупо, но код-гольф не связан со скоростью программы, верно?
Код перед тем, как сделать его короче:
Теперь, если вы хотите проверить это с n = 3, вам придется ждать как час, так что вот другая версия:
Обновление: забыл удалить "публичный".
Обновление: используется «Система». вместо «использования системы»; Также, благодаря Кевину Круйссену , использовали «а» вместо «args».
Обновление: спасибо гастропнеру и кому-то .
источник
args
может бытьa
:)for(X = 0; X < Y; X++)
вfor(X = Y; X-->0; )
, что должно сохранить байт на цикл.i = 0
в определенииi
и сохранить байт.System
. Такжеif((m[i,j,k]=(m[i,j,k]+ 1) % n)!=0)
может бытьif((m[i,j,k]=-~m[i,j,k]%n)>0)
.Write
либо сохранять байты, добавляя\n
строку в вызове, либо иным образом поврежденный. Я думаю, что вы также можете вернуть массив напрямую.Октава , 182 байта
Методом грубой силы TIO сохраняет время ожидания, и мне приходилось запускать его несколько раз, чтобы получить результат при n = 3, но теоретически это должно быть хорошо. Вместо пар, подобных (1,2), она выводит матрицу комплексных сопряжений, таких как 1 + 2i. Это может немного растягивать правило, но, на мой взгляд, оно соответствует требованиям к выходу. Должен быть лучший способ сделать две строки в декларации functino, но в данный момент я не уверен.
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 123 байта
Попробуйте онлайн!
Я использую
TwoWayRule
нотацию,Transpose[...,2<->4]
чтобы поменять 2-е и 4-е измерения массива; в противном случае это довольно просто.Ungolfed:
источник
Python 3 ,
271267241 байтПодход грубой силы: генерируйте все перестановки пар, пока не будет найден греко-латинский квадрат. Слишком медленно, чтобы генерировать что-то большее, чем
n=3
на TIO.Благодаря alexz02 для игры в гольф 26 байт и потолку catcat для игры в гольф 4 байта.
Попробуйте онлайн!
Объяснение:
источник