Задний план
Искусство ASCII - это практика создания изображений с использованием текста ASCII для формирования фигур.
Псевдоним - это эффект, создаваемый большими «пикселями» ASCII-графики размером с символы. Изображение становится блочным и плохо различимым. Сглаживание устраняет этот эффект, создавая градиент и смягчая жесткие края ASCII-графики.
Соревнование
Ваша задача состоит в том, чтобы написать самую короткую из возможных программ, которая возьмет часть искусства ASCII и выведет версию, которая была сглажена.
Что за сглаживание?
Все искусство ASCII будет состоять из двух типов символов: пробелы и непробельные символы. Для каждого символа, не являющегося пробелом, ваша программа должна определить, находится ли она в положении, в котором она должна быть сглажена. Если это так, то вам нужно заменить его на правильный символ. Если это не так, то персонаж остается прежним.
Как вы узнаете, должен ли персонаж быть сглаженным? Ответ зависит от символов, которые находятся непосредственно выше, ниже, слева и справа от символа ( не диагонали ). Вот диаграмма того, когда требуется сглаживание, где ?
и x
может обозначать любой непробельный символ.
x? -> d?
? ?
?x -> ?b
? ?
? ?
?x -> ?F
? ?
x? -> Y?
x -> ; Note: This character has been changed from _ to ;
? ?
? ?
x -> V
?x -> ?>
x? -> <?
x -> @
Ввод (и пример предварительного сглаживания ASCII art)
Во-первых, будет две строки ввода (в STDIN), число H, за которым следует число W. Затем будет H строк ровно по W символов каждая (исключая символ новой строки). Эти следующие строки будут искусством ASCII, которое должно быть сглажено. Вот пример ввода (не красивый, но тестовый):
7
9
888888
888888
999 98 7
666666
666666
6666
6
Вывод (и пример сглаженного искусства)
Ваша программа должна выводить в STDOUT искусство ASCII (тех же размеров), которое было сглажено. Вот вывод для вышеуказанного ввода. Обратите внимание, как символы границы обрабатываются как ограничивающие пробелы.
d8888>
d8888F
<99 98 @
Y6666b
Y6666>
Y66F
V
Это может выглядеть не очень хорошо (из-за пробела между строками в блоке кода), это выглядит лучше с большим ASCII-изображением, а качество зависит от используемого шрифта.
Другой пример
вход
12
18
xx xxx xxx
xxxx xxx xxx
xxxxxx xxx xxx
xxx xxx xxx xxx
xxxx xxx xxx xxx
xxxxxx xxx xxx
xxxx xxx xxx
x xx xxx xxx x
xx xxx xxx xx
xxx xxx xxx xxx
xxxx xxx xxx xx
xxxxx xxx xxx x
Выход
db <xb <xb
dxxb Yxb Yxb
dxxxxb Yxb Yxb
dxx xxb xxb xxb
Yxxb xxF xxF xxF
YxxxxF dxF dxF
YxxF dxF dxF
; YF dxF dxF ;
xb dxF dxF dx
xxb <xF <xF <xx
xxxb Yxb Yxb Yx
Yxxx> Yx> Yx> V
Правила, ограничения и примечания
Ваша программа должна быть написана только для печатных символов ASCII, чтобы мы могли создавать рисунки из этих программ. Кроме этого, применяются стандартные правила игры в гольф.
источник
_
стало;
потому, что работает лучше.Ответы:
Рубин,
180168 символовЕще одна реализация Ruby, которая использует zip-подход. Вы можете увидеть второй пример, работающий онлайн .
Редактировать: Использование
readlines
сохраняет 12 символов.источник
Рубин
275265263261258254244243214212207Образец 1: http://ideone.com/PfNMA
Образец 2: http://ideone.com/sWijD
источник
0..h-1
можно записать как0...h
. 3)G=[];h.times{G<<gets}
может быть написано такG=readlines
же, как в вашем коде C #. 4) После шага 3. переменная h становится бесполезной, значения h и w используются только один раз, поэтомуh=gets.to_i;w=gets.to_i;H=(0..h-1);W=(0..w-1)
их можно записать какH=0...gets.to_i;W=0...gets.to_i
. 5) В этом случаеand
можно записать как&&
, что не нужно пробелов вокруг. 6) у вас есть дополнительный; и вы посчитали перевод строки в конце файла, которые не нужны. Это значит 214 символов: ideone.com/CiW0lH=0..gets.to_i
когда писал код, но, похоже, он не работал (очевидно, это было по другим причинам).map
вместоeach
2)z=->...
вместоdef z...end
.map
вместоeach
изменений. Однако для лямбда-синтаксиса, я думаю, это потребовало бы, чтобы использованиеz
было в форме,z.call(args)
а неz(args)
, таким образом, добавляя немного к числу символов. Пожалуйста, дайте мне знать, если я что-то упустил.[]
.Javascript, 410 символов:
ungolfed:
Оригинал,
440 символов:NB Я предположил, что первые две входные строки на самом деле не имеют значения, а размер следующих строк правильный. Я также рассчитываю, что смогу отрубить еще несколько символов, когда у меня будет шанс!
источник
m={22:"b",28:"d",13:"Y",7:"F",20:";",5:"V",6:">",12:"<",4:"@"}
подстрочный затем преобразуйте м сparseInt()
:m[parseInt(y[d](''),2)]
. Это уменьшает размер до 373 символов.Питон, 259 символов
Программа считывает входные данные в одну строку
I
(с пробелами, разделяющими строки), собирает список из 5-ти кортежей, содержащих символ и его четыре окружающих символа, а затем просматривает результирующий символ с помощью индексации строки.источник
PHP -
359330282268257 символовисточник
\r\n
. Я обновил свой код для работы с EOL в стиле Unix\n
.Питон,
246241WC и тест на образце 2, диффузный с выходом раствора Ruby вверху:
источник
C #
591563источник