Biên dịch tiếng Anh cho sếp của bạn


16

Sếp của bạn gần đây đã học được ngôn ngữ lập trình thú vị này được gọi là tiếng Anh . Anh ấy đã có ý tưởng "cách mạng" này, anh ấy muốn viết mã với bạn để tăng gấp đôi tỷ lệ sản xuất mã! Vì anh ấy không phải là người am hiểu về công nghệ, anh ấy muốn bạn viết một trình biên dịch cho nó để anh ấy cũng có thể viết mã!

Bây giờ, bạn là một lập trình viên lười biếng xấu xa và rõ ràng sẽ không viết một chương trình để biên dịch ngôn ngữ phức tạp đến nực cười này. Thay vào đó, bạn sẽ đảm bảo luôn có lỗi trong mã của sếp, để anh ta không bao giờ được biên dịch thực tế và bị mắc kẹt trong việc sửa lỗi ngữ pháp thay vì mã hóa.

Thách thức là viết một chương trình có thể chạy từ thiết bị đầu cuối và chấp nhận đường dẫn tệp làm đối số. Chương trình phải:

  1. sửa đổi đầu vào tập tin bằng cách giới thiệu một lỗi đánh máy.
  2. Giả vờ thất bại biên dịch do gặp phải lỗi đánh máy bạn đã giới thiệu.
  3. Chạy chương trình trên các bản sao của cùng một tệp không nên đưa ra cùng một lỗi đánh máy hai lần liên tiếp.

Để minh họa cho thử thách, hãy chạy chương trình của bạn trên tệp này:

Take an array as input.
Sort the array.
Output the array.

nên xuất ra một cái gì đó dọc theo dòng

Error on line 1:
'Take an arqay as input.'
         ^
arqay is not a valid identifier.

và tệp mà bạn đã bảo chương trình biên dịch bây giờ sẽ trông như sau:

Take an arqay as input.
Sort the array.
Output the array.

Dưới đây là một số chi tiết về thông số kỹ thuật của chương trình:

Chương trình của bạn được phép giả định rằng việc hoán đổi bất kỳ ký tự nào trong chương trình mà ông chủ của bạn nhập vào một ký tự ngẫu nhiên khác nhau sẽ gây ra lỗi ngữ pháp. Chương trình của bạn không nên sử dụng các ký tự không theo thứ tự chữ cái để tạo ra lỗi trong mã ông chủ của bạn. Sếp của bạn sẽ không bao giờ sử dụng một con số hoặc biểu tượng, và anh ta sẽ phát hiện ra rằng một cái gì đó đang nổi lên. Chương trình của bạn chỉ nên đưa ra lỗi cho các từ trong chương trình của sếp. Không thay đổi khoảng trắng trong câu hoặc dấu câu. Chương trình của bạn không nên thay đổi trường hợp chương trình mà sếp của bạn cố gắng biên dịch, nghĩa là các lỗi như arQaykhông hợp lệ. Điều này ngăn ngừa các lỗi như takethay vì Takexảy ra, hoặc Arraythay vì array. Chương trình của bạn sẽ xuất lỗi bằng cách trước tiên nêu rõ lỗi đó là dòng nào:

Error on line <insert line number here>:

Sau đó nó sẽ in ra dòng có lỗi bên trong 'các ký hiệu. Trên dòng tiếp theo, nó nên đặt một ^biểu tượng dưới từ có lỗi và cuối cùng nó sẽ có một số văn bản mô tả lỗi (phần này tùy thuộc vào bạn, bạn có thể nói bất cứ điều gì bạn muốn ở đó miễn là nó mô tả lỗi).

Bạn có thể giả sử rằng tệp đầu vào tồn tại và nó không trống. Bạn cũng có thể giả sử tệp đầu vào không có lỗi ngữ pháp trước khi bạn thêm.

Tiền thưởng:

-60 byte nếu các lỗi mà mã của bạn giới thiệu không hoàn toàn ngẫu nhiên, nhưng dựa trên lỗi chính tả như trong này câu hỏi .

-60 byte cho ít nhất 5 thông báo lỗi khác nhau, xen kẽ ngẫu nhiên.

-60 byte nếu chương trình của bạn có cơ hội 1 trong 100 hoặc ít hơn để xuất một số thông điệp giải thích cho sếp của bạn.

EDIT: Số byte của các tin nhắn không được tính vào điểm số của bạn. (Cảm ơn Martin Büttner vì ý tưởng hay này)

Đây là mã golf, số byte ngắn nhất sẽ thắng. Vui lòng không đánh golf nội dung thông báo lỗi, sếp của bạn sẽ không vui nếu anh ta không thể hiểu các thông báo lỗi và sẽ yêu cầu bạn sửa chúng cho anh ta.


Tôi có phải xử lý các dòng không chứa chữ cái không?
2014

Bạn chỉ có thể tạo một lỗi đánh máy trong các ký tự bảng chữ cái và bạn có thể giả sử tệp đầu vào là một tệp không trống hợp lệ tồn tại.
Rodolphito

7
Tôi không phải là người thích để lại thông báo lỗi cho chúng tôi. Ngay cả khi chúng tôi "không chơi golf thông báo lỗi", họ vẫn có thể tạo ra sự khác biệt của một số byte, thậm chí có thể là hai chục nếu chúng tôi sẽ nhận phần thưởng thứ hai. Đó có thể là khá nhiều. Tôi nghĩ rằng đối với một cuộc thi đánh gôn công bằng, bạn nên chỉ định 5 thông báo lỗi và thông báo giảm giá hoặc để chúng tôi trừ đi độ dài chuỗi của chúng khỏi số byte.
Martin Ender

Cảm ơn vì tiền boa, tôi đã nghĩ về việc có các tin nhắn được xác định trước, nhưng tôi muốn cho một chút tự do hơn với điều đó. Trừ số byte tin nhắn từ điểm số là một ý tưởng tuyệt vời.
Rodolphito

Câu trả lời:


3

TI-BASIC, 77 - 34 (văn bản lỗi) = 43

Trong trường hợp anh ta muốn thực hiện trên máy tính TI-83/84 của mình;)

Là tiêu chuẩn cho các chức năng, chuỗi tệp phải ở trong Ansđể nó có thể trả về và hiển thị đầu ra.

Ans->Str1:If 1=inString(Ans,"A
Then:"B
Else:"A
End:Disp "ERROR ON LINE 1","'"+Ans+sub(Str1,2,-1+length(Str1))+"'"," ^ INVALID

Lưu ý rằng nhiều mã thông báo là một byte.


Tôi có thể chạy mã này ở đâu?
Rodolphito

Máy tính TI-83/84 hoặc trình giả lập cho một.
Timtech

inString, Ans, sub, Else, Then, End, Disp , Str1... Chẳng phải những tất cả 1 byte cho máy tính?
Ismael Miguel

4
GÌ????????????????? Điều đó giống như nói rằng 8 bit không phải là 1 byte !!!!!!!!! Nếu tôi trình bày một mã trong lắp ráp, sử dụng dạng nhị phân, họ cũng sẽ tính các byte là 1 macro của hơn 5 byte? Đó là ngu ngốc rõ ràng! (xin lỗi những từ mạnh mẽ, nhưng nó thực sự là STUPID!) Điều này không đại diện cho mã của bạn. Ý tôi Anslà không giống với byte được đại diện bởi Ans. Một A*n*scái tạo ra bất kỳ kết quả nào mà máy tính muốn, cái còn lại trả về giá trị của biểu thức số học cuối cùng. Nếu tính đến điều này, tôi nghĩ rằng việc không chấp nhận số lượng THỰC SỰ làm cho việc trình bày sai mã này.
Ismael Miguel

5
Dường như nó không sửa đổi ngẫu nhiên tệp, có vẻ như nó luôn hiển thị thay đổi trong dòng 1 và thay đổi chữ cái đầu tiên thành B nếu là A hoặc A nếu không.
Rodolphito
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.