Sabır, genç “Padovan”


44

Fibonacci dizisini herkes bilir:
Bir kare alırsınız, ona eşit bir kare eklersiniz, daha sonra tekrar tekrar yan uzunluğu, elde edilen dikdörtgenin en büyük yan uzunluğuna eşit bir kare eklersiniz.
Sonuç, sayı dizisi Fibonacci dizisi olan güzel bir kare sarmaldır :

Fakat ya kareleri kullanmak istemiyorsak?

Benzer bir şekilde eşkenar üçgenler (kareler yerine) kullanırsak, aynı derecede güzel üçgenler spirali ve yeni bir dizi alırız : Padovan dizisi , aka A000931 :

Görev:

Pozitif bir tamsayı göz önüne alındığında, , çıkış , Padovan dizi ya da ilk inci terimi açısından.NaNNN

Dizinin ilk üç teriminin hepsinin olduğunu varsayalım . Böylece, sıra aşağıdaki gibi başlayacaktır: 1

1,1,1,2,2,3,...

Giriş:

  • Herhangi bir pozitif tamsayıN0

  • Geçersiz giriş dikkate alınmak zorunda değildir

Çıktı:

  • Padovan sırayla inci terimi OR ilk Padovan sekansının özelliği açısından.NNN

  • İlk terimi basılırsa, çıktı uygun olan ne olabilir (liste / dizi, çok satırlı dize vb.)N

  • Olabilir ya -indexed veya -indexed01

Test Durumları:
(0 indeksli, Dönem)N

Input | Output
--------------
0     | 1
1     | 1
2     | 1
4     | 2
6     | 4
14    | 37
20    | 200
33    | 7739

(1 indeksli, ilk terimi)N

Input | Output
--------------
1     | 1
3     | 1,1,1
4     | 1,1,1,2
7     | 1,1,1,2,2,3,4
10    | 1,1,1,2,2,3,4,5,7,9
12    | 1,1,1,2,2,3,4,5,7,9,12,16

Kurallar:


2
14(0 indeksli) çıktısı olarak gösterilirken 28vermem gerektiğine inanıyorum37
Jonathan Allan 20

@JonathanAllan evet, haklısın. Ben son iki test durumları sabit inci terim ama o değil. Yayın düzenlendi. N
Tau

@LuisMendo Buna inanıyorum. Gönderiyi düzenlerim.
Tau

1
@sharur Fibonacci dizisi için bu tanım görsel tanımdır. Eklenen her art arda kare, dizideki o terimin uzunluğuna sahiptir. Tanımladığınız dizi, arkasındaki sayısal akıl yürütmedir. Her iki sekans da diğerleri kadar iyi çalışır.
Tau

1
Bağladığınız OEIS dizisinin kullandığından beri biraz farklı olduğunu unutmayın a_0=1, a_1=0, a_2=0. Biraz kaymasıyla biter çünkü o zamana_5=a_6=a_7=1
Carmeister

Yanıtlar:


59

Jöle , 10 bayt

9s3’Ẓæ*³FṀ

Çevrimiçi deneyin!

1 endeksli. En büyük elemanını hesaplar: burada ikili matris uygun bir şekilde hesaplanır:

[001101010]n
[isprime(0)isprime(1)isprime(2)isprime(3)isprime(4)isprime(5)isprime(6)isprime(7)isprime(8)]

(Bu tam bir tesadüf.)

9s3         [[1,2,3],[4,5,6],[7,8,9]]    9 split 3
   ’        [[0,1,2],[3,4,5],[6,7,8]]    decrease
    Ẓ       [[0,0,1],[1,0,1],[0,1,0]]    isprime
     æ*³    [[0,0,1],[1,0,1],[0,1,0]]^n  matrix power by input
        FṀ                               flatten, maximum

33
Bu açıkça bir tür vudu
Pureferret

7
Bu yayınlanmalı.
YSC

6
@YSC Zaten yayımlandı A000931 .
Asalların

1
... "Biri bu iki bayt golf oynayamazsa " (:) şimdi 9 baytım var )
Jonathan Allan

1
Burada saçma sapan cevaplar görmeye çok alıştım, 'Jelly' sonrası virgülün aslında bu sorunun
şifresi olduğunu sanıyordum


26

Jöle ,  10 9  8 bayt

ŻṚm2Jc$S

Verimli bir monadik Link kabul n(0-indexed) P(n).

Çevrimiçi deneyin!

Nasıl?

AraçlarP(n)=i=0n2(i+1n2i)

ŻṚm2Jc$S - Link: integer, n       e.g. 20
Ż        - zero range                  [0, 1, 2, 3, 4, ..., 19, 20]
 Ṛ       - reverse                     [20, 19, ..., 4, 3, 2, 1, 0]
  m2     - modulo-slice with 2         [20, 18, 16, 14, 12, 10,  8,  6,  4,  2,  0]  <- n-2i
      $  - last two links as a monad:
    J    -   range of length           [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]  <- i+1
     c   -   left-choose-right         [ 0,  0,  0,  0,  0,  0,  0, 28,126, 45,  1]
       S - sum                         200

Ve burada bir "taşla iki kuş" dir
... ayrıca tamamen farklı yöntem 8 bayt (bu bir 1-endeksli, ama çok daha yavaş olduğu):

3ḊṗRẎ§ċ‘ - Link: n
3Ḋ       - 3 dequeued = [2,3]
   R     - range = [1,2,3,...,n]
  ṗ      -   Cartesian power         [[[2],[3]],[[2,2],[2,3],[3,2],[3,3]],[[2,2,2],...],...]
    Ẏ    - tighten                   [[2],[3],[2,2],[2,3],[3,2],[3,3],[2,2,2],...]
     §   - sums                      [ 2,  3,   4,    5,    5,    6,     6,...]
       ‘ - increment                 n+1
      ċ  - count occurrences         P(n)

18

Haskell , 26 bayt

(l!!)
l=1:1:1:2:scanl(+)2l

Çevrimiçi deneyin! Sıfır dizine alınmış n 'terimini çıkarır.

Aşağıdaki "bariz" özyinelemeli çözümün rakipsiz olacağını düşündüm, ama sonra bunu buldum. Bu l=1:scanl(+)1l, sonsuz Fibonacci listesinin klasik golf ifadesine benzer , ancak burada bitişik elemanlar arasındaki fark, 4 pozisyonu geri alır. Daha doğrudan yazabiliriz l=1:1:zipWith(+)l(0:l), ama bu daha uzun.

Bu zorluk sonsuz liste çıktısına izin verirse, ilk satırı kesebilir ve 20 bayt alabilirdik.

27 bayt

f n|n<3=1|1>0=f(n-2)+f(n-3)

Çevrimiçi deneyin!




6

Octave / MATLAB, 35 33 bayt

@(n)[1 filter(1,'cbaa'-98,2:n<5)]

İlk n terimini çıkarır.

Çevrimiçi deneyin!

Nasıl çalışır

Özyinelemeli bir filtre uygulayan anonim işlev .

'cbaa'-98üretmek için daha kısa bir formdur [1 0 -1 -1].

2:n<5üretmek için daha kısa bir formdur [1 1 1 0 0 ··· 0]( n = 1 terim).

filter(1,[1 0 -1 -1],[1 1 1 0 0 ··· 0])girdiyi [1 1 1 0 0 ··· 0]pay katsayısı 1ve payda katsayıları olan bir transfer fonksiyonu tarafından tanımlanan ayrık zamanlı bir filtreden geçirir [1 0 -1 -1].


6

J , 22 bayt

Ngn ve Galen sayesinde -2 bayt

kapalı form, 26 bayt

0.5<.@+1.04535%~1.32472^<:

Çevrimiçi deneyin!

yinelemeli, 22 bayt

(],1#._2 _3{ ::1])^:[#

Çevrimiçi deneyin!


1
Başka bir 24-baytlık çözüm (sıkıcı): (1 # .2 3 $: @ - ~]) `1: @. (3 &>) Çevrimiçi deneyin!
Galen Ivanov

Ngn sayesinde 23 byte 1:-> #: Çevrimiçi deneyin!
Galen Ivanov

@GalenIvanov tyvm, bu harika bir numara.
Jonah

2
1:-> 1. "advers" görünüşte sağda bir isim ile çalışır
ngn

@ Tgn ... tekrar ty!
Jonah

5

Retina , 47 42 bayt

K`0¶1¶0
"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*
6,G`

Çevrimiçi deneyin! İlk nterimleri ayrı satırlara çıkarır. Açıklama:

K`0¶1¶0

İçin şartları ile giriş değiştirin -2, -1ve 0.

"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*

nTekrarlama ilişkisini kullanarak sonraki terimleri oluşturun . *_buradaki $&*_maçta (ilk) sayıyı unary'e çeviren $1*kısa $1*_, orta sayıyı da unary'e çeviren kısa . $.(Döner onun tekli tartışmaların ondalık toplamı, ilk ve orta sayının toplamını yani.

6,G`

İlk altı karakteri, yani ilk üç satırı atın.


5

Cubix , 20 bayt

Bu endeksli 0 ve çıktılar N inci terimi

;@UOI010+p?/sqq;W.\(

Çevrimiçi deneyin!

Yan uzunluğu 2 olan bir küp üzerine sarar

    ; @
    U O
I 0 1 0 + p ? /
s q q ; W . \ (
    . .
    . .

Çalıştırılmasını izle

  • I010 - Yığını başlatır
  • +p? - Yığının üstünü ekler, sayacı yığının altından çeker ve testler
  • /;UO@ - Sayaç 0 ise, üst yüze yansıtın, TOS'u çıkarın, u-dönüşü, çıkışı ve durdurma
  • \(sqq;W - Sayaç pozitifse, sayacı azaltın, sayacı azaltın, TOS'u değiştirin, yukarıdan aşağıya iki kez bastırın, TOS'u çıkarın ve şeridi tekrar ana döngüye kaydırın.


4

Perl 6 , 24 bayt

{(1,1,1,*+*+!*...*)[$_]}

Çevrimiçi deneyin!

Oldukça standart üretilen bir dizi, ifadenin oluşturduğu her yeni öğe * + * + !*. Bu, üçüncü önceki öğeye, ikinci önceki öğeye ve önceki öğenin her zaman Falsesayısal olan sıfır olan mantıksal olumsuzluğuna ekler .


Bu topluluk neden wiki?
Jo King,

@JoKing Beni yener. Bir şekilde yaptıysam, bilerek değildi.
Sean,

4

05AB1E , 8 bayt

1Ð)λ£₂₃+

Çevrimiçi deneyin!

1Ð)1D)3Å1n£

Nasıl?

1Ð)λ£₂₃+ | Full program.
1Ð)      | Initialize the stack with [1, 1, 1].
   λ     | Begin the recursive generation of a list: Starting from some base case,
         | this command generates an infinite list with the pattern function given.
    £    | Flag for λ. Instead of outputting an infinite stream, only print the first n.
     ₂₃+ | Add a(n-2) and a(n-3).

1Ð)2 byte tbh olabileceğini sanmıyorum . Altı farklı 3-byte alternatif düşünebilirim , ama 2-byter yok.
Kevin Cruijssen

4

APL (Dyalog Unicode) , 20 18 17 bayt SBCS

Bu kod 1 indekslidir. nSon birkaç fazladan üyeyi düşürmeniz gerektiğinden, Padovan dizisinin eşyalarını almak için aynı sayıda bayt var. Aynı zamanda 0 indeksleme almak için aynı byte sayısıdır.

Düzenleme: ngn sayesinde -2 bayt. Ngn sayesinde -1 bayt

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

Çevrimiçi deneyin!

açıklama

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

  ⍺(. . . .)⍣⎕⍵   This format simply takes the input ⎕ and applies the function
                   inside the brackets (...) to its operands (here marked ⍵ and ⍺).
  2(. . .+/)⍣⎕×⍳3  In this case, our ⍵, the left argument, is the array 1 1 1,
                   where we save our results as the function is repeatedly applied
                   and our ⍺, 2, is our right argument and is immediately applied to +/,
                   so that we have 2+/ which will return the pairwise sums of our array.
       2⌷          We take the second pairwise sum, f(n-2) + f(n-3)
    ⊢,⍨            And add it to the head of our array.
4⌷                 When we've finished adding Padovan numbers to the end of our list,
                   the n-th Padovan number (1-indexed) is the 4th member of that list,
                   and so, we implicitly return that.

4

K (ngn / k) , 24 20 bayt

Ngn sayesinde -4 bayt!

{$[x<3;1;+/o'x-2 3]}

Çevrimiçi deneyin!

0 dizinli, ilk N terimi


1
f[x-2]+f[x-3]-> +/o'x-2 3( o"tekrar" dir)
ngn

@ ngn Teşekkürler! J de (başarı olmadan) denedim; burası zarif.
Galen Ivanov

@ngn Aslında burada J: 'in görünüşünde bir olasılık var: (1 # .2 3 $: @ - ~]) `1: @. (3 &>)
Galen Ivanov

ah, sağ, üs-1 kod çözme toplamak için tren dostu bir yoludur :)
ngn

2
1:-> #j özümünde
ngn

4

x86 32 bit makine kodu, 17 bayt

53 33 db f7 e3 43 83 c1 04 03 d8 93 92 e2 fa 5b c3

demontaj:

00CE1250 53                   push        ebx  
00CE1251 33 DB                xor         ebx,ebx  
00CE1253 F7 E3                mul         eax,ebx  
00CE1255 43                   inc         ebx  
00CE1256 83 C1 04             add         ecx,4  
00CE1259 03 D8                add         ebx,eax  
00CE125B 93                   xchg        eax,ebx  
00CE125C 92                   xchg        eax,edx  
00CE125D E2 FA                loop        myloop (0CE1259h)  
00CE125F 5B                   pop         ebx  
00CE1260 C3                   ret

0 dizinli. Başlatma, eax * 0 hesaplanarak uygun bir şekilde gerçekleştirilir. 128-bit sonuç 0'dır ve edx: eax'a gider.

Her yinelemenin başlangıcında, kayıtların sırası ebx, eax, edx'tir. xchg eax1 bayt - komut için kodlamadan yararlanmak için doğru sırayı seçmem gerekti.

Konvansiyonda eaxfonksiyonun dönüş değerini tutan çıkışın ulaşmasını sağlamak için döngü sayacına 4 eklemek zorunda kaldım fastcall.

Kaydetme ve geri yükleme gerektirmeyen ebx, ancak fastcallyine de eğlenceli olan başka bir arama kuralı da kullanabilirim :)


2
PP & CG'de makine kodu cevaplarını görmeyi seviyorum! +1
Tau


3

Lua 5.3,49 48 bayt

function f(n)return n<4 and 1or f(n-2)+f(n-3)end

Çevrimiçi deneyin!

Vanilla Lua, boole dizelerini zorlayan (hatta tonumber(true)geri dönen nil) zorlamadığı için sahte bir üçlü operatör kullanmanız gerekir. Bu sürüm, tüm Lua gibi, 1 indekslidir. 1orBölümünün değiştirilmelidir 1 ornumaraları Lexing için farklı bir yol vardır Lua 5.1 bölgesi.



3

JavaScript (ES6), 23 bayt

a(0)=a(1)=a(2)=1

N

f=n=>n<3||f(n-2)+f(n-3)

Çevrimiçi deneyin!


Geri dönüşün true, 1çıkışın geri kalanı sayı ise döndürmeyle aynı olduğunu söylemenin makul olduğunu sanmıyorum .
Nit


Biraz gereksinimleri eksik düşünüyorum: Benim modifikasyonu bir göz (Java versiyonu) var burada .
Shaq

@Shaq Mücadelesi , dizinin ilk üç teriminin hepsinin 1 olduğunu açıkça belirtir . Bu nedenle, A000931'de tanımlanan dizi değildir (ancak formül aynıdır).
Arnauld,

@Arnauld yep şimdi görebiliyorum. Üzgünüm!
Shaq


2

TI-BASIC (TI-84), 34 bayt

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1

N

Giriş girildi Ans.
Çıktı geldi Ansve otomatik olarak yazdırıldı.

Yeterli zamanın geçtiğini ve çok sayıda cevabın gönderildiğini ve bu cevabın çoğunu kullanan birçok kişinin bulunduğunu düşündüm.

Örnek:

0
               0
prgmCDGFD
               1
9
               9
prgmCDGFD
               9
16
              16
prgmCDGFD
              65

Açıklama:

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1      ;full program (example input: 6)

[[0,1,0][0,0,1][1,1,0]]                     ;generate the following matrix:
                                            ; [0 1 0]
                                            ; [0 0 1]
                                            ; [1 1 0]
                       ^(Ans+5              ;then raise it to the power of: input + 5
                                            ; [4  7 5]
                                            ; [5  9 7]
                                            ; [7 12 9]
                               Ans(1,1      ;get the top-left index and leave it in "Ans"
                                            ;implicitly print Ans

2

Pyth, 16 bayt

L?<b3!b+y-b2y-b3

Bu, işlevi tanımlar y. Burada dene!

İşte daha eğlenceli bir çözüm, 9 byte daha uzun olsa da; Ancak bayt tıraş olabilir.

+l{sa.pMf.Am&>d2%d2T./QY!

Bu, OEIS sayfasında David Callan tarafından verilen tanımı kullanır: "a (n) = tuhaf ve> = 3 olan parçalara n bileşimlerinin sayısı." Burada dene! Bir fonksiyon tanımlamak yerine doğrudan girdi alır.


y-b2y-b3belki bifürkatla ya da refactored olabilir Lmi? 2 element dizisi bildirmek rağmen pahalı. yL-Lb2,3daha uzun :(
Ven

@Ven I değiştirmek mümkün +y-b2y-b3olan smy-bdhB2bayt aynı miktarda olan; hB2dizisindeki sonuçlar[2, 3]
RK.

Eh üzerinde yapılan hB2. Çok kötü, aynı bayt sayısı.
Ven

Evet, dharitadan kurtulmanın bir yolu olup olmadığını merak ediyorum .
RK.

2

Java, 41 bayt

Bir lambda kullanamazsınız (çalışma zamanı hatası). Bu Javascript cevabının limanı

int f(int n){return n<3?1:f(n-2)+f(n-3);}

TIO


Bazı gereksinimleri kaçırdığınızı düşünüyorum: Değişikliğime buradan bir göz atın .
Shaq

Lütfen Shaq'ın yorumunu dikkate almayın: cevabınız doğru ve mümkün olan en kısa Java cevabı (Java 12'den itibaren).
Olivier Grégoire

Tamam ozaman. Neyi "özlediğimden" emin değilim ama tamam. Düzenleme: nvm JS cevabını okudum.
Benjamin Urquhart






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.