puzzle pemrograman m3ph1st0s 1 (C ++) [ditutup]

26

Ini adalah yang pertama dari serangkaian teka-teki C ++ untuk Anda. Semoga Anda menikmati.

Jadi, puzzle no.1:

Diberikan program berikut:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Masukkan beberapa kode pada satu baris baru di mana saja di dalam program sehingga outputnya adalah 0. Baris baru akan berisi paling banyak 18 karakter (termasuk spasi), dan sisa baris akan tetap tidak dimodifikasi. Agar lebih jelas, berikut adalah contoh kode baru yang valid:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   int* p = NULL;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Baris baru dengan 15 karakter telah dimasukkan sehingga tidak masalah. Namun itu tidak menyelesaikan masalah.

Jika ini terlalu sederhana untuk Anda, jangan khawatir, banyak yang akan datang !!

Bogdan Alexandru
sumber
2
Saya sangat senang seseorang mengirim pertanyaan C ++ sesekali! Maksudku, dengan semua teka-teki di mana solusi C ++ akan menjadi 20 atau 30 baris, maka orang-orang yang memposting solusi dalam J atau K atau Golfscript menjadi frustasi setelah beberapa saat.
Tn. Lister
3
Apakah hasilnya harus valid, C ++ terdefinisi dengan baik atau dapatkah menggunakan UB? (Tapi seperti yang dicatat Tuan Lister, kode aslinya bahkan tidak valid C ++.)
Konrad Rudolph
4
itu tidak valid main harus mengembalikan int (baca standar c ++)
BЈовић
2
kita kehilangan intinya di sini. masukkan int dan return 0 jika Anda keberatan, saya tidak.
Bogdan Alexandru
11
@ Bogdan: Dafuq? Pertama, DevC ++ sangat kuno, outputnya tidak relevan. Dan kedua, apakah kompiler yang diberikan atau tidak dalam konfigurasi yang diberikan setiap saat menargetkan OS apa pun menerimanya tidak membuatnya valid C ++.
DeadMG

Jawaban:

14
#define int float

harus bekerja juga dan memiliki panjang yang sama.

Dan
sumber
ini adalah apa yang ada dalam pikiran saya ketika saya pertama kali datang dengan ide
Bogdan Alexandru
5
#define int floatsebenarnya adalah perilaku yang tidak terdefinisi. Anda tidak diizinkan memberi arti baru pada kata kunci.
fredoverflow
Fred, dapatkah Anda mengutip sumber Anda? Dokumen cpp GCC mengatakan "Anda dapat mendefinisikan pengidentifikasi valid apa pun sebagai makro, meskipun itu adalah kata kunci C."
Dan
@Dan: Standar C ++ melarangnya.
DeadMG
3
Ini mungkin UB, tetapi beberapa kompiler populer mendukungnya. Saya telah melakukan #define int ERRORuntuk memaksa diri saya untuk menggunakan yang setara dengan int32_tbukan tipe bawaan. Pada saat saya sampai int main(), saya sudah lupa tentang makro dan bertanya-tanya mengapa sih kode saya tidak dapat dikompilasi.
dan04
33

Kita dapat menyingkirkan a = 1 dengan memindahkannya ke lingkup lain:

#include <iostream>
main() 
{
int a=0;if(0)
    const int a=1;
    const int b=2;
    const float c=0.5;
    std::cout << a/b-a*c;
}

Ini menurut saya 13 karakter. Atau lebih baik lagi dapatkan yang baru ayang juga menghasilkan 0:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
if(int a=2)
   std::cout << a/b-a*c;
}

Itu 11 karakter

bekukoi
sumber
24
#include <iostream>
main() 
{
   const int a=1;
#define a 0
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

1 baris baru, 12 karakter baru

massa
sumber
Itulah yang ingin saya kirim ... +1 untuk Anda.
H2CO3
Ide pertama saya ketika membaca pertanyaan)))
Qwertiy
23

Jadi #define a 0, Selesai. Saya melihat bahwa itu diposting - tidak mengejutkan.

Anehnya, ini tidak diposting:

#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout<<0||
   std::cout << a/b-a*c;
}

14 karakter

Itu harus dilakukan, bukan?

lihat
sumber
21
#include <iostream>
main() 
{
const int a=0;//\
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

17 karakter.

Omong-omong, program asli tidak dikompilasi di bawah MSVC, yang mengeluh bahwa maintidak memiliki tipe pengembalian.

Tuan Lister
sumber
2
int a = 0; // \ juga akan melakukan trik
salin
2
Benar. Tapi apakah ini semacam kontes "garis pendek yang menang"?
Mr Lister
Saya pikir begitu, tapi ternyata tidak. Trik yang bagus
salin
2
Ya, solusi terpendek menang pada codegolf SE. lihat faq
BЈовић
2
@ BЈовић FAQ mengatakan solusi terpendek menang untuk pertanyaan kode-golf yang sebenarnya. Pertanyaan ini jelas bukan pertanyaan kode-golf.
kojiro
11

18, termasuk baris baru

#define float int
shiona
sumber
Saya tidak benar-benar yakin ini bekerja ... Anda menyatakan c sebagai pelampung dan menginisialisasi dengan 0,5
Bogdan Alexandru
5
Yang akan dipotong menjadi nol.
DeadMG
Anda benar, lucunya saya belum pernah menemukan menginisialisasi sebuah int dengan nilai desimal, saya pikir itu akan menjadi kesalahan kompiler, tetapi itu hanya mengeluarkan peringatan
Bogdan Alexandru
2
@BogdanAlexandru melihat sebentar pada standar C ++, ini secara spesifik merinci konversi implisit yang dimainkan di sini.
oldrinb
2
Perhatikan bahwa meskipun semua kompiler mengizinkan ini, standar melarang mendefinisikan ulang kata kunci (dan floatmerupakan kata kunci).
avakar
11
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   1?std::cout<<0:
   std::cout << a/b-a*c;
}

15 karakter.

Andrey Regentov
sumber
akan menampilkan lebih dari "0"
Bogdan Alexandru
2
mengapa operator ternary tidak mau bekerja?
Andrey Regentov
9
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a 0;1
   std::cout << a/b-a*c;
}

14 karakter.

FireFly
sumber
7
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   return puts("0");
   std::cout << a/b-a*c;
}

17 karakter.

Ashrr
sumber
1
Solusi terbaik, karena ia terbang dalam menghadapi apa pun yang terkait dengan C ++.
fabspro
3
`put 'tidak dideklarasikan dalam lingkup ini
shiona
@shiona kompiler apa yang Anda gunakan?
Ashrr
@Arshr gcc (g ++) 4.5.4
shiona
1
Jangan berpikir, kode ini mengembalikan 0. Tetapi Anda dapat mengganti ruang melalui tanda seru. Lagi pula, saya tidak yakin kapan menempatkan pengembalian nol.
Qwertiy
7
#include <iostream>
main()
{
   const int a=1;
   const int b=2;
   const float c=0.5;
std::cout<<0;//\
   std::cout << a/b-a*c;
}

Ini 17 karakter jadi pas.

marinus
sumber
7

Saya tidak tahu C ++, namun berdasarkan pertanyaan, tidak bisakah Anda hanya memasukkan baris ke output 0 saja? pertanyaan menentukan output harus 0, itu tidak menentukan Anda harus MENGUBAH output ke 0.

std::cout << 0

(Saya memiliki 0 petunjuk tentang C ++, mungkin seseorang dapat menggunakan konsep ini)

NRGdallas
sumber
Oh well, outputnya seharusnya hanya 0, saya pikir sudah jelas, kalau tidak tidak akan ada puzzle, kan?
Bogdan Alexandru
7
@BogdanAlexandru Anda akan menemukan bahwa mengeksploitasi pertanyaan yang ditulis dengan buruk adalah teknik yang umum untuk menyelesaikan teka-teki ini. Jika Anda ingin mencegah pengguna mengambil pintasan ini, luangkan beberapa menit ekstra menganalisis pertanyaan Anda sendiri dan mencoba untuk menghapus kemungkinan ambiguitas.
ardnew
3

12 karakter, mirip dengan solusi mob

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a b
   std::cout << a/b-a*c;
}

kombinasi lain juga berfungsi, seperti #define a catau#define c 0

Csq
sumber
2

Saya tahu ini bukan , tetapi saya tampaknya mengenakan topi itu hari ini!

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;

--Sebuah;

   std::cout << a/b-a*c;
}

lima karakter, termasuk baris baru;

Toby Speight
sumber
2
Ini tidak mengkompilasi, karena aini const.
Csq
Ups, saya seharusnya memberikannya ke kompiler! :-(
Toby Speight
0

c ++ terserah ...

echo "0"; exit
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

dijalankan melalui:

sh mp.cpp
bayi-kelinci
sumber
Usaha yang bagus tetapi melanggar persyaratan: valid C ++.
Konrad Rudolph
0

Varian pada jawaban Tuan Lister tetapi sedikit kurang jelas.

#include <iostream>
int main() 
{
   const float a=1; //??/
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}
Toby Speight
sumber
-1
#include <iostream>
int main() 
{
int a;if(a)
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Bagaimana dengan 11 karakter ini ...

menyeret
sumber
1
Masalahnya di sini adalah bahwa int asebelum iftidak diinisialisasi, sehingga adapat memiliki nilai apa pun.
frozenkoi
1
Ini tidak terdefinisi, Anda menggunakan nilai yang belum diinisialisasi untuk a.
Konrad Rudolph