Напишіть програму, щоб намалювати двовимірну діаграму вузла на основі структури вузла. Вузол - це саме те, що звучить: петля мотузки, яка зав'язана. У математиці діаграма вузлів показує, де шматок мотузки перетинається над або під собою, щоб утворити вузол. Деякі приклади діаграм вузлів наведені нижче:
У лінії, де мотузка перетинає себе, перервається.
Вхід: вхід, що описує вузол, є масивом цілих чисел. Вузол, де мотузка перетинає себе n разів, може бути представлена як масив з n цілих чисел, кожне зі значенням у діапазоні [0, n-1]. Назвемо цей масив K .
Щоб отримати масив, що описує вузол, пронумеруйте кожен із сегментів 0 до n-1. Сегмент 0 повинен вести до сегмента 1, який повинен вести до сегмента 2, який повинен вести до сегмента 3, і так далі, поки сегмент n-1 не буде петлею назад і не призведе до сегмента 0. Сегмент закінчується, коли через нього перетинається інший сегмент мотузки ( представлена перервою у рядку на діаграмі). Візьмемо найпростіший вузол - вузол трилистника. Після того, як ми пронумерували сегменти, сегмент 0 закінчується, коли сегмент 2 перетинає його; сегмент 1 закінчується, коли сегмент 0 перетинає його; а сегмент 2 закінчується, коли сегмент 1 перетинає його. Таким чином, масив, що описує вузол, є [2, 0, 1]. Загалом, сегмент x починається там, де відрізаний відрізок x-1 mod n , і закінчується там, де відрізок K [x] перетинає його.
На зображенні нижче представлені діаграми вузлів із позначеними сегментами та відповідними масивами, що описують вузол.
Три верхні діаграми - це справжні вузли, в той час як нижня три - це петлі мотузки, які перетинаються через них, але насправді не є вузловими (але все ще мають відповідні коди).
Ваше завдання полягає в тому, щоб написати функцію, яка займає масив цілих чисел K (ви можете назвати це щось інше), що описує вузол (або петлю мотузки, яка насправді не зав'язана), і яка створює відповідну діаграму вузлів, як описано вище приклади. Якщо ви можете, надайте версію свого коду або пояснення, що не має волі, а також надайте зразки результатів коду. Один і той же вузол часто може бути представлений декількома різними способами, але якщо діаграма вузлів, яку виконує ваша функція, має вхід як одне з можливих уявлень, ваше рішення є дійсним.
Це код-гольф, тому найкоротший код у байтах виграє. Лінія, що представляє мотузку, може мати товщину в 1 піксель, однак під і перехрестям слід чітко розрізнити (розмір розриву мотузки повинен бути більшим за товщину мотузки принаймні на піксель з обох боків) .
Я схвалюю відповіді, які покладаються на вбудовані можливості теорії вузлів, але той, який обраний в кінці кінців, не може покладатися на вбудовані можливості теорії вузлів.
Все, що я знаю про моє позначення: я вважаю, що є послідовності значень, які, здається, не відповідають жодному вузлу чи unknot. Наприклад, послідовність [2, 3, 4, 0, 1], здається, неможливо намалювати.
Припустимо, що ви переходите на перехрестя і, починаючи з цього перетину, слідуйте по шляху мотузки в одну сторону і позначте кожен маркований перетин, на який ви зіткнулися, з послідовно більшими інтегральними значеннями. Для чергування вузлів існує простий алгоритм перетворення моєї позначення в таку маркування, а для чергування вузлів тривіально конвертувати цю маркування в код Гаусса:
template<size_t n> array<int, 2*n> LabelAlternatingKnot(array<int, n> end_at)
{
array<int, n> end_of;
for(int i=0;i<n;++i) end_of[end_at[i]] = i;
array<int, 2*n> p;
for(int& i : p) i = -1;
int unique = 0;
for(int i=0;i<n;i++)
{
if(p[2*i] < 0)
{
p[2*i] = unique;
p[2*end_of[i] + 1] = unique;
++unique;
}
if(p[2*i+1] < 0)
{
p[2*i+1] = unique;
p[2*end_at[i]] = unique;
++unique;
}
}
return p;
}
template<size_t n> auto GetGaussCode(array<int, n> end_at)
{
auto crossings = LabelAlternatingKnot(end_at);
for(int& i : crossings) ++i;
for(int i=1;i<2*n;i+=2) crossings[i] = -crossings[i];
return crossings;
}
KnotData
в Mathematica ...: '(
Knot
вбудований! Приклад використання: << Units`; Convert[Knot, Mile/Hour]
врожайність 1.1507794480235425 Mile/Hour
. (Я думаю, що це смішно незалежно від того, правда це чи неправда; але насправді це правда.)