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 !!


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.


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


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


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?


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.


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

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


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.


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.


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.


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)


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


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;


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

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;
}

-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 ...


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.