Питон, 456 429 381
import turtle as t
L="fl"
R="fr"
d=L*3+R*3
b=(d+R)*3
a=[b,120,L*3+"fflflffflflfrflflfffl"+R*4+"flf",90,b+"ffrfrflffrffrfrfrflflf",120,(R*5+L*5+R+L)*5+"rrfr"+L*5+R*2+L*2+R*4+"f",72,(d+"f")*5+"rfl"+((d+"b")*5)[:-1],120]
l=t.lt
f=t.fd
b=t.bk
r=t.rt
p=input()*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
for c in a[p]:exec c+"(a[p+1])"
t.getscreen().getcanvas().postscript(file="o")
Я реализовал примитивный интерпретатор с l r f b
операторами, которые перемещают курсор черепахи под углом фигур. За один раз получается только один угол. Я сжал строки, повторно используя строки (вроде как псевдо-подпрограммы), кроме этого, я не проверял, использовал ли я лучший путь. Он выводит в файл PostScript.
Небольшое объяснение кода без гольфа:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
Импортирует встроенный модуль черепахи и определяет макросы, которые сокращают строки. Модуль Turtle использует команды для перемещения «черепахи» по экрану (т.е. вперед (100), влево (90))
netList=[
#tetrahedron
tetrahedron,120,
#cube
Left*3+"fflflffflflfrflflfffl"+Right*4+"flf",90,
#octohedron, builds off the tetrahedron
tetrahedron+"ffrfrflffrffrfrfrflflf",120,
#dodecahedron
(Right*5 + Left*5 + Right + Left)*5
+"rrfr"+
Left*5 + Right*2 + Left*2 + Right*4 + "f",72,
#icosahedron
(diamond+"f")*5 +"rfl"+((diamond+"b")*5)[:-1],120
]
Этот список содержит углы и последовательности движений. Тетраэдр был сохранен для повторного использования с октоэдром.
l=t.left
f=t.forward
b=t.back
r=t.right
Это та часть, которая мне нравится, она выполняет односимвольные локальные функции, поэтому вызовы могут быть сокращены и автоматизированы с помощью предварительно определенных строк.
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
Это начинается с ввода (между 1 и 5) и преобразования его в индекс, который указывает на строку формы в списке netList. Эти настройки черепахи, чтобы показать всю сеть. Их можно было бы опустить, если бы задача состояла в том, чтобы просто нарисовать их, но, поскольку нам нужен вывод изображения, они нужны.
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
Цикл for принимает команды в строке последовательности команд и выполняет их, поэтому для такой строки, как «fl», выполняется «вперед (угол); влево (угол);» вызывая вновь созданные локальные функции. последняя строка выводит файл с именем 'o' в формате постскриптума с использованием функции черепаха.
Для запуска :
Скопируйте его в файл и запустите оттуда. Когда вы запустите его, он будет ждать ввода числа от 1 до 5 (я просто изменил его, чтобы он спрашивал перед настройкой черепахи). Когда вы вводите число, появляется окно и рисует сеть. если вы хотите, чтобы он шел быстрее, вы можете добавить t.speed(200)
раньшеsetup
.
Вы можете скопировать и вставить его в интерпретатор, но при raw_input()
вызове он использует следующую введенную строку "t.setup(.9,.9)"
вместо числа. Поэтому, если вы сделаете это, скопируйте до raw_input()
, введите число, а затем скопируйте остальные. Он предназначен для запуска в целом. Или вы можете скопировать его в функцию и вызвать его.
Вот его результаты (конвертированные из postscript):
Примечание: их расположение в окне изменилось, но их общая форма одинакова.
Это немного грубой силы для гольф-кода, но я устал от попыток найти согласованный шаблон между формами.