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.