X Langkah Maju, 1 Langkah Mundur


21

Di sini 100 angka pertama dari urutan yang mudah:

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

Bagaimana cara kerja urutan ini?

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
  • Untuk setiap ganjil n(diindeks 0), ini a(n-1) + X(di mana X=1dan bertambah 1 setiap kali diakses)
  • Untuk setiap even n(0-diindeks), itua(n-1) - 1

Tantangan:

Satu dari:

Aturan tantangan:

  • Input ndapat berupa 0 atau 1-diindeks.
  • Jika Anda menampilkan (bagian dari) urutan, Anda dapat menggunakan daftar / larik, mencetak ke STDOUT dengan pembatas apa pun (spasi, koma, baris baru, dll.). Panggilanmu.
  • Harap sebutkan mana dari tiga opsi yang Anda gunakan dalam jawaban Anda.
  • Anda harus mendukung setidaknya 10.000 nomor pertama (nomor 10.000 adalah 12,497,501).

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika memungkinkan.

Kasus uji:

Pastebin dengan 10.001 angka pertama dalam urutan. Jangan ragu memilih yang Anda inginkan.

Beberapa angka yang lebih tinggi:

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

Jawaban:



8

Excel, 31 byte

Jawaban 0diindeks. Keluarkan njumlahnya.

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

Urutan yang dijelaskan pada akhirnya hanya dua urutan yang saling terkait:

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

Interlacing ini menjadi satu 0urutan diindeks memberikan:

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

Pemberian yang mana:

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

yang kita golf ke 31byte.


Menggunakan pendekatan yang sama, 1diindeks memberikan 37byte:

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

6

Jelly , 6 byte

Rj-ḣ⁸S

Cobalah online!

Diindeks 0. Mengembalikan nnomor th.

Penjelasan:

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

4

JavaScript (Node.js) , 23 byte

x=>(7+(x-2|1)**2)/8-x%2

1-diindeks. Cobalah online!

f(x) = f(x+1) + 1 if x is even
     = SUM{1..(x-3)/2} if x is odd

SUM{1..(x-3)/2}
= (1+(x-3)/2)*((x-3)/2)/2
= (x-1)*(x-3)/8
= ((x-2)^2-1)/8

4

Haskell , 40 38 37 byte

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

Mengembalikan daftar yang tak terbatas, coba online!

Penjelasan

scanlmengambil tiga argumen f, initdan xs( [ x 0 , x 1 ... ] ) dan membuat daftar baru:

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

Kami mengatur init = 0dan menggunakan membalik ($)Operator aplikasi (sehingga berlaku suatu i ke fungsi x i ), sekarang kita hanya perlu daftar fungsi - daftar [1..]>>=(:[pred]).(+)adalah daftar tak terbatas dengan fungsi yang tepat:

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

Alternatif yang menarik, 37 byte

flipmemiliki tipe yang (a -> b -> c) -> b -> a -> cjuga bisa kita gunakan id :: d -> dalih-alih ($)karena inferensi tipe Haskell tipe ditu akan disatukan a -> b, memberikan kita hal yang sama.

Cobalah online!

Edit

-2 byte dengan menggunakan (>>=)bukan do-notation.

-1 byte dengan menggunakan scanlbukan zipWith.



3

05AB1E , 10 byte

ÎF<NÈi¼¾>+

Cobalah online!

Penjelasan

Î             # 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-byter lain: ÎFNÈN;Ì*<O


ÎGDN+D<menghasilkan urutan, tetapi meraih elemen ke-n tampaknya ... sulit dalam 3 byte.
Magic Octopus Mm


3

APL (Dyalog Unicode) , 16 12 byte SBCS

Fungsi awalan diam-diam anonim. Diindeks 0.

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

Cobalah online!

+/ jumlah dari

⊢↑nelemen  pertama

∘∊ dari ϵ terdaftar (diratakan)

¯1,¨⍨ negatif-satu-ditambahkan ke masing-masing

n ɩ ndices  pertama (0 hingga n–1


Ah, itu solusi saya ... kira itu cukup mirip.
Erik the Outgolfer

3

Jelly , 6 byte

HḶS‘_Ḃ

Tautan monadik yang menerima (1-diindeks) nyang kembalia(n) .

Cobalah online!Atau lihat test-suite

Bagaimana?

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, pendekatan yang menarik di sana.
Erik the Outgolfer

3

PHP , 73 64 55 51 47 byte

Metode pertama

Jawaban golf kode pertama!
Saya yakin ada trik PHP untuk membuatnya lebih pendek dan matematika mungkin dapat ditingkatkan.

Mengambil n sebagai argumen pertama dan menampilkan nomor ke-n dalam urutan.

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

Mengurangi 9 byte dengan menghapus "$ x = 0;" dan "$ i = 0".

Minus 9 byte, terima kasih kepada @Kevin Cruijssen yang memperbaiki perulangan for dan kehilangan tag akhir.

Dikurangi 1 byte menggunakan bitwise atau "|" daripada "(int)"

Mengurangi 3 byte berkat @ Dennis karena Anda dapat menghapus tag dengan menjalankannya dari baris perintah dengan "php -r 'code here'"

Cobalah online!

Metode kedua

Cocokkan jawaban saya sebelumnya dengan metode yang sama sekali baru!

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

Menggunakan XOR dan operator tenary untuk beralih antar jumlah dalam loop.

Sunting: Ini tidak berfungsi untuk n = 0 dan saya tidak tahu mengapa. $ i tidak ditugaskan jadi karena itu harus 0, oleh karena itu loop ($i<$argv[1])harus gagal(0<0==false) , maka $ x yang tidak ditugaskan harus output sebagai 0 dan bukan 1.

Cobalah online!

Metode ketiga

Mengubah rumus excel @Wernisch dibuat ke PHP memberikan solusi 47 byte

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

Cobalah online!


1
Hai, selamat datang di PPCG! Jika Anda belum melakukannya, kiat untuk bermain golf di PHP dan kiat untuk bermain golf di <semua bahasa> mungkin menarik untuk dibaca. Beberapa hal untuk golf: Anda dapat menghapus trailing ?>. Menghapus $x=0dan $i=0memang diizinkan (jika tidak, $x=$i=0akan lebih pendek juga). Juga, loop dapat disingkat menjadi for(;$i<$y+1;)$x+=$i++;. Yaitu total -15 byte. Selamat menikmati! :)
Kevin Cruijssen

@KevinCruijssen terima kasih banyak!
Sam Dean

Sama-sama. Btw, TIO Anda saat ini masih 60 byte, bukan 58. Dan tidak yakin mengapa Anda menyatakan 57. Coba online.
Kevin Cruijssen

@KevinCruijssen Saya terus memposting TIO yang salah! TIO mengatakan 58 sekarang tetapi saya telah memposting 55 karena Anda dapat menghapus "php" dari tag pembuka, hanya saja tidak di TIO
Sam Dean

@Wernisch, terima kasih atas formula Anda!
Sam Dean

3

R , 35 byte

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

Cobalah online!

Saya pikir ini adalah alternatif yang menarik untuk jawaban @ JayCe karena itu tidak port dengan sangat baik ke bahasa tanpa dukungan built-in untuk matriks, dan kebetulan sama seperti golf.

1-diindeks, mengembalikan nelemen pertama dari urutan.

Bagaimana itu bekerja:

rbind(n<-1:scan(),-1) membangun matriks berikut:

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

Karena R menyimpan matriks dalam urutan kolom-utama, jika kita mengonversi ini menjadi vector, kita akan mendapatkan vektor

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

yang jika kita mengambil jumlah kumulatif, kita akan dapatkan

1 0 2 1 4 3 7 6

yang merupakan urutan, hanya tanpa yang utama 0. diffinvuntungnya menambahkan nol di depan, jadi kami mengambil nilai pertama n-1dari matriks dan diffinvmereka, mendapatkan nilai pertama ndari urutan.


2
Saya penggemar berat jawaban 'difinv' Anda.
JayCe


3

R , 35 34 byte

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

Cobalah online!

Opsi keluaran pertama. Rumus yang sama dengan banyak jawaban lain (saya ingin mengarahkan ke jawaban pertama yang menyediakan rumus, saya tidak tahu yang mana).

Opsi output kedua dan ketiga di bawah ini:

R , 43 byte

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

Cobalah online!

R , 51 byte

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

Cobalah online!


3

Matlab / Oktaf, 31 26 byte

5 byte disimpan thx ke Luis Mendo!

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

1
Anda mungkin dapat menggunakan fixsebagai ganti floor, dan n/2+.5bukannyaceil(n/2)
Luis Mendo

@LuisMendo Ty! Tidak tahu fix()dan tidak berharap 1:n/2+.5untuk bekerja - begitu banyak hal yang bisa salah, tetapi mereka sebenarnya tidak :)
Leander Moesinger




3

QBasic, 31 byte

Solusi just-implement-the-spec datang sedikit lebih lama dari solusi Erik .

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

Output ini tanpa batas. Untuk keperluan menjalankannya, saya sarankan untuk mengubah baris terakhir ke sesuatu seperti LOOP WHILE INPUT$(1) <> "q", yang akan menunggu penekanan tombol setelah setiap entri urutan kedua dan keluar jika tombol ditekan q.


2

C # (.NET Core) , 56 byte

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

-2 byte terima kasih kepada Kevin Crujssen

Cobalah online!

1 diindeks. Kembalia(n)

Tidak Digolkan:

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++)bisa i=0;for(;++i<n;)dan i%2==0bisa i%2<1.
Kevin Cruijssen

@KevinCruijssen jadi saya bisa, terima kasih! Aku seharusnya melihat yang ke-2, tapi aku tidak berpikir yang pertama akan bekerja karena saya pikir untuk loop hanya memeriksa persyaratan setelah loop pertama. TIL
Skidsdev

Tidak, ini sudah memeriksa sebelum iterasi pertama. A do-whileakan memeriksa setelah menyelesaikan iterasi pertama. :)
Kevin Cruijssen

Dalam kasus yang sangat jarang, Anda bahkan bisa menggabungkan ifdengan for-loop. Misalnya: if(t>0)for(i=0;i<l;i++)untuk for(i=0;t>0&i<l;i++). Saya hampir tidak pernah bisa menggunakan ini dalam jawaban saya.
Kevin Cruijssen

itu cukup luar biasa, saya pasti harus mengingatnya saat berikutnya saya melakukan C # golf, yang sangat jarang terjadi hari ini: P sebagian besar pekerjaan C # saya jelas tidak menarik
Skidsdev

2

Sekam , 11 9 8 byte

ΘṁṠe→Θ∫N

Menyimpan satu byte berkat H.PWiz.
Keluaran sebagai daftar tak terbatas.
Cobalah online!

Penjelasan

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

2

Dodos , 69 byte

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

Cobalah online!


Entah bagaimana ini adalah jawaban terpanjang.

Penjelasan.

┌────┬─────────────────────────────────────────────────┐
│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

Arang , 15 byte

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

Cobalah online! Diindeks 0. Tautan adalah untuk mengucapkan versi kode. Rumusnya mungkin lebih pendek, tapi apa yang menyenangkan dari itu? Penjelasan:

    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 byte

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

Cobalah online!

Tidak secantik jawaban @tsh, tapi milikku bekerja untuk nomor yang lebih besar.

Dan sekarang terima kasih @tsh, untuk evalsolusinya!


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

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

Apakah evalmengembalikan nilai yang dimodifikasi terakhir? Saya masih belum sepenuhnya mengerti apa yang bisa dilakukannya.
Pria acak

Ini mengembalikan nilai pernyataan (yang mungkin tercakup dalam dopernyataan di versi yang lebih baru).
tsh

1

Melewati 93, 26 byte

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

Berjalan tanpa batas
Coba secara online , meskipun output menjadi sedikit miring dan turun kembali setelah x = 256, mungkin TIO tidak dapat menangani karakter di atas U + 256. Berfungsi dengan baik di https://www.bedroomlan.org/tools/befunge-playground (sayangnya hanya Chrome. Dengan Firefox, endline dihapus saat runtime, karena alasan tertentu ...)



1

Pyth , 8 byte

s<s,R_1S

Mengembalikan nnomor th dalam urutan, 0-diindeks.Cobalah online

Penjelasan, dengan contoh untuk 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 byte

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

Cobalah

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

Berdasarkan reverse engineering jawaban Python TFeld .
Cobalah

Diperluas

38 byte (generator urutan):

{  # 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
}

Perhatikan bahwa ini memiliki manfaat yang dapat Anda sampaikan * untuk mendapatkan seluruh urutan, atau meneruskan dalam Rentang untuk menghasilkan nilai-nilai ganda secara lebih efisien.

26 byte (perhitungan langsung):

{  # 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 byte

;L¨O>¹É-

Cobalah online!

Berdasarkan pendekatan Jonathan Allan's Jelly (yang mungkin didasarkan pada OP mengedit pertanyaan dengan definisi lain dari urutan), jadi 1-diindeks.


+1. Saya memiliki pendekatan serupa yang disiapkan di 05AB1E yang saya rencanakan untuk posting dalam beberapa hari jika tidak ada orang lain yang mempostingnya. Ini sedikit berbeda (saya pertama mengurangi separuh sebelum membuat daftar, daripada menghapus ekor; dan saya menggunakan Ibukan ¹), tetapi pendekatan umum dan byte-count persis sama:;<LO>IÉ-
Kevin Cruijssen

@KevinCruijssen Akan diposting kemarin jika saya memiliki kemampuan untuk berpikir lebih dalam, tapi, yah, ini adalah masa final, berpikir terlalu dalam tentang ini dilarang. : P
Erik the Outgolfer

Ah, aku senang aku tidak punya final lagi. Saya cukup sibuk di tempat kerja juga, dan harus menunda golf kode kadang-kadang lebih sering daripada yang saya inginkan. ; p Semoga beruntung dengan ujian Anda!
Kevin Cruijssen

1

Cembung , 10 9 byte

_½,ª)\2%-

Cobalah online!

Berdasarkan pendekatan Jonathan Allan's Jelly (yang mungkin didasarkan pada OP mengedit pertanyaan dengan definisi urutan lainnya). 1-diindeks.

Penjelasan:

_½,ª)\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]%]-]

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.