Bagaimana menentukan apakah suatu angka ganjil atau bahkan tanpa operasi mod -atau- bitwise?
Tantangan ini sangat tidak efisien, tetapi menantang kemampuan Anda untuk berpikir di luar kotak untuk solusi kreatif.
EDIT :
Silakan buat fungsi. Juga, sementara regex adalah menyenangkan respon, fungsi harus menerima setiap angka yang benar.
LATAR BELAKANG : Pertanyaan ini bermula dari masa pemrograman saya yang paling awal. Pekerjaan rumah untuk hari pertama kelas kami adalah menulis program sederhana yang dicetak 'aneh' atau 'datar'. Menjadi anak nakal saya, saya tidak membaca buku yang kami miliki untuk kelas di mana itu hanya menunjukkan kepada kita bagaimana menggunakannya%
untuk menentukan itu. Saya menghabiskan sekitar setengah jam mondar-mandir di kamar saya mencoba memikirkan cara untuk melakukan ini dan ingat dari ceramah bahwa angka dapat kehilangan dan mendapatkan presisi karena mereka dilemparkan dari satu jenis primitif ke yang lain. Oleh karena itu, jika Anda mengambil nomor itu, membaginya menjadi dua dan kemudian mengalikannya kembali tidak sama dengan angka aslinya, maka Anda akan tahu bahwa jumlahnya aneh.
Saya terkejut pada hari berikutnya, ketika instruktur kami mengevaluasi program kami, bahwa ia berpikir bahwa itu adalah cara penyelesaian masalah yang paling orisinal, jika tidak efisien.
sumber
Jawaban:
Dalam sebagian besar bahasa pemrograman, pembagian mengembalikan hasil bagi bilangan bulat. Jadi, Anda cukup memeriksa ini
sumber
int
/long
typefloor()
. Itu bekerja dengan sempurna di C dan C ++.Python
sumber
Brainf *** (179)
Ini adalah salah satu masalah yang lebih menarik yang melibatkan logika kondisional yang telah saya lakukan di BF.
Dibutuhkan input teks dengan angka. Jika angkanya genap, maka akan keluar
E
, dan jika ganjil, maka akan keluarO
.Saya cukup bangga bahwa saya akan memamerkan bentuk yang lebih dapat dibaca manusia:
sumber
Mathematica
sumber
I
danPi
bukannyai
danpi
.C
Dikalikan dengan sendirinya beberapa kali bilangan genap akan melimpah ke 0 diberi bilangan bulat ukuran terbatas, dan bilangan ganjil mana pun akan terus memiliki setidaknya set bit paling tidak signifikan.
Sunting: Sebagai fungsi sederhana:
sumber
Python (Lambat)
sumber
abs()
panggilan di awal.JavaScript
hasil
true
untuk bilangan genap. Ini hanya bekerja dengan bilangan bulat berukuran wajar (misalnya bukan notasi ilmiah ketika dikonversi ke string dan tidak memiliki bagian fraksional.)sumber
/[02468]$/.test
./[02468]$/.test('I am a fake even number 0')
. Dalam hal ini yang bisa Anda lakukan/^[0-9].[02468]$/.test(i)
/-?^\d*[02468]$/
akan sedikit lebih ketat dari regex Anda. Anda akan membutuhkan lebih banyak pekerjaan untuk ini agar berfungsi dengan benar untuk angka-angka yang menggunakan Strata menggunakan notasi ilmiah.Python
Karena saya tidak begitu yakin apa kriteria penilaiannya, inilah banyak solusi yang saya buat untuk hiburan. Sebagian besar digunakan
abs(n)
untuk mendukung angka negatif. Sebagian besar, jika tidak semua, dari mereka tidak boleh digunakan untuk perhitungan nyata.Yang ini agak membosankan:
Dan ini adalah favorit saya walaupun sayangnya tidak bekerja (seperti yang ditunjukkan oleh Maret Ho di bawah ini: hanya karena semua bilangan genap adalah jumlah dari dua bilangan prima, tidak berarti bahwa semua bilangan ganjil tidak).
sumber
Haskell
Ini, tentu saja, sama sekali bukan solusi kreatif, pemikiran-di-luar-kotak yang Anda cari, tetapi berapa kali saya bisa mengirim jawaban Haskell lebih pendek dari GolfScript, benarkah? Sayang sekali ini bukan kode golf.
Tetapi yang lebih serius:
sumber
odd
) yang merupakan fungsi builtin yang mengembalikan True jika nomornya ganjil. Itu jawaban yang lengkap dengan sendirinya dan lebih pendek dari jawaban GolfScript saat ini (yang pada saat penulisan ini adalah 10 karakter, tapi saya berharap itu turun). Pertanyaannya juga agak kurang spesifik, karena itu saya tegaskan ituodd
sudah cukup. Itu mungkin berubah juga.parity
algoritma bekerja pada semuaNum
instance yang bilangan bulat. Itu panas! Meskipun saya mungkin akan melakukannyaevens = [0,2..] >>= \n -> [-n, n]
. Mirip dengan odds.Menggunakan pembacaan yang sengaja disalahgunakan dari pertanyaan, "Bagaimana menentukan apakah suatu angka ganjil atau genap", inilah implementasi C (asumsikan
bool
dantrue
didefinisikan dengan tepat):sumber
0.5
kembalitrue
ketika seharusnya tidak.Apa, belum ada algoritma acak ??
C
Pasangkan angka secara acak dalam kisaran 0 .. n -1 hingga kurang dari 2 tersisa. Ini cukup luar biasa tidak efisien: O ( n 3 ).
Benar-benar berbeda:
Haskell
Menggunakan fakta bahwa transformasi Fourier dari fungsi genap (misalnya
\x->x^^4
) adalah nyata, sedangkan transformasi Fourier dari fungsi aneh adalah imajiner.sumber
Windows PowerShell
Tidak ada operator bitwise, tidak ada modulus, seperti yang diminta.
sumber
Coq, 103
Sejauh yang saya tahu ini adalah entri coq pertama pada codegolf.
Bahkan lebih pendek (59):
sumber
Rubi
Jika Anda ingin mencetak hasilnya:
sumber
.odd?
definisi.Unlambda
Dunia membutuhkan lebih banyak Unlambda.
Unlambda memiliki keunggulan pembunuh di sini: representasi default ( ahem ) untuk angka adalah angka Gereja, jadi semua yang diperlukan adalah menerapkannya ke fungsi biner-bukan berfungsi dengan benar. Mudah!
PS: Penurunan harga dan Unlambda jelas tidak dibuat untuk satu sama lain.
Verifikasi untuk beberapa bilangan bulat pertama:
sumber
Naskah Golf
sumber
Python
Performa yang mirip dengan versi sebelumnya. Berfungsi untuk 0 sekarang.
Versi sebelumnya yang salah:
Tidak terlalu efisien; waktu dan memori keduanya jelas O (n): 32 msec untuk 1.000.000; 2,3 msec untuk 100000; 3,2 usec untuk 100. Bekerja dengan angka negatif. Melempar kesalahan untuk 0, karena 0 tidak genap atau ganjil.
sumber
Fraktran
diaplikasikan ke
hasil baik
5
jikan
ganjil atau1
jikan
bahkan.Pembaruan : Jauh lebih pendek tetapi tidak begitu menarik:
adalah
2
untuk anehn
dan1
bahkann
.sumber
MMIX (4 Bytes)
Ini agak curang. Saya tidak menggunakan mod atau operasi sedikit pun. Ini agak bahwa pengujian untuk nomor ganjil / genap dibangun. Dengan asumsi yang
$3
berisi angka untuk diuji dan hasilnya masuk ke$2
:diatur
$2
ke1
jika$3
genap dan0
jika tidak. MnemnoricZSEV
berarti zero-set even dan memiliki semantik berikut:Untuk baris di atas,
mmixal
hasilkan empat byte perakitan ini:sumber
Skema
Ini adalah solusi paling tidak efisien yang saya tahu.
sumber
Perl
Bagaimana dengan
sumber
JavaScript, 36
Mengembalikan
true
jika bahkan,false
jika tidak.sumber
Perl
sumber
Python
menguji kuadrat i, jadi itu berfungsi untuk angka negatif juga
sumber
F #
Rekursi timbal balik untuk menang.
Angka n bahkan jika itu nol atau (n-1) ganjil.
Angka n ganjil jika tidak sama dengan nol dan (n-1) genap.
(abs ditambahkan jika ada yang tertarik pada paritas angka negatif)
sumber
Clojure
sumber
Apa yang memenuhi syarat sebagai operasi bitwise? Di bawah tenda, pembagian integer oleh 2 kemungkinan akan diterapkan sebagai bit-shift.
Dengan asumsi bitshift tidak keluar:
C / C ++
sunting Beberapa kurung terlewatkan, dan akhirnya diubah untuk menghapus pergeseran agar lebih sedikit. Anda dapat menguji ini dengan yang berikut (di * nix):
... meskipun di Linux / tcsh, saya harus melarikan diri dari backslash
\n
meskipun itu dalam tanda kutip tunggal. Saya menguji sedikit & big-endian, itu berfungsi dengan baik di keduanya. Juga, saya menyalinnya secara manual; komputer yang saya posting dengan tidak memiliki kompiler, jadi mungkin ada kesalahan.x86 asm
.
atau
atau
... diikuti oleh:
Sebagai alternatif, shift & bandingkan barang dapat dilakukan dengan cara ini juga:
sumber
shl
dan teman-teman tidak diizinkan ...Pada prosesor 68000 Anda bisa memindahkan nilai kata dari alamat yang ditentukan oleh nilai yang akan diuji:
dan biarkan jebakan perangkat keras untuk kesalahan alamat menentukan sifat ganjil / genap dari nilai - jika pengecualian dinaikkan, nilainya aneh, jika tidak, nilainya genap:
Tidak bekerja pada Intel x86 CPU karena lebih fleksibel tentang akses data.
sumber
Python
Saya memutuskan untuk mencoba solusi paling jelek dan paling membingungkan yang dapat saya pikirkan:
Mencetak e jika genap, o jika aneh.
sumber
Q
Terus kurangi 2 hingga x <2 lalu konversikan ke bool
sumber