Hofstadter Q-dizisi


25

Tanım

  1. a (1) = 1
  2. a (2) = 1
  3. a (n) = a (na (n-1)) + a (na (n-2)) n> 2 için, burada n bir tamsayıdır

Görev

Verilen pozitif tamsayı n, üret a(n).

testcases

n  a(n)
1  1
2  1
3  2
4  3
5  3
6  4
7  5
8  5
9  6
10 6
11 6
12 8
13 8
14 8
15 10
16 9
17 10
18 11
19 11
20 12

Referans



1
True olarak 1 olarak kullanılabildiği dillerde dönebilir miyiz ?
Dennis,

1
@Dennis Bu dilde true ise 1'e eşittir, sonra evet.
Leaky Nun

4
OEIS bağlantısından ayrı olarak, dizinin ilk ortaya çıktığı yer olan GEB'ye referans vermek iyi olabilir.
Martin Ender

Yanıtlar:


9

Retina , 84 83 79 74 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

.+
$*;1¶1¶
+`;(?=(1)+¶(1)+)(?=(?<-1>(1+)¶)+)(?=(?<-2>(1+)¶)+)
$3$4¶
G3=`
1

Çevrimiçi deneyin! (İlk satır, satır besleme ayrılmış bir test takımı sağlar.)

Bunu daha sonra golf oynamak zorunda kalacağım.


9

Haskell, 35 33 bayt

a n|n<3=1|b<-a.(-)n=b(b 1)+b(b 2)

Bir fonksiyon tanımlar a.


2
Cilt ile güzel hile! Bir şey gibi (b.b)1+(b.b)2toplamından daha kısa olmaz mıydı ?
xnor

Neden evet, teşekkürler @ xnor.
Anders Kaseorg

8

Julia, 29 bayt

!n=n<3||!(n-!~-n)+!(n-!~-~-n)

Çevrimiçi deneyin!

Nasıl çalışır

Unary operatörünü !amaçlarımız için yeniden tanımlıyoruz .

Eğer , n ise 1 ya da 2 , n<3döner gerçek ve bu bizim dönüş değeridir.

Eğer n daha büyük 2 , n<3döner sahte ve || şube idam edilir. Bu tanım, bir basit uygulama olup ~-nverimler 1 - n ve ~-~-nverimi , n - 2 .


7

Sesos, 54 bayt

0000000: eefb5b 04f83a a75dc2 36f8d7 cf6dd0 af7b3b 3ef8d7  ..[..:.].6...m..{;>..
0000015: cfed12 f661f0 ae9d83 ee63e6 065df7 ce6183 af7383  ....a.....c..]..a..s.
000002a: 76ef3c 3f6383 7eff9c b9e37f                       v.<?c.~.....

Çevrimiçi deneyin

Demonte

set numin
set numout
add 1
fwd 1
add 1
fwd 6
get
sub 1
jmp
    jmp
        sub 1
        fwd 1
        add 1
        rwd 1
    jnz
    fwd 1
    sub 1
    rwd 2
    add 2
    jmp
        rwd 4
        jmp
            sub 1
            fwd 3
            add 1
            rwd 3
        jnz
        fwd 4
        jmp
            sub 1
            rwd 3
            add 1
            rwd 1
            add 1
            fwd 4
        jnz
        rwd 3
        jmp
            sub 1
            fwd 3
            add 1
            rwd 3
        jnz
        fwd 4
        add 2
        jmp
            rwd 5
            jmp
                rwd 1
                jmp
                    sub 1
                    fwd 2
                    add 1
                    rwd 2
                jnz
                fwd 1
                jmp
                    sub 1
                    rwd 1
                    add 1
                    fwd 1
                jnz
                rwd 1
                sub 1
            jnz
            fwd 2
            jmp
                sub 1
                rwd 1
                add 1
                rwd 1
                add 1
                fwd 2
            jnz
            fwd 1
            jmp
                rwd 2
                jmp
                    sub 1
                    fwd 1
                    add 1
                    rwd 1
                jnz
                fwd 2
                jmp
                    sub 1
                    rwd 2
                    add 1
                    fwd 2
                jnz
                fwd 1
            jnz
            fwd 3
            sub 1
        jnz
        rwd 2
        jmp
            sub 1
            rwd 3
            add 1
            fwd 3
        jnz
        fwd 1
        sub 1
    jnz
    fwd 2
jnz
rwd 7
put

Veya Brainfuck notasyonunda:

+>+>>>>>>,-[[->+<]>-<<++[<<<<[->>>+<<<]>>>>[-<<<+<+>>>>]<<<[->>>+<<<]>>>>++[<<<<<[<
[->>+<<]>[-<+>]<-]>>[-<+<+>>]>[<<[->+<]>>[-<<+>>]>]>>>-]<<[-<<<+>>>]>-]>>]<<<<<<<.

6

C, 43 42 bayt

@Dennis sayesinde 1 bayt kaydedildi

Her cevap aynı, farklı bir şey yapmalıyım!

Çevrimiçi deneyin!

a(n){return n<3?:a(n-a(n-2))+a(n---a(n));}

Açıklama: Bu temelde a(n-a(n-2))+a(n-a(n-1))ama swaggy tanımsız davranış ile (benim telefon (gcc) ve ideone çalışıyor).


4
1. Ayrıca derleyiciden de bahsetmelisiniz; senin "yağma" tanımsız davranış. GCC ile 2. İhtiyacınız olmayan 1arasındaki ?ve :.
Dennis,

@Dennis İlginç bir şekilde, aynı formülasyon yinelemeli PowerShell $b+=$b[$_-$b[$_-2]]+$b[$_---$b[$_]]
cevabımda işe yarıyor

@TimmyD bazı derleyiciler n'den önce a (n) 'yi derleyebilir ve bunun için standart (veya tanımlanmış) bir davranış yoktur. Böylece tanımsız davranış.
betseg,

@ betseg Yep, katılıyorum. Sadece mutlaka C'ye özgü olmadığına işaret
AdmBorkBork

@TimmyD Oh, bunu yanlış anladım. Sadece herkesin kullandığı fonksiyonu değiştirmek istedim, bu yüzden benimki farklı ve swaggy olurdu: D
betseg

5

Mathematica, 36 bayt

Bayt sayısı, ISO 8859-1 kodlamasını ve Mathematica'nın $CharacterEncodingayarlandığını varsayar WindowsANSI(Windows'ta varsayılan; diğer ayarlar da çalışabilir, ancak bazıları UTF-8kesinlikle çalışmaz).

±1=±2=1
±n_:=±(n-±(n-1))+±(n-±(n-2))

±Unary operatörü olarak tanımlar .

Kopyalamadan kurtulmaya çalıştım, ancak aynı bayt sayısıyla bitti:

±1=±2=1
±n_:=Tr[±(n-±(n-#))&/@{1,2}]

Retina
Leaky Nun’da

@LeakyNun tamam mı? :)
Martin Ender

İki gün sonra.
Sızdıran Rahibe

@LeakyNun Yakında ödülleri bu kadar kolay bir şekilde verirseniz, hiçbir geri bırakma hakkınız kalmayacak.
mbomb007


4

Jöle , 15 14 bayt

2Rạ⁸߀$⁺Sµ1>?2

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın (birkaç saniye sürer).

Nasıl çalışır

2Rạ⁸߀$⁺Sµ1>?2  Main link. Argument: n (integer)

2R              Yield [1, 2].
      $         Combine the previous three links into a monadic chain.
   ⁸                Yield n.
  ạ                 Take the absolute difference of the return value and n.
    ߀              Recursively call the main link on each result.
       ⁺            Duplicate the chain.
                    The first copy maps [1, 2] to [a(n - 1), a(n - 2)].
                    The second copy maps [a(n - 1), a(n - 2)] to
                    [a(n - a(n - 1)), a(n - a(n - 2))].
        S           Take the sum.
         µ          Combine all links to the left into a chain.
            ?       If...
           > 2          n is greater than 2, call the chain.
          1         Else, return 1.

Sesos'ta yaparsan sana +400 ödül verebilirim.
Leaky Nun

@ LeakyNun Bir Sesos cevabı var gibi görünüyor. Yorumunuzdan bir gün sonra çıktı.
Yytsi

4

Jöle , 14 12 11 bayt

ịḣ2S;
1Ç⁸¡2ị

Bu yinelemeli bir yaklaşımdır.

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

1Ç¡2ị   Main link. Argument: n

1       Set the return value to 1.
 Ç¡     Call the helper link n times, updating the return value after each call.
   2ị   Extract the second element of the resulting array.


ịḣ2S;   Helper link. Argument: A (array)

ị       At-index; retrieve the elements of A at the values of A.
 ḣ2     Head 2; extract the first two results.
    S   Take the sum of the result.
     ;  Prepend the sum to A.

3

Python, 45 40 bayt

a=lambda n:n<3or a(n-a(n-1))+a(n-a(n-2))

Meydan okumanın basit ve saf yorumu.

@LeakyNun sayesinde 5 bayt kaydedildi!


3

Haskell, 39 37 bayt

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

Muhafızları kullanarak tam olarak mücadelede tanımlandığı gibi


Üzgünüz, (özdeş) haskell çözümümü göndermeden önce çözümünüzü görmedim. Ancak, yeni satırın dikkate alınması gerektiği için bayt sayısı 38 değil mi?
Laikoni,

Ve bekçi olmak n<3için h 2 olmalı 1.
Laikoni,

. @Laikoni O en 37 iki bayt olarak yeni satır sayısı sürece bir çok satırlı ( "" ") dizesi ile piton len özelliğine göre Evet, şimdi düzeltilenekadar başka bir şey fark ettim.
KarlKastor

TIL notepad ++, newline'ı iki karakter olarak sayar.
Laikoni,

@Likonikon şu an tartışılmaz 37 byte olan yeni hattan kurtuldu.
KarlKastor

3

R, 50 bayt

a=function(n)ifelse(n<3,1,a(n-a(n-1))+a(n-a(n-2)))

Kullanımı:

> a(1)
  1
> a(20)
  12


3

C #, 51 44 bayt

int a(int n)=>n<3?1:a(n-a(n-1))+a(n-a(n-2));

Bunun anonim yapılarak kısaltılabileceğini merak ediyorum, pinkfloydx33!


1
c # 6 ifade gövdeli işleviint a(int n)=>n<3?1:a(n-a(n-a))+a(n-a(n-2));
pinkfloydx33 18

Telefonuma yazarken daktilo gibi gözüküyorum. -aİlk set parens içindeki iç kısım en fazla olmalıdır-1
pinkfloydx33

Ben de farketmedim, hasta düzeltildi rq
downrep_nation

3

JavaScript (ES6), 45 Bayt 34 Bayt

ES6'da özyinelemeli bir çözüm. Herhangi bir golf ipuçları çok takdir etmek.

a=n=>n>2?a(n-a(n-1))+a(n-a(n-2)):1

Daha da kısaltmak için / u / ismillo'ya teşekkür ederiz .




2

APL, 20 bayt

{⍵≤2:1⋄+/∇¨⍵-∇¨⍵-⍳2}

Açıklama:

{⍵≤2:1⋄+/∇¨⍵-∇¨⍵-⍳2}
 ⍵≤2:1               If argument is 2 or less, return 1
      ⋄              Otherwise:
               ⍵-⍳2  Subtract [1, 2] from the argument
             ∇¨      Recursive call on both
           ⍵-        Subtract both results from the argument     
         ∇¨          Recursive call on both again
       +/            Sum          

2

VBA Excel 87 bayt

Özyinelemeli olmayan, bunun n = 100000 için çalışmasını istediğim için şunu söyleyin:

Function A(N):ReDim B(N):For i=3 To N:B(i)=B(i-B(i-1)-1)+B(i-B(i-2)-1)+1:Next:A=B(N)+1

... ve returnsatırın sonundaki (bayt # 87) tuşuna basın .End Function "free" ifadesini . N = 1 ve 2 için başlatmayı önlemek için B değerlerinin -1 ile kaydığına dikkat edin.

Elektronik tabloda normal olarak çağır, örn. =A(100000) almak için48157

Özyinelemeli sürümü, 61 bayt ,

Function Y(N):If N<3 Then Y=1 Else Y=Y(N-Y(N-1))+Y(N-Y(N-2))

n> 30 için makul olmayan bir şekilde yavaşlamaya başlar ve n> 40 için hiç çalıştığı söylenemez.


Performans umurumuzda değil. Kod uzunluğunu önemsiyoruz. Kısa çözümünüzü cevabınızın tepesine taşımalısınız.
mbomb007

1
@ mbomb007 Golfu kazanmak için hiçbir yere yakın olmadığım için, bir çalışma programını neyin oluşturduğu konusunda kendi seçimlerimi yapacağım. Tek baytlı tamsayıların bile işlenememesi, kolayca yapabilecek bir çözüm olduğunda, ilgilendiğim kadar iyi değil.
Joffan

2

Ruby, 36 bayt

Doğrudan bir uygulama. Herhangi bir golf önerisi açıktır.

a=->n{n<3?1:a[n-a[n-1]]+a[n-a[n-2]]}

Afaik, a = 'dan kurtulabilirsin. Buraya gönderirseniz, kodunuz -> ile başladığında yeterli olur. O zaman isimsiz bir işlev olarak sayılır.
16'da 10

@Seims Ne yazık ki, işlev kendini çağırır a[n-1]ve bu şekilde işlevin adlandırılması gerekir.
Sherlock9

2

Java 7, 68 61 51 bayt

17 Leaky Nun sayesinde kurtarıldı.

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

PPCG'ye Hoşgeldiniz!
AdmBorkBork

PPCG'ye Hoşgeldiniz! İpuçları Java'da Golf oynamak isteyebilirsiniz . Alternatif bir form olacaktır: int a(int n){return n<3?1:a(n-a(n-2))+a(n---a(n));}ama ne yazık ki, zaten cevaplarınızla aynı miktarda bayt kullanıyor. Ayrıca, cevabınızın Java 7'de daha kısa olacağı için Java 7’de olduğunu belirtirim: n->return n<3?1:a(n-a(n-1))+a(n-a(n-2))( 39 bayt ) .
Kevin Cruijssen

Hoşgeldin adamları için teşekkürler ve Java8'deki bahşiş için teşekkürler - Lambdalara böyle izin verildiğinin farkında değildim - Python'da buna izin verilse de, sanırım hiç düşünmedim. Lambda bir yarı-kolon gerekir mi?
Justin,

Ben Java 8 ama bir yorumuna göre, noktalı virgül tek hat ifadeleriyle ilgili sayılmaz duydum ne çok şey kullanmayın @JustinTervay @DavidConrad ve CAD97 @ de kendi Java cevapları biri .
Kevin Cruijssen

2

Oasis , 9 7 5 bayt (yarışmaz)

Rekabetçi değil , çünkü dil mücadeleyi sürdürüyor. 4 bayt'ı kurtardığı için Kenny Lau'ya teşekkürler . Kod:

ece+V

Genişletilmiş form ( Viçin kısa 11):

a(n) = ece+
a(0) = 1
a(1) = 1

Kod:

e        # Stack is empty, so a(n - 1) is used, and it calculates a(n - a(n - 1))
 c       # Calculate a(n - 2)
  e      # Calculate a(n - a(n - 2))
   +     # Add up

Çevrimiçi deneyin! . 0,1 saniyede n = 1000 hesaplar.


1

PowerShell v2 +, 85 79 69 bayt

param($n)$b=1,1;2..$n|%{$b+=$b[$_-$b[$_-1]]+$b[$_-$b[$_-2]]};$b[$n-1]

Girdiyi alır $n, $bbir dizi olarak ayarlar @(1, 1), sonradan bir döngüye girer 2 .. $n. Her bir yineleme $b, dizideki en son hesaplamaya basit +=ve dizilimin tanımını uygular. Ardından uygun sayıyı çıkarıyoruz $b( -1çünkü PowerShell'deki diziler sıfır dizinli). Bu eserler ise $nedilir 1veya 2bu değerlerin hem alt endeksleri içine önceden doldurulmuş çünkü $bönemsiz baştan, yani bile döngü çiviler, yine de göz ardı ediyor.


Özyinelemeli çözüm 78 76 bayt

$a={param($k)if($k-lt3){1}else{(&$a($k-(&$a($k-1))))+(&$a($k-(&$a($k-2))))}}

İlk defa cevap olarak bir lambda eşdeğeri kullandım, çünkü genellikle yinelemeli bir çözüm daha kısadır (iç içe geçmiş parelerin hepsinde görebileceğiniz gibi). Ancak, bu durumda, iç içe parenler, iç içe dizi çağrıları ile yinelemeli çözümde neredeyse yinelenir, bu nedenle özyinelemeli çözüm daha kısadır. Hayır, yinelemeli çözüm gerçekten daha kısadır (yukarıya bakın).

Bunun gibi yürütme operatörü aracılığıyla arayın &$a 20. Sadece basit bir özyinelemeli arama.


1

JavaScript (ES6), 66 bayt

n=>[...Array(n+1)].reduce((p,_,i,a)=>a[i]=i<3||a[i-p]+a[i-a[i-2]])

Hız için özyinelemeli olmayan versiyonu; özyinelemeli sürümü muhtemelen daha kısa ama başkasının yazması için bırakacağım. Kullandığım zaman hep hoşuma gidiyor reduce. Not: geri tarafından kaydedilen 1 bayt true(atmalarını olan 1arasında bir tam sayı bağlamında kullanıldığı zaman) a(1)ve a(2).


1

Pyth, 16 bayt

L|<b3smy-bytdtBb

L                  def y(b):
 |<b3                b < 3 or …
      m      tBb       map for d in [b - 1, b]:
       y-bytd            y(b - y(d - 1))
     s                 sum

Bir fonksiyon tanımlar y.

Çevrimiçi deneyin ( yMS20ilk 20 değeri yazdırmak için eklendi )


1

İleri, 76 bayt

Sonunda çalıştırmayı başardım!

: Q recursive dup dup 3 < if - 1+ else 2dup 2 - Q - Q -rot 1- Q - Q + then ;

Çevrimiçi deneyin

Açıklama:

: Q recursive                           \ Define a recursive function Q
    dup dup 3 <                         \ I moved a dup here to golf 2 bytes
    if                                  \ If n < 3, return 1
        - 1                             \ Golf: n-n is zero, add one. Same as 2drop 1+
    else
        2dup 2 - Q - Q                  \ Copy n until 4 on stack, find Q(n-Q(n-2))
        -rot                            \ Move the result below 2 copies of n
        1- Q - Q +                      \ Find Q(n-Q(n-2)), then add to previous ^
    then ;

Çevrimiçi deneyin (yukarıdan biraz golf oynamayın)

Ne yazık ki, karşılıklı özyineleme , golf oynamak için kullanmak biraz fazla endişe verici .


1

Akçaağaç, 43 41 bayt

a:=n->`if`(n>2,a(n-a(n-1))+a(n-a(n-2)),1)

Kullanımı:

> a(1);
  1
> a(20);
  12

Bu sorun kesinlikle not almak için iyi bir aday. Seçenek önbelleğini kullanarak , çalışma süreleri önemli ölçüde azaltılır:

aC := proc(n) 
      option cache; 
      ifelse( n > 2, aC( n - aC(n-1) ) + aC( n - aC(n-2) ), 1 ); 
end proc:

Bu kullanarak görülebilir:

CodeTools:-Usage( aC(50) );

0

J, 29 28 bayt

1:`(+&$:/@:-$:@-&1 2)@.(2&<)

Özyinelemeli tanımı kullanır.

kullanım

Ekstra komutlar çoklu giriş / çıkış formatlamak için kullanılır

   f =: 1:`(+&$:/@:-$:@-&1 2)@.(2&<)
   (,:f"0) >: i. 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 1 2 3 3 4 5 5 6  6  6  8  8  8 10  9 10 11 11 12

açıklama

1:`(+&$:/@:-$:@-&1 2)@.(2&<)  Input: n
                        2&<   If n < 2
1:                              Return 1
                              Else
               -&1 2            Subtract [1, 2] from n to get [n-1, n-2]
            $:@                 Call recursively on n-1 and n-2
           -                    Subtract each of the results from n
        /@:                     Reduce using
      $:                          A recursive call on each
    +&                            Then summation
                                Return that value as the result

0

dc, 62 bayt

?si2sa1dd2:a:a[la1+dsadd1-;a-;alad2-;a-;a+r:ali;a0=A]dsAxli;af

Bu çözüm dizileri ve özyineleme kullanır.

?si          # Take input from stdin and store it in register `i'
2sa          # Initialise register `a' with 2, since we'll be putting in the first
             #   two values in the sequence
1dd2         # Stack contents, top-down: 2 1 1 1
:a           # Pop index, then pop value: Store 1 in a[2]
:a           # Ditto:                     Store 1 in a[1]
[            # Open macro definition
 la 1+ dsa   # Simple counter mechanism: Increment a and keep a copy on stack

# The STACK-TRACKER(tm): Top of stack will be at top of each column, under the
#   dashed line. Read commands from left to right, wrapping around to next line.
#   This will be iteration number n.
  dd   1-    ;a       -          ;a            la            d          
#-----------------------------------------------------------------------
# n    n-1   a[n-1]   n-a[n-1]   a[n-a[n-1]]   n             n          
# n    n     n        n          n             a[n-a[n-1]]   n          
# n    n     n                                 n             a[n-a[n-1]]
#                                                            n          
#                                                                       

  2-            ;a            -             ;a            +      r    :a
#-----------------------------------------------------------------------
# n-2           a[n-2]        n-a[n-2]      a[n-a[n-2]]   a[n]   n      
# n             n             a[n-a[n-1]]   a[n-a[n-1]]   n      a[n]   
# a[n-a[n-1]]   a[n-a[n-1]]   n             n                           
# n             n                                                       

 li;a        # Load index of target element, and fetch that element's current value
             #    Uninitialised values are zero
 0=A         # If a[i]==0, execute A to compute next term
]dsAx        # Close macro definition, store on `A' and execute
li;a         # When we've got enough terms, load target index and push value
f            # Dump stack (a[i]) to stdout

Sonuç olarak, eğer birisi IDE inşa ediyorsa dc, haberim olsun!
Joe,

0

Erlang, 46 bayt

f(N)when N<3->1;f(N)->f(N-f(N-1))+f(N-f(N-2)).

0

Lua, 59 bayt

function a(n)return n<3 and 1 or a(n-a(n-1))+a(n-a(n-2))end
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.