Tugas
Diberikan bilangan bulat positif n
, keluaran n+1
jika n
ganjil, dan keluaran n-1
jika n
genap.
Memasukkan
Bilangan bulat positif. Anda dapat berasumsi bahwa integer berada dalam kemampuan penanganan bahasa.
Keluaran
Bilangan bulat positif, ditentukan di atas.
Testcases
input output
1 2
2 1
3 4
4 3
5 6
6 5
7 8
8 7
313 314
314 313
Mencetak gol
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Celah standar berlaku.
Jawaban:
C, 20 byte
Cobalah online .
sumber
Stack Cats , 3 + 3 (
-n
) = 6 byteCobalah online!
Membutuhkan
-n
flag untuk bekerja dengan input dan output numerik.Penjelasan
Stack Cats biasanya jauh dari kompetitif, karena serangkaian perintah yang terbatas (semuanya injeksi, dan sebagian besar adalah involusi) dan karena setiap program perlu memiliki simetri cermin. Namun, salah satu keterlibatan adalah untuk mengalihkan bit paling tidak signifikan dari angka, dan kita dapat mengimbangi nilainya dengan negasi unary yang juga ada. Untungnya, itu memberi kita program simetris, jadi kita tidak perlu khawatir tentang hal lain:
Input dan output implisit pada awal dan akhir program, karena mengambil input dan menghasilkan output bukanlah operasi yang dapat dibalik, sehingga mereka tidak bisa menjadi perintah.
sumber
perl -nle 'stuff'
adalah 2 karakter lebih dariperl -e 'stuff'
, jadi itu dihitung untuk 2 lebih banyak karakter ". Jadi(space)-n
3 byte lebih banyak daripada tanpa bendera.-e "code"
dan kemudian menyisipkan bendera tambahan sebelume
, misalnya-pe "code"
. Maka-p
benderanya hanya satu byte. Namun, Stack Cats tidak memiliki-e
argumen seperti itu , jadi Anda selalu perlu menambahkan penuh<sp>-n
ke perintah, dan karenanya tiga byte.x86 Assembly, 9 byte (untuk entri yang bersaing)
Setiap orang yang mencoba tantangan ini dalam bahasa tingkat tinggi kehilangan kesenangan nyata memanipulasi bit mentah. Ada begitu banyak variasi halus tentang cara melakukan ini, ini gila — dan banyak kesenangan untuk dipikirkan. Berikut adalah beberapa solusi yang saya rancang dalam bahasa assembly x86 32-bit.
Saya mohon maaf sebelumnya bahwa ini bukan jawaban khas kode-golf. Saya akan mengoceh banyak tentang proses pemikiran optimasi berulang (untuk ukuran). Semoga itu menarik dan mendidik untuk audiens yang lebih besar, tetapi jika Anda adalah tipe TL; DR, saya tidak akan tersinggung jika Anda melewatkannya sampai akhir.
Solusi yang jelas dan efisien adalah menguji apakah nilainya ganjil atau genap (yang dapat dilakukan secara efisien dengan melihat bit yang paling tidak signifikan), dan kemudian memilih antara n + 1 atau n − 1 yang sesuai. Dengan asumsi bahwa input dilewatkan sebagai parameter dalam
ECX
register, dan hasilnya dikembalikan dalamEAX
register, kita mendapatkan fungsi berikut:(13 byte)
Tetapi untuk tujuan kode-golf,
LEA
instruksi itu tidak bagus, karena mereka membutuhkan 3 byte untuk dikodekan.DEC
Rement sederhanaECX
akan jauh lebih pendek (hanya satu byte), tetapi ini mempengaruhi flag, jadi kita harus sedikit pintar dalam bagaimana kita mengatur kode. Kita dapat melakukan pengurangan pertama , dan tes ganjil / genap kedua , tetapi kemudian kita harus membalikkan hasil tes ganjil / genap.Juga, kita dapat mengubah instruksi pemindahan bersyarat ke cabang, yang dapat membuat kode berjalan lebih lambat (tergantung pada seberapa dapat diprediksi cabang itu - jika input bergantian secara tidak konsisten antara ganjil dan genap, cabang akan lebih lambat; jika ada pola, itu akan lebih cepat), yang akan menyelamatkan kita byte lain.
Bahkan, dengan revisi ini, seluruh operasi dapat dilakukan di tempat, hanya menggunakan satu register. Ini bagus jika Anda memasukkan kode ini di suatu tempat (dan kemungkinan besar, Anda pasti akan melakukannya, karena ini sangat singkat).
(sebaris: 7 byte; sebagai fungsi: 10 byte)
Tetapi bagaimana jika Anda memang ingin membuatnya berfungsi? Tidak ada konvensi panggilan standar yang menggunakan register yang sama untuk melewatkan parameter seperti halnya untuk nilai pengembalian, jadi Anda perlu menambahkan
MOV
instruksi register-register ke awal atau akhir fungsi. Ini hampir tidak ada biaya dalam kecepatan, tetapi menambah 2 byte. (RET
Instruksi ini juga menambahkan byte, dan ada beberapa overhead yang diperkenalkan oleh kebutuhan untuk membuat dan kembali dari panggilan fungsi, yang berarti ini adalah salah satu contoh di mana inlining menghasilkan kecepatan dan manfaat ukuran, daripada hanya menjadi kecepatan klasik -untuk pengorbanan ruang.) Secara keseluruhan, ditulis sebagai fungsi, kode ini membengkak hingga 10 byte.Apa lagi yang bisa kita lakukan dalam 10 byte? Jika kita benar-benar peduli tentang kinerja (setidaknya, kinerja yang dapat diprediksi ), alangkah baiknya untuk menyingkirkan cabang itu. Berikut ini adalah solusi branchless, bit-twiddling yang ukurannya sama dengan byte. Premis dasarnya sederhana: kita menggunakan bitor XOR untuk membalik bit terakhir, mengubah nilai ganjil menjadi genap genap, dan sebaliknya. Tapi ada satu niggle — untuk input ganjil, yang memberi kita n-1 , sedangkan untuk input genap, ia memberi kita n +1 - persis berlawanan dengan yang kita inginkan. Jadi, untuk memperbaikinya, kami melakukan operasi pada nilai negatif, secara efektif membalik tanda.
(sebaris: 7 byte; sebagai fungsi: 10 byte)
Cukup apik; sulit untuk melihat bagaimana hal itu dapat diperbaiki. Satu hal yang menarik perhatian saya: dua
NEG
instruksi 2 byte itu . Terus terang, dua byte sepertinya satu byte terlalu banyak untuk menyandikan negasi sederhana, tapi itu adalah set instruksi yang harus kita kerjakan. Apakah ada solusi? Yakin! JikaXOR
dengan -2, kita dapat menggantiNEG
asi kedua denganINC
rement:(sebaris: 6 byte; sebagai fungsi: 9 byte)
Satu lagi keanehan dari set instruksi x86 adalah instruksi multiguna
LEA
, yang dapat melakukan gerakan register-register, penambahan register-register, dikompensasi dengan konstanta, dan menskalakan semua dalam satu instruksi tunggal!(10 byte)
The
AND
instruksi sepertiTEST
instruksi kita gunakan sebelumnya, dalam bahwa baik melakukan bitwise-AND dan set bendera sesuai, tapiAND
benar-benar memperbarui tujuan operan. TheLEA
instruksi kemudian skala ini dengan 2, menambah nilai masukan asli, dan decrements oleh 1. Jika nilai masukan aneh, mengurangi ini 1 (2 × 0-1 = -1) dari itu; jika nilai inputnya genap, ini menambah 1 (2 × 1 - 1 = 1) padanya.Ini adalah cara yang sangat cepat dan efisien untuk menulis kode, karena banyak dari eksekusi dapat dilakukan di front-end, tetapi itu tidak memberi kita banyak dalam hal byte, karena dibutuhkan begitu banyak untuk mengkodekan kompleks
LEA
petunjuk. Versi ini juga tidak berfungsi dengan baik untuk tujuan inlining, karena mengharuskan nilai input asli dipertahankan sebagai input dariLEA
instruksi. Jadi dengan upaya pengoptimalan terakhir ini, kami telah benar-benar mundur, menyarankan mungkin sudah waktunya untuk berhenti.Jadi, untuk entri terakhir yang bersaing, kami memiliki fungsi 9-byte yang mengambil nilai input dalam
ECX
register ( konvensi panggilan berbasis register semi-standar pada 32-bit x86), dan mengembalikan hasilnya dalamEAX
register (seperti halnya semua konvensi pemanggilan x86):Siap berkumpul dengan MASM; panggilan dari C sebagai:
sumber
dec eax; xor eax, 1; inc eax
bekerja dan menghemat satu byte lebih banyak?Jelly , 3 byte
Cobalah online!
Kodesemu:
abs((-1)**n - n)
sumber
-1
.Python3,
2018 byteCukup mudah. Pertama kita menghitung n-1 dan memutuskan apakah akan menambahkan 2 ke dalamnya, atau tidak.
Jika n genap -> n mod 2 akan menjadi 0, maka kita akan menambahkan 2 * 0 ke n-1 , menghasilkan n-1 .
Jika n ganjil -> n mod 2 akan menjadi 1, maka kami akan menambahkan 2 * 1 ke n-1 , menghasilkan n + 1 .
Saya lebih suka penjelasan yang saya buat dengan cat MS & touchpad laptop ...
sumber
Python, 16 byte
Cobalah online!
sumber
"x+-012~|&^()*/%"
.-(1^-x)
.MATL , 7 byte
Ini menghindari operasi aritmatika. Cobalah online!
Penjelasan
Pertimbangkan input
4
sebagai contoh.sumber
Braingolf v0.1 ,
1110 byteCobalah online! (Argumen kedua adalah kode Braingolf, argumen ketiga adalah input)
Menyimpan satu byte berkat Neil
Jawaban braingolf yang pertama kali bersaing: D
Penjelasan:
Braingolf v0.2 , 9 byte [tidak bersaing]
Cobalah online! (Argumen kedua adalah kode Braingolf, argumen ketiga adalah input)
Lihat penjelasan di atas. Hanya perbedaannya dalam Braingolf v0.2, perilaku default operator diadik, dan fungsi
,
pengubah, dibalik, artinya 2 koma dalam jawaban v0.1 tidak lagi diperlukan.Namun v0.2 dirilis setelah tantangan, jadi yang ini tidak bersaing
sumber
.1<2,%?+:-
melakukan apa yang saya pikirkan?-
untuk membuatnya melakukan operasi dengan cara yang benar, dalam hal ini masih akan sama panjang dengan jawaban saya<
untuk memutar1
input di bawah ini, sehingga sudah di tempat yang benar.-
stack terlihat seperti ini:[n,1]
operator braingolf dibalik, sehingga akan tampil1 - n
, yang akan menghasilkan-(n-1)
, sementara hasil yang diinginkan cukupn-1
Cubix ,
109 byteCobalah online
Penjelasan
Versi bersih
Karakter yang dieksekusi adalah
sumber
Python, 68 byte
Dalam semangat pendekatan yang unik. Grafik berikut menunjukkan fungsi (dengan titik-titik ungu mewakili 10 kasus pertama). Seharusnya secara teori dimungkinkan untuk membangun solusi untuk pertanyaan ini berdasarkan sebagian besar (semua?) Fungsi periodik (misalnya dosa, tan, detik). Bahkan, mengganti cos untuk sec dalam kode sebagaimana mestinya bekerja.
sumber
PHP, 15 byte
sumber
;
diperlukan, dan telah mencoba menggunakan.php
file dan juga bergema langsung ke php (php7 cli.) Setiap kali saya diberitahu itu$argn
adalah variabel yang tidak ditentukan.F
bendera dan pipa:echo 42 | php -F script.php
.Javascript,
1712 bytePendekatan lain, 10 byte
dicuri dari jawaban C (sssshhh)sumber
x=>x-(-1)**x
|0
? Kedua solusi terlihat seolah-olah mereka harus secara otomatis mengubah string menjadi angka. (Untuk solusi pertama, jika Anda ingin menghindari desimal, gunakan<input type=number>
.)JavaScript (ES6),
14131210 byteCobalah
Asli, 12 byte
sumber
Python, 20 byte
n%2or-1
akan mengembalikan 1 jika aneh, tetapi jika bahkan,n%2
adalah "false" (0), jadi ia mengembalikan -1. Kemudian kita cukup menambahkannya ken
.Solusi sebelumnya, 23 byte
n%2
menghitung sisa ketikan
dibagi dengan 2. Jika itu genap, ini mengembalikan 0, dan elemen 0 dalam daftar ini adalahn-1
. Jika aneh, ini mengembalikan 1, dan elemen 1 dalam daftar ini adalahn+1
.sumber
lambda n:[n-1,n+1][n%2]
Retina , 21 byte
Cobalah online! Jawaban Retina pertama saya dengan dua baris baru! Penjelasan: Dua baris pertama dikonversi dari desimal ke unary. Baris ketiga dan keempat mengurangkan dua dari angka genap. Baris terakhir mengkonversi kembali ke desimal, tetapi menambahkannya juga.
sumber
05AB1E , 4 byte
Cobalah online!
sumber
Èi>ë<
sangat cantik;_;
.Cubix , 11 byte
Cobalah online!
Penjelasan
Versi bersih:
Karakter dieksekusi dalam urutan berikut:
sumber
Brain-Flak , 36 byte
Cobalah online!
Saya pribadi sangat senang dengan jawaban ini karena jauh lebih pendek daripada apa yang saya anggap metode tradisional untuk memecahkan masalah ini.
Penjelasan
Bit kode pertama
mengubah tumpukan dari hanya
n
menjadiKemudian, sementara bagian atas tumpukan bukan nol, kami mengurangi dan membalik tanda nomor di bawahnya
Kami menghapus nol dan menambahkan dua angka yang tersisa
sumber
Mathematica,
2219 byteDisimpan 3 byte berkat Greg Martin!
Jawaban sebelumnya, 22 byte
Penjelasan (untuk jawaban sebelumnya)
Mathematica memiliki fitur yang bagus sehingga operasi seperti aritmatika secara otomatis memasukkan daftar.
Dalam hal ini, kami mengambil
Mod[#,2]
yang akan mengembalikan 0 atau 1, tetapi kami perlu menambahkan 1 karena daftar Mathematica diindeks 1. Jika bahkan , ini keluar ke 1, jadi#-1
dikembalikan. Jika aneh , ini keluar ke 2, jadi#+1
dikembalikan.sumber
[[0]]
kemampuan:#-1[-1][[#~Mod~2]]&
.Bijaksana , 8 byte
Cobalah online!
Penjelasan
Jika ini sebaliknya, (pengurangan jika aneh, kenaikan bahkan jika), akan sangat mudah untuk melakukan ini.
Kami hanya akan membalik bit terakhir.
Cara mengatasinya di sini adalah kita membalik bit terakhir sementara negatif. Angka negatif adalah 1 off dari negasi angka
~
sehingga ini menciptakan offset yang menyelesaikan masalah.Jadi kami hanya mengambil program dan membungkusnya
-
.sumber
Java 8,
1610 byteJava 7,
3428 byteMembosankan port jawaban C menakjubkan @feersum .
Coba di sini.
Jawaban lama:
Java 8, 16 byte
Java 7, 34 byte
Penjelasan (dari jawaban Java 7 lama):
Coba di sini.
Jawaban di atas adalah varian yang lebih pendek
int c(int n){return n%2<1?n-1:n+1;}
dengan menyingkirkan ruang.sumber
Japt , 6 byte
Cobalah online!
sumber
Python, 20 byte
sumber
Di luar 93 , 18 byte
Saya belum selesai bermain golf (saya harap).
sumber
kv
(ataujv
jika benar-benar 1 atau 0) alih-alih#v_
. Juga, jika Anda menggunakan Coba online (dan saya sarankan), Anda dapat mengakhiri program dengan yang lain&
(meskipun akan memakan waktu 60 detik), sehingga Anda dapat menyingkirkan@
pada baris pertama jika Anda menggunakannya. di sini adalah daftar lengkap perintah untuk Befunge-98 , meskipun mereka mungkin tidak semuanya diimplementasikan dengan benar di TIO, seperti&
mengakhiri program alih-alih membalikkan pada EOF.Ruby, 12 byte
sumber
R, 17 byte
di mana
n=scan()
mengambil nilai digit.sumber
-(-1)^n
daripada+(-1)^n
karena kita perlu kembalin-1
jikan
bahkanCasio-Basic, 27 byte
26 byte untuk fungsi, +1 untuk dimasukkan
n
dalam kotak parameter.sumber
C, 29 byte
sumber
Jelly , 4 byte
Cobalah online!
sumber
Batch, 20 byte
Algoritma @ feersum yang ditemukan kembali secara independen, jujur!
sumber