Chương trình tự sửa lỗi.


14

Nhiệm vụ của bạn là tạo một chương trình trong đó nếu bất kỳ một ký tự nào bị xóa, nó sẽ phát hiện ký tự nào đã bị xóa và sau đó chèn lại ký tự đã xóa trong tệp nguồn của chính nó.

Ví dụ, nếu chương trình của bạn RadiationHardenedvà nó được sửa đổi RadiaionHardened, thì chương trình của bạn phải xuất ra rằng byte thứ 5 (được lập chỉ mục 0) đã được sửa đổi và sau đó nguồn chương trình phải RadiationHardenedngay lập tức sau khi thực hiện.

Ghi chú và quy tắc

  • Bạn có thể cho rằng chính xác một ký tự đã bị xóa trong mã nguồn trước khi thực hiện. Hành vi cho chương trình chưa sửa đổi là không xác định.
  • Bạn có thể giả sử byte thay đổi sẽ bị xóa, không được chuyển đổi, chèn hoặc thay thế.
  • Trong trường hợp chạy nhiều nhân vật giống nhau, bạn có thể báo cáo chỉ số đầu tiên hoặc chỉ mục cuối cùng của lần chạy, nhưng phải nhất quán về việc bạn sử dụng. Ví dụ: baaadbị xóa để baadcó thể báo cáo 1 hoặc 3 (không được lập chỉ mục), nhưng phải giống nhau trong toàn bộ chương trình.
  • Bạn không cần phải viết toàn bộ nguồn vào tệp riêng của nó. Bạn chỉ cần chèn lại byte đã xóa.
  • Không giống như các quy tắc điển hình cho các loại thuốc được làm cứng bằng bức xạ, việc phát hiện byte đã thay đổi khi đọc mã nguồn của chương trình là trò chơi công bằng.
  • Bạn có thể xuất chỉ mục byte đã thay đổi thông qua bất kỳ định dạng hợp lý nào. Hãy nhất quán về việc nó là 0-index hay 1-index hay bất kỳ ký hiệu nào khác. Bạn thậm chí có thể xuất một số trong một chuỗi mẫu.

Đây là nên chương trình ngắn nhất sẽ thắng.

Chúc may mắn!

EDIT1: thay đổi yêu cầu từ thay thế sang xóa

EDIT2: quy tắc được thêm vào để chạy các bản sao


4
Điều này khó hơn rất nhiều so với việc xử lý xóa tùy ý . Hầu hết các phi esolang rõ ràng là không có (thường không thể viết bất kỳ chương trình nào còn hiệu lực về mặt cú pháp dưới bất kỳ sửa đổi một byte nào). Ngay cả các Fungeoids chủ yếu bị cản trở (chúng không thể làm gì nếu byte thứ 0 được thay đổi thành lệnh thoát chương trình ). Tôi nghĩ có lẽ một trong hai IP có thể tồn tại trong một cái gì đó giống như Phân hạch nhưng *lệnh của nó sẽ giết chết tất cả các IP. Hồng y không thể làm điều đó, bởi vì @.
Lynn

Điều này có thể được biến thành code-challengenơi mỗi chương trình được phép khai báo danh sách các byte được bảo vệ chống lại phóng xạ (nhưng không quá - giả sử - 50% tổng kích thước). Một hệ thống tính điểm đơn giản có thể đếm mỗi byte được bảo vệ bằng bức xạ là 10 byte hoặc tương tự.
Arnauld

(Nhưng điều đó có thể dẫn đến một số câu trả lời tầm thường và không thú vị.)
Arnauld

1
@JoKing, báo cáo hoặc thiếu là tốt, miễn là nó phù hợp.
Beefster

2
"Bạn có thể yêu cầu tệp phải được đặt tên theo một tên nhất định và được chạy từ một thư mục cụ thể" - hãy cẩn thận, ai đó chỉ có thể yêu cầu tên tệp phải là chương trình chính xác ...
ASCII

Câu trả lời:


9

Befunge-98 (FBBI) , 344 296 248 byte

20020xxnngg33%%!!2200gg''00--3300gg33%%!!4400gg55%%!!22kk++55##rr55kk::00gg\\11pp00gg\\11++11pp22++00::pp00gg\\11++00gg--!!zz!!22**++00::gg00gg8844**--!!55++jj..''gg::00rr00::gg\\--..''220011''0011::''002211''223311''00441144kkppgg11001100::99oo@@

Hãy thử trực tuyến!

Xác minh!

Befunge-98 là ngôn ngữ bí truyền đầu tiên mà tôi có thể tìm thấy đó là cả 2D và có đầu ra tệp. Đây là một giải pháp đầy đủ (với một dòng mới) được lưu trữ trong một tệp có tên là một ký tự tab. Nó xuất ra dưới dạng 0 chỉ mục và xuất chỉ mục đầu tiên trong một chuỗi ký tự (mặc dù chỉ có từng cặp).

Có một vài sân golf được tạo ra, đặc biệt là có 15 mã không có mã , bây giờ chỉ là một không có! Tôi sẽ làm việc để làm cho điều này ngắn hơn, với mục tiêu đạt được hoặc dưới 200 byte.


Tuyệt vời! Tôi không nghĩ điều này là có thể
MilkyWay90

3

Unefunge-98 (PyFunge) , 118 byte

22xx00##rr33kk::gg\\11--pp22++00ppgg\\11++gg--!!zz!!22**--00gg::gg8844**--!!22++jj##''rr++..gg''2200pp0011--00::99oo@@

Hãy thử trực tuyến!

Xác minh!

Khi đánh golf câu trả lời Befunge-98 của tôi, tôi nhận ra rằng tôi có thể lưu một số byte bằng cách chuyển nó sang Unefunge, vì tôi sẽ chỉ phải lo lắng về một chiều chứ không phải hai chiều. Điều này cũng mở ra rất nhiều phím tắt và golf có thể, làm cho giải pháp mới nhỏ hơn nhiều .

Giải thích (không trùng lặp):

2x        Set the delta of the movement to 2
          This means the pointer moves 2 cells every step
          This will also initialise a counter as 2 (unless a 2 has been removed)
  0       Create the cell counter  (This will be stored at cell 0)
   #r     Enter the loop
     3k:                 Create 3 more copies of the counter
        g                Get the cell at the counter's position
         \1-p            Put it in the cell before that position
             2+0p        Add 2 to the counter and put it in cell 0
                 g       Get the cell at the counter's position
                  \1+g   Get the next cell
                      -!z!2*      If they are identical, push two, else 0
                            --    Subtract it from the total counter
                              0g:g84*-!   If the next character is a space
                                       2+j  r   Exit loop
                                         j#'    Else jump back to the start

Once the loop is over
+      Add the negative counter to the total counter
 .     And print
   '20p          Replace the 2 in cell 0 that was overwritten
             o   Write to a file named
            9    Tab
       01-       The cells from -1 to
  g              The total number of cells
              @  And exit the program
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.