Задний план
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