Bash + Jelly + GraphViz, 52 caracteres, 52 ou 63 bytes
Dado que os programas em questão discordam sobre qual codificação de caracteres usar, o programa está cheio de caracteres de controle. Aqui está o que parece embaixo xxd
, na codificação Latin-1 (que representa cada caractere em um byte):
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
Na verdade, não consegui executar o programa sem converter a entrada em UTF-8 por algum motivo (o que tornaria 63 bytes de comprimento). Logicamente deveria funcionar como Latin-1 - nenhum dos caracteres está fora do intervalo de 0 a 255 -, mas continuo recebendo erros de "índice de string fora do intervalo", não importa como eu configure as variáveis de ambiente de codificação de caracteres. Portanto, isso terá que ser contado como 63 bytes, a menos que alguém possa descobrir uma maneira de executá-lo sem recodificá-lo.
O programa pode ser um pouco mais legível se o interpretarmos na codificação de Jelly:
jelly e 'ƓRŒcj€⁾--Y“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»;”}'|circo -Tps
O programa pega o número de pontos na entrada padrão e gera uma imagem PostScript na saída padrão. (Ele pode ser adaptado trivialmente para produzir em qualquer formato que o GraphViz suporte, alterando o -Tps
no final; é apenas que o PostScript tem o nome mais curto. É possível salvar cinco caracteres removendo o -Tps
, mas obtém o resultado no formato de imagem interno do GraphViz que nada mais suporta, o que provavelmente não conta para os propósitos da pergunta.)
Fundamentalmente, este é apenas um programa Jelly que chama o GraphViz para fazer o desenho; no entanto, o Jelly não parece ter recursos para executar programas externos, então tive que usar o bash para vinculá-los. (Isso também significa que é mais barato fazer com que o Jelly solicite a entrada do stdin manualmente; normalmente ele recebe a entrada da linha de comando, mas isso significaria bytes extras no wrapper do bash.) circo
Organizará automaticamente todos os pontos solicitados a desenhar em um círculo , portanto, o código Jelly precisa solicitar que ele desenhe uma lista de pontos, todos conectados entre si. Veja como funciona:
Ɠ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
O uso do Jelly permite compactar levemente a string que configura a saída do GraphViz por meio de seu dicionário embutido. O dicionário tem graph
, node
e point
. Irritantemente, ele não possui shape
(possui SHAPE
, mas o GraphViz faz distinção entre maiúsculas e minúsculas), portanto, precisamos codificar esse caractere por caractere.
Aqui está a saída da entrada 21 (com uma ligeira modificação no programa para torná-lo em um formato que pode ser carregado no Stack Exchange):
n
e desenhar linhas para ganharn
pontos.