Питон, 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):
Примечание: их расположение в окне изменилось, но их общая форма одинакова.
Это немного грубой силы для гольф-кода, но я устал от попыток найти согласованный шаблон между формами.
d
это строка, которая делает два треугольника, так что это(d+'f')*5+setupPosition+(d+'b')*5
setup
делает окно черепахи достаточно большим, чтобы держать сеть. То же самоеgoto
, он перемещает «черепаху» в -200, 150.clear
очищает линию, сделаннуюgoto
. Их просто команды для настройки рисования.p=(ord(raw_input())-49)*2
принимает число от 1 до 5, соответствующее той форме, которую вы хотите.Mathematica
Вне конкурса, не бесплатный язык (если бесплатная пробная версия не считается бесплатной)
Использование:
источник
Питон 2 (с Каиром) - 239
Результаты:
источник
Логотип, 199 байт
Читая это назад, я вижу, что моя оригинальная версия не соответствовала спецификации в том виде, в котором она была написана (взять числовой аргумент и нарисовать одну фигуру), а скорее интерпретировалась другими ответами (нарисовать все фигуры). Новая версия исправляет это. Ожидается, что будет называться, например
q 5
.cs
должно быть сделано, прежде чем очистить экран и направить черепаху на север.q
вызывает основную функциюp
с 3 аргументами. Синтаксис для этого довольно раздутый, поэтому, чтобы побить мой предыдущий счет, мне пришлось сбрить байты в другом месте.новая версия
p
принимает 3 аргумента. Нет необходимостиx
иy
потому, что мы строим только одну сеть, ноd
шаг между подразделениями остается.s
по-прежнему число сторон на многоугольник, иn
теперь кодирует для двух разных вещей>n/8
количество подсчитываемых субъединиц, иn*45
это угол, на который необходимо повернуть черепаху перед запуском (используя естественный мод 360 для вращений. )Улучшенный цикл завершает рисование
s
линий с правым поворотом иs+2
линий с левым вращением в одном цикле.интерпретатор calormen кажется менее терпимым к отсутствующим пробелам, чем на момент моего первого поста, но код работает нормально http://turtleacademy.com/playground/en
Логотип, 200 байт
Переводчик на http://www.calormen.com/jslogo/# Предполагается, что черепаха указывает на север, прежде чем запустить программу. Используйте
cs
команду, чтобы очистить экран, наведите черепаху на север и поместите ее в начало координат в центре экрана.Базовая единица всех вышеперечисленных сетей - это пара полигонов. Они расположены в 2 ряда в шахматном порядке, образуя субъединицу из 4 многоугольников, которые можно перевести вертикально, чтобы образовались все сети (кроме октаэдра, который перемещается на чертеже икосаэдра и тетраэдра). Субъединица образует 1 сетку тетраэдра, 1/5 сетки икосаэдра, 1/3 сетки додекаэдра и 2/3 сетки куба (две субъединицы изображены, а два средних квадрата перекрываются).
Код без правил
источник
ht
чтобы скрыть это для изображения. Я рад, что я не сделал!