Ini adalah seri ke-3 dari seri C / C ++ saya; jika Anda melewatkan 2 yang pertama, mereka ada di sini: (1) puzzle pemrograman m3ph1st0s 1 (C ++) (2) puzzle pemrograman m3ph1st0s 2 (C ++): "Call hard!"
Saya harus mengatakan bahwa teka-teki saya 100% asli. Jika tidak, saya akan selalu menyatakannya dalam teks. Teka-teki 3 saya memiliki 2 bagian sebagai berikut:
Teka-teki 3.1
Bagian ini (3.1) bukan teka-teki asli saya, ini dikumpulkan dari beberapa halaman internet yang saya baca beberapa waktu lalu. Saya menggunakannya di sini sebagai titik awal dan pemanasan untuk Anda. Pecahkan yang ini dan kemudian lanjutkan ke bagian ke-2.
Seseorang mencoba mencetak tanda "+" sebanyak 20 kali dan muncul dengan program berikut:
#include <stdio.h>
int main() {
int i;
int n = 20;
for( i = 0; i < n; i-- )
printf("+");
return 0;
}
Fakta bahwa itu tidak memiliki hasil yang diharapkan jelas - program tidak pernah berakhir. Memperbaikinya! Mudah? Sekarang perbaiki program dengan mengubah HANYA SATU KARAKTER - karakter non-ruang tentu saja! Untuk tantangan ini ada 3 solusi. Temukan semuanya 3. Hanya untuk memperjelas: program harus menampilkan 20 "+" tanda dan harus berakhir dengan cepat. Sebelum mengkritik saya tentang apa arti "puasa", saya akan mengatakan itu berarti paling banyak beberapa detik (yang omong-omong terlalu banyak tetapi hanya untuk membuatnya lebih jelas).
Teka-teki 3.2
EDITED Telah ditunjukkan kepada saya sebelumnya bahwa solusi untuk puzzle 3.2.2 mungkin bergantung pada kompiler. Untuk menghilangkan kemungkinan diskusi tentang masalah ini, saya akan memodifikasi ide dan memperbaikinya pada teka-teki berikutnya ketika saya akan lebih berhati-hati untuk tidak menimbulkan kontroversi. Namun, untuk menjaga agar puzzle ini tetap berjalan, saya akan membuat modifikasi kecil untuk 3.2.2 (solusinya akan lebih mudah tetapi lebih bersih).
Ketika saya pertama kali melihat puzzle, saya merasa cukup mengagumkan. Saya berhasil menyelesaikannya tetapi tidak segera karena membutuhkan perhatian yang cermat. Jika Anda di sini itu berarti Anda juga menyelesaikannya. Jika Anda melakukannya dengan menulis program untuk mengganti semua karakter yang mungkin dengan semua nilai yang mungkin dan menguji setiap solusi, Anda akan hilang. Pria yang bekerja keras. Sekarang telah mengoreksi program yang menulis 20 "+" tanda:
3.2.1: Masukkan satu huruf tunggal dan tidak lebih dari kode sehingga hasilnya valid dan menghasilkan hal yang sama di semua 3 program yang diperbaiki. Tidak perlu dikatakan lagi, surat itu harus ada sebelum melampirkan} utama (saya katakan itu karena saya tidak ingin mendengar orang-orang yang hanya meletakkan surat setelah program dan entah bagaimana kompiler mereka sangat ramah).
Diedit (lihat di bawah) - Untuk pertanyaan akhir ini pertimbangkan bahwa penghitung i mulai dari -1 dan bukan 0.
3.2.1.5: Ulangi semua masalah sebelumnya dengan ketentuan bahwa output setidaknya 19 "+" tanda (tetapi masih merupakan output yang terbatas). Mengubah ruang diizinkan. Sekarang Anda mungkin telah menemukan lebih banyak solusi daripada dalam kasus pertama. Beberapa di antaranya pasti cocok untuk pertanyaan 3.2.2.
3.2.2: Pilih nilai lain untuk menginisialisasi variabel n sehingga output yang dihasilkan akan tetap sama untuk setidaknya satu program yang diperbaiki di 3.2.1.5 (tidak harus untuk semuanya).
EDIT1 TERAKHIR : mengubah program sehingga menghasilkan tanda 21 "+" masih merupakan solusi yang baik, karena teks aslinya tidak mengatakan "persis" 20 tanda. Namun, output tak terbatas dilarang. Jelas ini tidak berarti mari kita mulai mengeluarkan ratusan tanda "+" karena tidak dilarang. Tetapi menghilangkan 21 output yang indah tidak akan menjadi semangat kompetisi ini.
TERAKHIR EDIT2 : mempertimbangkan TERAKHIR EDIT1 dan menerima ruang berubah tampaknya sekarang kami memiliki 5 solusi yang mungkin, empat di antaranya telah ditunjukkan dalam tanggapan. Namun tantangan terakhir belum tersentuh dan saya harus membuatnya jelas sekali lagi: n harus diberi nilai lain , solusi yang menetapkan 20 ke n oleh beberapa trik tidak akan melakukannya (seperti n = 20L). Saya juga lebih suka melihat solusi ke-3 yang tidak mengubah spasi.
EDIT TERAKHIR3 : Saya telah mengedit pertanyaan terakhir, baca!
Tantangannya adalah untuk menyelesaikan kedua bagian teka-teki. Yang pertama melakukannya menang.
Saya harap semuanya jelas, jika tidak silakan kirim pertanyaan dan saya akan mengedit secepat mungkin. Bersulang. teks yang ditekankan
sumber
Jawaban:
3.1
Setiap perubahan ini akan membuat output program 20 '+' tanda-tanda. Yang ini dekat:
Ini menghasilkan 21 tanda + '.
3.2.1
Saya menemukan setidaknya 112 cara untuk menyelesaikan masalah ini dengan memasukkan satu huruf. Tidak semua dari mereka dapat bekerja pada semua kompiler.
Untuk dua yang terakhir, gantilah setiap surat untuk
x
memberi Anda 104 kemungkinan solusi. Menggunakan salah satu dari dua baris terakhir akan mengubah output, tetapi output akan tetap sama untuk semua 3 program yang diperbaiki.3.2.2
Yang saya pikirkan hanyalah beberapa hal yang dapat dikembalikan ke nomor 20 saat ditugaskan
int
.sumber
f
dand
akhiran untukint
jenis (baik,d
untuk setiap jenis dalam hal ini), tapi ada beberapa orang lain yang telah Anda tinggalkan:int n = 20l
,int n = 20U
, danint n = 20u
. Juga saya tidak percayauint
adalah pengidentifikasi tipe standar dalam C atau C ++. Kompiler apa yang Anda gunakan untuk ini?3.1
Namun teka-teki lainnya. Tetapi solusi normal membosankan, bagaimana dengan sesuatu yang istimewa?
Solusi satu:
Saya memutuskan untuk mengubah HANYA SATU KARAKTER, yaitu
-
,. Tidak ada karakter selain-
yang diubah.Solusi dua:
Ini mengubah persis satu karakter - titik koma setelah
int i
menjadi=printf("++++++++++++++++++++");exit(0);
.Solusi tiga:
Ini memuat
stdix.h
header sistem. Dalam sistem termasuk jalur, masukkan file berikut, yang disebut stdix.h. Itu harus mengandung konten berikut.3.2
Sekarang untuk memasukkan satu huruf. Yah, itu sederhana, ganti
int main()
denganint main(a)
. Ini tidak valid menurut standar, tetapi siapa yang peduli?sumber
Teka-teki 3.1 Jawaban
i--
ken--
(demo: http://ideone.com/l0Y10 )i < n
kei + n
(demo: http://ideone.com/CAqWO )[SPACE]i < n
ke-i < n
. (demo: http://ideone.com/s5Z2r )Teka-teki 3.2.1
Ubah
int n = 20
keint n = 20L
(tambahkanL
hingga akhir).Teka-teki 3.2.2
Belum menemukan jawaban ...
sumber
3.1
i--
ken--
i<n
untuk-i<n
3.2.1
untuk
(Tergantung kompiler ...)
3.2.2
mencetak 19 tanda, sama dengan
int n = 20L;
. Namun, saya tidak akan menemukan itu jika saya belum melihat jawaban lain untuk 3.2.1sumber
sumber