Python: Tôi ước tôi là PHP [đã đóng]


8

Có một câu chuyện cũ về một người ném đá không bao giờ hài lòng với những gì anh ta. Anh ước mình có thể trở thành mặt trời, và anh cũng vậy. Bị chặn bởi những đám mây, anh ước được - và trở thành - một đám mây. Khi gió thổi, anh ước mình là gió. Bị chặn lại bởi ngọn núi, anh ước được trở thành một ngọn núi, và do đó trở thành một. Tuy nhiên, chẳng mấy chốc, anh ta đã bị một kẻ ném đá tấn công và muốn trở thành một kẻ ném đá.

Tương tự, nhiệm vụ của bạn là viết một chương trình không bao giờ hài lòng với ngôn ngữ của nó. Chương trình của bạn phải xuất ra một tập hợp thay thế regex để biến nó thành ngôn ngữ khác. Và như thế.

Quy tắc

  1. Viết một chương trình bằng ngôn ngữ bạn chọn.
  2. Chương trình sẽ xuất ra một loạt ít nhất hai phân đoạn. Một đoạn là một loạt các văn bản, được phân tách bằng dấu chấm phẩy. Tuy nhiên, nếu một dấu chấm phẩy được chứa trong regex, thì việc phá vỡ nó sẽ dẫn đến cú pháp không hợp lệ, nó không tách các phân đoạn. Xem ví dụ.
  3. Phân đoạn đầu tiên là mẫu regex cần tìm và phân khúc thứ hai là mẫu thay thế. Thứ ba là một mẫu "tìm" khác và mẫu thứ tư là mẫu "thay thế", v.v.
  4. Áp dụng các mẫu regex cho chương trình. Thay thế mô hình trên phân khúc đầu tiên bằng một trên thứ hai; thay thế mẫu thứ ba bằng mẫu thứ tư, v.v.
  5. Kết quả phải là một chương trình trong một ngôn ngữ khác, theo chính quy tắc 2 đến 4.
  6. Các ngôn ngữ được sử dụng phải tạo thành một chu kỳ lặp lại vô hạn.
    • Ví dụ: Python -> PHP -> C ++ -> Python -> PHP -> C ++ -> Python -> ...
  7. Điểm của bạn là khoảng thời gian của chu kỳ. Ties bị phá vỡ bởi chiều dài mã ban đầu ngắn nhất.
    • Trong ví dụ trên, điểm số là ba.
  8. Trong mỗi lần lặp của chu trình, không có ngôn ngữ nào có thể được sử dụng nhiều hơn một lần.
  9. Đối với quy tắc 5 và 7, các ngôn ngữ tương thích (C và C ++) và các phiên bản khác nhau của cùng một ngôn ngữ (Python 2 và Python 3) được coi là giống nhau.
  10. Bản thân các chương trình không cần lặp lại.
    • Trong ví dụ trên, chương trình thứ nhất và thứ tư có thể khác nhau.
  11. Bất kỳ phiên bản nào của regex đều được chấp nhận, nhưng phải sử dụng tương tự cho tất cả các chương trình.
  12. Tổng sản lượng cho mỗi chương trình không được vượt quá 100 ký tự.
  13. Mỗi đầu ra phải chứa các hướng dẫn để thực sự thay đổi chương trình. Đó là, không có hai chương trình liên tiếp trong chu kỳ có thể giống nhau.

Thí dụ

Python -> Ruby -> Python -> ...

print "uts;Z;rint;uts;Z(?=;Z);rint"

Đầu ra:

uts;Z;rint;uts;Z(?=;Z);rint

Các phân khúc là:

FIND     ;    REPLACE
uts      ;    Z
rint     ;    uts
Z(?=;Z   ;    rint   (breaking the first segment in two would result in invalid syntax)

Áp dụng thay thế regex, theo thứ tự, cho chúng ta:

print "Z;Z;rint;Z;Z(?=;Z);rint"      # replace each "uts" with "Z"
puts "Z;Z;uts;Z;Z(?=;Z);uts"         # replace each "rint" with "uts"
puts "rint;Z;uts;rint;Z(?=;Z);uts"   # replace each "Z" followed by ";Z" with "rint"

Chạy dòng cuối cùng cung cấp cho chúng tôi các hướng dẫn để biến điều này trở lại thành mã Python.


Nếu bạn đang sử dụng kích thước mã làm bộ ngắt kết nối, chúng ta có thực sự cần giới hạn 100 ký tự không?
Martin Ender

@ MartinBüttner Có; tại sao không?
Ypnypn

Chắc chắn, nhưng đó là một nhân vật dài hơn \;;)
Martin Ender

C ++ không nhất thiết phải tương thích với C.
golfer9338

8
Tôi nghĩ rằng bạn có thể muốn yêu cầu tất cả các chương trình trong chu trình phải khác nhau. Nếu tôi sai, xin vui lòng nêu rõ - và tôi yêu cầu ưu tiên cho giải pháp rõ ràng.
Peter Taylor

Câu trả lời:


6

2 ngôn ngữ: Python, Ruby; 33 29 byte

Đây là một cách khác để làm Python và Ruby, ngắn hơn một chút so với thử thách:

Python:   print'^;puts"^.*?\\42#\\73"#'
prints:   ^;puts"^.*?\42#\73"#

Ruby:     puts"^.*?\42#\73"#print'^;puts"^.*?\\42#\\73"#'
prints:   ^.*?"#;

Không quá khó để thêm PHP vào hỗn hợp.


1

2 ngôn ngữ: Python 2 và Befunge-93, 77 byte

Sau khi đọc kỹ các quy tắc lần này , tôi đã đưa ra một câu trả lời thực sự. Nó sẽ không giành được bất kỳ giải thưởng nào, nhưng Befunge chỉ quá vui để lập trình.

u=u">>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u"
print u

Chương trình Python này xuất ra:

>>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u

Điều này mang lại những thay thế:

FIND         REPLACE
>>>>>:#,_@   Z
print        >>>>>:#,_@
Z(?=;Z)      print
<v           Y
u            <v
Y(?=;Y)      u

Điều này biến chương trình thành chương trình Befunge này:

<v=<v"print;Z;>>>>>:#,_@;print;Z(?=;Z);>>>>>:#,_@;u;Y;<v;u;Y(?=;Y);<v"
>>>>>:#,_@ <v

Có lẽ tôi sẽ xem nếu tôi có thể làm cho nó một dòng. Thành thật mà nói, tôi hơi ngạc nhiên khi Befunge hoạt động cho loại vấn đề này.

(Xin lỗi vì đã xóa và xóa một bó; Tôi đã hoảng loạn trong một giây vì tôi nghĩ chương trình có thể không hoạt động.)

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.