Menghasilkan program terpendek yang mengambil dua bilangan bulat yang ditandatangani sebagai input (melalui stdin atau sebagai argumen) dan menampilkan 3 output yang berbeda tergantung pada apakah angka pertama adalah (1) lebih besar dari, (2) lebih kecil dari, atau (3) sama dengan yang kedua jumlah.
Tangkapan
Anda tidak dapat menggunakan salah satu dari yang berikut ini di program Anda:
- Operator perbandingan standar:
<
,>
,<=
,>=
,==
,!=
. - Setiap file library terlepas dari
conio
,stdio
atauiostream
. - Karakter ASCII yang tidak dapat dicetak atau yang tidak dapat dicetak.
Pemenang
Program dengan jumlah karakter terpendek akan menang.
code-golf
restricted-source
c
c++
belukar
sumber
sumber
abs
tanpa menyertakan file perpustakaan (karena kompiler tahu juga) tidak diperbolehkan?Jawaban:
53 byte
Hanya karakter pertama dari output yang relevan. Tiga output yang berbeda adalah:
Ia bekerja untuk berbagai input int penuh pada semua platform di mana sizeof (panjang)> sizeof (int).
Sunting: biayanya satu karakter tambahan untuk membuat case 3 mencetak '+' sebagai gantinya:
sumber
Mungkin saya melewatkan sesuatu dalam aturan, tapi ...
81 byte
Ouputs
00
jikaa > b
,-10
jikaa == b
, dan-1-1
jikaa < b
.sumber
long long
bisa lebih dari 64 bit,int
bisa lebih besar sehingga Anda bisa meluap, hasil pergeseran nilai negatif yang tepat adalah implementasi didefinisikan. Hampir semua jawaban yang diturunkan dari C memiliki masalah yang sama.sizeof
.90 byte
Jika kita dapat menggunakan
stdio
, mengapa tidak menggunakan kemampuan pemformatannya untuk melakukan perbandingan?Mengasumsikan penyandian yang kompatibel dengan ASCII dan sedikit-endianness.
72 byte
Quotients dibulatkan ke nol tetapi shift kanan (dalam praktiknya) "dibulatkan ke bawah". Itu hadiah mati.
6579 byteProperti lain yang membedakan bilangan negatif adalah bahwa mereka menghasilkan modulo negatif. Yang ini tidak bergantung pada representasi integer sama sekali; bahkan bekerja pada 8-bit pemanggang kelebihan-127 saya! Oh, dan karena kita bisa menggunakan
conio
, mengapa tidak menyimpan dua byte denganputch
? Sekarang, jika saya hanya dapat menemukan salinan TurboC saya ...EDIT : Tangani perbedaan besar dengan asumsi
long long
lebih lebar dariint
.sumber
%d
s di Andascanf
untuk mengurai dua bilangan bulat. Ide yang bagus!a = 1, b = 23
dana = 12, b = 3
. Tidakkah Anda perlu memakai123
STDIN dalam kedua kasus itu?1 23
dan12 3
sebagai input).6461 karakterMencetak nilai karakter -1, 0, dan 1 masing-masing kurang dari, sama dengan, atau lebih besar dari.
Implementasi ini bergantung pada perilaku undefined untuk
b
menjadi jenisint
dan masukan di luar jangkauanINT_MIN / 2
untukINT_MAX / 2
. Pada platform tempat limpahan yang ditandatangani membungkus, baik pelengkap 2s (pada dasarnya semuanya) atau sign-magnitude, itu akan gagal untuk 25% dari kemungkinan pasangan yang validint
. Menariknya (bagi saya), ini akan bekerja dengan benar pada platform di mana jenuh yang masuk ditandai.sumber
a-b
meluap.-(2^14)
dan2^14 - 1
pada semua platform yang sesuai, dan mungkin akan bekerja untuk kisaran yang jauh lebih besar pada kebanyakan platform. Semua jawaban lain pada titik ini membuat asumsi tentang ukuran tipe, ukuran relatif tipe, atau representasi.main(a,b)
sudah merupakan perilaku yang tidak terdefinisi, sehingga tidak ada jawaban yang dijamin akan berfungsi. Nevermind portabilitas.66102 byteMembaca bilangan bulat dari STDIN dan mencetak
0
(a <b),1
(a> b) atau2
(a == b).Sunting: Sekarang ini juga berfungsi untuk perbedaan yang terlalu besar untuk masuk ke dalam bilangan bulat 32-bit. Saya yakin terary bersarang itu dapat disingkat dengan sedikit lebih banyak sihir.
sumber
52 byte
Sayangnya ini hanya bekerja untuk bilangan bulat positif, tetapi saya pikir konsep menggunakan operator aritmatika murni menarik:
Output:
sumber
putchar(a/b-b/a)
jauh lebih pendek.5954 karakter54 karakter dengan kompiler seperti gcc yang tidak menolak di
main(x,y)
:59 karakter sebaliknya:
Keluaran:
sumber
main(x,y)
bekerja di gcc, jadi jangan ragu untuk menjatuhkan 5 byte dari jumlah karakter Anda.66 byte
Mencetak byte 0x00 if
a == b
, 0x01 ifa < b
dan 0xff ifa > b
.Karena non-ASCII atau karakter ASCII yang tidak dapat dicetak dalam program [saya] dan jika ada sesuatu yang tidak dilarang secara eksplisit dalam pertanyaan, maka diizinkan , karakter yang tidak diinginkan dalam output harus sepenuhnya baik-baik saja.
sumber
long
64-bit.87 karakter
Menggunakan trik 2 ^ 31 untuk mengonversi ke int yang tidak ditandatangani
Casting divisi untuk unsigned untuk menangani bit atas sebagai data, bukan masuk
Menggunakan ^ ke XOR a dan b, ketika mereka sama ini mengembalikan 0
Menggunakan bersarang kondisi (?) Untuk mendapatkan "<", ">", atau "=" untuk memberi makan ke menempatkan ()
sumber
71 byte
http://ideone.com/uvXm6c
sumber
z=x-y
dan saya cukup yakin mereka perlu. Anda juga dapat menyimpan dua karakter dengan menggunakan49,
50` dan51
langsung, alih-alih menambahkan48
.-2000000000 2000000000
, serta kombinasi bilangan bulat lainnya yang menyebabkan overflow dalam pengurangan.68 karakter
Letakkan karakter ASCII 1, 2 atau 3 masing-masing kurang dari, lebih besar atau sama.
sumber
a-b
meluap.8889 byteIni dimulai dengan menambahkan
1<<31
(INT_MIN
) ke a dan b, sehingga 0 sekarang sesuaiINT_MIN
. Kemudian lilitkan dan kurangi a dan b setiap loop sampai 0, kemudian cetak 0, 1 atau 2 tergantung pada apakah a, b atau keduanya 0.120119 byteIni bukan solusi terpendek seperti itu tetapi mungkin golf sedikit lebih baik dari saya. (Atau hanya orang yang memiliki pengetahuan lebih banyak tentang C daripada saya)
Idenya adalah untuk menutupi setiap bit, mulai dari yang kiri dan memeriksa ketidaksetaraan. Selebihnya harus menjelaskan sendiri. Karena angka negatif dimulai dengan 1 bit, saya pertama-tama membalikkan bit pertama dengan
a^=1<<31
.sumber
;)
Smiley yang bahagia harus tersenyum yang sedih);
. 2.a&b
hanya menguji jikaa
danb
memiliki bit yang sama; kamu membutuhkan&&
.Saya pikir saya bahkan tidak akan mencoba menulis kode pendek. Apa yang akan saya coba adalah melakukan perbandingan ini dengan cara yang portabel menurut spesifikasi C99.
Operator modulo mempertahankan tanda, tetapi mungkin menghasilkan nol (termasuk nol negatif), jadi kami memastikan kami memiliki nilai ganjil dan genap untuk diperiksa (bahkan tanpa mengetahui apakah kami menggunakan komplemen yang). Operasi aritmatika mungkin meluap, tetapi bitwise tidak akan, dan dengan memastikan ada bit yang ditetapkan dan dihapus, kita menghindari secara tidak sengaja mengubah angka kita menjadi nol negatif atau nilai perangkap. Fakta bahwa dua operasi diperlukan untuk melakukannya secara aneh seharusnya tidak menjadi masalah, karena representasi perangkap yang mungkin tidak menyebabkan perilaku yang tidak ditentukan sampai dimasukkan ke dalam nilai yang tinggi. Melakukan operasi dengan bit 0 toggled memastikan kami mendapatkan tepat satu sisanya. Berbekal pengetahuan tentang kedua tanda, kita dapat memutuskan bagaimana melanjutkan dengan perbandingan.
Metode ini mungkin salah satu dari sedikit yang memungkinkan mengekstraksi tanda nol negatif integer. Kami menyelesaikannya dengan secara eksplisit memeriksa nol. Jika kita benar-benar bermain golf, tentu saja kita bisa membiarkan perbandingan dua nol untuk melakukan pengurangan.
sumber
C 80 karakter
Mencetak '<', '>' atau '=', sebagaimana mestinya.
C 63 karakter
Pendekatan baru:
Mencetak '1', '2' atau '3'.
sumber
Dalam 64 karakter tanpa stdio.h
a,b;main(){scanf("%d%d",&a,&b);puts((a-b)>>31?"<":a^b?">":"=");}
mencetak '>' jika a> b, '<' jika a <b, '=' jika a == b int overflow adalah UB. Hanya saja, jangan meluap.
sumber