Sierpinski üçgeni Çizim olmuştur yapılan ölüm . Bununla birlikte yapabileceğimiz başka ilginç şeyler var. Üçgende yeterince sert kesilirse, baş aşağı üçgenleri fraktal grafiğin düğümleri olarak görebiliriz. Bu grafikte yolumuzu bulalım!
İlk önce, her düğüme bir sayı atayalım. En büyük baş aşağı üçgeni sıfır düğüm olacak ve daha sonra sol üst sağdaki sıraya ardışık sayılar vererek, katman katman katman aşağı iniyoruz.
Küçük sayıların biraz daha az bulanık olduğu daha büyük sürüm için tıklayın.
Numaralandırma tanımlamak için başka bir yol merkez düğüm endeksi olmasıdır (Elbette, bu deseni. Mavi üçgen içindeki sonsuza devam eder) 0
ve düğümün çocukları i
(bir sonraki-küçük ölçekli komşu üçgenler) indeksleri var 3i+1
, 3i+2
ve 3i+3
.
Bu grafiğin etrafında nasıl hareket ederiz? Herhangi bir üçgenden bir adım atabileceğiniz altı doğal adım vardır:
- Bir kişi daima kenarlardan birinin ortasındaki noktadan, mevcut düğümün üç çocukundan birine hareket edebilir. Biz bu hamle tayin edeceğiz
N
,SW
veSE
. Biz düğüm üzerinde şu anda eğer Örneğin2
, bu düğümlerin yol açacak7
,8
,9
sırasıyla. Kenarlardaki (dolaylı torunları) diğer hareketlere izin verilmez. - Ayrıca, üçgenin birinden, üçgenin kenarına temas etmemek koşuluyla, doğrudan ebeveyne veya iki dolaylı atadan birine hareket edebilir. Biz bu hamle tayin edeceğiz
S
,NE
veNW
. Biz düğüm üzerinde şu anda eğer Örneğin31
,S
yol açacağını10
,NE
geçersiz olacak veNW
yol açacak0
.
Meydan okuma
İki negatif olmayan tam sayı göz önüne alındığında x
ve y
, bir kısa yol bulmak x
için y
sadece altı hareket yukarıda tarif edilen kullanılarak,. Birkaç kısa yol varsa, bunlardan herhangi birini yazdırın.
Kodunuzun, yukarıdaki şemada gösterilen 5 seviyeden daha fazlası için çalışması gerektiğini unutmayın. Bunu varsayabilirsin x, y < 1743392200
. Bu, 32 bit işaretli bir tamsayı içine sığmalarını sağlar. Bunun ağacın 20 seviyesine karşılık geldiğine dikkat edin.
Kodunuz, herhangi bir geçerli girişi 5 saniyeden daha kısa sürede işlemelidir . Bu bir kaba kuvvet genişlemesi ilk aramayı hariç tutarken, oldukça gevşek bir kısıtlama olmalıdır - referans uygulamam, yarım saniyede 1000 derinlik için rasgele girdiler kullanır (bu, düğümler için ~ 480 basamaklı sayılardır).
STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) parametresi ile çıktı alarak bir program veya işlev yazabilirsiniz.
Çıkış dizeleri düz, açık liste olmalı N
, S
, NE
, NW
, SE
, SW
, herhangi makul bir ayırıcı kullanılarak (boşluk, linefeeds, virgül ","
...).
Standart kod-golf kuralları geçerlidir.
Test Kılıfları
İlk birkaç test durumu yukarıdaki şema kullanılarak elle yapılabilir. Diğerleri cevapların yeterince verimli olmasını sağlar. Bunlar için listelenmemiş aynı uzunlukta başka çözümler olabilir.
0 40 => N N N N
66 67 => S SW N N N
30 2 => NW NW -or- NE SW
93 2 => NE SW
120 61 => NW NW NW NW N SE SW N
1493682877 0 => S S NW NW
0 368460408 => SW SW N N SW SW SE SW SW N SE N N SW SW N SE SE
1371432130 1242824 => NW NW NE NW N SE SW SW SW SE SE SW N N N N SW
520174 1675046339 => NE NW NE NE SE SE SW SW N SE N SW N SW SE N N N N SE SE SW SW
312602548 940907702 => NE NW S SW N N SW SE SE SE SW SE N N SW SE SE SE SW
1238153746 1371016873 => NE NE NE SE N N SW N N SW N SE SE SW N SW N N SE N SE N
547211529 1386725128 => S S S NE NW N N SE N SW N SE SW SE SW N SE SE N SE SW SW N
1162261466 1743392199 => NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE