Enumerasi integer pusing

25

Tantangan Anda hari ini adalah untuk menampilkan istilah tertentu dari urutan yang menyebutkan semua bilangan bulat. Urutannya adalah sebagai berikut: Jika kita memiliki fungsi diindeks 0 menghasilkan urutan f(n)dan ceil(x)fungsi langit-langit, maka f(0) = 0; abs(f(n)) = ceil(n/2); sign(f(n))positif ketika ndan ceil(n/2)keduanya genap atau ganjil.

Untuk membantu memahami urutan ini, beberapa istilah pertama adalah sebagai berikut: 0 1 -1 -2 2 3 -3 -4 4 5 -5 -6 6 7 -7...

Tugas Anda adalah menulis sebuah program yang membutuhkan bilangan bulat ndan menampilkan urutan nke-3 dari urutan tersebut. Input mungkin hanya 0 atau 1-diindeks saja.

Kasus uji (0-diindeks):

0  =>  0
1  =>  1
2  => -1
3  => -2
4  =>  2
5  =>  3

Ini adalah , byte terkecil menang!

Pavel
sumber
Terkait: Cetak semua bilangan bulat
sergiol
Tampaknya kebalikan dari fungsi Lipat
sergiol

Jawaban:

8

SOGL V0.12 , 8 6 byte

I».»⌡±

Coba Di Sini! atau coba nomor pasangan pertama (diubah sedikit agar berfungsi)
0-diindeks.

Penjelasan:

I       increment the input
 »      floor divide by 2
  .     push the original input
   »    floor divide by 2
    ⌡   that many times
     ±    negate

Atau lebih sederhana:

(input + 1) // 2 negated input // 2 times
        I     »     ±      .     »    ⌡
dzaima
sumber
3
ITU TIDAK MENGAMBIL MENIT SINGLE!
NieDzejkob
6
Saya ».»sedang menelepon I».»⌡±.
Jonathan Allan
@ Jonathan Allan Saya tidak mengerti ._.
Pavel
9

Python 2 , 26 24 byte

lambda x:-~x/2/(1-(x&2))

Cobalah online!

Halvard Hummel
sumber
1
Anda bisa menyimpan byte menggunakan -~-(x&2)untuk penyebut terakhir.
rekursif
5

JavaScript (ES6), 18 byte

1-diindeks.

n=>n/(++n&2||-2)|0

Demo

Arnauld
sumber
4

C, 25 byte

f(n){return~n/2*~-(n&2);}
orlp
sumber
Anda dapat menyimpan 4 byte dengan menetapkan nilai kembali ke parameter pertama alih-alih menggunakan kata kunci kembali. f(n){n=~n/2*~-(n&2);}
cleblanc
5
@cleblanc Bukan itu cara C bekerja.
orlp
2
gcc -O0untuk x86-64 memang terjadi untuk mengkompilasi versi @ cleblanc dengan instruksi yang meninggalkan hasil multiply eax( godbolt.org/g/dztKPV ), tetapi kemudian itu akan menjadi x86-64 gcc -O0jawaban, bukan jawaban C. Saya tidak memilih-C jawaban yang berhenti dengan optimasi diaktifkan, terutama tidak ekspresi terakhir yang bodoh sebagai omong kosong nilai-kembali. Bahkan jika begitulah cara gcc bekerja, itu bukan cara C bekerja.
Peter Cordes
Buat penunjuk na. Anda tidak perlu optimisasi jika nilai asli dan akhir tidak ada di tumpukan.
mreff555
1
@ mreff555 Itu akan menjadi metode IO non-standar (meskipun dapat diterima), dan tidak akan lebih pendek.
orlp
4

Haskell , 26 byte

f x=div(x+1)2*(-1)^div x 2

Cobalah online!

Jawaban Haskell lainnya sepertinya adalah hal-hal yang terlalu rumit ... ^^

Lynn
sumber
3

Pyke , 6 byte

heQeV_

Coba di sini!

Gunakan pendekatan dzaima ... Beats Ties Jelly!

Penjelasan

h      - Increment the input, which is implicit at the beginning.
 e     - Floor halve.
  Q    - Push the input.
   e   - Floor halve.
    V_ - Apply repeatedly (V), ^ times, using negation (_).
       - Output implicitly.

Byte hex-encoded setara akan menjadi: 68 65 51 65 56 5F.

Tuan Xcoder
sumber
3

Jelly , 6 byte

HµĊN⁸¡

Cobalah online!

Menggunakan algoritma dzaima.

-1 terima kasih kepada Jonathan Allan .

Erik the Outgolfer
sumber
SOGL tidak bisa mengalahkan Jelly ...? Akan melihat ke golf.
Erik the Outgolfer
@JonathanAllan duh> _ <
Erik the Outgolfer
3

Mathematica, 24 byte

(s=⌈#/2⌉)(-1)^(#+s)&  

-14 byte dari @Misha Lavrov

J42161217
sumber
1
Menggunakan Booledan OddQmemiliki efek mengubah angka ganjil menjadi 1 dan bahkan angka menjadi 0, tetapi Anda tidak perlu itu di sini: kekuatan -1 memberikan Anda jawaban yang tepat untuk semua angka ganjil. Jadi Anda bisa mengurangi langkah itu menjadi (-1)^Tr@{#,s}atau hanya (-1)^(#+s).
Misha Lavrov
3

Haskell , 25 43 42 byte

((do a<-[0..];[[-a,a],[a,-a]]!!mod a 2)!!)

Cobalah online! 1-diindeks.

Sunting: Versi sebelumnya memiliki tanda-tanda yang salah, terima kasih kepada @ Potato44 karena menunjukkan. Diperbaiki untuk 18 byte ...

Sunting 2: Terima kasih kepada BMO untuk -1 byte!

Laikoni
sumber
Anda dapat menghemat 1 byte dengan menggunakan do-notation, coba online!
ბიმო
@BMO Terima kasih! ...
Laikoni
2

Python 3 , 29 byte

lambda n:-~n//2*(-1)**(n%4>1)

Cobalah online!

Biarawati Bocor
sumber
3
(-1)**(n%4>1)adalah cara penulisan yang agak berbelit-belit (1-(n&2));)
orlp
2

05AB1E , 6 byte

;DîsF(

Cobalah online!

Menggunakan algoritma dzaima.

Erik the Outgolfer
sumber
2

Batch, 29 byte

@cmd/cset/a"%1/2^(%1<<30>>30)
Neil
sumber
2

JavaScript (ES6), 18 byte

f=
n=>n/2^(n<<30>>30)
<input type=number min=0 value=0 oninput=o.textContent=f(this.value)><pre id=o>0

Diindeks 0.

Neil
sumber
2

Javascript, 17 byte

n=>~n/2*~-(n&2)^0

Yang ini diindeks 0. Ini sepenuhnya tipuan tipuan.

rekursif
sumber
2

Secara kubik , 23 byte

(Diindeks 1)

FDF'$:7+8/0_0*0-8*7/0%6

Cobalah online!

Kesulitan utama saat menulis kode dalam Cubically adalah:

  • Hanya ada 1 variabel yang dapat ditulis, dan
  • Mendapatkan konstanta itu sulit.

Jadi, solusi ini menghitung

((((n+1)/2)%2)*2-1)*n/2

di mana /menunjukkan pembagian bilangan bulat. Itu hanya perlu 1 variabel sementara, dan konstanta 1 dan 2.

Penjelasan:

FDF'$:7+8/0_0*0-8*7/0%6
FDF'                      Set face value of face 0 to 2, and value of memory index 8 (cube is unsolved) to 1 (true = unsolved)
    $                     Read input
     :7                                 input
       +8                                + 1
         /0                        (        ) /2
           _0                     (             ) %2
             *0                  (                  ) *2
               -8                                        -1
                 *7             (                          ) *n
                   /0                                          /2
                     %6   Print
pengguna202729
sumber
2

TI-Basic (TI-84 Plus CE), 20 byte

‾int(‾Ans/2)(1-2remainder(int(Ans/2),2

Program lengkap yang disebut seperti 5:prgmNAME.

TI-Basic adalah bahasa tokenized , semua token yang digunakan di sini adalah satu byte, kecuali remainder(yang dua. mewakili token resmi, yang diketik dengan (-)kunci.

Contoh:

0:prgmNAME
 => 0
1:prgmNAME
 => 1
2:prgmNAME
 => -1
#etc

Penjelasan:

‾int(‾Ans/2)(1-2remainder(int(Ans/2),2
‾int(‾Ans/2)                           # -int(-X) is ciel(X), so ciel(Ans/2)
                          int(Ans/2)   # int(X) is floor(X), so floor(Ans/2)
                remainder(int(Ans/2),2 # 1 if floor(Ans/2) is odd else 0
            (1-2remainder(int(Ans/2),2 # -1 if floor(Ans/2) is odd, else 1
_int(_Ans/2)(1-2remainder(int(Ans/2),2 # -ciel(Ans/2) if floor(Ans/2) is odd, else ciel(Ans/2)

Rumus yang sama dengan fungsi Y-var:

Y1= ‾int(‾X/2)(1-2remainder(int(X/2),2
pizzapants184
sumber
2

dc , 16 byte

1+d2~+2%2*1-r2/*

Saya yakin ada cara untuk membuat 0,1 ke -1. 1 di dc lebih pendek, tetapi tidak ada ide untuk saat ini.

Cobalah online!

cab404
sumber
2

Java 8, 15 byte

n->~n/2*~-(n&2)

EDIT: Apakah Jawa benar-benar bahasa terpendek dari non-golf ?! o.Ô

Penjelasan:

Coba di sini.

Saya akan menggunakan tabel di bawah ini sebagai referensi tentang apa yang terjadi.

  1. ~nsama dengan -n-1.
  2. Karena pembagian integer di Jawa secara otomatis didasarkan pada bilangan bulat positif dan ceils pada bilangan bulat negatif, ~n/2akan menghasilkan urutan0,-1,-1,-2,-2,-3,-3,-4,-4,-5,-5,...
  3. n&2akan menghasilkan salah satu 0atau 2, dalam urutan0,0,2,2,0,0,2,2,0,0,2,...
  4. ~-xsama dengan (x-1), jadi ~-(n&2)( ((n&2)-1)) menghasilkan urutan-1,-1,1,1,-1,-1,1,1,-1,-1,1,...
  5. Mengalikan dua urutan ~n/2dan ~-(n&2)memberi adalah urutan yang benar yang ditanyakan dalam tantangan:0,1,-1,-2,2,3,-3,-4,4,5,-5,...

Tabel ikhtisar:

n       ~n      ~n/2    n&2     ~-(n&2)     ~n/2*~-(n&2)
0       -1      0       0       -1          0
1       -2      -1      0       -1          1
2       -3      -1      2       1           -1
3       -4      -2      2       1           -2
4       -5      -2      0       -1          2
5       -6      -3      0       -1          3
6       -7      -3      2       1           -3
7       -8      -4      2       1           -4
8       -9      -4      0       -1          4
9       -10     -5      0       -1          5
10      -11     -5      2       1           -5
Kevin Cruijssen
sumber
2

Brain-Flak , 86 74 72 70 byte

{({}[()]<({}<>([({})]{(<{}([{}]())>)}{}())<>)>)}{}<>{}{<>([{}])(<>)}<>

Cobalah online!

Penjelasan

Ada dua bagian dari kode ini. Bagian pertama

({}[()]<({}<>([({})]{(<{}([{}]())>)}{}())<>)>)}{}

apakah kekuatan perhitungan. Ini menentukan ceil(n/2)dan apakah akan meniadakan output atau tidak.

Untuk menjelaskan cara kerjanya, pertama saya akan menjelaskan bagaimana seseorang akan menghitung ceil(n/2). Ini bisa dilakukan dengan kode berikut

{({}[()]<({}([{}]()))>)}{}

Ini menghitung mundur dari n setiap kali melakukan not ( ([{}]())) pada penghitung dan menambahkan penghitung ke hasil. Karena penghitungnya adalah nol separuh waktu, kami hanya menambah setiap proses lainnya dimulai dengan yang pertama.

Sekarang saya ingin juga menghitung tanda hasil kami. Untuk melakukan ini kita mulai penghitung lain. Penghitung ini hanya mengubah status jika penghitung pertama mati. Dengan begitu kita mendapatkan pola yang diinginkan. Kami menempatkan kedua penghitung ini di tumpukan off untuk memudahkan dengan memindahkannya ketika saatnya tiba.

Sekarang setelah kita selesai menghitung tumpukan kita terlihat seperti ini

          parity(n)
ceil(n/2) sign

Jadi kita perlu melakukan beberapa pekerjaan untuk mendapatkan hasil yang diinginkan bagian kedua ini melakukannya.

<>{}{<>([{}])(<>)}<>
Wisaya Gandum
sumber
1

QBIC , 27 26 byte

g=(:+1)'\2`~(a-g)%2|?-g\?g

Penjelasan

g=          set worker var 'g' to
(:+1)           our index (plus one for the ceil() bit)
'\2`            integer divided by 2 (the int div needs a code literal: '..`
~(a-g)%2    IF index - temp result is odd (index 2 minus result 1 = 1)
|?-g        THEN PRINT g negated
\?g         ELSE PRINT g
steenbergh
sumber
1

Clojure 122 byte

Verbose, bahkan saat bermain golf. Saya akan memilih simpati di sini ... :-)

Golf:

(defn d[n](let[x(int(Math/ceil(/ n 2)))y(cond(or(and(even? n)(even? x))(and(odd? n)(odd? x)))(Math/abs x):else(- 0 x))]y))

Tidak Disatukan:

(defn dizzy-integer [n]
  (let [x   (int (Math/ceil (/ n 2)))
        y   (cond
                (or (and (even? n) (even? x))
                    (and (odd? n)  (odd? x))) (Math/abs x)
                :else (- 0 x)) ]
    y))
Bob Jarvis - Pasang kembali Monica
sumber
1

Excel VBA 32-Bit, 39 37 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari sel A1dan output ke jendela langsung VBE

?[Sign((-1)^Int(A1/2))*Int((A1+1)/2)]

Dibatasi hingga 32-Bit karena A^Btidak valid dalam 64-Bit ( A ^Bsedekat mungkin dapat dicapai)

Taylor Scott
sumber
Apakah ruang antara (-1) dan ^[Intdibutuhkan?
Pavel
@Pavel setidaknya untuk Versi 64-Bit dari Excel VBA, ya; Tetapi itu mengatakan saya bersumpah bahwa itu bukan untuk Versi 32-Bit, tetapi sayangnya saya tidak dapat menguji itu pada perangkat keras yang saya miliki
Taylor Scott
@ Pavel - Saya sudah melihatnya di bawah Sistem 32-Bit (spesifikasi instalasi default) dan di bawah sistem itu ruang tidak diperlukan - Saya telah membatasi solusi untuk 32-Bit untuk mengambil keuntungan dari ini
Taylor Scott
1
Keren! Anda lupa menambahkan dalam hitungan byte yang dikoreksi.
Pavel
Whoops, Trims @Pavel - Sudah diperbaiki sekarang
Taylor Scott