2010-10-25 7 views
19

Một máy bay trực thăng thả hai đoàn tàu, mỗi tàu trên dù, lên một tuyến đường sắt vô tận thẳng.Lập trình hai chuyến tàu để giao cắt mà không có dữ liệu vị trí hoặc thông tin liên lạc (câu đố logic)

Có khoảng cách không xác định giữa hai chuyến tàu.

Mỗi khuôn mặt cùng một hướng, và khi hạ cánh, dù được gắn vào mỗi chuyến tàu rơi xuống mặt đất bên cạnh tàu và bị gián đoạn.

Mỗi chuyến tàu có một vi mạch điều khiển chuyển động của nó. Các chip giống hệt nhau.

Không có cách nào để các đoàn tàu biết chúng ở đâu.

Bạn cần viết mã trong chip để làm cho các đoàn tàu đụng vào nhau.

Mỗi dòng mã cần một chu kỳ đồng hồ duy nhất để thực thi.

Bạn có thể sử dụng các lệnh sau đây (và chỉ này):

  • MF - di chuyển tàu về phía trước
  • MB - di chuyển tàu ngược
  • IF (P) - có điều kiện đó là thỏa mãn nếu xe lửa nằm cạnh một chiếc dù. Không có "sau đó" để tuyên bố IF này.
  • GOTO
+8

Tại sao lại đóng? Đó là một câu hỏi đơn giản về thuật toán-xây dựng có câu trả lời rõ ràng. – aioobe

+1

Bạn có thể thêm một thẻ nữa "Câu hỏi phỏng vấn" để hiển thị nhiều hơn – vrbilgi

+6

Chỉ vì bạn có thể sao chép và dán câu hỏi về lập trình vào SO, điều đó không có nghĩa là câu hỏi là tốt. Câu hỏi này cần định dạng tốt hơn, và có lẽ một vài từ từ OP về * tại sao * câu hỏi đã được đăng. –

Trả lời

25

Làm cho mỗi chuyến tàu chuyển tiếp chậm cho đến khi tìm thấy dù. Khi tàu sau tìm thấy chiếc dù của tàu phía trước, làm cho nó di chuyển về phía trước nhanh hơn để bắt kịp với tàu phía trước.

1. MF 
2. IF(P) 
3. GOTO 5 
4. GOTO 1 
5. MF 
6. GOTO 5 

Nếu bạn muốn mất ít thời gian hơn để tàu tiếp cận nhau, với chi phí thêm một số mã, bạn có thể hủy vòng lặp thứ hai.

+0

Nếu đó là cú pháp chính xác cho lệnh 'IF', đây là một câu trả lời đúng. Ngay cả khi các hướng dẫn thứ 2 và thứ 3 nằm trên cùng một dòng, nó vẫn hoạt động. –

+0

Đây là một khó khăn. Nó cần sự hiểu biết về cuộc bầu cử thống nhất lãnh đạo. – none

+1

Tôi không nghĩ đây là câu trả lời đúng. Tôi nghĩ rằng MF và MB không điều chỉnh tốc độ của tàu, nhưng chỉ cần di chuyển nó một khoảng cách. – Dialecticus

2
label1: MF 
If (P) 
{ 
    // Do nothing (because of no then?) 
} 
ELSE 
{ 
    MF; 
    MB; 
    GOTO label1; 
} 
label 2:MF 
GOTO label2; 

Tua đi 2 lần, lùi 1 lần cho đến khi gặp chiếc xe lửa khác đi tiếp như điên (va vào nhau - nó vẫn Chuyển tiếp rồi lùi - nghĩa là nó chậm hơn). Tôi sử dụng MF một lần trong nhãn 2, có nghĩa là nó mất 2 chu kỳ đồng hồ để đi một bước về phía trước. Trong nhãn 1, phải mất 5 chu kỳ đồng hồ để chuyển tiếp một bước. Vì vậy, nếu chúng ta sử dụng MF nhiều hơn trong label2, hai trong số chúng sẽ va vào nhau nhanh hơn.
Không sử dụng biến nào.

+0

Tôi đã định dạng mã của bạn; hãy sử dụng nút '101010' hoặc thụt lề mã của bạn bằng 4 dấu cách lần sau :-) –

+0

Btw về cơ bản này sử dụng cùng một logic như giải pháp @ jchl, ngoại trừ việc nó sử dụng khối và ELSE, dường như không tồn tại trong ngôn ngữ này. –

+1

Vâng, tôi hiểu điều đó. Nhưng tôi không thấy giải pháp của anh ấy khi tôi viết bài của tôi. Nếu tôi làm mới trang đủ sớm thì tôi sẽ hài lòng với giải pháp của anh ấy. Tôi sử dụng khối để hiểu dễ dàng hơn và ELSE vì "không có" trong câu hỏi. – Kiennx