Bash + Jelly + GraphViz, 52 Zeichen, 52 oder 63 Bytes
Angesichts der Tatsache, dass die fraglichen Programme nicht übereinstimmen, welche Zeichenkodierung verwendet werden soll, ist das Programm voll von Steuerzeichen. So sieht es xxd
in der lateinischen 1-Kodierung aus (die jedes Zeichen in einem Byte darstellt):
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
Ich konnte das Programm jedoch nicht zum Laufen bringen, ohne die Eingabe aus irgendeinem Grund in UTF-8 umzuwandeln (was eine Länge von 63 Byte zur Folge hätte). Logischerweise sollte es als Latin-1 funktionieren - keines der Zeichen liegt außerhalb des Bereichs von 0 bis 255 -, aber ich erhalte weiterhin Fehler "String-Index außerhalb des Bereichs", egal wie ich die Umgebungsvariablen für die Zeichencodierung konfiguriere. Dies muss also als 63 Byte gezählt werden, es sei denn, jemand kann eine Möglichkeit finden, es auszuführen, ohne es neu zu codieren.
Das Programm ist möglicherweise etwas besser lesbar, wenn wir es in Jellys Codierung interpretieren:
jelly e 'ƓRŒcj€⁾--Y“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»;”}'|circo -Tps
Das Programm nimmt die Anzahl der Punkte auf der Standardeingabe und gibt ein PostScript-Bild auf der Standardausgabe aus. (Es kann trivial angepasst werden, um in jedem von GraphViz unterstützten Format auszugeben, indem das -Tps
am Ende geändert wird . Es ist nur so, dass PostScript den kürzesten Namen hat. Sie können -Tps
wahrscheinlich fünf Zeichen speichern, indem Sie das entfernen , aber dann werden Sie im internen GraphViz-Bildformat ausgegeben das unterstützt sonst nichts, was für die zwecke der frage wohl nicht zählt.)
Grundsätzlich ist dies nur ein Jelly-Programm, das GraphViz zum Zeichnen aufruft. Jelly scheint jedoch keine Fähigkeiten zum Ausführen externer Programme zu haben, daher musste ich bash verwenden, um sie miteinander zu verknüpfen. (Dies bedeutet auch, dass es billiger ist, Jelly-Eingaben von stdin manuell anzufordern; normalerweise werden sie über die Befehlszeile eingegeben, dies würde jedoch zusätzliche Bytes im Bash-Wrapper bedeuten.) circo
Alle Punkte, die gezeichnet werden sollen, werden automatisch in einem Kreis angeordnet Der Jelly-Code muss ihn also nur bitten, eine Liste von Punkten zu zeichnen, die alle miteinander verbunden sind. So funktioniert das:
Ɠ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
Durch die Verwendung von Jelly können wir den String, der die GraphViz-Ausgabe konfiguriert, über das integrierte Wörterbuch leicht komprimieren. Das Wörterbuch hat graph
, node
und point
. Dummerweise hat es nicht shape
(es hat SHAPE
, aber GraphViz ist case-sensitive), so haben wir zu kodieren , die Zeichen- für -Zeichen.
Hier ist die Ausgabe für Eingabe 21 (mit einer geringfügigen Änderung am Programm, damit es in einem Format ausgegeben wird, das auf Stack Exchange hochgeladen werden kann):
n
und Linien fürn
Punkte ziehen müssten .