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 байтами). Логічно це повинно бути працювати як латинська-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
очок.