Siklus Aritmatika

13

Memasukkan:

Integer nyang >=0atau >=1( f(0)opsional)

Keluaran:

Angka n'th dalam urutan di bawah ini, ATAU urutan ke atas dan termasuk nomor n' th.

Urutan:

(0),1,-1,-3,0,5,-1,-7,0,9,-1,-11,0,13,-1,-15,0,17,-1,-19,0,21,-1,-23,0,25,-1,-27,0,29,-1,-31,0,33,-1,-35,0,37,-1,-39,0,41,-1,-43,0,45,-1,-47,0,49,-1,-51,0,53,-1,-55,0,57,-1,-59,0,61,-1,-63,0,65,-1,-67,0,69,-1,-71,0,73,-1,-75,0,77,-1,-79,0,81,-1,-83,0,85,-1,-87,0,89,-1,-91,0,93,-1,-95,0,97,-1,-99

Bagaimana urutan ini dibangun?

f(n=0) = 0(opsional)
f(n=1) = f(0) + natau lainnya f(n=1) = 1
f(n=2) = f(1) - n
f(n=3) = f(2) * n
f(n=4) = f(3) / n
f(n=5) = f(4) + n
.

Atau dalam pseudo-code:

function f(integer n){
  Integer result = 0
  Integer i = 1
  Loop as long as i is smaller than or equal to n
  {
    if i modulo-4 is 1:
      result = result plus i
    if i modulo-4 is 2 instead:
      result = result minus i
    if i modulo-4 is 3 instead:
      result = result multiplied with i
    if i modulo-4 is 0 instead:
      result = result integer/floor-divided with i
    i = i plus 1
  }
  return result
}

Tetapi seperti yang Anda perhatikan ada dua pola dalam urutan:

0, ,-1,  ,0, ,-1,  ,0, ,-1,   ,0,  ,-1,   ,0,  ,-1,   ,...
 ,1,  ,-3, ,5,  ,-7, ,9,  ,-11, ,13,  ,-15, ,17,  ,-19,...

jadi setiap pendekatan lain yang menghasilkan urutan yang sama tentu saja baik-baik saja juga.

Aturan tantangan:

  • Input 0-diindeks dan 1-diindeks akan menghasilkan hasil yang sama (itulah sebabnya f(0)opsional untuk input 0-diindeks jika Anda ingin memasukkannya).
  • Anda diizinkan untuk menampilkan nnomor ke-5 dari urutan ini. Atau seluruh urutan ke atas dan termasuk nnomor ke '. (Jadi f(5)bisa menghasilkan salah satu 5atau 0,1,-1,-3,0,5.)
    • Jika Anda memilih untuk menampilkan urutan hingga dan termasuk nomor n'th, format output fleksibel. Dapat berupa string daftar / larik, koma / spasi / baris baru atau dicetak ke STDOUT, dll.
  • Divide ( /) adalah pembagian integer / floor, yang membulatkan ke arah 0 (tidak menuju infinity negatif seperti halnya dalam beberapa bahasa).

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 pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji tambahan di atas n=100:

Input     Output

1000      0
100000    0
123       -123
1234      -1
12345     12345
123456    0
Kevin Cruijssen
sumber
1
Saya tidak dapat menemukan ini di oeis.org sehingga Anda mungkin ingin mengirimkannya di sana. Ini urutan yang menarik, saya terkejut tidak ada yang mendaftar.
pipa
1
@pipe tampaknya cukup sewenang
qwr

Jawaban:

20

JavaScript (ES6), 19 byte

n=>[0,n,-1,-n][n&3]

Cobalah online!

Bukti

Mari kita asumsikan bahwa kita memiliki hubungan berikut untuk beberapa n beberapa dari 4. hubungan ini sepele diverifikasi untuk istilah pertama urutan.

f(n)   = 0
f(n+1) = n+1
f(n+2) = -1
f(n+3) = -(n+3)

Dan biarkan N = n + 4 . Kemudian, menurut definisi:

f(N)   = f(n+4) = f(n+3) // (n+4) = -(n+3) // (n+4) = 0
f(N+1) = f(n+5) = f(n+4) + (n+5)  = 0 + (n+5)       = N+1
f(N+2) = f(n+6) = f(n+5) - (n+6)  = (n+5) - (n+6)   = -1
f(N+3) = f(n+7) = f(n+6) * (n+7)  = -1 * (n+7)      = -(N+3)

Yang, dengan induksi matematis, membuktikan bahwa relasi berlaku untuk sembarang N dari 4 .

Arnauld
sumber
2
Karena sebagian besar jawabannya adalah port dari solusi ini, saya ingin menambahkan bahwa saya telah memverifikasi itu terbukti.
Erik the Outgolfer
Saya punya bukti alternatif.
Erik the Outgolfer
Ah, gila, terganggu oleh pekerjaan sambil mengerjakan sesuatu yang sangat mirip. +1
Shaggy
Karena penasaran, apakah ada alasan untuk memilih "n & 3" daripada "n% 4"?
IanF1
2
@ IanF1 Saya kira ini hanya kebiasaan pemrograman tingkat rendah (komputasi bitwise DAN dalam perakitan lebih mudah dan lebih cepat daripada menghitung modulo). Tapi tidak masuk akal di sini dan saya sebenarnya setengah tergoda untuk mengubahnya n%4setelah itu sehingga bekerja dengan angka lebih besar dari 32-bit.
Arnauld
4

05AB1E , 8 byte

Keluarkan nthjumlahnya

ÎD(®s)sè

Cobalah online!

05AB1E , 14 byte

Menghasilkan daftar angka hingga N menggunakan pola dalam urutan

ÅÉāÉ·<*āÉ<‚øí˜

Cobalah online!

Penjelasan

Contoh menggunakan N = 7

ÅÉ               # List of odd numbers upto N
                 # STACK: [1,3,5,7]
  ā              # Enumerate 1-based
   É             # is odd?
                 # STACK: [1,3,5,7],[1,0,1,0]
    ·<           # double and decrement
                 # STACK: [1,3,5,7],[1,-1,1,-1]
      *          # multiply
                 # STACK: [1,-3,5,-7]
       āÉ<       # enumerate, isOdd, decrement
                 # STACK: [1,-3,5,-7],[0,-1,0,-1]
          ‚ø     # zip
                 # STACK: [[1, 0], [-3, -1], [5, 0], [-7, -1]]
            í    # reverse each
             ˜   # flatten
                 # RESULT: [0, 1, -1, -3, 0, 5, -1, -7]
Emigna
sumber
4

Python 2 , 25 byte

Jawaban Port of Arnauld:

lambda n:[0,n,-1,-n][n%4]

Cobalah online!


Solusi naif:

Python 3 , 50 49 byte

lambda n:n and eval('int(f(n-1)%sn)'%'/+-*'[n%4])

Cobalah online!


Python 2 , 78 77 76 58 57 53 52 byte

lambda n:n and eval('int(1.*f(n-1)%sn)'%'/+-*'[n%4])

Cobalah online!

Digunakan banyak byte pada int, karena lantai python membelah, dan tidak ke arah 0, seperti pada pertanyaan.

TFeld
sumber
@KevinCruijssen Ya, terima kasih :)
TFeld
3

J , 12 byte

Jawaban Port of Arnauld:

4&|{0,],_1,-

Cobalah online!

J , 28 byte

Solusi naif:

{(0 _1$~]),@,.(_1^i.)*1+2*i.

Menghasilkan angka ke-n

Cobalah online!

Galen Ivanov
sumber
3

TIS -n 2 1 , 123 byte

Keluarkan nnomor ke untuk 0 <= n <= 999. (Batas atas adalah karena keterbatasan bahasa).

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
JRO -5
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY
HCF

Cobalah online!


TIS -n 2 1 , 124 byte

Keluarkan nnomor ke untuk 0 <= n <= 999. (Batas atas adalah karena keterbatasan bahasa). Beberapa ndapat disediakan, dipisahkan oleh spasi putih.

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
MOV ACC ANY
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

Cobalah online!


TIS -n 3 1 , 192 byte

Menghasilkan nilai untuk 0..nuntuk 0 <= n <= 999. (Batas atas adalah karena keterbatasan bahasa).

@0
MOV UP ACC
ADD 1
MOV ACC ANY
JRO -1
@1
SUB UP
JLZ C
HCF
C:ADD UP
MOV ACC ANY
ADD 1
SWP
ADD 1
MOV ACC ANY
SUB 4
JEZ W
ADD 4
W:SWP
@2
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

Cobalah online!


Semua menggunakan angka I / O ( -nbendera). Dua solusi pertama menggunakan dua node komputasi, satu diposisikan di atas yang lain. Yang ketiga memiliki setumpuk tiga node.

Untuk dua solusi pertama, simpul atas membaca input, mengirimkan nomor asli aktif, lalu berulang kali mengurangi 4 hingga kami menjadi negatif, kemudian menambahkan 5 untuk indeks untuk tabel lompatan kami. Ini setara dengan (n % 4) + 1.

Solusi ketiga membagi tugas ini menjadi dua node; yang paling atas hanya mengulangi batas sampai akhir waktu, dan simpul tengah menghitung secara paralel indeks (dibandingkan dengan batas itu) dan modulo seperti di atas.

Node yang lebih rendah dari ketiga solusi adalah sama; ia memiliki meja lompat, dan di sinilah keajaiban terjadi. Kami menyimpan nomor asli di ACC, maka JRO(mungkin J UMP R elative O FFset) ke depan oleh 1, 2, 3, atau 4, tergantung pada apa node di atas mengatakan.

Bekerja mundur:

  • 4akan a ) NEGmakan ACC, dan b ) ACCturun untuk output.
  • 3akan dimasukkan 1ke dalam ACC, kemudian melakukan langkah 4- langkah a dan 4b .
  • 2akan langsung melompat ke langkah 4b .
  • 1akan SUBproselyting ACCoff sendiri (efektif zeroing ACC), kemudian melakukan langkah 2, yang melompat ke 4b .
Phlarx
sumber
2

C (gcc) , 62 byte

f(n,k){k=~-n;n=n?n%4?k%4?n-2&3?f(k)*n:f(k)-n:f(k)+n:f(k)/n:0;}

Cobalah online!

Jonathan Frech
sumber
Anda dapat mengurangi separuh jumlah byte (31 byte) dengan membuat port jawaban Java OlivierGrégoire : f(n){n=n%2>0?n*(2-n%4):n%4/-2;}Saya akan menambahkannya sebagai jawaban kedua, karena saya juga menyukai pendekatan rekursif Anda. :)
Kevin Cruijssen
@KevinCruijssen Saya memang melihat solusi Java 10 mereka dan memperhatikan keringkasannya, meskipun saya tidak ingin hanya menyalin solusi mereka, karena sintaks aritmatika dua bahasa terlalu mirip.
Jonathan Frech
1

Java (JDK 10) , 25 byte

n->n%2>0?n*(2-n%4):n%4/-2

Cobalah online!

Lebih pendek dari algoritma pesaing dalam bahasa lain dengan 28 byte

n->new int[]{0,n,-1,-n}[n%4]

Cobalah online!

Olivier Grégoire
sumber
1

Retina , 46 byte

.+
*
r`(____)*$
_$.=
____
-
___.*
-1
__

_.*
0

Cobalah online!Penjelasan:

.+
*

Konversikan ke unary.

r`(____)*$
_$.=

Konversi kembali ke desimal, tetapi pergi n%4+1 garis bawah.

____
-

Dalam hal itu adalah 4, maka hasilnya adalah -n.

___.*
-1

Kasus 3: -1

__

Kasus 2: n

_.*
0

Kasus 1: 0

Neil
sumber
1

Haskell , 50 byte

f 0=0
f n=([(+),(-),(*),quot]!!mod(n-1)4)(f(n-1))n

Cobalah online!

Solusi Arnauld, porting ke Haskell adalah 23 byte:

z n=cycle[0,n,-1,-n]!!n
Angs
sumber
1

APL (Dyalog Classic) , 22 12 byte

10 byte besar disimpan karena komentar Erik the Outgolfer. Terima kasih!

4∘|⊃0,⊢,¯1,-

Cobalah online!

Menghasilkan angka ke-n

Saya tidak tahu APL, saya hanya mencoba untuk membuat port J solusi Arnauld saya berfungsi di Dyalog APL.

Galen Ivanov
sumber
2
Usaha yang bagus! Beberapa komentar: 1) Anda dapat menggantinya (0,⍵,¯1,-⍵)dengan (0⍵¯1,-⍵). 2) Anda dapat menghapus 1+dengan mengasumsikan bahwa ⎕IOvariabel sistem ditugaskan 0(ya, itu diizinkan). 3) Kami biasanya tidak menghitung f←bagian ketika mengirimkan fungsi. 4) Anda dapat menggunakan fungsi alih-alih []mengindeks. Semua bersama-sama membentuk ini: ⎕IO←0(jangan hitung ini){(4|⍵)⊃0⍵¯1,-⍵}
Erik the Outgolfer
@Erik the Outgolfer Terima kasih!
Galen Ivanov
2
Lebih lanjut golf berdasarkan pendekatan ini: 4∘|⊃0,⊢,¯1,-.
Erik the Outgolfer
1
@Erik the Outgolfer - Ya, memang! Saya pikir Anda 4∘|⊃0,⊢,¯1,- persis seperti apa solusi J saya 4&|{0,],_1,-akan terlihat seperti di APL. Terima kasih lagi!
Galen Ivanov
1
Sebenarnya, J adalah varian APL, meskipun lebih jauh daripada yang lebih mirip APL lainnya seperti Dyalog dan NARS2000.
Erik the Outgolfer
1

Cubix , 20 19 byte

Iun:^>s1ns:u@Ota3s0

Cobalah online!

Port pendekatan yang sama dengan cubix.

Di sebuah kubus:

    I u
    n :
^ > s 1 n s : u
@ O t a 3 s 0 .
    . .
    . .

Bit pertama ^Iu:n>s1ns:u0smembangun tumpukan dan kemudian 3atmenyalin item yang sesuai ke TOS, lalu Omengeluarkan dan @mengakhiri program.

Giuseppe
sumber
0

Ruang putih, 84 83 byte

[S S S N
_Push_0][S N
S _Duplicate_0][T   T   S _Store][S S S T   S N
_Push_2][S S T  T   N
_Push_-1][T T   S _Store][S S S T   N
_Push_1][S N
S _Duplicate_1][T   N
T   T   _Read_STDIN_as_integer][S S S T T   N
_Push_3][S S S T    N
_Push_1][T  T   T   ][S S T T   N
_Push_-1][T S S N
_Multiply][T    T   S _Store][T T   T   _Retrieve_input][S S S T    S S N
_Push_4][T  S T T   _Modulo][T  T   T   _Retrieve_result][T N
S T _Print_as_integer]

Huruf S(spasi), T(tab), dan N(baris baru) ditambahkan hanya sebagai penyorotan.
[..._some_action]ditambahkan sebagai penjelasan saja.

Cobalah online (dengan spasi, tab, dan baris baru saja).

Port dari jawaban JavaScript @Arnauld .

Penjelasan (contoh input n=7):

Command   Explanation         Stack        Heap                  STDIN   STDOUT   STDERR

SSSN      Push 0              [0]
SNS       Duplicate top (0)   [0,0]
TTS       Store               []           {0:0}
SSSTSN    Push 2              [2]          {0:0}
SSTTN     Push -1             [2,-1]       {0:0}
TTS       Store               []           {0:0,2:-1}
SSSTN     Push 1              [1]          {0:0,2:-1}
SNS       Duplicate top (1)   [1,1]        {0:0,2:-1}
TNTT      Read STDIN as nr    [1]          {0:0,1:7,2:-1}        7
SSSTTN    Push 3              [1,3]        {0:0,1:7,2:-1}
SSSTN     Push 1              [1,3,1]      {0:0,1:7,2:-1}
TTT       Retrieve input      [1,3,7]      {0:0,1:7,2:-1}
SSTTN     Push -1             [1,3,7,-1]   {0:0,1:7,2:-1}
TSSN      Multiply (-1*7)     [1,3,-7]     {0:0,1:7,2:-1}
TTS       Store               [1]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve input      [7]          {0:0,1:7,2:-1,3:-7}
SSSTSSN   Push 4              [7,4]        {0:0,1:7,2:-1,3:-7}
TSST      Modulo (7%4)        [3]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve            [-7]         {0:0,1:7,2:-1,3:-7}
TNST      Print as integer    []           {0:0,1:7,2:-1,3:-7}           -7
                                                                                  error

Berhenti dengan kesalahan: Keluar tidak ditentukan.

Kevin Cruijssen
sumber