Пітона, 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
операторами, які переміщують курсор черепахи навколо кута фігури. За один раз він повертає лише один кут. Я стиснув рядки шляхом повторного використання рядків (на зразок psuedo-підпрограм), крім цього, я не перевірив, чи використовую я найкращий шлях. Він виводить у файл постскрипту.
Невелике пояснення коду без гольфу:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
Імпортує вбудований модуль черепахи та визначає макроси, що вкорочують струни. Модуль черепахи використовує команди для переміщення «черепашки» по екрану (тобто вперед (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()
, поки не введіть число, ніж скопіюйте вставити решту. Він призначений для запуску в цілому. Або ви можете скопіювати його у функцію та зателефонувати.
Ось його результати (перетворені з постскрипту):
Примітка: положення цих у вікні змінилося, але загальна їх форма однакова.
Це трохи груба сила для кодового гольфу, але я втомився намагатися знайти послідовний малюнок між формами.