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 / kanannmenurutkbit. 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%bharus samaa. Begitu5 % -3juga2, dan-5 % 3adalah-2: 5 / 3is1,5 % 3is2, karena 1 * 3 + 2 = 5.-5 / 3is-1,-5 % 3is-2, -1 -1 3 + -2 = -5.5 / -3is-1,5 % -3is2, -1 -1 -3 + 2 = 5.-5 / -3is1,-5 % -3is-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)setbkea + 5, lalu setakeb, dan dihitung sebagai satu operasi. - Penugasan majemuk dapat digunakan
a += bsaranaa = a + bdan 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
returnpernyataan danreturns dari titik mana pun diizinkan. Itureturnsendiri tidak dihitung sebagai operasi. - Anda dapat mendeklarasikan variabel tanpa biaya.
- Anda dapat menggunakan
whileloop, tetapi Anda tidak dapat menggunakanifataufor. Operator yang digunakan dalamwhilekondisi tersebut menghitung skor Anda.whileloop 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 menggunakanbreakjuga - 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 whileloop! 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 whileloop, 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.
whiledan breaktetapi tidak if? if (x) { ... }setara dengan while (x) { ... break; }.
breakdan 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"! :)
ifdan fortidak diizinkan? int x=condition; while (x) { ... x=0; }gratis, hanya lebih banyak kode. Sama halnya dengan c-style for.