Ini adalah CMC (tantangan mini obrolan) yang saya posting di chatroom kami, The Ninteenth Byte , beberapa waktu lalu.
Tantangan
Diberikan bilangan bulat positif x
, tergantung pada 2 bit terakhir x
, lakukan hal berikut:
x & 3 == 0: 0
x & 3 == 1: x + x
x & 3 == 2: x * x
x & 3 == 3: x ^ x (exponentiation)
Input output
Single Integer -> Single Integer
Baris baru tambahan diizinkan dalam output. Tidak ada spasi putih lain yang diizinkan.
Testcases
input output
1 2
2 4
3 27
4 0
5 10
6 36
7 823543
8 0
9 18
10 100
11 285311670611
12 0
Ini adalah tantangan kode-golf , jadi kode terpendek menang!
0
kasus menjadix + 2
, melihat bagaimana yang lainx * 2
,x ^ 2
danx ^^ 2
(tetration)? : Px ^ x
)? 32-bit sudah tidak cukup untuk test case11
, dan 64-bit tidak cukup untuk test case19
.Jawaban:
Jelly , 8 byte
Cobalah online!
Bagaimana itu bekerja
Pertama, pemberitahuan yang
x&3
setara denganx%4
, di mana%
modulo. Lalu, karena Jelly menggunakan pengindeksan modular (a[n] == a[n+len(a)]
), jadi kita bahkan tidak perlu menghadapinya.Kemudian:
x%4==0
, kembalix_x
(kurangi) (untuk konsistensi);x%4==1
, kembalix+x
;x%4==2
, kembalix×x
(multiplikasi);x%4==3
, kembalix*x
(eksponensial)Perhatikan bahwa Jelly menggunakan pengindeksan 1, sehingga pengurangannya
"_"
dipindahkan ke akhir.sumber
wc --bytes
).Python , 30 byte
Cobalah online!
sumber
CJam , 12 byte
Cobalah online!
Penjelasan
Menjalankan salah satu dari operasi berikut tergantung pada
x
nilai mod 4 (mod 4 setara dengan DAN 3).sumber
Mathematica 25 Bytes
Disimpan 4 Bytes berkat @MartinEnder
sumber
Pyth, 8 byte
Penerjemah
sumber
v
bukan.v
..v
tidak dapat mengaksesQ
... Rupanya saya kalah dalam Pyth. +1 untuk Anda.v
yang memiliki cakupan lokal,.v
hanya eval ekspresi."0y*^
bisa jadi"-+*^
.Ruby , 26 byte
Cobalah online!
sumber
PHP, 37 Bytes
Versi Online
PHP, 47 Bytes
Versi Online
Fungsi BC Matematika
sumber
Haskell,
2827 byteCobalah online!
Sunting: Terima kasih kepada @ Ørjan Johansen selama 1 byte.
sumber
cycle
.JavaScript, 24 byte
Cobalah online!
sumber
C, 63 atau 62 byte
-1 byte jika makro dibolehkan, dengan asumsi
x
bukan ekspresi seperti3+5
(karena itu akan mengacaukan prioritas):sumber
cast to incomplete array type "int[]" is not allowed
Compiler berkataerror C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
; JUGA! dimana int f (int x)? kode sebenarnya setidaknya 8 byte lebih lama; juga sangat lambat dan tidak efisien, karena mengevaluasi semua - jangan ulangi IRL)(int[])
sintaks ini untuk situasi ini. 2)f(x)
C89 sangat legal. Saya tidak menentukan standar. 3) Ini tentang ukuran kode, bukan efisiensi. Dan 4) Jika Anda akan menggurui, setidaknya gunakan kompiler nyata dan / atau periksa fakta Anda.Java 7, 75 byte
Meskipun valid menurut aturan,
long
adalah 64-bit, sehingga gagal untuk kasus uji eksponensial ke19^19
atas. Untuk memperbaikinya kita dapat menggunakanBigDecimal
pendekatan:148146 bytePenjelasan (dari pendekatan BigDecimal):
Kode uji:
Coba di sini.
Keluaran:
sumber
x86 Assembler, Sintaks Intel, 192 byte
Contoh berpura-pura untuk kecepatan kerja tercepat. Apakah adalah bagian program atau program, yang menggunakan konvensi panggilan cepat. Ini mengasumsikan variabel input
x
dalam registereax
, dan mengembalikan hasil juga dalameax
. Ide dasarnya adalah menjauh dari menggunakan lompatan bersyarat, seperti dalam beberapa contoh di sini. Juga, ini bukan untuk mengevaluasi semuanya (seperti pada contoh C dengan array) tetapi untuk menggunakan array pointer ke functons dan membuat lompatan tanpa syarat lebih cepat (jmp / panggilan) sebagai analog "bahasa C switch () - case .." yang dioptimalkan. Teknik ini dapat juga berguna dalam jenis emulator finita automata - seperti prosesor, pelaksana dan sebagainya.Pembaruan: untuk x64 gunakan "r" dalam nama register, bukan "e" (mis.
rax
Bukannyaeax
,rcx
bukanecx
). Ukuran tidak akan berubah, dan itu akan menggunakan kata-kata tak bertanda 64-bit.sumber
C #, 39 byte
Penjelasan
Perhatikan bahwa:
(xx, x + x, x * x, x ^ x) == (0, 2, x, x ^ (x-1)) * x
Solusi ini menciptakan sebuah array, mengindeks ke dalamnya dan kemudian mengalikan hasilnya dengan
x
:Versi alternatif:
(39B, semua perkalian yang dilakukan dalam array,
x%4
gantix&3
)(39B, sama dengan jawaban @ MetaColon tetapi
x%2*2*x
digantix*x%4<1?0:2
)sumber
Sebenarnya , 12 byte
Cobalah online!
Penjelasan:
sumber
05AB1E , 10 byte
Menggunakan penyandian 05AB1E . Cobalah online!
sumber
J , 14 byte
Cobalah online!
sumber
(4&|{-,+,*,^)~
berfungsi juga tetapi itu adalah jumlah byte yang sama karena parens, meskipun sedikit lebih jelas apa fungsinya.Oasis , 25 byte
Cobalah online!
Bagaimana itu bekerja
Perhatikan bahwa
x&3
itu setara denganx%4
, di mana%
modulo.Oasis adalah bahasa berbasis tumpukan di mana setiap karakter adalah perintah.
sumber
Cubix , 29 byte
Cobalah online!
Penjelasan akan ditambahkan segera ...
sumber
C #, 42 Bytes
Sebenarnya itu adalah C # yang normal, tetapi karena Anda tidak dapat menjalankannya sebagai keseluruhan program dan Anda harus mengetiknya di interaktif, saya kira Anda dapat menyebutnya C # interaktif .
Penjelasan :
Saya tidak tahu apakah ini varian terpendek, ada saran yang dihargai.
sumber
x
tidak didefinisikan. Itu menjadikan ini cuplikan, bukan program lengkap.x
" berarti Anda diberikanx
melalui metode input standar (yaitu, fungsi atau program).PHP, 36 byte
sumber
dc, 27
Saya tidak pernah memiliki kesempatan untuk menggunakan array di dc sebelumnya:
Cobalah online .
sumber
Groovy, 26 byte
Cobalah online!
sumber
C, 115 byte
Contoh adalah fungsi
int f(int x)
Ini berpura-pura untuk kecepatan kerja tercepat karena menjauhkan CPU dari menggunakan lompatan bersyarat. Dan ini hanya cara optimalisasi kecepatan yang benar untuk tugas ini. Juga, ia mencoba untuk tidak mengevaluasi semuanya, seperti pada contoh array C
return(int[]){0,x+x,x*x,pow(x,x)}[x%4];
Tetapi tetapi dengan bijak menggunakan array pointer ke functons, untuk membuat lompatan tanpa syarat yang jauh lebih cepat (jmp / panggilan) dengan aritmatika alamat yang jauh lebih cepat, sebagai versi yang dioptimalkan dari " switch () - case .. ". Teknik ini bisa juga berguna dalam beberapa jenis finita automata - seperti emulator prosesor, pelaksana, pengurai aliran perintah, dan sebagainya - di mana masalah kecepatan dan kode sukaswitch(x%4) case(0):... case(1):...
tidak cocok karena menghasilkan beberapa instruksi cmp / jnz; dan ini adalah operasi yang mahal untuk CPUProgram uji paling sederhana dan tersingkat (dalam kondisi default) untuk kasus ini adalah sebagai berikut:
Ini akan menambah hanya 12 byte payload dan akan total ukuran kita menjadi 127 byte;
Tetapi Anda sebaiknya memberi tahu linker untuk menggunakan
f
fungsi sebagai titik masuk, alih-alihmain
. Itulah caranya, jika kami bertujuan untuk mendapatkan biner yang berfungsi paling cepat untuk tugas ini dari kode terpendek ;-) Ini terjadi karena pustaka C menambahkan kode init / shutdown tambahan sebelum memanggil fungsi utama () Anda.Kode mengkompilasi pada Komunitas MSVS 2015 tanpa ada trik dan masalah dan menghasilkan hasil yang benar. Saya belum mengujinya dengan gcc, tapi saya yakin itu akan berfungsi dengan baik juga.
sumber
R,
4742 byteBerlaku fungsi
-
,+
,*
, atau^
berdasarkan modulusx
untukx
danx
.-
adalah satu-satunya (agak) hal yang cerdas, karenax-x
selalu 0.R, 33 byte
Metode yang sama seperti yang digunakan orang lain. Meskipun lebih pendek, saya tidak terlalu menyukainya.
sumber
Pyth , 12 byte
Cobalah online!
Bagaimana itu bekerja
Pertama, pemberitahuan yang
x&3
setara denganx%4
, di mana%
modulo. Kemudian, karena Pyth menggunakan pengindeksan modular (a[n] == a[n+len(a)]
), jadi kita bahkan tidak perlu berurusan dengan itu.Kemudian:
x%4==0
, kembalix-x
(untuk konsistensi);x%4==1
, kembalix+x
;x%4==2
, kembalix*x
;x%4==3
, kembalix^x
.Lebih lanjut tentang notasi Polandia: Wikipedia (terlalu buruk jika Anda berada di Turki).
sumber
Japt , 13 byte
Cobalah online!
Ini menggunakan metode yang sama dengan jawaban eval lainnya, kecuali program
-U
hanya meniadakanU
, jadi kami menggunakan^
(bitwise XOR) sebagai gantinya.sumber
Vim, 50 byte
Di sini,
^V
mewakili aCtrl+V
,^R
mewakiliCtrl-R
dan^[
mewakiliesc
kuncinyaBekerja dengan terlebih dahulu membangun ekspresi dan kemudian membiarkan
bc
mengevaluasinya. Mengharapkan input pada baris pertama dalam buffer kosong.Penjelasan:
sumber
^V
hanya menempelkan apa yang saya miliki di clipboard saya, bukan nomor ...D
alih - alihd$
Pyth, 9 byte
Suite uji
Tidak ada yang terjadi di sini, hanya menghitung empat nilai, dan pilih satu dengan pengindeksan modular.
sumber
Batch, 135 byte
Saya berharap untuk membuat eksponensial dengan membangun dan mengevaluasi string bentuk
[0+...+0, 2+...+2, x+...+x, x*...*x]
tergantung pada dua bit terakhirx
tapi sayangnya kode untuk memilih operasi terlalu lama untuk diekspresikan karena saya tidak dapat menggunakan*
sebagaifor
parameter, tapi saya setidaknya dapat menggunakan beberapa tipuan jatuh-jatuh untuk bermain golf beberapa byte.sumber
Retina , 87 byte
Cobalah online! (Tautan termasuk test suite.)
Penjelasan: Dua baris pertama mengubah input menjadi unary dan menduplikatnya (jadi sekarang kita miliki
x;x
). Dua baris berikutnya mencarix&3
dari salah satu0
atau1
dan berubahx;x
menjadix;0
ataux;2
tepat. Dua baris berikutnya mencarix&3==3
dan perubahanx;x
kex;x;x;...;x;1;x
(x
x
s). Ini berarti bahwa kita harus baikx;0
,x;2
,x;x
, ataux;...;x
dan masih kalikan semuanya bersama-sama dan mengkonversi kembali ke desimal. (Kode multiplikasi didasarkan pada yang ada di Retina wiki tetapi diubah untuk menangani perkalian dengan nol.)sumber