Triển khai ROT-47 Nhận trong ROT-47


23

Thách thức: Triển khai ROT-47 theo mã hoạt động như chính nó và là phiên bản ROT-47 của chính nó.

Ghi điểm:

Điểm của bạn được tính bằng tỷ lệ phần trăm của các byte đủ điều kiện được sử dụng, ROT-47 trong tổng số cả hai phiên bản của chương trình chia cho tổng số byte (tất cả các ký tự) của cả hai phiên bản .

Một byte đủ điều kiện được sử dụng, ROT-47 là bất kỳ ký tự nào sẽ được chuyển đổi bởi mật mã ROT-47 không phải là một phần của một nhận xét hoặc bị bỏ qua bởi trình biên dịch / trình thông dịch. Ví dụ, bất kỳ ký tự nào trong chương trình brainfuck không +-<>[],.được coi là byte đã sử dụng và bất kỳ ký tự nào trong chương trình C bao gồm và sau //hoặc bên trong /* */không được coi là byte được sử dụng. Tất cả các ký hiệu đặc biệt trong APL không được xem xét sử dụng, cũng như tất cả các ký tự trong chương trình Khoảng trắng (xin lỗi).

Ties sẽ bị phá vỡ bởi chương trình với nhiều upvote nhất. Nếu vẫn còn hòa, thì chương trình ngắn nhất sẽ thắng.

Ví dụ cho điểm:

C: 62/64 = 96.875%

Thông báo có một không gian trong chương trình này. Rõ ràng cũng vậy, chương trình này không phải là một mục hợp lệ vì nó thậm chí không được biên dịch, nhưng tôi muốn cho thấy cách tính điểm hoạt động.

main(){printf("Hello World!");}

4
Và ngôn ngữ nào được >2:?WXLAC:?E7WQw6==@ (@C=5PQXjNbiên dịch trong?
Hosch250 ngày

@ hosch250 lol, đó chỉ là một ví dụ ngớ ngẩn
durron597

1
Theo "ROT-47 đủ điều kiện", ý bạn là "trong phạm vi ASCII từ 33 đến 126"? Tức là nếu chương trình C của tôi có khoảng trắng hoặc dòng mới hoặc tab, những thứ đó có được tính là ROT-47 đủ điều kiện hay không? Điều gì về thực tế là một số không gian rất cần thiết để chương trình hoạt động với nhiều ngôn ngữ - những ngôn ngữ đó không được tính là được sử dụng vì chúng không đủ điều kiện R47, mặc dù chương trình sẽ bị hỏng nếu không có chúng?
Jonathan Van Matre

@JonathanVanMatre Khoảng trắng hoặc dòng mới hoặc tab không được tính vì tôi cảm thấy việc ghi điểm sẽ quá phức tạp; và tôi không muốn Whitespace có thể ghi được 100%, vì điều đó sẽ đánh bại mục đích.
durron597

2
Đối với tất cả những người phản đối quy tắc chấm điểm điên rồ của tôi, vui lòng bình luận / trả lời tại đây: meta.codegolf.stackexchange.com/questions/1167/ Kẻ
durron597

Câu trả lời:


28

Ruby, 100% (74 ký tự)

Đầu vào trên STDIN, đầu ra trên STDOUT.

Vj=s=gets;puts(s.tr'!-~','P-~!-O');Vj;'lDl86EDjAFEDWD]ECVP\OV[V!\OP\~VXj;'

Dòng thứ hai là dòng đầu tiên ROT-47'd. Do đó, khi ROT-47ing toàn bộ chương trình, nó sẽ trở thành:

';lDl86EDjAFEDWD]ECVP\OV[V!\OP\~VXj';jV=s=gets;puts(s.tr'!-~','P-~!-O');jV

Chiến lược của tôi ở đây dựa trên thực tế là:

  • V'khi ROT-47'd

  • j;khi ROT-47'd

  • Do đó, Vj=...Vj;biến thành ';l...';, về cơ bản là không có

    • Bây giờ bạn có thể tạo bất kỳ mã tùy ý nào làm bất cứ điều gì bình thường và không hoạt động khi ROT-47'd. Điều này là do Vj=...Vj;có thể hỗ trợ chạy bất kỳ mã nào như bạn có thể làm Vj=0;{INSERT ANY CODE};Vj;và điều đó sẽ trở thành '...';khi ROT-47'd. Bạn chỉ cần cẩn thận không sử dụng Vtrong mã đó, vì điều đó sẽ phá vỡ nó.
  • Logic tương tự có thể được sử dụng ngược lại để tạo ra nửa thứ hai ( jVthay vì Vj)


được rồi bạn đúng tôi không bao giờ chỉ định điều đó và tôi sẽ không hồi tố. Tuy nhiên, không gian vẫn không được tính là ký tự đủ điều kiện; Tôi nghĩ đây là 136/140.
durron597

1
@ durron597 Đã sửa; không còn chỗ trống
Doorknob

Dang ruby ​​không yêu cầu các dòng kết thúc bằng dấu chấm phẩy :)
durron597

16

C - 54,6%

Y;BW;XL;jNj;AW(){XL^Y;};main(int i,char**v){char*x=v[1];while(*x){if(*x>32&&*x<128)*x=(*x+15)%94+32;putchar(*x++);}}//Y^Nj>2:?W:?E :[492CYYGXL492CYIlG,`.jH9:=6WYIXL:7WYImbaUUYIk`agXYIlWYIZ`dXThcZbajAFE492CWYIZZXjNN

Khi ROT-47-dịch, chúng tôi nhận được

*jq(j){j;};jp(WXL){/*jNj>2:?W:?E :[492CYYGXL492CYIlG,`.jH9:=6WYIXL:7WYImbaUUYIk`agXYIlWYIZ`dXThcZbajAFE492CWYIZZXjNN^^*/};main(int i,char**v){char*x=v[1];while(*x){if(*x>32&&*x<128)*x=(*x+15)%94+32;putchar(*x++);}}

Cả hai chương trình đều biên dịch và ROT-47 - dịch đối số đầu tiên:

$ ./a "hello world"
96==@ H@C=5

Tôi gặp khó khăn khi làm điều này để làm việc trên ideone. Tôi rất ấn tượng khi thấy điểm trên 50%!
durron597 ngày

@ durron597 Nó sẽ không hoạt động trên ideone vì nó chấp nhận đầu vào thông qua các đối số, không phải stdin
mniip

1
Upvote để thực hiện ROT-47 cho các đối số, không chỉ để tự dịch. Điều đó nên có trong spec.
Jonathan Van Matre

10

GolfScript, 120/120 byte = 100%

{:&&32>&&+254<*{7+7+94%33+}*}%LiUUbamUUZadckYLfZfZhcTbbZNYNT

hoặc, trong ROT-47:

LiUUbamUUZadckYLfZfZhcTbbZNYNT{:&&32>&&+254<*{7+7+94%33+}*}%

Không có ý kiến ​​hoặc lạm dụng chuỗi. Lệnh không xác định LiUUbamUUZadckYLfZfZhcTbbZNYNT(bằng với phần còn lại của mã trong ROT-47) là lệnh không hoạt động, nhưng nó vẫn được trình thông dịch thực thi, vì vậy tôi tin rằng nó được tính là đã sử dụng.

Đây thực sự là một thử thách khá dễ dàng trong GolfScript. Khó khăn chính là trong việc tránh chữ số 1, được ROT-47 ánh xạ vào lệnh GolfScript `. Các lệnh ., -, ,, \, [, /, ]^ cũng phải tránh được, nhưng đó là khá dễ dàng trong trường hợp này, vì nhiệm vụ không cần xây dựng mảng.

Tiền thưởng:

Đây là một quine GolfScript kỳ 2 (tức là một chương trình in chương trình thứ hai in lại chương trình đầu tiên) trong đó hai chương trình là các biến đổi ROT-47 của nhau:

{`'0$~'+.{7+7+94%33+}%@!{0$@@;}*}0$~L1V_SOVZ]LfZfZhcTbbZNToPL_SoojNYN_SO

Chương trình này tự đầu ra mã hóa ROT-47, mang lại một chương trình GolfScript khác:

L1V_SOVZ]LfZfZhcTbbZNToPL_SoojNYN_SO{`'0$~'+.{7+7+94%33+}%@!{0$@@;}*}0$~

đến lượt nó, cũng tự đầu ra mã hóa ROT-47, mang lại chương trình trước đó một lần nữa. Vì vậy, chương trình này cũng là một quine xoay .


Mẫu số của bạn sai: "chia cho tổng số byte (tất cả các ký tự) của cả hai phiên bản". 60/120 = 50%
Jonathan Van Matre

@JonathanVanMatre: Tất cả các byte trong cả hai phiên bản đều được sử dụng (= được thực hiện bởi trình thông dịch), do đó sẽ là 120/120 = vẫn là 100%.
Ilmari Karonen

Tôi không chắc về điểm số vì tôi không biết về golf. Tôi biết rằng, ví dụ, Atrong brainfuck sẽ tính vào tử số chứ không phải mẫu số. Đây là điều tương tự hay khác nhau?
durron597

@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTlà mã định danh hợp lệ trong GolfScript và sẽ được thực thi dưới dạng lệnh. Tuy nhiên, nó không phải là một trong những lệnh dựng sẵn , cũng không được chương trình gán cho một ý nghĩa, vì vậy theo mặc định, nó chỉ đơn giản là không làm gì cả.
Ilmari Karonen

6

trăn, 96,1% (?)

Theo định nghĩa của bạn, chuỗi được tính là mã được sử dụng?

V=input();print("".join([chr(33+(ord(V[i])+14)%94)for i in range(len(V))]));V
'l:?AFEWXjAC:?EWQQ];@:?W,49CWbbZW@C5WD,:.XZ`cXThcX7@C : :? C2?86W=6?WDXX.XXj'

1
Nhìn lại họ không nên có, nhưng bây giờ đã quá muộn
durron597
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.