Câu đố lập trình 3 (C) của m3ph1st0s


11

Đây là phần thứ ba trong loạt câu đố C / C ++ của tôi; trong trường hợp bạn bỏ lỡ 2 cái đầu tiên thì chúng ở đây: (1) câu đố lập trình của m3ph1st0s 1 (C ++) (2) câu đố lập trình của m3ph1st0s 2 (C ++): "Hãy gọi khó!"

Tôi phải nói rằng câu đố của tôi là 100% nguyên bản. Nếu không, tôi sẽ luôn luôn nêu trong văn bản. Câu đố thứ 3 của tôi có 2 phần như sau:

Câu đố 3.1

Phần này (3.1) không phải là một câu đố gốc của tôi, nó được thu thập từ một số trang internet tôi đã đọc cách đây một thời gian. Tôi sử dụng nó ở đây như một điểm khởi đầu và khởi động cho bạn. Giải quyết phần này và sau đó chuyển sang phần 2.

Một số người đã cố in dấu "+" 20 lần và đưa ra chương trình sau:

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

Thực tế là nó không có kết quả như mong đợi là hiển nhiên - chương trình không bao giờ kết thúc. Sửa nó! Dễ dàng? Bây giờ hãy sửa chương trình bằng cách thay đổi CHỈ MỘT ĐẶC ĐIỂM - tất nhiên là nhân vật không gian! Đối với thử thách này có 3 giải pháp. Tìm cả 3 người trong số họ. Chỉ cần làm rõ: chương trình phải xuất ra 20 dấu "+" và phải kết thúc nhanh. Trước khi chỉ trích tôi về "nhanh" nghĩa là gì, tôi sẽ nói nó có nghĩa là nhiều nhất là vài giây (bằng cách này là quá nhiều nhưng chỉ để làm cho nó rõ ràng).

Câu đố 3.2

EDITED Tôi đã chỉ ra trước đó rằng giải pháp cho câu đố 3.2.2 có thể phụ thuộc vào trình biên dịch. Để loại bỏ bất kỳ cuộc thảo luận nào có thể có về chủ đề này, tôi sẽ sửa đổi ý tưởng và cải thiện nó trong câu đố tiếp theo khi tôi sẽ cẩn thận hơn để không gây tranh cãi. Tuy nhiên, để tiếp tục giải câu đố này, tôi sẽ thực hiện một sửa đổi nhỏ cho 3.2.2 (giải pháp sẽ dễ dàng hơn nhưng sạch hơn).

Khi tôi lần đầu tiên nhìn thấy câu đố tôi thấy nó khá tuyệt vời. Tôi đã cố gắng giải quyết nó nhưng không phải ngay lập tức vì nó đòi hỏi sự chú ý cẩn thận. Nếu bạn ở đây có nghĩa là bạn quá giải quyết nó. Nếu bạn đã làm như vậy bằng cách viết một chương trình để thay thế tất cả các ký tự có thể bằng tất cả các giá trị có thể và kiểm tra mọi giải pháp, bạn sẽ bị mất. Anh chàng chăm chỉ mặc dù. Bây giờ đã sửa chương trình viết 20 ký hiệu "+":

3.2.1: Chèn một chữ cái duy nhất và không có gì nữa trong mã để kết quả hợp lệ và xuất ra điều tương tự trong cả 3 chương trình đã sửa. Không cần phải nói, bức thư phải có trước bao vây} của chính (tôi nói rằng vì tôi không muốn nghe những người chỉ đặt một lá thư sau chương trình và bằng cách nào đó trình biên dịch của họ rất thân thiện).

EDITED (xem dưới đây) - Đối với những câu hỏi cuối cùng này, hãy xem xét rằng bộ đếm i bắt đầu từ -1 thay vì 0.

3.2.1.5: Lặp lại tất cả các sự cố trước đó với điều kiện đầu ra có ít nhất 19 dấu "+" (nhưng vẫn là đầu ra hữu hạn). Thay đổi không gian được cho phép. Bây giờ bạn có thể đã tìm thấy nhiều giải pháp hơn trong trường hợp đầu tiên. Một số trong số này chắc chắn sẽ phù hợp với câu hỏi 3.2.2.

3.2.2: Chọn một giá trị khác để khởi tạo biến n để đầu ra kết quả sẽ giữ nguyên cho ít nhất một chương trình đã sửa trong 3.2.1.5 (không nhất thiết phải cho tất cả chúng).

LAST EDIT1 : thay đổi chương trình để nó tạo ra các dấu 21 "+" vẫn là một giải pháp tốt, vì văn bản gốc không nói "chính xác" 20 dấu hiệu. Tuy nhiên, đầu ra vô hạn bị cấm. Rõ ràng điều này không có nghĩa là tất cả chúng ta hãy bắt đầu xuất ra hàng trăm dấu "+" vì nó không bị cấm. Nhưng loại bỏ một đầu ra 21 đẹp sẽ không theo tinh thần của cuộc thi này.

LAST EDIT2 : xem xét LAST EDIT1 và chấp nhận thay đổi không gian , có vẻ như bây giờ chúng ta có 5 giải pháp khả thi, bốn trong số đó đã được chỉ ra trong các phản hồi. Tuy nhiên, thách thức cuối cùng chưa được thực hiện và tôi phải làm rõ một lần nữa: n phải được gán một giá trị khác , các giải pháp gán 20 cho n bằng một số thủ thuật sẽ không thực hiện được (như n = 20L). Ngoài ra tôi thích xem giải pháp thứ 3 không thay đổi không gian.

LAST EDIT3 : Tôi đã chỉnh sửa các câu hỏi cuối cùng, vui lòng đọc!

Thử thách là giải cả hai phần của câu đố. Người đầu tiên làm điều đó sẽ thắng.

Tôi hy vọng mọi thứ đều rõ ràng, nếu không xin vui lòng gửi bất kỳ câu hỏi nào và tôi sẽ chỉnh sửa nhanh nhất có thể. Chúc mừng. Đoạn văn bản được nhấn mạnh


Tôi giả sử thay đổi một ký tự bao gồm thay đổi bất kỳ khoảng trắng nào thành các ký tự không phải không gian? Nếu vậy, tôi nghĩ rằng tôi đã tìm thấy cả 3 giải pháp cho phần 1.
mellamokb

oh..Xin lỗi..Tôi có ý định từ chối một cách rõ ràng nhưng tôi quên mất. Tôi sẽ chỉnh sửa ngay bây giờ. Thx cho hỏi.
Bogdan Alexandru

Tốt thôi. Bởi vì tôi không thể tìm thấy bất kỳ câu trả lời nào cho phần 3.2.2 cho 3 giải pháp hiện tại của mình ... Tôi đoán điều đó có nghĩa là tôi cần tìm thêm một câu :)
mellamokb

vâng :) chúc may mắn về điều đó
Bogdan Alexandru

1
@ardnew: Tôi không tin OP đã từng thay đổi mục đích ban đầu của câu hỏi. Tôi đồng ý có nhiều cách tốt hơn để khắc phục câu hỏi hơn là kết thúc một loạt các Chỉnh sửa ở cuối ... nhưng nó vẫn là cốt lõi của cùng một câu hỏi, với một số điều được làm rõ.
mellamokb

Câu trả lời:


8

3,1

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

Bất kỳ thay đổi nào trong số này sẽ làm cho đầu ra chương trình có dấu 20 '+'. Điều này là gần:

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

Nó xuất ra các dấu 21 '+'.

3.2.1

Tôi tìm thấy ít nhất 112 cách để giải quyết vấn đề này khi chèn một chữ cái. Không phải tất cả trong số họ có thể làm việc trên tất cả các trình biên dịch.

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+");

Đối với hai người cuối cùng, thay thế bất kỳ thư nào xđể cung cấp cho bạn 104 giải pháp có thể. Sử dụng một trong hai dòng cuối cùng sẽ thay đổi đầu ra, nhưng đầu ra vẫn sẽ giống nhau cho cả 3 chương trình đã sửa.

3.2.2

Tất cả những gì tôi nghĩ ra là một số thứ được đưa trở lại số 20 khi được giao int.

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

Đúng, bạn có câu trả lời chính xác giống như tôi (Tôi đã không đăng chúng trước đây vì tôi không có câu trả lời). Tôi nghĩ rằng câu trả lời cho 3.2.2 nằm ở giải pháp thứ ba cho 3.1 mà không ai trong chúng ta tìm thấy (và tuân theo quy tắc không cho phép thay đổi không gian).
mellamokb

Trên 3.2.1, tôi không chắc chắn về fdhậu tố cho intcác loại (tốt, dcho bất kỳ kiểu cho rằng vấn đề), nhưng có một vài người khác mà bạn đã rời đi: int n = 20l, int n = 20U, và int n = 20u. Ngoài ra tôi không tin uintlà một định danh loại tiêu chuẩn trong C hoặc C ++. Trình biên dịch nào bạn đang sử dụng cho những anyway?
ardew

Bạn đã làm một công việc khá tốt ở đây, nhưng không hoàn thành! Trước hết, giải pháp ~ i vẫn tốt! Yêu cầu là đầu ra 20 "+" vì vậy 21 vẫn là một giải pháp tốt (giải pháp xấu duy nhất là đầu ra vô hạn). Điều này có nghĩa là bây giờ bạn đã tìm thấy 4 giải pháp! Và điều buồn cười là, tôi vẫn còn một cái nữa :) Về bản 3.2.2, thật tệ vì tôi đặc biệt yêu cầu thay đổi GIÁ TRỊ của n, không được thực hiện một số thủ thuật để làm cho nó 20 :)
Bogdan Alexandru

1
và ngoài ra, cả hai giải pháp -i và ~ i đều thay đổi không gian nên tôi sẽ xem xét chúng là giải pháp "một phần". giải pháp hoàn chỉnh thứ 3 phải thay đổi một ký tự không phải khoảng trắng như được chỉ định trong văn bản câu đố
Bogdan Alexandru

1
bạn đã không hiểu vấn đề. Tôi đã nói rằng sửa đổi sẽ tạo ra đầu ra giống như chương trình sửa đổi lõi. nghĩa là tôi có các chương trình đã sửa C1, C2, C3. sau khi chèn ký tự, tôi có P1, P2, P3. yêu cầu là: P1 có cùng đầu ra với C1, P2 có cùng đầu ra với C2, P3 có cùng đầu ra với C3. Nó không phải là P1, P2, P3 có cùng một đầu ra
Bogdan Alexandru

2

3,1

Lại thêm một câu đố nữa. Nhưng giải pháp bình thường là nhàm chán, những gì đặc biệt?

Giải pháp một:

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

Tôi quyết định thay đổi CHỈ MỘT ĐẶC ĐIỂM, đó là -. Không có nhân vật khác ngoài -được thay đổi.

Giải pháp hai:

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

Điều này thay đổi chính xác một ký tự - dấu chấm phẩy sau int ivào =printf("++++++++++++++++++++");exit(0);.

Giải pháp ba:

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

Điều này tải stdix.htiêu đề hệ thống. Trong hệ thống bao gồm đường dẫn, chèn tệp sau đây, được gọi là stdix.h. Nó phải chứa các nội dung sau đây.

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

3.2

Bây giờ để chèn một chữ cái. Vâng, đó là đơn giản, thay thế int main()bằng int main(a). Điều này không hợp lệ theo tiêu chuẩn, nhưng ai quan tâm?



0

3,1

  1. Thay đổi i--thànhn--
  2. i<n đến -i<n
  3. (Thật không may câu trả lời không hợp lệ vì tôi đã không kiểm tra trình biên dịch trước khi thấy các câu trả lời khác)

3.2.1

int n = 20 

đến

uint n = 20

(Trình biên dịch phụ thuộc ...)

3.2.2

int n =-20L;

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

in 19 dấu hiệu, giống như với int n = 20L;. Tuy nhiên, tôi sẽ không nghĩ ra nếu tôi không thấy câu trả lời khác cho 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
Hãy chắc chắn để thêm ngôn ngữ chương trình và số ký tự vào câu trả lời của bạn.
Timtech

1
@Timtech tại sao tính nhân vật? đây không phải là môn đánh gôn
tự hào

1
@Timtech còn tại sao phải bao gồm ngôn ngữ? đây là một thách thức ngôn ngữ cụ thể.
tự hào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.