Описание задания:
Напишите программу как можно короче, чтобы нарисовать радиальный градиент в искусстве ASCII. Размер выходной сетки предопределен. Центральная точка и символы, которые будут использоваться для градиента, предоставляются в качестве входных данных для программы.
Градиент будет размером 70 × 25 символьных ячеек со следующими спецификациями
- Верхний левый угол сетки имеет координаты (0, 0).
- Градиент, состоящий из предоставленных символов, отображается на 35 единиц длины . Единица длины составляет один символ в высоту и два символа в ширину (поскольку
monospaced fonts
обычно символы имеют в два раза больше высоты). - В пределах этих 35 LU текущее расстояние от центральной точки умножается на количество символов градиента / 35, чтобы получить индекс символа для рисования в этой точке. Дробные числа для индекса здесь округляются до нуля. Единицы длины должны быть оставлены как действительные числа. (Конечно, если результаты совпадают, реализация не имеет значения.)
- Помимо этих 35 LU появляется только последний символ градиента. Тем не менее, поскольку последний градиентный «диапазон» уже начинается в пределах 35 LU, последний символ начинает казаться уже менее 35 LU.
Входные данные:
Входные данные задаются на стандартном входе и состоят из трех строк, каждая из которых заканчивается разрывом строки:
- В х - координата центральной точки градиента
- У координата центральной точки градиента
- Символы, используемые для рисования градиента. Те могут включать пробелы.
Выход:
Выходной сигнал - это градиент, определенный правилами выше для стандартного выходного сигнала. Стандартный поток ошибок игнорируется. Каждая линия градиента заканчивается разрывом строки. Никакие другие символы кроме тех, которые определены вводом, не могут появляться.
Пример ввода 1:
58
14
.:;+=xX$&
Пример вывода 1:
&&$$$$$$$$XXXXXXXXxxxxxxxxx===========++++++++++++++++++++++++++++++++
&$$$$$$$$XXXXXXXXxxxxxxxxx=========+++++++++++++;;;;;;;;;;;;;;;;;;;;;+
$$$$$$$$XXXXXXXXxxxxxxxx=========+++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$$XXXXXXXXxxxxxxxx========++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$XXXXXXXXxxxxxxxx========+++++++++;;;;;;;;;;;;;:::::::::::::;;;;;
$$$$$XXXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;;;:::::::::::::::::::::;
$$$$$XXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;:::::::::::::::::::::::::
$$$$XXXXXXXXxxxxxxx=======++++++++;;;;;;;;;:::::::::::::::::::::::::::
$$$$XXXXXXXxxxxxxx========+++++++;;;;;;;;::::::::::...............::::
$$$XXXXXXXXxxxxxxx=======+++++++;;;;;;;;:::::::::...................::
$$$XXXXXXXxxxxxxx=======++++++++;;;;;;;::::::::.......................
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;::::::::......... ........
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::........ ......
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::....... .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::....... .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::....... .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::........ ......
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;::::::::......... ........
$$$XXXXXXXxxxxxxx=======++++++++;;;;;;;::::::::.......................
$$$XXXXXXXXxxxxxxx=======+++++++;;;;;;;;:::::::::...................::
$$$$XXXXXXXxxxxxxx========+++++++;;;;;;;;::::::::::...............::::
$$$$XXXXXXXXxxxxxxx=======++++++++;;;;;;;;;:::::::::::::::::::::::::::
$$$$$XXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;:::::::::::::::::::::::::
$$$$$XXXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;;;:::::::::::::::::::::;
$$$$$$XXXXXXXXxxxxxxxx========+++++++++;;;;;;;;;;;;;:::::::::::::;;;;;
Пример ввода 2:
0
0
X.X.X.X
Пример вывода 2:
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXX............XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXX.............XXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXX
..................XXXXXXXXXXX..........XXXXXXXXXX...........XXXXXXXXXX
................XXXXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXXX
...............XXXXXXXXXXXX...........XXXXXXXXXX...........XXXXXXXXXXX
............XXXXXXXXXXXXXX...........XXXXXXXXXXX..........XXXXXXXXXXXX
.........XXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX.............XXXXXXXXXXX...........XXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXX...........XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX................XXXXXXXXXXXX............XXXXXXXXXXXXXXX
XXXXXXXXXXX..................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXX
...........................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXX
........................XXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXX
......................XXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXX
..................XXXXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXXXX
.............XXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX.................XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX...................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Пример ввода 3:
70
25
.:+#
Пример вывода 3:
######################################################++++++++++++++++
#################################################+++++++++++++++++++++
#############################################+++++++++++++++++++++++++
##########################################++++++++++++++++++++++++++++
#######################################+++++++++++++++++++++++++++++++
####################################++++++++++++++++++++++++++++++++++
##################################++++++++++++++++++++++++++++++++++++
################################++++++++++++++++++++++++++++++++++++++
##############################++++++++++++++++++++++++++++++++::::::::
#############################+++++++++++++++++++++++++++::::::::::::::
###########################+++++++++++++++++++++++++::::::::::::::::::
##########################++++++++++++++++++++++++::::::::::::::::::::
#########################++++++++++++++++++++++:::::::::::::::::::::::
########################+++++++++++++++++++++:::::::::::::::::::::::::
#######################++++++++++++++++++++:::::::::::::::::::::::::::
######################++++++++++++++++++++::::::::::::::::::::::::::::
#####################+++++++++++++++++++::::::::::::::::::::::::::::::
####################+++++++++++++++++++::::::::::::::::::::::::.......
####################++++++++++++++++++::::::::::::::::::::::..........
###################+++++++++++++++++++::::::::::::::::::::............
###################++++++++++++++++++:::::::::::::::::::..............
###################+++++++++++++++++:::::::::::::::::::...............
##################++++++++++++++++++::::::::::::::::::................
##################++++++++++++++++++:::::::::::::::::.................
##################++++++++++++++++++:::::::::::::::::.................
Пример ввода 4
59
1
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>|,.-#+!$%&/()=?*'_:;
Пример вывода 4
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCAzyxwutsrqonmljihgfdcba abcdfghijl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><97654310ZYXVUTSQPONMKJIHGEDCBAyxwvutrqponmkjihgffeedeeffghijkm
$+#-.|><98654320ZYXWUTSRQONMLKIHGFEDBAzyxwutsrqponmlkjihhggggghhijklmn
$!#-.,|<987643210YXWVUSRQPONLKJIHGEDCBAzywvutsrqponmllkjjjiiijjjkllmno
$!+#.,|><87654210ZYXVUTSRQONMLKJHGFEDCBAzywvutsrrqponnmmlllllllmmnnopq
%!+#-.|><987543210YXWVUTRQPONMLJIHGFEDCBAzyxwvutsrrqppooonnnnnoooppqrr
%$!+-.,|><87654310ZYXWVTSRQPONMLJIHGFEDCBAzyxxwvuttssrrqqqqqqqqqrrsstt
&%!+#-.,><987643210ZYXVUTSRQPONMLKJIHGFEDCBAzyyxwvvuutttssssssstttuuvv
&%$!+#.,|><986543210ZYWVUTSRQPONMLKJIHGFEDDCBAzzyyxwwwvvvuuuuuvvvwwwxy
/&%$!#-.,|><976543210ZYXVUTSRQPONMLKKJIHGFEEDCBBAAzzyyyxxxxxxxxxyyyzzA
(/&%!+#-.,|><876543210ZYXWVUTSRQPONMLKJJIHGGFEEDCCBBBAAAzzzzzzzAAABBBC
)(/%$!+#-.,|><876543210ZYXWVUTSRQPPONMLKKJIIHGGFFEEDDDCCCCCCCCCCCDDDEE
=)(&%$!+#-.,|><986543210ZYYXWVUTSRQPPONMMLKKJIIHHGGGFFFEEEEEEEEEFFFGGG
?=)(&%$!+#-.,|><9876543210ZYXWVVUTSRRQPOONMMLLKJJJIIIHHHHHHHHHHHHHIIIJ
*?=)(/%$!+#-.,|><98765432210ZYXWWVUTSSRQQPOONNMMLLLKKKJJJJJJJJJJJKKKLL
'*?=)(/&%$!+#-.,|><98765432110ZYXXWVUUTSSRRQPPOOONNNMMMMMLLLLLMMMMMNNN
_'*?=)(/&%$!+#-.,|><988765432210ZYYXWWVUUTTSSRRQQQPPPOOOOOOOOOOOOOPPPQ
:_'*?=)(/&%$!+##-.,|><9877654332100ZYYXXWVVUUTTTSSSRRRRQQQQQQQQQRRRRSS
;;:_'*?=)(/&%$!+#-.,,|><98876554322100ZZYYXXWWVVVUUUTTTTTTTTTTTTTTTUUU
;;;:_'*?=)(/&&%$!+#-.,,|><9987665443321100ZZYYYXXXWWWWVVVVVVVVVVVWWWWX
;;;;;:_'*?=)(/&%$$!+#-..,|>><9887665544322211000ZZZYYYYYYYYYYYYYYYYYZZ
;;;;;;:_'*??=)(/&%%$!+##-.,,|><<99877665544333222111100000000000001111
;;;;;;;;:_'*?==)(/&&%$!++#--.,,|>><<9887766655544433333322222223333334
Прошла неделя Пришло время обнародовать длины решения от конкурса нашего университета:
167 - Python
189 - Haskell
203 - C
210 - VB.NET
219 - C
И наши собственные решения:
91 - GolfScript
125 - Ruby
157 - PowerShell
Ответы:
Рубин 1.9,
116 114 108101 персонажисточник
Brainfuck - 1286
Это одно из моих любимых творений. Включает работающую (для некоторых определений работающую) функцию квадратного корня.
Вывод немного отключен из-за ошибок округления, но все еще распознаваем. Плавающая точка выше моего текущего уровня навыка. К сожалению, это будет работать только с 16-битными ячейками, что означает, что он будет медленным.
Выход 1:
Выход 2:
источник
Питон - 141 символ
источник
Delphi, 200 (и 185)
Так как мне нравится ascii-art, здесь Delphi-версия этого кода:
Не очень впечатляющий характер, так как мне пришлось использовать блок Math для связи в функции Min (). Кроме того, ReadLn () почему-то не читает целые числа и строки за один вызов, так что это довольно дорого. Новая строка тоже нуждается в большом количестве символов. Кроме того, Delphi нужно много пробелов вокруг ключевых слов. Не очень горжусь этим.
Во всяком случае, вывод образца 4 дает мне:
Если вы примете вывод с отступом, эта версия будет немного короче, если заменить символ новой строки на отступ, который приведет к переносу символа из 80 символов (симуляция перевода строки на стандартных консолях 80x25)
(это экономит 15 символов, в общей сложности 185 символов). Вывод для "0 0 XXXX":
(Вы можете увидеть отступ ?! ;-))
источник
APL (74)
Причина, по которой он заключен в функцию, заключается в том, что изменение
⎕IO
не относится к остальной части системы.Объяснение:
L←⍴⊃C Y X⎕IO←⍞⎕⎕0
: Набор⎕IO
для0
(решений на массивах 0 на основе , а не на основе 1), множество Х с⎕
(первой строкой для чтения), набор Y , чтобы⎕
(второй строка для чтения), множество С до⍞
(чтения третьей линии, без форматирования), и множество L на длину (⍴
) отC
.25 70
: размеры матрицы.¨⍳⍵
: для каждого элемента в матрице, где каждый элемент имеет свои собственные координаты ...⍵-Y X
: разница между текущей точкой и центральной точкой1 2÷⍨
: разделить координату X на 2 (потому что символ в два раза меньше ширины).5*⍨+/2*⍨
: взять квадратный корень из суммы квадратов35÷⍨
: разделить на 35⌊L⌊
: взять минимальное количество символов и текущее значение и округлить его,/
: Значения по-прежнему заключены в список (только из одного элемента), и это создаст интервал в выходных данных, поэтому «освободите» значения из их списков.C[
...]
: использовать значение, которое мы нашли в качестве индекса в списке символов⎕←
Теперь у нас есть матрица, где каждый элемент (x, y) является символом для (x, y), поэтому выведите матрицу.источник
Perl 5,10, 103 символа
источник
Perl, 120 символов
источник
abs
есть причина.$x,$y=<>,<>;
.Windows PowerShell, 157
Ничего примечательного. Забит до смерти уже
источник
С, 176
Вот перевод моего решения Delphi на C с сохранением 24 символов:
Вы можете проверить этот код здесь: http://www.ideone.com/oTvHt
источник
main()
я предполагаю, и таким образом сохранить точку с запятой.Общий Лисп, 173 персонажа
Единственный реальный трюк, который я здесь использую, это использование
как символ новой строки
источник
Scala 223 (204 без App-Wrapper)
Динамическая установка столбцов и строк (70, 25) позволила бы заполнять градиенты экрана.
источник
C # 311
Думал, что составлю длинную программу, чтобы другие чувствовали себя лучше:
Ввод осуществляется с консоли, по одной строке за раз (две строки для координат и одна для символов градиента).
Спасибо Джои за советы.
Образец 1: http://ideone.com/X0jIZ
Пример 2: http://ideone.com/RvICt
источник
int
вместоfloat
, выраженияx-i
иy-j
становятся типаint
. Из-за этого вместо значения типа float будет вызываться int Math.Abs (значение int), что приведет к некоторой потере точности. Я попробовал это и получил некоторые острыеint
s сэкономит больше;)). Да, и*.5
стоит только один символ.