X Adım İleri, 1 Adım Geri


21

İşte kolay bir dizinin ilk 100 sayısı:

0,1,0,2,1,4,3,7,6,11,10,16,15,22,21,29,28,37,36,46,45,56,55,67,66,79,78,92,91,106,105,121,120,137,136,154,153,172,171,191,190,211,210,232,231,254,253,277,276,301,300,326,325,352,351,379,378,407,406,436,435,466,465,497,496,529,528,562,561,596,595,631,630,667,666,704,703,742,741,781,780,821,820,862,861,904,903,947,946,991,990,1036,1035,1082,1081,1129,1128,1177,1176,1226

Bu dizi nasıl çalışır?

n: 0 1     2           3     4     5     6     7     8      9       10      11      12

   0,      1-1=0,      2-1=1,      4-1=3,      7-1=6,       11-1=10,        16-1=15,      
     0+1=1,      0+2=2,      1+3=4,      3+4=7,      6+5=11,        10+6=16,        15+7=22
  • a(0) = 0
  • Her garip n(0 indeksli) için, a(n-1) + X(neredeX=1 ve 1 ile artış gösterir erişilir her zaman)
  • Her biri için n(0 indeksli)a(n-1) - 1

Meydan okuma:

Biri:

  • Bir giriş tamsayısı verildiğinde n,n dizisinde 'inci sayısı.
  • Bir giriş tamsayısı nverildiğinde ilk çıkışn , dizinin sayılarını çıkar.
  • Giriş yapmadan ( veya kullanılmayan boş bir giriş yapmadan) diziyi süresiz olarak çıkarın .

Meydan okuma kuralları:

  • Giriş n , hem 0- hem de 1 indeksli olabilir.
  • Dizinin çıktısını alırsanız (bir kısmını), herhangi bir sınırlayıcıyla (boşluk, virgül, yeni satır vb.) STDOUT'a yazdırarak bir liste / dizi kullanabilirsiniz. Senin çağrı.
  • Lütfen cevabınızda hangi üç seçeneğin kullanıldığını belirtiniz.
  • En az ilk 10.000 numarayı desteklemelisiniz (10.000. Sayı 12,497,501).

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT fonksiyonlarını, uygun parametrelerle fonksiyonlarını ve geri dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen mümkünse bir açıklama ekleyin.

Test durumları:

Pastebin dizisindeki ilk 10.001 sayı ile. İstediğiniz herhangi bir seçim yapmaktan çekinmeyin.

Bazı yüksek sayılar:

n (0-indexed)    Output:

68,690           589,772,340
100,000          1,249,975,000
162,207          3,288,888,857
453,271          25,681,824,931
888,888          98,765,012,346
1,000,000        124,999,750,000

Yanıtlar:



8

Excel, 31 bayt

Cevap 0endekslendi. Çıkışlar nsayı.

=(A1^2+IF(ISODD(A1),7,-2*A1))/8

Açıklanan dizi, nihayetinde geçmeli sadece iki dizidir:

ODD:   (x^2+x+2)/2
EVEN:  (x^2-x)/2

Bunları 0dizine dizilmiş bir diziye yerleştirmek:

a = (x^2 - 2x)/8 if even
a = (x^2 + 7 )/8 if odd

Hangi verir:

=IF(ISODD(A1),(A1^2+7)/8,(A1^2-2*A1)/8)

hangi 31baytlara kadar golf .


Aynı yaklaşımı kullanarak, 1dizinlenmiş 37bayt verir :

=(A1^2-IF(ISODD(A1),4*A1-3,2*A1-8))/8

6

Jöle , 6 bayt

Rj-ḣ⁸S

Çevrimiçi deneyin!

0 endeksli. İadenİnci sayısını .

Açıklama:

Rj-ḣ⁸S Arguments: z
R      [1..x]: z (implicit)
 j-    Join x with y: ^, -1
   ḣ⁸  Take first y of x: ^, z
     S Sum: ^


4

Haskell , 40 38 37 bayt

scanl(flip($))0$[1..]>>=(:[pred]).(+)

Sonsuz bir liste döndürür, çevrimiçi deneyin!

açıklama

scanlÜç argüman alır f, initve xs( [ x 0 , x 1 ... ] ) ve yeni bir liste oluşturur:

[ a 0 = init , a 1 = f (a 0 , x 0 ) , a 2 = f (a 1 , x 1 ) ... ]

init = 0Döndürülmüş ($)uygulama operatörünü ayarlayıp kullanıyoruz (bu nedenle x i fonksiyonuna bir i uygular ), şimdi sadece bir fonksiyon listesine ihtiyacımız var - liste[1..]>>=(:[pred]).(+) doğru fonksiyonları ile sonsuz bir listesi:

[(+1),(-1),(+2),(-1),(+3),(-1),(+4),...

İlginç alternatif, 37 bayt

fliptürünün Haskell'in türündeki çıkarımı yerine (a -> b -> c) -> b -> a -> ckullanabileceğimiz türdenid :: d -> d($)d ile birleşik olacaka -> b bize aynı şeyi veriyor.

Çevrimiçi deneyin!

Düzenle

-Notation (>>=)yerine -2 bayt kullanılır do.

-1 bayt scanlyerine kullanarak zipWith.



3

05AB1E , 10 bayt

ÎF<NÈi¼¾>+

Çevrimiçi deneyin!

açıklama

Î             # initialize stack with: 0, input
 F            # for N in [0 ... input-1] do:
  <           # decrement the current number
   NÈi        # if N is even
      ¼       # increment a counter
       ¾>     # push counter+1
         +    # add to current number

10 bayt daha: ÎFNÈN;Ì*<O


ÎGDN+D<diziyi oluşturur, ancak nth elemanını almak 3 baytta zor gözüküyor.
Magic Octopus Urn,


3

APL (Dyalog Unicode) , 16 12 bayt SBCS

Anonim zımni önek işlevi. 0 endeksli.

+/⊢↑∘∊¯1,¨⍨⍳

Çevrimiçi deneyin!

+/ toplamı

⊢↑ ilk n elemanlar

∘∊ arasında £ değerinin nlisted (düzleştirilmiş)

¯1,¨⍨ Negatif-on-ekteki-için-her

 ilk n girdiler (0 - n–1


Ah, bu benim çözümümdü ... sanırım yeterince benzerdi.
Outgolfer Erik,

3

Jöle , 6 bayt

HḶS‘_Ḃ

Kabul bir Monadik bağlantı (1 endeksli) nolan döner a(n).

Çevrimiçi deneyin! Veya test odasına bakın

Nasıl?

HḶS‘_Ḃ - link: n
H      - halve         -> n/2.0
 Ḷ     - lowered range -> [0,1,2,...,floor(n/2.0)-1]
  S    - sum           -> TriangleNumber(floor(n/2.0)-1)
   ‘   - increment     -> TriangleNumber(floor(n/2.0)-1)+1
     Ḃ - bit = 1 if n is odd, 0 if it's even
    _  - subtract      -> TriangleNumber(floor(n/2.0)-1)+isEven(n)

Hm, işte ilginç bir yaklaşım.
Outgolfer Erik,

3

PHP , 73 64 55 51 47 bayt

İlk yöntem

İlk kod golf cevap!
Eminim onu ​​kısaltmak için PHP hileci vardır ve matematik muhtemelen geliştirilebilir.

İlk argüman olarak n'yi alır ve dizideki nth sayısını çıkarır.

$y=$argv[1]/2;for(;$i<$y+1;)$x+=$i++;echo$x-($y|0);

"$ X = 0;" kaldırarak eksi 9 bayt ve "$ i = 0".

@Kevin Cruijssen sayesinde for döngüsü ve bitiş etiketinin kaybını artıran eksi 9 bayt.

Bitsel veya "|" kullanarak eksi 1 bayt "(int)" yerine

@Dennis sayesinde eksi 3 bayt, etiketleri "php -r 'code here'" komut satırından çalıştırarak etiketleri kaldırabilirsiniz.

Çevrimiçi deneyin!

İkinci yöntem

Önceki cevabımı yepyeni bir yöntemle eşleştirdim!

for(;$i<$argv[1];$i++)$x+=($y^=1)?$i/2+1:-1;echo$x;

Döngüdeki toplamlar arasında geçiş yapmak için XOR ve tenary operatörünü kullanma.

Düzenleme: Bu n = 0 için çalışmıyor ve nedenini bilmiyorum. $ i atanmadı, bu yüzden 0 olmalı, bu nedenle döngü ($i<$argv[1])başarısız olmalı (0<0==false), bu nedenle atanmamış bir $ x 0 olmalı ve 1 değil.

Çevrimiçi deneyin!

Üçüncü yöntem

@Wischisch excel formülünü PHP'ye dönüştürmek 47 baytlık bir çözüm sunar

$z=$argv[1];echo(pow($z,2)+(($z&1)?7:-2*$z))/8;

Çevrimiçi deneyin!


1
Merhaba, PPCG'ye hoş geldiniz! Henüz yapmadıysanız, PHP’de golf oynamak için ipuçları ve <tüm dillerde> golf için ipuçları okumak ilginç olabilir. Golf için bazı şeyler: izini kaldırabilirsiniz ?>. Çıkarma $x=0ve $i=0gerçekten izin verilir (olmasaydı, $x=$i=0aynı zamanda daha kısa olurdu). Ayrıca, döngü kısaltılabilir for(;$i<$y+1;)$x+=$i++;. Toplamda -15 bayttır. Kaldınız! :)
Kevin Cruijssen

@KevinCruijssen çok teşekkürler!
Sam Dean

Rica ederim. Ancak, TIO'nuz halen 58 yerine 60 bayttır. Neden 57 dediğinizden emin değilsiniz . Çevrimiçi deneyin.
Kevin Cruijssen

@KevinCruijssen Yanlış TIO'yu göndermeye devam ettim! TIO şimdi 58 diyor, ancak açılış etiketinden "php" yi silebildiğiniz için 55 yazdım, ancak TIO'da değil
Sam Dean

@Wernisch formülü için teşekkürler!
Sam Dean

3

R , 35 bayt

diffinv(rbind(n<-1:scan(),-1)[n-1])

Çevrimiçi deneyin!

Bunun ilginç bir alternatif olduğunu düşündüm @ JayCe'nin cevabına çünkü matrisler için yerleşik desteği olmayan dilleri çok iyi desteklemiyor ve tıpkı golf gibi.

1 indeksli, ilkini döndürür n dizinin elemanlarını .

Nasıl çalışır:

rbind(n<-1:scan(),-1) aşağıdaki matrisi oluşturur:

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   -1   -1   -1   -1

R matrisleri sütun ana düzeninde tuttuğu için, eğer bunu a'ya dönüştürseydik vector, bir vektör elde ederiz.

1 -1 2 -1 3 -1 4 -1

Bir kümülatif toplamı alırsak,

1 0 2 1 4 3 7 6

bu, sadece öncü olmadan dizidir 0. diffinvNeyse ki baştaki sıfırı ekler, bu yüzden ilk n-1değerleri matristen ve diffinvonlardan alırız n, dizinin ilk değerlerini elde ederiz .


2
'Diffinv' cevaplarınızın büyük hayranıyım.
JayCe


3

R , 35 bayt

(u=(n=scan())-n%%2-1)-n+(15+u^2)/8

Çevrimiçi deneyin!

İlk çıktı seçeneği. Formülü diğer birçok cevap olarak adlandırın (formülü sağlayan ilk cevaba işaret etmek istiyorum, hangisinin olduğunu anlayamıyorum).

Aşağıdaki ikinci ve üçüncü çıktı seçenekleri:

R , 43 bayt

function(m,n=1:m,u=n%%2+1)((n-u)^2-1)/8+2-u

Çevrimiçi deneyin!

R , 51 bayt

while(T){cat(((T-(u=T%%2+1))^2-1)/8+2-u," ");T=T+1}

Çevrimiçi deneyin!


3

Matlab / Octave, 31 26 bayt

5 bayt, Luis Mendo'ya teşekkür etti!

@(n)sum(1:n/2+.5)-fix(n/2)

1
Muhtemelen fixyerine floorve n/2+.5yerine kullanabilirsinizceil(n/2)
Luis Mendo

@LuisMendo Ty! Bilmiyordum fix()ve 1:n/2+.5çalışmayı beklemiyordum - bir şeyler yanlış gidebilirdi, ama aslında bilmiyorlar :)
Leander Moesinger




3

QBasic, 31 bayt

Sadece spec-uygulayın çözümü Erik'in çözümünden biraz daha uzun sürüyor .

DO
?n
i=i+1
n=n+i
?n
n=n-1
LOOP

Bu süresiz olarak çıkar. Çalıştırmak için, son satırın LOOP WHILE INPUT$(1) <> "q", her ikinci sıra girişinden sonra bir tuşa basılmasını bekleyecek ve tuşa basıldığında çıkacak gibi bir şeye değiştirmenizi öneririm q.


2

C # (.NET Core) , 56 bayt

n=>{int a=0,i=0;for(;++i<n;)a+=i%2<1?-1:i/2+1;return a;}

Kevin Crujssen sayesinde -2 bayt

Çevrimiçi deneyin!

1 endekslendi. İadea(n)

Ungolf'd:

int f(int n)
{
    // a needs to be outside the for loop's scope,
    // and it's golfier to also define i here
    int a = 0, i = 1;
    // basic for loop, no initializer because we already defined i
    for (; ++i < n;)
    {
        if (i%2 < 1) {
            // if i is even, subtract 1
            a -= 1;
        }
        else
        {
            // if i is odd, add (i / 2) + 1
            // this lets us handle X without defining another int
            a += i / 2 + 1;
        }
    }
    // a is the number at index n
    return a;
}

1
i=1;for(;i<n;i++)olabilir i=0;for(;++i<n;)ve i%2==0olabilir i%2<1.
Kevin Cruijssen

@KevinCruijssen böylece yapabilirim, teşekkürler! İkinciyi görmeliydim, ancak ilki çalışacağını hiç düşünmemiştim, ilk döngüden sonra koşullu kontrol edilen döngüler için düşündüm. TIL
Skidsdev

Hayır, zaten ilk tekrarlamadan önce kontrol eder. Bir do-whileilk yineleme tamamladıktan sonra kontrol edecektir. :)
Kevin Cruijssen

Çok nadir durumlarda if, bir for-loop ile birleştirme bile yapabilirsiniz. Örneğin: if(t>0)for(i=0;i<l;i++)için for(i=0;t>0&i<l;i++). Yine de, cevaplarımı kullanmakta neredeyse hiç başaramadım.
Kevin Cruijssen

Bu oldukça harika, kesinlikle bir dahaki sefere aklımda tutmam gerekecek bir dahaki sefere ben C # golf, bu günlerde oldukça nadirdir: P # C # çalışmalarımın çoğu kesinlikle ungolfy
Skidsdev

2

Kabuk , 11 9 8 bayt

ΘṁṠe→Θ∫N

H.PWiz sayesinde bir bayt kaydedildi.
Sonsuz bir liste olarak çıkar.
Çevrimiçi deneyin!

açıklama

ΘṁṠe→Θ∫N
      ∫N   Cumulative sum of natural numbers (triangular numbers).
     Θ     Prepend 0.
 ṁṠe→      Concatenate [n + 1, n] for each.
Θ          Prepend 0.

2

Dodos , 69 bayt

	. w
w
	. h
	+ r . ' dab h '
h
	h ' '
	. dab
r
	
	r dip
.
	dot
'
	dip

Çevrimiçi deneyin!


Her nasılsa bu en uzun cevap.

Açıklama.

┌────┬─────────────────────────────────────────────────┐
│Name│Function                                         │
├────┼─────────────────────────────────────────────────┤
│.   │Alias for "dot", computes the sum.               │
├────┼─────────────────────────────────────────────────┤
│'   │Alias for "dip".                                 │
├────┼─────────────────────────────────────────────────┤
│r   │Range from 0 to n, reversed.                     │
├────┼─────────────────────────────────────────────────┤
│h   │Halve - return (n mod 2) followed by (n/2) zeros.│
└────┴─────────────────────────────────────────────────┘

1

Mangal kömürü , 15 bayt

I∨ΣEN⎇﹪ι²±¹⊕⊘ι⁰

Çevrimiçi deneyin! 0 endeksli. Bağlantı, kodun ayrıntılı bir versiyonudur. Formül muhtemelen daha kısa olurdu, ama bunun nesi eğlenceli? Açıklama:

    N           Input as a number
   E            Map over implicit range
     ⎇          Ternary
      ﹪ι²       Current value modulo 2
         ±¹     If true (odd) then -1
           ⊕⊘ι  Otherwise calculate X as i/2+1
  Σ             Take the sum
 ∨            ⁰ If the sum is empty then use zero
I               Cast to string and implicitly print

1

JavaScript, 49 48 45 bayt

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')

Çevrimiçi deneyin!

@Tsh cevabı kadar güzel değil ama benimki daha büyük sayılar için çalışıyor.

Ve şimdi @tsh, evalçözüm için teşekkürler !


<=x+1olabilir<x+2
Kevin Cruijssen

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')daha kısa olmalı
tsh

Does evalson düzenleme değeri döndürür? Ne yapabileceğini hala tam olarak anlamadım.
Rastgele adam

İfadenin değerini ( sonraki sürümde ifadede ele alınabilir) döndürür do.
tsh

1

Befunge 93, 26 bayt

<v0p030
 >:.130g+:30p+:.1-

Süresiz çalışır İnternet'te
deneyin , çıktı biraz kazanır ve x = 256'dan sonra geri gider, muhtemelen TIO U + 256 üzerindeki karakterleri kullanamaz. Https://www.bedroomlan.org/tools/befunge-playground adresinde iyi çalışır (yalnızca Chrome, ne yazık ki. Firefox ile, bitiş çizgileri çalışma zamanında kaldırılır, nedense ...)



1

Pyth , 8 bayt

s<s,R_1S

İade n0 indeksli dizideki inci sayısını . Çevrimiçi deneyin

Açıklama, örneğin n=5:

s<s,R_1SQQ   Final 2 Q's are implicit, Q=eval(input())

       SQ    1-indexed range        [1,2,3,4,5]
   ,R_1      Map each to [n,-1]     [[1,-1],[2,-1],[3,-1],[4,-1],[5,-1]]
  s          Sum (Flatten)          [1,-1,2,-1,3,-1,4,-1,5,-1]
 <       Q   Take 1st Q             [1,-1,2,-1,3]
s            Sum, implicit output   4

1

Perl 6 ,  38  26 bayt

{(0,{$_+(($+^=1)??++$ !!-1)}...*)[$_]}

Dene

{(+^-$_+|1)**2 div 8+$_%2}

TFeld'in Python cevabı tersine mühendislik dayanarak .
Dene

Expanded

38 bayt (sıra üreteci):

{  # bare block lambda with implicit parameter $_

  (
    # generate a new sequence everytime this function is called

    0,    # seed the sequence

    {     # bare block that is used to generate the rest of the values

      $_  # parameter to this inner block (previous value)

      +

      (
          # a statement that switches between (0,1) each time it is run
          ( $ +^= 1 )

        ??     # when it is 1 (truish)
          # a statement that increments each time it is run
          ++$ # &prefix:« ++ »( state $foo )

        !!     # or else subtract 1
          -1
      )
    }

    ...  # keep generating until:

    *    # never stop

  )[ $_ ] # index into the sequence
}

Bunun, geçebileceğiniz avantaj olduğunu unutmayın. * tüm sırayı almak için geçebileceğiniz ya da daha verimli bir şekilde birden fazla değer üretmek için bir Aralık'ta geçebileceğiniz .

26 bayt (doğrudan hesaplama):

{  # bare block lambda with implicit parameter $_

  (

    +^     # numeric binary negate
      -$_  # negative of the input
      +|   # numeric binary or
      1

  ) ** 2   # to the power of 2

  div 8     # integer divide it by 8

  + $_ % 2  # add one if it is odd
}

1

05AB1E , 8 bayt

;L¨O>¹É-

Çevrimiçi deneyin!

Jonathan Allan'ın Jelly yaklaşımına dayanarak (muhtemelen OP dizinin başka bir tanımı ile soruyu düzenlemeye dayanıyordu), yani 1 indekslendi.


+1. 05AB1E'de hazırlanan benzer bir yaklaşıma sahiptim, eğer kimsenin göndermemesi durumunda birkaç gün içinde göndermeyi planladım. Biraz farklıdır (önce kuyruğu kaldırmak yerine, listeyi oluşturmadan önce I¹;<LO>IÉ-
yarıyı düşürürüm

@KevinCruijssen Daha derin düşünebilme yeteneğim olsaydı dün yayınlanırdı, ama, bu, final dönemi, bunun hakkında çok derin düşünmek yasaktır. : P
Outgolfer Erik

Ah, artık finaller yapmadığım için mutluyum. Ben de işyerimde oldukça meşgulüm ve bazen kod golfü istediğimden daha fazla ertelemek zorunda kalıyorum. ; p Sınavlarınızda başarılar!
Kevin Cruijssen

1

Dışbükey , 10 9 bayt

_½,ª)\2%-

Çevrimiçi deneyin!

Jonathan Allan'ın Jelly yaklaşımına dayanarak (muhtemelen OP dizinin başka bir tanımı ile soruyu düzenlemeye dayanıyordu). 1 endeksli.

Açıklama:

_½,ª)\2%- Stack: [A]
_         Duplicate. Stack: [A A]
 ½        Halve. Stack: [A [A]½]
  ,       Range, [0..⌊N⌋). Stack: [A [[A]½],]
   ª      Sum. Stack: [A [[A]½],]ª]
    )     Increment. Stack: [A [[[A]½],]ª])]
     \    Swap. Stack: [[[[A]½],]ª]) A]
      2   2. Stack: [[[[A]½],]ª]) A 2]
       %  Modulo. Stack: [[[[A]½],]ª]) [A 2]%]
        - Minus. Stack: [[[[[A]½],]ª]) [A 2]%]-]

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.