Düğüm yapısına dayanarak bir düğümün 2-D diyagramını çizmek için bir program yazın. Bir düğüm tam olarak neye benzediği gibidir: bağlanmış bir ip ipi. Matematikte, bir düğüm diyagramı düğümü oluşturmak için bir ip parçasının kendisinin üstünden veya altından geçtiği yerleri göstermektedir. Bazı örnek düğüm diyagramları aşağıda gösterilmiştir:
İpin kendi üzerinden geçtiği çizgide bir kopma var.
Giriş: Düğümü tanımlayan giriş bir tam sayı dizisidir. Halatın n defa kendisinin üzerinden geçtiği bir düğüm , her biri [0, n-1] aralığında bir değere sahip olan bir n tamsayı dizisi olarak gösterilebilir . Bu diziyi K diyelim .
Bir düğümü tanımlayan diziyi elde etmek için, 0'dan n-1'e kadar olan bölümlerin her birini numaralandırın. 0 segmenti, segment 2'ye yol açması gereken segment 2'ye, segment 3'e yol açmalı ve segment n-1 geri dönene ve segmenti 0'a gelene kadar devam etmelidir. diyagramdaki çizgide bir mola ile gösterilir). En basit düğümü alalım - trefoil düğümü. Segmentleri numaralandırdıktan sonra, segment 2 üstünden geçtiğinde segment 0 biter; bölüm 1 üzerinden geçtiğinde bölüm 1 sona erer; ve segment 2, segment 1 üzerinden geçtiğinde biter. Böylece, düğümü tanımlayan dizi [2, 0, 1] 'dir. Genel olarak, x kesimi, x-1 kesiminin n bıraktığı yerde başlar ve K [x] kesiminin üstünden geçtiği yerde biter .
Aşağıdaki resim, etiketli bölümlere ve düğümü tanımlayan ilgili dizilere sahip düğüm şemalarını göstermektedir.
En üstteki üç diyagram gerçek düğümlerdir, alttaki üç ise üzerlerinden geçen ancak gerçekte düğümlenmemiş (ancak buna karşılık gelen kodlara sahip olan) ip halkalarıdır.
Göreviniz Sayı dizisi alır bir işlev yazmaktır K (bunu farklı bir şey diyebiliriz) bir düğüm (veya aslında düğümlü değil ipin döngü) açıklayan ve yukarıda açıklandığı gibi, ilgili düğüm diyagramı üretir hangi örnekleri. Yapabiliyorsanız, kodunuzun eski bir sürümünü veya bir açıklamasını sağlayın ve ayrıca kodunuzun örnek çıktılarını sağlayın. Aynı düğüm çoğu zaman farklı şekillerde gösterilebilir, ancak işlev çıktısı veren düğüm şemasının girişini olası gösterimlerinden biri olarak kabul etmesi durumunda çözümünüz geçerlidir.
Bu kod golf, bayt cinsinden en kısa kod kazanır. İpi temsil eden çizgi 1 piksellik bir kalınlığa sahip olabilir, ancak alt ve üst geçişler açıkça ayırt edilebilir olmalıdır (ipteki kopma boyutu ipin kalınlığından en az iki tarafın bir pikselinden büyük olmalıdır) .
Yerleşik düğüm teorisi yeteneklerine dayanan cevapları değiştireceğim, fakat sonunda seçilen cevap, yerleşik düğüm teorisi yeteneklerine dayanamaz.
İşaretlemem hakkında bildiğim her şey: Herhangi bir düğüme veya bilmediğine karşılık gelmeyen değerler dizileri olduğuna inanıyorum. Örneğin, [2, 3, 4, 0, 1] dizisinin çizilmesi imkansız gibi görünüyor.
Bunun dışında, bir geçit aldığınızı ve bu geçitten başlayarak, ipin yolunu bir yönde takip ettiğinizi ve başarılı bir şekilde daha büyük integral değerleri ile karşılaştığınız etiketlenmemiş her geçidi etiketlediğinizi varsayalım. Değişken düğümler için, gösterimimi böyle bir etiketlemeye dönüştürecek basit bir algoritma vardır ve değişken düğümler için bu etiketi Gauss Koduna dönüştürmek çok önemlidir:
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'da kullanamıyorum ...: '(
Knot
yerleşik bir yapı var! Örnek kullanım: << Units`; Convert[Knot, Mile/Hour]
verim 1.1507794480235425 Mile/Hour
. (Bunun doğru ya da yanlış olmasına bakılmaksızın komik olduğunu düşünüyorum; ama aslında doğru.)