Iccanobif Dizisini çıkartın


22

nOEIS'de A014258 olarak belgelenen Iccanobif dizisindeki diziyi tam sayıya kadar çıkaran veya döndüren bir program veya adlandırılmış işlev yazın . Sıfır 0ise n, yalnızca ( ) dizisindeki sıfırıncı öğenin yazdırılacağını unutmayın .

Dizi, standart Fibonacci dizisi gibi başlayarak üretilir, ancak önceki iki sayıyı ekledikten sonra sonucu çevirirsiniz ve baştaki sıfırları düşürürsünüz. En azından benim için ilginç bir gerçek, bu dizinin kesinlikle artmamasıdır (aşağıdaki listeye bakınız). Ayrıca, Fibonacci dizisine kesinlikle eşit veya ondan daha büyük (ve muhtemelen de) görünüyor.

Programınızın girişi bir tamsayı olmalıdır.

Dizinin ilk 20 numarası, görüntüleme zevkiniz için burada verilmiştir:

0, 1, 1, 2, 3, 5, 8, 31, 93, 421, 415, 638, 3501, 9314, 51821, 53116, 739401, 715297, 8964541, 8389769

Standart boşluklar yasaktır.

En kısa program kazanır.

EDIT: Dizinin sıfırıncı eleman ile başladığını ve nsıfır ise dahil edilmesi gerektiğini açıklığa kavuşturmak için bir not eklendi .

Örnek IO olanakları:

0    ->    0
1    ->    0 1
6    ->    0 1 1 2 3 5 8
17   ->    [0, 1, 1, 2, 3, 5, 8, 31, 93, 421, 415, 638, 3501, 9314, 51821, 53116, 739401, 715297]

Şimdi birkaç cevap olduğuna göre, aşağıda Python 2'deki işaretlemeyle gizlemek için çok çalıştığım uygulamalar:

yinelemeli:

# İlk programıma en yakın olanı. 73 bayt. Ayrıca bu program not edilmelidir
 yığın taşmasına ulaşılamıyor. 10 saniyeden az bir sürede n = 5000 için çalışır.

i,a,b=input(),0,1
print a
while i:print b;i,a,b=i-1,b,int(str(a+b)[::-1])

özyineli:

#Bunun nsondaki yeni satırları yazdırdığını unutmayın . 64 bayt.
 N'nin büyük değerleri için yığın taşması hatasına çarpacak.

def f(n,i=0,j=1):print i,n and f(n-1,j,int(str(i+j)[::-1]))or'';


8
Daha önce yapılmamış Fibonacci dizisi ile bir ilgisi olduğunu düşünmek için +1
Level River St

@ steveverrill Başka bir meydan okuma yapmak istediğime karar verdim, sonra dizilimin nasıl olacağını görmek için karar verdim. Bu yüzden bir program yazdım. Sonra OEIS'i aradım ve mücadeleyi yaptım.
mbomb007

Bu sorudan ilham aldı mı?
JohnE

@JohnE Hayır. Daha önce gördüm, ancak bu zorluk bu sitedeki en basit zorluklardan biri. Hayır, sadece hayal gücümden bir meydan okuma olarak kullanabileceğim bir sayı dizisi yaratıyordum.
mbomb007

3
Bence bir cevap kabul etmeden önce biraz daha beklemelisin. Cevaplardan biri açıkça rakipsiz olmadığı sürece (örneğin 1 baytlık bir çözüm), en az bir hafta beklemeniz önerilir.
Dennis

Yanıtlar:


3

Pyth, 17 15 14

Pu+Gs_`s>2GQU2

Çevrimiçi deneyin

Çok basit bir uygulama, range(2)girişe eşit sayıda eleman ekler ve ekler, ardından ekstralar kesilir ve son eleman çıkar.

Tersine çevreyi işaret ettiğin için teşekkürler @Jakube >.

açıklama

Pu+Gs_`s>2GQU2    : Q = eval(input) (implicit)
P                 : all but the last element
 u         QU2    : reduce Q times starting with [0, 1]
  +G              : add to the previous result
       s>2G       : sum of the last two elements of G
    s_`           : int(reversed(repr(above value)))

4

Python 2, 58 bayt

a=0;b=1
exec"print a;a,b=b,int(str(a+b)[::-1]);"*-~input()

strPython 2'de yeterince büyük sayılar sonunda bir L ile yazıldığından, backticks yerine dönüştürmeyi kullanır . Özyinelemeli bir işlev denedim, ancak daha uzun sürdü (61):

f=lambda n,a=0,b=1:-~n*[0]and[a]+f(n-1,b,int(str(a+b)[::-1]))

3

Julia, 79 bayt

f=n->(t=[0,1];for i=2:n push!(t,t[i]+t[i-1]|>string|>reverse|>int)end;t[1:n+1])

Bu, bir tamsayıyı giriş olarak kabul eden ve bir tamsayı dizisi döndüren bir işlev yaratır.

Ungolfed + açıklama:

function f(n)
    # Start with the usual Fibonacci stuff
    t = [0,1]

    # Looooooooooooooop
    for i = 2:n
        # Compute the Iccanobif number by piping results
        iccanobif = t[i] + t[i-1] |> string |> reverse |> int

        # Jam it into t
        push!(t, iccanobif)
    end

    # Return the first n + 1
    t[1:n+1]
end

Örnekler:

julia> f(1)
2-element Array{Int64,1}:
 0
 1

julia> f(17)
18-element Array{Int64,1}:
      0
      1
      1
      2
      3
      5
      8
     31
     93
    421
    415
    638
   3501
   9314
  51821
  53116
 739401
 715297

3

T-SQL, 149

Özyinelemeli CTE sorgusu kullanan çok düz ileri satır içi tablo işlevi. INT'leri kullandığı için bu 37'de zirveye çıkacaktır.

create function i(@ int)returns table return with r as(select 0I,1N union all select n,reverse(i+n)+0from r)select 0n union all select top(@)n from r

Aşağıdaki gibi kullanılır

select * from i(0)
n
-----------
0

(1 row(s) affected)

select * from i(1)
n
-----------
0
1

(2 row(s) affected)

select * from i(6)
n
-----------
0
1
1
2
3
5
8

(7 row(s) affected)

select * from i(17)
n
-----------
0
1
1
2
3
5
8
31
93
415
421
638
3501
9314
51821
53116
715297
739401

(18 row(s) affected)

3

K, 25 23 bayt

{-1_ x{x,.|$+/-2#x}/!2}

No Stinking Loops'taki örneklerden birinin basit bir şekilde değiştirilmesi .

İfade .|$, bir dizgeye bir sayı yazar, onu tersine çevirir ve sonra değerlendirir.

Düzenle:

Benim açımdan sınır şartlarına özensiz dikkat. Şimdi daha doğru:

  {-1_ x{x,.|$+/-2#x}/!2}'0 1 6 10
(,0
 0 1
 0 1 1 2 3 5 8
 0 1 1 2 3 5 8 31 93 421 415)

Düzenleme 2:

(x+1)#-1_2 karakter kaydedilerek değiştirilebilir . Boşluk gereklidir, çünkü aksi takdirde _xbir değişkene uygulanan "bırakma" operatörünü istediğimde bir tanımlayıcı olacaktır x.


2
OP'ye göre, çıkış sıfır ile başlamalıdır.
Stretch Maniac

Doğru - Şimdi düzeltilmeli.
JohnE,

1
Buraya sadece aynı olanı görmek için bir cevap göndermek için geldim. Güzel bitti.
tmartin

3

Haskell, 64 49 bayt

a!b=a:b!(read$reverse$show$a+b)
q n=0:take n(1!1)

Kullanım örneği: q 15->[0,1,1,2,3,5,8,31,93,421,415,638,3501,9314,51821,53116]

Nasıl çalışır: !özyinelemeli olarak ilk argümanından başlayarak sonsuz bir iccanobif sayıları listesi oluşturur (ikinci argüman bir sonraki iccanobif sayısı olmalıdır). iccanobif listesindeki qilk nsayıları 1, 1a ile başlar ve a ile hazırlar 0.


2

CJam, 18 bayt

U1{_2$+sW%i}ri*;]p

Nasıl çalışır

U1                      e# First two numbers in the series
  {        }ri*         e# Run the loop input numbers times
   _2$+                 e# Get sum of last two numbers in the series
       sW%i             e# Convert to string, inverse and convert back to a number
                ;       e# Remove the last number to get only first n + 1 numbers.
                 ]p     e# Wrap all numbers in an array and print the array

Burada çevrimiçi deneyin


2

Java - 126 124

Java'yı bu sitenin etrafında bir süredir görmedim ...

void f(int b){for(int c=0,d=1,g;b-->=0;d=Integer.valueOf(new StringBuilder(c+(c=d)+"").reverse()+""))System.out.println(c);}

f(5) baskılar 0 1 1 2 3 5 8 31 93 421 415 638


Ben de kabul ediyorum...System.out.println(c);
mbomb007 23:15

@ mbomb007 Teşekkürler! Beni 2 bayt kurtardı.
Stretch Maniac

Java'nın string manipülasyonu pahalı olduğundan, bir sayıyı tersine çevirmek için sayısal yöntemi kullanarak muhtemelen kısaltabilirsiniz .
mbomb007

Ben fazla 1,5 yıl geçti biliyorum ama değiştirerek 6 bayt kaydedebilirsiniz Integer.valueOf(ile new Long((ve sonra değiştirmek intiçin-döngüsünde longsıra). Bunun yerine sadece tamsayılarla çalışmayı tercih ediyorsanız new Integer(, hala daha kısadır Integer.valueOf(.
Kevin Cruijssen

2

SWI-Prolog, 141 131 121 bayt

a(X,R):-X>1,A is X-1,a(A,B),reverse(B,[K,L|_]),W is K+L,name(W,Z),reverse(Z,Y),name(E,Y),nth0(X,R,E,B);X=1,R=[0,1];R=[0].

Çalışan a(17,X).çıkışlar:

[0, 1, 1, 2, 3, 5, 8, 31, 93, 421, 415, 638, 3501, 9314, 51821, 53116, 739401, 715297] 

a(10000,X).Bilgisayarımın çıktısını almak yaklaşık 10 saniye sürüyor .

Düzenleme: Yukarıdaki 121 baytlık sürüm, bir tek tanım tanımı = bir astar. Eski 131 bayt sürümü aşağıdaki gibidir (olarak çalıştırılması gerekir p(17,X)):

a(0,[0]).
a(1,[1,0]).
a(X,[E|B]):-A is X-1,a(A,B),B=[K,L|_],W is K+L,name(W,Z),reverse(Z,Y),name(E,Y).
p(X,Y):-a(X,Z),reverse(Z,Y).

2

> <> (Balık) 592 254 Bayt

Süper golf oynamayan (hiçbir şey yapmayan toplam 42/43 boşluk ve toplamda 30 yeniden yönlendirme jetonu), ancak ilk etapta çalışmasını sağlamak ilginç bir egzersizdi.

10!/{:}0=?v/{1-}}:{+:0}!/a,:1%-:0=?!v~{:1!/$:@0=?!v$~}}:&{{&*\
/-$/    ;n/\oo", "n:    \       }+1{/     \$-1$*a /|.!20}}01@/
* :{:}(?v:{!":}-1!/$:@0=?!v$~{:}1!/$:@0=?!v$~}}}:&{{{&*:1%-*&{{&+}}{1+}02.
b .1 +bb   \      \$-1$*a /       \$-1$,a /
\*9{~~~{/

İlk yığında istenen uzunluğu sağlayarak burada test edebilirsiniz .

EDIT: yarıya byte sayısından daha fazla


2

PHP, 114 , 109 bayt

function f($n){if($n==0)return 0;$f=[0,1];for($i=2;$i<=$n;++$i){$f[$i]=strrev($f[$i-1]+$f[$i-2]);}return $f;}

Hiçbir şey fantezi, sadece ters sihir ile ortalama bir fibonacci algoritması.

Ungolfed:

function f($n)
{
    if($n == 0) return 0;
    $f = [0, 1];
    for ($i=2; $i<=$n; ++$i){
        $f[$i] = strrev($f[$i-1] + $f[$i-2]);
    }
    return $f;
}

1

Excel VBA, 279 bayt

n = InputBox("n")
For i = 0 To n
If i < 2 Then
Cells(i + 1, 1) = i
ElseIf i > 6 Then
x = Cells(i, 1) + Cells(i - 1, 1)
l = Len(x)
v = CStr(x)
For j = 1 To l
r = r + Right(v, 1)
v = Left(v, l - j)
Next j
Cells(i + 1, 1) = r
r = ""
Else
Cells(i + 1, 1) = Cells(i, 1) + Cells(i - 1, 1)
End If
Next i

Makroyu çalıştırmak, kullanıcıdan n için bir değer girmesini ister.

Sonuçlar daha sonra A sütununda satır satır yazdırılır:

Çıktı


1
Kısaltmak için kodunuzdaki boşlukları kaldırabilir misiniz?
mbomb007

@ mbomb007 Excel VBA yazarken boşlukları otomatik olarak girilir, bu yüzden onları sadece bırakın.
Wightboy

1

JavaScript (ES2015), 81 73 bayt

(a,b=0,c=1)=>{for(;a-->-1;c=[...(b+(b=+c)+"")].reverse().join``)alert(b)}

Bu işlevi çalıştırma (adlandırılmış f) 6:

f(6);// alerts: 0, 1, 1, 2, 3, 5, 8

1

Pip , 13 bayt

Bu programda kullanılan tüm özelliklerin, bu soru sorulmadan önce Pip'de mevcut olduğundan eminim.

LaSio:+RVi+oi

Komut satırı argümanı olarak girdi alır. Çevrimiçi deneyin!

açıklama

               a is 1st cmdline arg; i is 0; o is 1 (implicit)
La             Loop (a) times:
       RVi+o   Reverse of i+o
      +        Unary + treats its operand as a number, thus removing leading 0's
    o:         Assign the result to o...
  Si           ... before swapping i and o
            i  After the loop, output i

İki değişkenin değerleri böyle gelişir:

Iter   o   i (output)
   0   1   0
   1   0   1
   2   1   1
   3   1   2
   4   2   3
   5   3   5
   6   5   8
   7   8  31
   8  31  93
   9  93 421
  10 421 415

0

Pushy , 18 bayt ( yarışmaz )

Z1{:2d+vFs@KjkvF;_

Çevrimiçi deneyin!

Programların en şıkı değil ama işe yarıyor.

Z1     \ Push 0 and 1 to begin the sequence
{:     \ Input times do:
 2d+   \   Add the last two terms
 vF    \   Send to second stack
 s     \   Split into digits
 @Kjk  \   Reverse and join into one number
 vF;    \   Send back to first stack
_      \ At the end of the program, print the whole stack.

@ mbomb007 evet, üzgünüm!
FlipTack


0

R, 134 bayt

i=function(n){s=c(0,1);for(i in 3:n){s[i]=as.numeric(paste0(rev(strsplit(as.character(s[i-2]+s[i-1]),'')[[1]]),collapse=''))};cat(s)}

Örnek:

> i(10)
0 1 1 2 3 5 8 31 93 421

Birinin numaranızı almaktan daha iyi bir R alternatifi olup olmadığını görmek ister, bir dize yapmak, tersine çevirmek ve tekrar bir sayıya çevirmek isterim.


0

Groovy, 70 bayt

{r={"$it".reverse() as int};f={n->n<3?1:r(f(n-1))+r(f(n-2))};r(f(it))}

{
    r={"$it".reverse() as int};       // Reverse digits, costly using string.
    f={n->n<3?1:r(f(n-1))+r(f(n-2))}; // Recursive Iccanobbif implementation.
    r(f(it))                          // Reverse final output.
}
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.