Bash + Jelly + GraphViz, 52 символа, 52 или 63 байта
Учитывая, что рассматриваемые программы не согласны с тем, какую кодировку символов использовать, программа полна контрольных символов. Вот как это выглядит xxd
в кодировке Latin-1 (которая представляет каждый символ одним байтом):
00000000: 6a65 6c6c 7920 6520 2793 5213 636a 0c8e jelly e '.R.cj..
00000010: 2d2d 59fe 9a3f 1d15 dc65 34d3 8442 7f05 --Y..?...e4..B..
00000020: 1172 80cf fb3b ff7d 277c 6369 7263 6f20 .r...;.}'|circo
00000030: 2d54 7073 -Tps
Однако я не мог заставить программу работать, не преобразовав входные данные в UTF-8 по какой-то причине (что сделало бы ее длиной 63 байта). По логике это должно работать как Latin-1 - ни один из символов не выходит за пределы диапазона от 0 до 255 - но я продолжаю получать ошибки «строковый индекс вне диапазона» независимо от того, как я настраиваю переменные среды кодирования символов. Так что это будет считаться 63 байтами, если кто-то не сможет найти способ запустить его без перекодирования.
Программа может быть немного более читабельной, если мы интерпретируем ее в кодировке Jelly:
jelly e 'ƓRŒcj€⁾--Y“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»;”}'|circo -Tps
Программа берет количество точек на стандартном вводе и выводит изображение PostScript на стандартном выводе. (Его можно легко адаптировать для вывода в любом формате, поддерживаемом GraphViz, изменив его -Tps
в конце; просто у PostScript самое короткое имя. Возможно, вы можете сохранить пять символов, удалив -Tps
, но затем вы получите вывод во внутреннем формате изображения GraphViz. что больше ничего не поддерживает, что, вероятно, не имеет значения для целей вопроса.)
По сути, это просто программа Jelly, которая вызывает GraphViz для рисования; однако, у Jelly, похоже, нет никаких возможностей для запуска внешних программ, поэтому мне пришлось использовать bash, чтобы связать их вместе. (Это также означает, что дешевле делать Jelly-запрос ввода от stdin вручную; обычно это требует ввода из командной строки, но это будет означать дополнительные байты в оболочке bash.) circo
Автоматически упорядочит все точки, которые его просят нарисовать, в круг поэтому код Jelly просто должен попросить его нарисовать список точек, все из которых связаны друг с другом. Вот как это работает:
ƓRŒcj€⁾--Y“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»;”}
Ɠ read number from stdin
R produce range from 1 to that number
(here used to produce a list with
that many distinct elements)
Œc select all unordered pairs from that
⁾-- a string consisting of two hyphens
j€ join each pair via the string
Y join on newlines
; prepend (in this context)
“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ» "graph{node[shape=point]"
”} follow output with a "}" character
Использование Jelly позволяет нам немного сжать строку, которая настраивает вывод GraphViz через встроенный словарь. Словарь имеет graph
, node
и point
. Досадно, что он не имеет shape
(он есть SHAPE
, но GraphViz чувствителен к регистру), поэтому мы должны кодировать этот символ за символом.
Вот вывод для ввода 21 (с небольшими изменениями в программе, чтобы сделать вывод в формате, который может быть загружен в Stack Exchange):
n
и нарисовать линии дляn
очков.