Bash + Galaretka + GraphViz, 52 znaki, 52 lub 63 bajty
Biorąc pod uwagę, że omawiane programy nie zgadzają się co do tego, jakiego kodowania znaków użyć, program jest pełen znaków kontrolnych. Oto, jak to wygląda pod xxd
kodowaniem Latin-1 (które reprezentuje każdy znak w jednym bajcie):
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
Nie udało mi się jednak uruchomić programu bez przekonwertowania danych wejściowych na UTF-8 z jakiegoś powodu (co spowodowałoby, że miałyby one 63 bajty). Logicznie powinno to działać jako Latin-1 - żaden ze znaków nie jest poza zakresem od 0 do 255 - ale ciągle pojawiają się błędy „indeksu ciągu poza zakresem” bez względu na to, jak skonfiguruję zmienne środowiskowe kodowania znaków. Będzie to więc musiało być policzone jako 63 bajty, chyba że ktoś wymyśli sposób na uruchomienie go bez ponownego kodowania.
Program może być nieco bardziej czytelny, jeśli zinterpretujemy go w kodowaniu Jelly:
jelly e 'ƓRŒcj€⁾--Y“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»;”}'|circo -Tps
Program pobiera liczbę punktów na standardowym wejściu i wyświetla obraz PostScript na standardowym wyjściu. (Można go trywialnie dostosować do wyświetlania w dowolnym formacie obsługiwanym przez GraphViz, zmieniając -Tps
na końcu; po prostu PostScript ma najkrótszą nazwę. Prawdopodobnie możesz zapisać pięć znaków, usuwając -Tps
, ale wtedy otrzymasz wynik w wewnętrznym formacie graficznym GraphViz że nic więcej nie obsługuje, co prawdopodobnie nie ma znaczenia dla celów pytania).
Zasadniczo jest to tylko program Jelly, który wywołuje GraphViz, aby wykonać rysunek; jednak Jelly nie wydaje się mieć żadnych możliwości uruchamiania zewnętrznych programów, więc musiałem użyć bash, aby połączyć je ze sobą. (Oznacza to również, że tańsze jest ręczne wprowadzanie żądania Jelly ze standardowego wejścia; zwykle pobiera dane z wiersza poleceń, ale oznaczałoby to dodatkowe bajty w opakowaniu bash). circo
Automatycznie ustawi wszystkie punkty, o które proszony jest o narysowanie w okręgu , więc kod Jelly musi tylko poprosić go o narysowanie listy punktów, z których wszystkie są ze sobą połączone. Oto jak to działa:
Ɠ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
Zastosowanie Jelly pozwala nam delikatnie skompresować ciąg, który konfiguruje wyjście GraphViz za pomocą wbudowanego słownika. Słownik ma graph
, node
i point
. Irytujące, nie ma shape
(ma SHAPE
, ale GraphViz rozróżnia wielkość liter), więc musimy zakodować tę postać po znaku.
Oto dane wyjściowe dla danych wejściowych 21 (z niewielką modyfikacją programu, aby uzyskać dane wyjściowe w formacie, który można przesłać do Stack Exchange):
n
i narysować linie dlan
punktów.