Tantangannya: Tetapkan x
sedemikian rupa sehingga ekspresi (x == x+2)
akan dievaluasi menjadi benar.
Saya menandai pertanyaan dengan C, tetapi jawaban dalam bahasa lain dapat diterima, asalkan mereka kreatif atau menyoroti aspek menarik dari bahasa tersebut.
Saya bermaksud menerima solusi C, tetapi bahasa lain bisa mendapatkan suara saya.
- Benar - berfungsi pada implementasi yang sesuai standar. Pengecualian - dengan asumsi implementasi tipe dasar, jika itu implementasi umum (mis. Asumsi
int
adalah komplemen 32bit 2) adalah OK. - Sederhana - harus berukuran kecil, gunakan fitur bahasa dasar.
- Menarik - saya akui itu subjektif. Saya punya beberapa contoh untuk apa yang saya anggap menarik, tetapi saya tidak ingin memberikan petunjuk. Pembaruan : Menghindari preprocessor itu menarik.
- Cepat - Jawaban bagus pertama akan diterima.
Setelah mendapatkan 60 jawaban (saya tidak pernah mengharapkan partisipasi semacam itu), mungkin baik untuk merangkumnya.
60 jawaban dibagi menjadi 7 kelompok, 3 di antaranya dapat diimplementasikan dalam C, sisanya dalam bahasa lain:
- Preprosesor C.
#define x 2|0
disarankan, tetapi ada banyak kemungkinan lain. - Titik mengambang. Sejumlah besar, tak terbatas
atau NaNsemuanya berfungsi. Aritmatika petunjuk. Pointer ke struct besar menyebabkan menambahkan 2 untuk membungkus.
Sisanya tidak bekerja dengan C:
- Operator overloading - A
+
yang tidak menambah atau==
yang selalu mengembalikan true. - Membuat
x
panggilan fungsi (beberapa bahasa mengizinkannya tanpax()
sintaks). Maka itu dapat mengembalikan sesuatu yang lain setiap kali. - Tipe data satu bit. Lalu
x == x+2 (mod 2)
. - Mengubah
2
- beberapa bahasa memungkinkan Anda menetapkannya0
.
math
arithmetic
c
ugoren
sumber
sumber
4. Quick
? Maksud Anda "Siapa yang tahu satu dan cukup beruntung untuk membaca pertanyaan ini terlebih dahulu"?add to Set
oleh perpustakaan standar, tanpa mendefinisikan ulang+
diri Anda, tidak masuk ke dalam 7 kategori ini, IMHO.Jawaban:
Output 1.
Tautan: http://ideone.com/dL6A5
sumber
float x=1./0
sedikit lebih pendek dan mungkin lebih elegan. Tapi bagaimanapun, ini pasti adalah jawaban bagus pertama.float x=1e20
akan cukupFortran IV:
Setelah ini, setiap konstanta 2 dalam program adalah nol. Percayalah, saya telah melakukan ini (ok, 25 tahun yang lalu)
sumber
Ini sepertinya berhasil:
Pada dasarnya, ekspresi diperluas ke
(2|0 == 2|(0+2))
. Ini adalah contoh yang bagus mengapa seseorang harus menggunakan tanda kurung ketika mendefinisikan makro.sumber
2|(0+2)
menjadi1
?|
adalah bitwise OR ;||
logis ATAU.Brainfuck
Ini tentu saja sedikit meregangkan "mengevaluasi benar", karena dalam Brainfuck tidak ada yang benar-benar mengevaluasi apa pun - Anda hanya memanipulasi kaset. Tetapi jika sekarang Anda menambahkan ekspresi Anda
program ini setara dengan
(karena semuanya kecuali
<>+-[],.
komentar). Yang tidak melakukan apa-apa selain meningkatkan nilai di mana kita berada sekarang. Rekaman diinisialisasi dengan semua nol, jadi kita berakhir dengan 1 pada posisi kursor, yang berarti "benar": jika kita sekarang memulai bagian bersyarat[]
, itu akan masuk / loop.sumber
x
?x
jadi di sinix
didefinisikan sebagaix
.need
apa - apa kecuali+
F #
sumber
=
?==
bahkan tidak didefinisikan secara default.C
Catatan: mungkin tidak berfungsi jika
FLT_EVAL_METHOD != 0
(lihat komentar di bawah).sumber
INF + 2 == INF
, sedangkan jawaban saya menggunakan pelampung presisi tunggal yang cukup besar yaitu 2 kurang dari satu ULP.∞ + 2 = ∞
adalah sesuatu yang dapat dipahami oleh siapa pun dan tidak bergantung pada komputer apa pun yang spesifik, sedangkan menambahkan 2 ke angka konkret dan tidak memiliki efek sedikit lebih mengejutkan dan spesifik untuk presisi terbatas komputer, dan IMHO lebih menarikFLT_EVAL_METHOD == 1
matematika dilakukandouble
. Rekomendasikan nilai FP yang lebih besar pasti akan melebihilong double
presisi seperti1.0e37f
C #
Bukan shortie, tapi agak elegan.
http://ideone.com/x56Ul
sumber
Scala:
{ val x = Set(2); (x == x + 2) }
Haskell: Tentukan ℤ / 2ℤ pada
Bool
eans:maka untuk apa pun yang
x :: Bool
kita milikix == x + 2
.Pembaruan: Terima kasih atas ide-ide dalam komentar, saya memperbarui contoh sesuai.
sumber
fromInteger = odd
(+)
bisa didefinisikan seperti yang(/=)
saya yakini.()
.Python
sumber
__cmp__
sebagaiclass X(int):__cmp__=lambda*x:0
(atau__eq__
meskipun sedikit lebih lamaclass X(int):__eq__=lambda*x:True
class X:__add__=lambda s,o:s
__add__
biasanya diberikan beberapa argumen (lambda x,y:
), saya menyimpan beberapa karakter dengan menggunakan * untuk mengemas semua argumen menjadi tuple (lambda *y:
). Lihat dokumen untuk info lebih lanjut.GNU C mendukung struktur tanpa anggota dan ukuran 0:
sumber
PHP:
Atau:
Keluaran:
sumber
Ini adalah kesalahpahaman umum bahwa dalam C, spasi putih tidak masalah. Saya tidak bisa membayangkan seseorang belum menemukan ini di GNU C:
Cetakan
1
.sumber
x == x+2
masih salah). Tapi begitu Anda memunculkan ide, saya pikir#define x -2*__LINE__
lebih elegan._CAT
adalah pengidentifikasi yang dilindungi undang-undang. Apa pun yang dimulai dengan garis bawah, dan huruf besar disediakan di C.C
Ini lebih menarik tanpa menggunakan macro dan tanpa menyalahgunakan infinity.
Cobalah jika Anda tidak percaya!
sumber
0
. Tidak, masih belum percaya.??\
??\
harus dikonversi menjadi satu\
, jadi tidak ada??\
. Namun beberapa kompiler modern memberikan peringatan secara default untuk trigraph dan baris gabungan bahkan jika diaktifkan.Mathematica:
Saya pikir solusi ini adalah novel karena menggunakan konsep Nilai Up Mathematica .
SUNTING:
Saya memperluas jawaban saya untuk menjelaskan apa arti Nilai Up dalam Mathematica .
Baris pertama pada dasarnya mendefinisikan ulang penambahan untuk simbol
x
. Saya bisa langsung menyimpan definisi seperti itu dalam fungsi global yang dikaitkan dengan+
simbol, tetapi definisi ulang seperti itu akan berbahaya karena redefinisi dapat menyebar secara tak terduga melalui algoritma bawaan Matematika .Sebagai gantinya, menggunakan tag
x/:
, saya menghubungkan definisi dengan simbolx
. Sekarang setiap kali Mathematica melihat simbolx
, itu memeriksa untuk melihat apakah itu sedang dioperasikan oleh operator tambahan+
dalam pola bentuk dix + 2 + ___
mana simbol___
berarti kemungkinan urutan nol dari simbol lain.Redefinisi ini sangat spesifik dan memanfaatkan kemampuan pencocokan pola yang luas dari Mathematica . Misalnya, ekspresi
x+y+2
kembalix+y
, tetapi ekspresix+3
kembalix+3
; karena dalam kasus sebelumnya, polanya dapat dicocokkan, tetapi dalam kasus yang terakhir, polanya tidak dapat dicocokkan tanpa penyederhanaan tambahan.sumber
Javascript:
Tes Fiddle
sumber
Infinity
, atau-Infinity
, dan karena ini Anda dapat menggunakan pintasanx = 1/0
.(99999999999999999 == 99999999999999999+2)
karena saya pikir itu sedikit lebih menarik daripada(Infinity == Infinity+2)
, meskipun seperti kata OP, "itu subjektif" :)-1
dan berulang . Bahasa itu sendiri adalah Python, tetapi itu tidak terlalu penting dalam kasus ini.false
; di mana pun Anda mendapatkan informasi tentang JS itu salah dan tidak boleh dipercaya.skema
sumber
(x == x + 2)
tampak seperti C, tetapi berarti hal yang sama sekali berbeda.(= x 2)
.(define (x a b c d) #t)
:)Jawaban yang jelas:
Ketika ini berakhir:
sumber
while(!(x == x+2)) {}
akan lebih semangatBerikut ini adalah solusi untuk JavaScript yang tidak mengeksploitasi kasus tepi
Infinity
dan-Infinity
penambahan floating-point. Ini tidak bekerja di Internet Explorer 8 dan di bawah atau dalam mode ketat opt-in ES5. Saya tidak akan menyebutwith
pernyataan dan getter terutama fitur "canggih".Diedit untuk menambahkan: Trik di atas juga dimungkinkan tanpa menggunakan
with
danget
, seperti dicatat oleh Andy E dalam Tips untuk bermain golf di JavaScript dan juga oleh jncraton pada halaman ini:sumber
x
panggilan fungsi, meskipun sepertinya variabel dibaca. Saya mengasumsikan urutan evaluasi kiri-ke-kanan, tetapi tidak apa-apa karena ditentukan dalam JS (tidak seperti C).Yang berikut ini bukan standar yang sesuai C , tetapi harus bekerja pada hampir semua platform 64-bit:
sumber
x
akan bertambah dalam langkah 2 ^ 61, jadix + 8
akan samax
.int
.int
, bukanchar
.Sage:
mengembalikan True
Secara umum untuk GF (2 ** n) selalu benar bahwa x = x + 2 untuk setiap x
Ini bukan bug atau masalah dengan overflow atau infinity, itu sebenarnya benar
sumber
Gangguan umum
Sangat mudah ketika
x
tidak harus menjadi nilai aktual.sumber
APL (Dyalog)
APL bahkan tidak memiliki infinity, hanya saja mengapung tidak cukup tepat untuk membedakan antara
1.000.000.000.000.000
dan1.000.000.000.000.002
. Sejauh ini yang saya tahu, ini satu-satunya cara untuk melakukan ini di APL.sumber
Perl 6
Saya terkejut tidak melihat solusi ini sebelumnya. Pokoknya, solusinya adalah - bagaimana jika
x
yang0
dan2
sekaligus?my \x
dalam contoh ini menyatakan variabel sigilless - pertanyaan ini bertanya tentangx
, bukan gaya-Perl$x
. The?? !!
adalah operator ternary.Tapi...
x
adalah beberapa nilai sekaligus.x
sama dengan0
dan2
sekaligus.x + 2
sama dengan2
dan4
sekaligus. Jadi, secara logis mereka setara.sumber
Python 2.X (Menggunakan redefinisi integer (cache))
Saya perhatikan semua jawaban python telah mendefinisikan kelas yang mendefinisikan ulang
+
operator. Saya akan menjawab dengan demonstrasi fleksibilitas ular piton tingkat rendah. (Ini adalah potongan python2 khusus)Dalam python, integer disimpan kurang lebih dengan cara ini di C:
Artinya, struct dengan
size_t
,void *
, danlong
objek, dalam urutan itu.Setelah kita menggunakan, dan karena itu men-cache integer, kita dapat menggunakan
ctypes
modul python untuk mendefinisikan kembali integer itu, sehingga tidak hanya melakukannyax == x+2
, tetapi2 == 0
Cetakan
sumber
Perl
menggunakan subrutin dengan efek samping pada variabel paket:
Keluaran:
true!
sumber
sub x{}
"Bekerja" juga .. (setidaknya di 5.10.1 saya), tetapi saya tidak tahu mengapa ..sub x{}
mengembalikan undef atau daftar kosong, yang keduanya merupakan angka nol. Dan x + 2 diuraikan sebagai x (+2).perl -MO=Deparse
mengungkapkanprint "true\n" if x() == x(2);
Python
mengeksploitasi presisi floating point membuat ini sangat sederhana.
Untuk membuatnya kurang spesifik sistem, diperlukan impor tambahan
Ini juga bisa digunakan dalam bahasa lain. Ini bekerja karena reprensentasi 100000000000000000000.0 dan 100000000000000002.0 persis sama untuk mesin, karena cara floating point diwakili di dalam mesin. lihat http://en.wikipedia.org/wiki/IEEE_floating_point untuk informasi lebih lanjut.
Jadi ini pada dasarnya akan bekerja dalam bahasa apa pun yang memungkinkan Anda untuk menambahkan bilangan bulat ke float dan hasilnya adalah float.
sumber
Berikut ini adalah solusi untuk C ++ berdasarkan overloading operator. Itu bergantung pada konversi implisit dari sebuah
enum
keint
.sumber
std::boolalpha
bukan?:
.Saya tahu ini tantangan kode ... tapi saya pegolf. Maaf.
Ruby - 13 karakter - Solusi Infinity
mengembalikan true
Ruby - 41 karakter - Solusi Op Overloading
atau
sumber
Jika OK untuk mengeksploitasi pertanyaan sedikit, maka saya akan menambahkan beberapa Java baru. Triknya pasti bukan hal baru, tetapi mungkin menarik bahwa ini mungkin di Jawa.
Dan hasilnya:
sumber
Solusi VBScript ini bekerja mirip dengan solusi JavaScript saya. Saya tidak menggunakan preprosesor namun solusinya tampaknya sepele.
sumber