Задний план
PICASCII - это аккуратный инструмент, который преобразует изображения в ASCII- .
Он достигает различной степени яркости, используя следующие десять символов ASCII:
@#+';:,.`
Мы скажем, что эти charxels (элементы символов) имеют яркость от 1 (знак-знак) до 10 (пробел).
Ниже вы можете увидеть результаты преобразования небольшого кода, уэльского флага, загнутого фрактала, большой форели и небольшого гольфа, отображаемых с правильным шрифтом:
Вы можете увидеть изображения в этой скрипке и загрузить их с Google Drive .
задача
В то время как конечные результаты PICASCII визуально приятны, все пять комбинированных изображений весят 153 559 байт. Насколько эти изображения могут быть сжаты, если мы готовы пожертвовать частью их качества?
Ваша задача - написать программу, которая принимает художественное изображение ASCII, такое как приведенные выше, и минимальное качество в качестве входных данных и печатает сжатие изображения с потерями - в виде полной программы или функции, возвращающей одну строку - которая удовлетворяет требование к качеству.
Это означает, что вы не можете написать отдельный декомпрессор; он должен быть встроен в каждое сжатое изображение.
Исходное изображение будет состоять из charxels с яркостью от 1 до 10, разделенных переводом строки на строки одинаковой длины. Сжатое изображение должно иметь одинаковые размеры и использовать одинаковый набор символов.
Для несжатого изображения, состоящего из n символов, качество сжатой версии изображения определяется как
где c i - яркость i- го charxel вывода сжатого изображения, а u i - яркость i- го charxel несжатого изображения.
счет
Ваш код будет работать с пятью изображениями сверху в качестве входных данных и минимальными настройками качества 0,50, 0,60, 0,70, 0,80 и 0,90 для каждого из изображений.
Ваша оценка - это среднее геометрическое размеров всех сжатых изображений, т. Е. Двадцать пятый корень из произведения длин всех двадцати пяти сжатых изображений.
Самый низкий балл побеждает!
Дополнительные правила
Ваш код должен работать с произвольными изображениями, а не только с теми, которые используются для оценки.
Ожидается, что вы оптимизируете свой код для тестовых случаев, но программа, которая даже не пытается сжать произвольные изображения, не получит от меня одобрения.
Ваш компрессор может использовать встроенные компрессоры потока байтов (например, gzip), но вы должны сами реализовать их для сжатых изображений.
Допускаются встроенные функции, обычно используемые в декомпрессорах потока байтов (например, базовое преобразование, декодирование по длине прогона).
Компрессор и сжатые изображения не обязательно должны быть на одном языке.
Однако вы должны выбрать один язык для всех сжатых изображений.
Для каждого сжатого изображения применяются стандартные правила игры в гольф.
верификация
Я создал сценарий CJam, чтобы легко проверить все требования к качеству и рассчитать оценку для представления.
Вы можете скачать интерпретатор Java здесь или здесь .
e# URLs of the uncompressed images.
e# "%s" will get replaced by 1, 2, 3, 4, 5.
"file:///home/dennis/codegolf/53199/original/image%s.txt"
e# URLs of the compressed images (source code).
e# "%s-%s" will get replaced by "1-50", "1-60", ... "5-90".
"file:///home/dennis/codegolf/53199/code/image%s-%s.php"
e# URLs of the compressed images (output).
"file:///home/dennis/codegolf/53199/output/image%s-%s.txt"
e# Code
:O;:C;:U;5,:)
{
5,5f+Af*
{
C[IQ]e%g,X*:X;
ISQS
[U[I]e%O[IQ]e%]
{g_W=N&{W<}&}%
_Nf/::,:=
{
{N-"@#+';:,.` "f#}%z
_::m2f#:+\,81d*/mq1m8#
_"%04.4f"e%S
@100*iQ<"(too low)"*
}{
;"Dimension mismatch."
}?
N]o
}fQ
}fI
N"SCORE: %04.4f"X1d25/#e%N
пример
Bash → PHP, оценка 30344,0474
cat
Достигает 100% качества для всех входов.
$ java -jar cjam-0.6.5.jar vrfy.cjam 1 50 1.0000 1 60 1.0000 1 70 1.0000 1 80 1.0000 1 90 1.0000 2 50 1.0000 2 60 1.0000 2 70 1.0000 2 80 1.0000 2 90 1.0000 3 50 1.0000 3 60 1.0000 3 70 1.0000 3 80 1.0000 3 90 1.0000 4 50 1.0000 4 60 1.0000 4 70 1.0000 4 80 1.0000 4 90 1.0000 5 50 1.0000 5 60 1.0000 5 70 1.0000 5 80 1.0000 5 90 1.0000 SCORE: 30344.0474
Ответы:
Java → CJam, оценка ≈4417,89
Требуется банка CJam в пути к классам. Если вы дадите ему 2 аргумента командной строки (имя файла и качество), он добавляет «.cjam» к имени файла и записывает сжатое изображение туда. В противном случае он рассчитывает свою оценку по 5 тестовым изображениям, которые предположительно находятся в текущем каталоге. Программа также проверяет каждое сжатое изображение автоматически. Возможно, вы захотите еще раз проверить расчет баллов в случае каких-либо расхождений.
Используемые методы (пока что): масштабирование вдвое (по горизонтали, вертикали или обоим), если это не слишком сильно снижает качество, пользовательское кодирование RLE и базовое преобразование для упаковки большего количества данных в каждый символ, оставаясь в диапазон печати ASCII.
источник
javac -cp cjam-0.6.5.jar Compress.java
, ноjava -cp cjam-0.6.5.jar Compress
говоритError: Could not find or load main class Compress
иjava Compress
не находит класс CJam.-cp .:cjam-0.6.5.jar
(в windoze я думаю, что вам нужно точка с запятой вместо двоеточия)Python 3.5 (основной и выходной) (в настоящее время неконкурентный)
С днем рождения, вызов! Вот ваш подарок: ответ!
РЕДАКТИРОВАТЬ: преобразованный вывод в код Python, улучшенная степень сжатия (немного) EDIT2: сделал его печатать сырой, когда
size
равен 1. Улучшенный счет, но счет должен быть рассчитан снова. EDIT3: @Dennis указал, что у меня все еще есть ошибки, чтобы исправить, поэтому я отметил ответ как неконкурентныйКод:
Этот ответ может использовать много улучшений, поэтому я, вероятно, над этим поработаю больше на выходных.
Как это работает:
size
.size
и попробуйте снова.Этот алгоритм хорошо работает для низкого качества (0,5, 0,6), но не слишком хорошо работает для изображений более высокого качества (фактически раздувает). Это также очень медленно.
Здесь у меня есть все сгенерированные файлы, поэтому вам не придется заново их генерировать.
источник
comping
должна бытьcompimg
), которую я исправил для запуска программы. Если я не допустил ошибку при запуске вашего кода, размеры некоторых из сгенерированных изображений являются неправильными (например,image2.txt
имеет 33 164 байта, ноimage2-50.0.txt
имеет 33 329), а другие не генерируют тот же файл при запуске сгенерированных программ (image3-50.0.txt
имеет качество 0,5110 , но запуск сгенерированной программы приводит к качеству 0,4508 ).image3-50.0.py
с вашего Dropbox, и он совпадает с файлом, который я сгенерировал.