Латинский квадрат представляет собой квадрат , который не повторяется символов в строках или столбцах: .
13420
21304
32041
04213
40132
И, как знают многие игроки в судоку, вам не нужны все числа, чтобы вывести оставшиеся числа.
Ваша задача - сжать латинский квадрат до как можно меньшего числа байтов. Вы должны предоставить одну или две программы, которые сжимают / распаковывают.
Различная информация:
- Используемые числа всегда будут
0..N-1
, гдеN
длина края квадрата, иN<=25
- При декомпрессии латинский квадрат должен быть идентичен вводу.
- Ваша программа (ы) должна быть способна (де) сжать любой латинский квадрат (в пределах максимального размера квадрата), а не только те, которые я предоставил. Коэффициенты сжатия должны быть одинаковыми.
- Вы должны фактически запустить сжатие и распаковщик, чтобы получить ваш счет (Нет времени выполнения конца вселенной)
Тестовые случаи можно найти на github . Ваша оценка - общий размер сжатых тестовых случаев.
РЕДАКТИРОВАТЬ: По состоянию на 20:07 7 июля я обновил контрольные примеры (чтобы исправить проблему поколения). Пожалуйста, перезапустите вашу программу на новых тестовых случаях. Спасибо, Андерс Касорг .
code-challenge
compression
Натан Меррилл
источник
источник
0
хотяn-1
:)n
разные символы. : PОтветы:
Питон,
1281,3751268,625 байтМы кодируем латинский квадрат по одному «решению» за раз, где каждое решение имеет одну из этих трех форм:
На каждом шаге мы делаем все логические выводы, которые можем, основываясь на предыдущих решениях, а затем выбираем решение с наименьшим числом возможных вариантов выбора, которые, следовательно, принимают наименьшее количество битов для представления.
Выбор предоставляется простым арифметическим декодером (div / mod по количеству вариантов). Но это оставляет некоторую избыточность в кодировке: если k декодирует в квадрат, где произведение всех чисел выбора было m , то k + m , k + 2⋅ m , k + 3⋅ m ,… декодируют в тот же квадрат с некоторым оставшимся состоянием в конце.
Мы используем эту избыточность, чтобы избежать явного кодирования размера квадрата. Декомпрессор начинает с попытки декодирования квадрата размером 1. Всякий раз, когда декодер завершает работу с оставшимся состоянием, он выбрасывает этот результат, вычитает m из исходного числа, увеличивает размер на 1 и пытается снова.
Выход:
источник
np.stack()
. В этом случае его можно заменить наnp.array([…])
, и я сделал это в текущей версии.MATLAB,
3'062,52'888,125 байтЭтот подход просто отбрасывает последнюю строку и последний столбец квадрата и преобразует каждую запись в слова определенной битовой глубины. Битовая глубина выбирается минимальной для заданного размера квадрата. (Предложение @KarlNapf) Эти слова просто добавляются друг к другу. Декомпрессия как раз наоборот.
Сумма для всех тестовых случаев составляет 23'105 бит или 2'888.125 байт. (Все еще сохраняется для обновленных тестовых случаев, поскольку размер моих выходных данных зависит только от размера входных данных.)
источник
n=9..16
4 битов достаточно.Python 3, 10772 бита (1346,5 байт)
Требуется 0,1 секунды для сжатия и распаковки комбинированных тестовых случаев.
Проверьте счет на Ideone .
источник
len(possible)
является 1 иpossible.index(rows[i][j])
является 0 , так что символ кодируется без каких - либо затрат.J 2444 байта
Полагается на встроенную функцию
A.
преобразования в и из перестановки целых чисел [0, n) и индекса перестановки.Компресс, 36 байт
На входе находится двумерный массив, представляющий латинский квадрат. Каждая строка преобразуется в индекс перестановки, и этот индекс преобразуется в список из 255 базовых цифр и заменяется значением ASCII. Каждая строка затем соединяется с использованием символа ASCII на 255.
Распаковка, 45 байт
Разбивает входную строку при каждом значении ASCII 255 и анализирует каждую группу как базовые 255 цифр. Затем, используя количество групп, создайте список целых чисел [0, длина), переставьте его в соответствии с каждым индексом и верните в виде 2-мерного массива.
источник
Python,
605245213556 байтcompress
принимает квадрат как многострочную строку, как в примерах, и возвращает двоичную строку, тогда какdecompress
делает наоборот.Удалите последний ряд + столбец и застегните остальное.
base64
не кажется необходимымисточник
Python 3, 1955 байт
Еще один, который использует индексы перестановки ...
выход
источник
Python3 - 3
572351 байтdataCompress
берет список целочисленных кортежей и возвращает строку.dateDeCompress
берет строку и возвращает список целочисленных кортежей.Короче говоря, для каждой строки эта программа берет индекс перестановки строк и сохраняет его в базе 36. Распаковка занимает много времени с большими входами, но сжатие действительно быстрое даже на больших входах.
Использование:
dataCompress([(2,0,1),(1,2,0),(0,1,2)])
результат:
c|4|3|0
dataDeCompress("c|4|3|0")
результат:
[(2, 0, 1), (1, 2, 0), (0, 1, 2)]
источник
permutations
вызовы вlist
вызовы -permutations
возвращает генератор, который лениво генерирует все перестановки, но если вы пытаетесь превратить его в alist
, он охотно генерирует все перестановки, что требует очень долгое время.O(n)
времени, а неO(n!)
методом грубой силы проверки всех перестановок .Java, 2310 байт
Мы преобразуем каждую строку квадрата в число, представляющее, какую лексикографическую перестановку он использует, используя факторические числа, также известные как система факторных чисел. , которая полезна для нумерации.
Мы записываем квадрат в двоичный файл, где первый байт является размером квадрата, а затем у каждой строки есть один байт для числа байтов в двоичном представлении Java BigInteger, за которым следуют байты этого BigInteger.
Чтобы повернуть процесс вспять и распаковать квадрат, мы читаем размер обратно, а затем каждый BigInteger и используем это число для генерации каждой строки квадрата.
Permutor адаптирован из класса, который я написал несколько лет назад, для работы с перестановками:
Использование:
С латинским квадратом
latin.txt
сожмите это:И распакуйте его:
источник