puzzle pemrograman m3ph1st0s 3 (C): “Easy bug” [ditutup]


11

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


Saya berasumsi mengubah satu karakter termasuk mengubah spasi untuk karakter non-spasi? Jika demikian, saya pikir saya telah menemukan semua 3 solusi untuk bagian 1.
mellamokb

oh..sayang..Aku ada dalam pikiran untuk menyangkal hal itu dengan jelas tapi aku lupa. Saya akan mengedit sekarang. Terima kasih untuk bertanya.
Bogdan Alexandru

Oh bagus. Karena saya tidak dapat menemukan jawaban untuk bagian 3.2.2 untuk 3 solusi saya saat ini ... Saya kira itu berarti saya perlu mencari satu lagi :)
mellamokb

ya :) selamat mencoba itu
Bogdan Alexandru

1
@ardnew: Saya tidak percaya OP pernah mengubah maksud asli pertanyaan. Saya setuju ada cara yang lebih baik untuk memperbaiki pertanyaan daripada menepuk-nepuk sekelompok Edit di akhir ... tetapi masih pada intinya pertanyaan yang sama, dengan beberapa hal diklarifikasi.
mellamokb

Jawaban:


8

3.1

for( i = 0;-i < n; i-- )
for( i = 0; i < n; n-- )
for( i = 0; i + n; i-- )

Setiap perubahan ini akan membuat output program 20 '+' tanda-tanda. Yang ini dekat:

for( i = 0;~i < n; i-- )

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.

int n = 20L;
int n = 20f;
int n = 20d;
uint n = 20;

for( i = 0L; ... )
for( i = 0f; ... )
for( i = 0d; ... )

iprintf("+");
printf("+x");
printf("x+");

Untuk dua yang terakhir, gantilah setiap surat untuk xmemberi 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.

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;

Yap, Anda memiliki jawaban yang sama persis seperti yang saya lakukan (saya tidak mempostingnya sebelumnya karena saya tidak menjawab semuanya). Saya pikir jawaban untuk 3.2.2 terletak pada solusi ketiga untuk 3.1 yang tidak ditemukan oleh kita berdua (dan mematuhi aturan untuk tidak membiarkan ruang diubah).
mellamokb

Pada 3.2.1, saya tidak yakin tentang fdan dakhiran untuk intjenis (baik, duntuk setiap jenis dalam hal ini), tapi ada beberapa orang lain yang telah Anda tinggalkan: int n = 20l, int n = 20U, dan int n = 20u. Juga saya tidak percaya uintadalah pengidentifikasi tipe standar dalam C atau C ++. Kompiler apa yang Anda gunakan untuk ini?
ardnew

Anda telah melakukan pekerjaan yang cukup bagus di sini, tetapi tidak lengkap! Pertama-tama, solusi ~ i masih bagus! Syaratnya adalah untuk keluaran 20 "+" tanda jadi 21 masih merupakan solusi yang baik (satu-satunya solusi buruk adalah keluaran tak terbatas). Ini berarti bahwa Anda sekarang telah menemukan 4 solusi! Dan lucunya, saya masih punya satu lagi :) Tentang 3.2.2, itu buruk karena saya secara khusus diminta untuk mengubah NILAI n, tidak melakukan beberapa trik untuk membuatnya 20 :)
Bogdan Alexandru

1
dan juga, solusi -i dan ~ i mengubah ruang jadi saya akan menganggapnya sebagai solusi "parsial". solusi lengkap ke-3 harus mengubah karakter non-spasi seperti yang ditentukan dalam teks kuis
Bogdan Alexandru

1
Anda tidak mengerti masalahnya. Saya mengatakan modifikasi akan menghasilkan output yang sama dengan program modifikasi yang sesuai. yaitu, saya memiliki program yang diperbaiki C1, C2, C3. setelah penyisipan karakter saya memiliki P1, P2, P3. persyaratannya adalah: P1 memiliki output yang sama dengan C1, P2 memiliki output yang sama dengan C2, P3 memiliki output yang sama dengan C3. BUKAN P1, P2, P3 memiliki output yang sama
Bogdan Alexandru

2

3.1

Namun teka-teki lainnya. Tetapi solusi normal membosankan, bagaimana dengan sesuatu yang istimewa?

Solusi satu:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++ )
      printf("+");
   return 0;
}

Saya memutuskan untuk mengubah HANYA SATU KARAKTER, yaitu -,. Tidak ada karakter selain -yang diubah.

Solusi dua:

#include <stdio.h>
int main() {
   int i=printf("++++++++++++++++++++");exit(0);
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Ini mengubah persis satu karakter - titik koma setelah int imenjadi =printf("++++++++++++++++++++");exit(0);.

Solusi tiga:

#include <stdix.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Ini memuat stdix.hheader sistem. Dalam sistem termasuk jalur, masukkan file berikut, yang disebut stdix.h. Itu harus mengandung konten berikut.

static inline void printf(const char *string) {
    int i;
    for(i = 0; i < 20; i--)
        putchar('+');
    exit(0);
}

3.2

Sekarang untuk memasukkan satu huruf. Yah, itu sederhana, ganti int main()dengan int main(a). Ini tidak valid menurut standar, tetapi siapa yang peduli?



0

3.1

  1. Ubah i--ken--
  2. i<n untuk -i<n
  3. (Sayangnya jawaban tidak valid karena saya tidak memeriksa dengan kompiler sebelum melihat jawaban lain)

3.2.1

int n = 20 

untuk

uint n = 20

(Tergantung kompiler ...)

3.2.2

int n =-20L;

for(i = -1; i%n; i--)

mencetak 19 tanda, sama dengan int n = 20L;. Namun, saya tidak akan menemukan itu jika saya belum melihat jawaban lain untuk 3.2.1


0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}

1
Pastikan untuk menambahkan bahasa program dan jumlah karakter ke dalam jawaban Anda.
Timtech

1
@Timtech mengapa jumlah karakter? ini bukan kode-golf
haskeller bangga

1
@Timtech juga mengapa harus memasukkan bahasa? ini adalah tantangan khusus bahasa.
haskeller bangga
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.