Ini adalah versi dari tantangan terakhir. Apakah angka ini bilangan bulat dari -2? dengan serangkaian kriteria yang berbeda yang dirancang untuk menyoroti sifat menarik dari masalah dan membuat tantangan lebih sulit. Saya menaruh beberapa pertimbangan di sini .
Tantangan seperti yang dinyatakan oleh Toby dalam pertanyaan terkait, adalah:
Ada cara pintar untuk menentukan apakah integer adalah kekuatan tepat dari 2. Itu bukan lagi masalah yang menarik, jadi mari kita tentukan apakah integer yang diberikan adalah kekuatan yang tepat dari -2 . Sebagai contoh:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
Aturan:
- Integer adalah 64 bit, ditandatangani, komplemen dua. Ini adalah satu - satunya tipe data yang dapat Anda gunakan.
- Anda hanya dapat menggunakan operasi berikut. Masing-masing dihitung sebagai satu operasi.
n << k
,n >> k
: Pergeseran kiri / kanann
menurutk
bit. Bit tanda diperpanjang di shift kanan.n >>> k
: Bergeser ke kanan tetapi tidak memperpanjang bit tanda. 0 bergeser masuk.a & b
,a | b
,a ^ b
: Bitwise AND, OR, XOR.a + b
,a - b
,a * b
: Menambah, mengurangi, mengalikan.~b
: Bitwise terbalik-b
: Negasi komplemen dua.a / b
,a % b
: Membagi (hasil bagi bilangan bulat, putaran ke 0), dan modulo.- Modulo angka negatif menggunakan aturan yang ditentukan dalam C99 :
(a/b) * b + a%b
harus samaa
. Begitu5 % -3
juga2
, dan-5 % 3
adalah-2
: 5 / 3
is1
,5 % 3
is2
, karena 1 * 3 + 2 = 5.-5 / 3
is-1
,-5 % 3
is-2
, -1 -1 3 + -2 = -5.5 / -3
is-1
,5 % -3
is2
, -1 -1 -3 + 2 = 5.-5 / -3
is1
,-5 % -3
is-2
, sebagai 1 * -3 + -2 = -5.- Perhatikan bahwa
//
operator pembagian lantai Python tidak memenuhi properti pembagian "putaran menuju 0" di sini, dan%
operator Python juga tidak memenuhi persyaratan.
- Modulo angka negatif menggunakan aturan yang ditentukan dalam C99 :
- Tugas tidak dihitung sebagai operasi. Seperti dalam C, tugas mengevaluasi ke nilai sisi kiri setelah penugasan:
a = (b = a + 5)
setb
kea + 5
, lalu seta
keb
, dan dihitung sebagai satu operasi. - Penugasan majemuk dapat digunakan
a += b
saranaa = a + b
dan dihitung sebagai satu operasi.
- Anda dapat menggunakan konstanta integer, mereka tidak dihitung sebagai apa pun.
- Tanda kurung untuk menentukan urutan operasi dapat diterima.
- Anda dapat mendeklarasikan fungsi. Deklarasi fungsi bisa dalam gaya apa pun yang nyaman untuk Anda tetapi perhatikan bahwa integer 64 bit adalah satu - satunya tipe data yang valid. Deklarasi fungsi tidak dihitung sebagai operasi, tetapi sebuah fungsi panggilan dianggap sebagai satu. Juga, harus jelas: Fungsi dapat berisi beberapa
return
pernyataan danreturn
s dari titik mana pun diizinkan. Itureturn
sendiri tidak dihitung sebagai operasi. - Anda dapat mendeklarasikan variabel tanpa biaya.
- Anda dapat menggunakan
while
loop, tetapi Anda tidak dapat menggunakanif
ataufor
. Operator yang digunakan dalamwhile
kondisi tersebut menghitung skor Anda.while
loop dijalankan selama kondisinya mengevaluasi ke a tidak nol ("benar" 0 dalam bahasa yang memiliki konsep ini bukan hasil yang valid). Sejak awal-return diperbolehkan, Anda diijinkan untuk menggunakanbreak
juga - Overflow / underflow diizinkan dan tidak ada penjepitan nilai yang akan dilakukan. Itu diperlakukan seolah-olah operasi benar-benar terjadi dengan benar dan kemudian dipotong menjadi 64 bit.
Kriteria Penilaian / Kemenangan:
Kode Anda harus menghasilkan nilai yang bukan nol jika inputnya adalah kekuatan -2, dan nol sebaliknya.
Ini adalah atom-kode-golf . Skor Anda adalah jumlah total operasi yang ada dalam kode Anda (sebagaimana didefinisikan di atas), bukan jumlah total operasi yang dijalankan pada saat run-time. Kode berikut:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
Berisi 5 operasi: dua di fungsi, dan tiga panggilan fungsi.
Tidak masalah bagaimana Anda mempresentasikan hasil Anda, gunakan apa pun yang nyaman dalam bahasa Anda, baik itu akhirnya menyimpan hasil dalam variabel, mengembalikannya dari suatu fungsi, atau apa pun.
Pemenangnya adalah pos yang terbukti benar (berikan bukti kasual atau formal jika perlu) dan memiliki skor terendah seperti dijelaskan di atas.
Bonus Tantangan Mode Sangat Keras!
Untuk kesempatan memenangkan apa pun kecuali kemampuan potensial untuk mengesankan orang di pesta, kirimkan jawaban tanpa menggunakan while
loop! Jika cukup dari ini diajukan saya bahkan dapat mempertimbangkan membagi kelompok yang menang menjadi dua kategori (dengan dan tanpa loop).
Catatan: Jika Anda ingin memberikan solusi dalam bahasa yang hanya mendukung bilangan bulat 32-bit, Anda dapat melakukannya, asalkan Anda cukup membenarkan bahwa bilangan bulat 64-bit akan tetap benar untuk penjelasan.
Juga: Beberapa fitur bahasa tertentu dapat diizinkan tanpa biaya jika mereka tidak menghindari aturan tetapi diperlukan untuk memaksa bahasa Anda ke dalam berperilaku sesuai dengan aturan di atas . Sebagai contoh (dibuat-buat), saya akan mengizinkan gratis tidak sama dengan 0 perbandingan dalam while
loop, ketika diterapkan pada kondisi secara keseluruhan, sebagai solusi untuk bahasa yang memiliki "benar" 0's. Upaya yang jelas untuk mengambil keuntungan dari hal-hal semacam ini tidak diperbolehkan - mis. Konsep nilai "benar" 0 atau "tidak terdefinisi" tidak ada dalam aturan di atas, dan karenanya tidak dapat diandalkan.
m ^= s
itu masih mengesankan, dan saya pikir itu akan benar-benar baik untuk membuat substitusi untuk memperbaikinya lebih.
while
dan break
tetapi tidak if
? if (x) { ... }
setara dengan while (x) { ... break; }
.
break
dan pengembalian awal adalah bagian yang disesalkan) dan merupakan cerita panjang dan pelajaran yang dipetik dalam aturan untuk tantangan di masa depan. Selalu ada versi "bonus"! :)
if
dan for
tidak diizinkan? int x=condition; while (x) { ... x=0; }
gratis, hanya lebih banyak kode. Sama halnya dengan c-style for
.