Implementasikan ROT-47… di ROT-47

23

Tantangan: Menerapkan ROT-47 dalam kode yang berfungsi sebagai versi dirinya sendiri dan sebagai versi ROT-47 itu sendiri.

Mencetak:

Skor Anda dihitung sebagai persentase dari byte yang digunakan, ROT-47 yang memenuhi syarat dalam total kedua versi program dibagi dengan total byte (semua karakter) dari kedua versi .

SEBUAH digunakan, ROT-47 byte yang memenuhi syarat adalah karakter yang akan dikonversi oleh ROT-47 cipher yang tidak bagian dari komentar atau diabaikan oleh compiler / interpreter. Misalnya, setiap karakter dalam program brainfuck yang +-<>[],.tidak dianggap sebagai byte yang digunakan, dan karakter apa pun dalam program C termasuk dan setelah //atau di dalam /* */tidak dianggap sebagai byte yang digunakan. Semua simbol khusus dalam APL tidak dianggap digunakan, seperti juga semua karakter dalam program Whitespace (maaf).

Ikatan akan dipecahkan oleh program dengan jumlah suara terbanyak. Jika masih ada seri, maka program terpendek menang.

Contoh pemberian skor:

C: 62/64 = 96,875%

Perhatikan ada ruang dalam program ini. Jelas juga, program ini bukan entri yang valid karena bahkan tidak dikompilasi, tetapi saya ingin menunjukkan bagaimana cara kerja penilaian.

main(){printf("Hello World!");}
durron597
sumber
4
Dan bahasa apa yang >2:?WXLAC:?E7WQw6==@ (@C=5PQXjNdikompilasi?
Hosch250
@ hosch250 lol, itu hanya contoh bodoh
durron597
1
Dengan "ROT-47 memenuhi syarat" maksud Anda "dalam kisaran ASCII 33 hingga 126"? Yaitu jika program C saya memiliki spasi atau baris baru atau tab, apakah itu dianggap sebagai ROT-47 yang memenuhi syarat atau tidak? Bagaimana dengan fakta bahwa beberapa ruang sangat penting agar sebuah program berfungsi dalam banyak bahasa - apakah itu tidak dihitung seperti yang digunakan karena mereka tidak memenuhi syarat R47, meskipun program akan rusak tanpa mereka?
Jonathan Van Matre
@JonathanVanMatre Ruang atau baris baru atau tab tidak dihitung karena saya merasa skornya akan terlalu rumit sebaliknya; dan saya tidak ingin Whitespace dapat mencetak skor 100%, karena itu akan mengalahkan tujuan.
durron597
2
Kepada semua orang yang keberatan dengan aturan penilaian gila saya, silakan komentar / jawab di sini: meta.codegolf.stackexchange.com/questions/1167/…
durron597

Jawaban:

28

Ruby, 100% (74 karakter)

Input pada STDIN, output pada STDOUT.

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

Baris kedua adalah baris pertama ROT-47. Karena itu, ketika ROT-47 menjalankan keseluruhan program, itu menjadi:

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

Strategi saya di sini didasarkan pada kenyataan bahwa:

  • Vadalah 'ketika ROT-47

  • jadalah ;ketika ROT-47

  • Oleh karena itu, Vj=...Vj;berubah menjadi ';l...';, yang pada dasarnya adalah no-op

    • Sekarang Anda dapat membuat kode arbitrer yang melakukan apa saja secara normal dan tanpa-ops saat ROT-47. Ini karena Vj=...Vj;dapat mendukung menjalankan kode apa pun yang dapat Anda lakukan Vj=0;{INSERT ANY CODE};Vj;, dan itu akan menjadi '...';ketika ROT-47. Anda hanya harus berhati-hati untuk tidak menggunakan Vkode itu, karena itu akan merusaknya.
  • Logika yang sama dapat digunakan secara terbalik untuk menghasilkan babak kedua ( jVbukan Vj)

Gagang pintu
sumber
oke Anda benar saya tidak pernah menentukan itu dan saya tidak akan surut. Namun, spasi tetap tidak dihitung sebagai karakter yang memenuhi syarat; ini harus 136/140 saya pikir.
durron597
1
@ durron597 Tetap; tidak ada lagi ruang.
Gagang pintu
Dang ruby ​​tidak memerlukan garis untuk diakhiri dengan tanda titik koma :)
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

Ketika ROT-47 diterjemahkan, kami dapat

*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++);}}

Kedua program mengkompilasi, dan ROT-47-menerjemahkan argumen pertama:

$ ./a "hello world"
96==@ H@C=5
mniip
sumber
Saya kesulitan membuat ini berfungsi pada ideone. Saya sangat terkesan melihat skor di atas 50%!
durron597
@ durron597 Ini tidak akan berfungsi pada ideone karena menerima input melalui argumen, bukan stdin
mniip
1
Suara positif untuk menerapkan ROT-47 untuk argumen, bukan hanya untuk terjemahan sendiri. Itu seharusnya di spec.
Jonathan Van Matre
10

GolfScript, 120/120 byte = 100%

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

atau, dalam ROT-47:

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

Tidak ada komentar atau penyalahgunaan string. Perintah tidak terdefinisi LiUUbamUUZadckYLfZfZhcTbbZNYNT(yang sama dengan sisa kode di ROT-47) adalah no-op, tetapi masih dijalankan oleh penerjemah, jadi saya percaya itu dianggap sebagai yang digunakan.

Ini sebenarnya tantangan yang cukup mudah di GolfScript. Kesulitan utama adalah dalam menghindari digit 1, yang dipetakan oleh ROT-47 ke dalam perintah GolfScript `. Perintah ., -, ,, \, [, /, ]dan^ juga harus dihindari, tapi itu cukup mudah dalam kasus ini, karena tugas yang diperlukan tidak ada bangunan larik.

Bonus:

Berikut adalah quine GolfScript periode-2 (yaitu program yang mencetak program kedua yang mencetak program pertama lagi) di mana kedua program adalah transformasi ROT-47 satu sama lain:

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

Program ini mengeluarkan sendiri kode ROT-47, menghasilkan program GolfScript lain:

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

yang, pada gilirannya, juga mengeluarkan sendiri ROT-47 yang dikodekan, menghasilkan program sebelumnya lagi. Dengan demikian, program ini juga merupakan quine yang berputar .

Ilmari Karonen
sumber
Penyebut Anda salah: "dibagi dengan total byte (semua karakter) dari kedua versi". 60/120 = 50%
Jonathan Van Matre
@JonathanVanMatre: Semua byte di kedua versi digunakan (= dieksekusi oleh penerjemah), jadi 120/120 = masih 100%.
Ilmari Karonen
Saya tidak yakin tentang penilaian karena saya tidak tahu skrip golf. Saya tahu bahwa, misalnya, Adalam brainfuck akan dihitung dalam pembilang tetapi tidak penyebutnya. Apakah ini sama atau berbeda?
durron597
@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTadalah pengidentifikasi yang valid dalam GolfScript, dan akan dieksekusi sebagai perintah. Namun, itu bukan salah satu dari perintah bawaan, juga tidak diberi makna oleh program, jadi secara default ia tidak melakukan apa-apa.
Ilmari Karonen
6

python, 96.1% (?)

Menurut definisi Anda, string dihitung sebagai kode yang digunakan?

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'
qwr
sumber
1
Kalau dipikir-pikir, mereka seharusnya tidak melakukannya, tetapi sekarang sudah terlambat
durron597