Spiral Permütasyon Dizisi


17

Doğal sayıları dikdörtgen bir spiral içinde toplayabiliriz:

 17--16--15--14--13
  |               |
 18   5---4---3  12
  |   |       |   |
 19   6   1---2  11
  |   |           |
 20   7---8---9--10
  |
 21--22--23--24--25

Ama şimdi onları dikdörtgen bir ızgara üzerinde bulunduğumuza göre, spirali farklı bir sırada çözebiliriz, örneğin saat yönünde gidip kuzeye doğru başlayabiliriz:

 17  16--15--14--13
  |   |           |
 18   5   4---3  12
  |   |   |   |   |
 19   6   1   2  11
  |   |       |   |
 20   7---8---9  10
  |               |
 21--22--23--24--25

Ortaya çıkan dizi açıkça doğal sayıların bir permütasyonudur:

1, 4, 3, 2, 9, 8, 7, 6, 5, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, 22, 21, 20, 19, 18, 17, ...

Göreviniz bu sırayı hesaplamak. ( OEIS A020703 , ancak spoyler uyarısı: başka ilginç bir tanım ve kendiniz bulmak isteyebileceğiniz birkaç formül içerir.)

Eğlenceli gerçek: 8 olası gevşeme emrinin hepsinin kendi OEIS girişi vardır.

Meydan okuma

Pozitif bir tam sayı verilen n, geri nyukarıda görülen diziye ait elemanından.

STDIN (veya en yakın alternatif), komut satırı bağımsız değişkeni veya işlev bağımsız değişkeni ile girdi alarak ve sonucu STDOUT (veya en yakın alternatif), işlev dönüş değeri veya işlev (çıkış) parametresi aracılığıyla çıktı alarak bir program veya işlev yazabilirsiniz.

Standart kuralları geçerlidir.

Test Durumları

1       1
2       4
3       3
4       2
5       9
6       8
7       7
8       6
9       5
100     82
111     111
633     669
1000    986
5000    4942
9802    10000
10000   9802

n = 11131 OEIS'e kadar olan tam bir liste için OEIS'teki b dosyasına bakın .

Yanıtlar:


6

Jöle, 11 10 bayt

’ƽð²+ḷ‘Ḥ_

Telefonumda başka bir Jelly cevabı.

’ƽð²+ḷ‘Ḥ_   A monadic hook:
’ƽ          Helper link. Input: n
’             n-1
 ƽ            Atop integer square root. Call this m.
   ð         Start a new dyadic link. Inputs: m, n
    ²+ḷ‘Ḥ_    Main link:
    ²+ḷ       Square m, add it to itself,
       ‘      and add one.
        Ḥ     Double the result
         _    and subtract n.

Burada deneyin .


Jelly'i kullanmaya başlamak için herhangi bir ipucu var mı? Çatalların / kancaların nasıl ayrıştırıldığını söyleyemem.
Lynn

Önce APL veya J'yi öğrenin. Zincirler aslında trenlerden daha kolaydır, çünkü fonksiyonların hepsi sabit bir düzene sahiptir.
lirtosiast

Anlıyorum. Evet, J tecrübem var. Sanırım jelly.pyhangi zincirlerin desteklendiğini okumaya ve anlamaya çalışacağım .
Lynn

2
Bunu telefonunuza nasıl yazdınız? Bu, kodun kendisinden daha etkileyici!
DJMcMayhem

8

Japt, 20 19 16 bayt

V=U¬c)²-V *2-U+2

Çevrimiçi test edin!

Şu gözlemlere dayanarak:

F (N) = tavan (N ^ .5) * (tavan (N ^ .5) -1) - N + 2

Veya daha doğrusu,

F (N) = N veya eşittir ilk kare, eksi karekökü, eksi N, artı 2.

Bu açıklamanın henüz OEIS sayfasında olup olmadığını bilmiyorum.


5

Julia, 28 bayt

n->2((m=isqrt(n-1))^2+m+1)-n

Bu, bir tamsayıyı kabul eden ve bir tam sayı döndüren bir lambda işlevidir. Bunu çağırmak için bir değişkene atayın.

Bu tanımlar m şekilde tamsayıdır büyük olduğu m 2N -1, yani tam sayı kare kökü n -1 ( isqrt). Daha sonra OEIS ifadesini 2 ( m + 1) m - n + 2'yi basitçe 2 ( m 2 + m + 1) - n'ye basitleştirebiliriz .

Çevrimiçi deneyin


4

CJam, 14 bayt

qi_(mQ7Ybb2*\-

Alex'in yaklaşımını kullanarak: 2*(m^2+m+1)-nnerede m = isqrt(n-1).


2

ES7, 31 28 26 bayt

n=>(m=--n**.5|0)*++m*2-~-n

Alex'in formülünü bağımsız olarak keşfetmiştim ama o zaman bir bilgisayarın yakınında olmadığım için kanıtlayamıyorum.

Düzenleme: @ETHproductions sayesinde 3 bayt kaydedildi. 2 bayt daha kaydetti.


n=>((m=--n**.5|0)+m*m)*2-n+1bence işe yarar.
ETHproductions

@ETHproductions Teşekkürler, kendimi --noraya nasıl alacağımı merak ediyordum ...
Neil

@ETHproductions Heh, cevabınızdan 2 bayt tıraş etmeyi başardım.
Neil


1

MATL , 16 13 bayt

qX^Y[tQ*Q2*G-

Lynn'in CJam cevabına dayanarak .

Çevrimiçi deneyin! (dilde yapılan değişikliklere göreY[değiştirildik)

q       % input n. Subtract 1
X^      % square root
Y[      % floor
tQ      % duplicate and add 1
*       % multiply
Q       % add 1
2*      % multiply by 2
G-      % subtract n

Bu, diğer yanıtlardan ( 16 bayt ) farklı bir yaklaşım kullanır :

6Y3iQG2\+YLt!G=)

Açıkça iki spiral matrisi oluşturur (aslında, dikey olarak çevrilmiş versiyonları, ancak bu çıktıyı etkilemez). Birincisi

17    16    15    14    13
18     5     4     3    12
19     6     1     2    11
20     7     8     9    10
21    22    23    24    25

ve ikincisi değiştirilen yolu izler:

25    10    11    12    13
24     9     2     3    14
23     8     1     4    15
22     7     6     5    16
21    20    19    18    17

Bulmak için nbulmak yeterli dizisinin inci sayıda nikinci matris içinde ve birinci karşılık gelen sayı almak. Matrislerin yeterince büyük olması gerekir kin görünmesi için olması ve başlangıç ​​noktasının (sayı ) her ikisinde de aynı konumda olması için tek boyutta olması gerekir 1.

Çevrimiçi olarak da deneyin ! (6Y3dildeki değişikliklere göre taşınmıştır)

6Y3      % 'spiral' string
i        % input n
QG2\+    % round up to an odd number large enough
YL       % generate spiral matrix of that size: first matrix
t!       % duplicate and transpose: second matrix
G=       % logical index that locates n in the second matrix
)        % use that index into first matrix

0

Brachylog , 20 bayt

-1$r$[I*I+I+1=*2-?=.

Bu, diğer tüm cevaplarla hemen hemen aynı tekniği kullanır.

açıklama

-1                   § Build the expression Input - 1
  $r                 § Square root of Input - 1
    $[I              § Unify I with the floor of this square root
       *I+I+1        § Build the expression I * I + I + 1
             =*2-?   § Evaluate the previous expression (say, M) and build the expression
                     § M * 2 - Input
                  =. § Unify the output with the evaluation of M * 2 - Input

Bu cevap hakkında orta derecede ilginç bir gerçek, =parantez yerine kullanımın daha kolay ve daha kısa olmasıdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.