ติดตั้ง ROT-47 …ใน ROT-47


23

ถาม: ใช้ROT-47ในโค้ดที่ใช้งานได้ทั้งตัวมันเองและตัว ROT-47

เกณฑ์การให้คะแนน:

คะแนนของคุณจะคำนวณเป็นเปอร์เซ็นต์ของใช้ ROT-47 ไบต์ที่มีสิทธิ์ในการรวมของทั้งสองรุ่นของโปรแกรมโดยแบ่งไบต์รวม (ตัวละครทั้งหมด) ของทั้งสองรุ่น

ใช้ ROT-47 ไบต์มีสิทธิ์เป็นตัวละครใด ๆ ที่จะได้รับการแปลงโดยเน่า-47 ตัวเลขที่ไม่ได้เป็นส่วนหนึ่งของการแสดงความคิดเห็นหรือละเว้นโดยคอมไพเลอร์ / ล่าม ตัวอย่างเช่นอักขระใด ๆ ในโปรแกรม brainfuck ที่+-<>[],.ไม่ถือเป็นไบต์ที่ใช้แล้วและอักขระใด ๆ ในโปรแกรม C รวมถึงและหลังจาก//หรือภายใน/* */จะไม่ถือว่าเป็นไบต์ที่ใช้ สัญลักษณ์พิเศษทั้งหมดใน APL ไม่ได้รับการพิจารณาว่าใช้เช่นเดียวกับตัวละครทั้งหมดในโปรแกรม Whitespace (ขออภัย)

ความสัมพันธ์จะถูกทำลายโดยโปรแกรมที่มี upvotes มากที่สุด หากยังมีการเสมอกันโปรแกรมที่สั้นที่สุดจะชนะ

ตัวอย่างการให้คะแนน:

C: 62/64 = 96.875%

แจ้งให้ทราบว่ามีช่องว่างในโปรแกรมนี้ เห็นได้ชัดว่าโปรแกรมนี้ไม่ได้เป็นรายการที่ถูกต้องเพราะมันไม่ได้รวบรวม แต่ฉันต้องการที่จะแสดงวิธีการให้คะแนนทำงาน

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

4
และภาษาอะไรที่จะ>2:?WXLAC:?E7WQw6==@ (@C=5PQXjNรวบรวม
Hosch250

@ hosch250 ฮ่า ๆ นั่นเป็นเพียงตัวอย่างโง่ ๆ
durron597

1
โดย "ROT-47 ที่มีสิทธิ์" คุณหมายถึง "ในช่วง ASCII 33 ถึง 126"? คือถ้าโปรแกรม C ของฉันมีช่องว่างหรือขึ้นบรรทัดใหม่หรือแท็บให้นับเป็น ROT-47 ที่มีสิทธิ์หรือไม่ สิ่งที่เกี่ยวกับความจริงที่ว่าช่องว่างบางอย่างนั้นมีความสำคัญเพื่อให้โปรแกรมทำงานได้ในหลายภาษา - สิ่งเหล่านั้นไม่นับตามที่ใช้เพราะไม่มีคุณสมบัติ R47 ถึงแม้ว่าโปรแกรมจะแตกถ้าไม่มี
Jonathan Van Matre

@JonathanVanMatre ช่องว่างหรือการขึ้นบรรทัดใหม่หรือแท็บไม่นับเพราะฉันรู้สึกว่าการให้คะแนนนั้นซับซ้อนเกินไป และฉันไม่ต้องการให้ Whitespace สามารถทำคะแนนได้ 100% เพราะนั่นจะเอาชนะวัตถุประสงค์
durron597

2
สำหรับทุกคนที่ไม่เห็นด้วยกับกฎการให้คะแนนที่บ้าของฉันโปรดแสดงความคิดเห็น / ตอบได้ที่นี่: meta.codegolf.stackexchange.com/questions/1167/…
durron597

คำตอบ:


28

Ruby, 100% (74 ตัวอักษร)

อินพุตบน STDIN, เอาต์พุตบน STDOUT

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

บรรทัดที่สองคือบรรทัดแรก ROT-47'd ดังนั้นเมื่อ ROT-47ing โปรแกรมทั้งหมดมันจะกลายเป็น:

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

กลยุทธ์ของฉันที่นี่ขึ้นอยู่กับข้อเท็จจริงที่ว่า:

  • Vคือ'เมื่อ ROT-47 ได้

  • jคือ;เมื่อ ROT-47 ได้

  • ดังนั้นVj=...Vj;จะกลายเป็น';l...';ซึ่งเป็นหลักไม่มี -op

    • ตอนนี้คุณสามารถสร้างรหัสโดยพลการใด ๆ ที่ทำอะไรได้ตามปกติและไม่มีตัวเลือกเมื่อ ROT-47 ต้องการ นี่เป็นเพราะVj=...Vj;สามารถรองรับการเรียกใช้รหัสใด ๆ ที่คุณสามารถทำได้Vj=0;{INSERT ANY CODE};Vj;และนั่นจะกลายเป็น'...';เมื่อ ROT-47 ต้องการ คุณเพียงแค่ต้องระวังไม่ให้ใช้Vในโค้ดนั้นเพราะมันจะทำลายมัน
  • ตรรกะที่คล้ายกันสามารถใช้ในการกลับด้านเพื่อสร้างครึ่งหลัง ( jVแทนVj)


โอเคคุณถูกต้องฉันไม่เคยระบุอย่างนั้นและฉันจะไม่ย้อนหลัง อย่างไรก็ตามช่องว่างยังคงไม่นับเป็นอักขระที่มีสิทธิ์ นี่น่าจะเป็น 136/140 ฉันคิดว่า
durron597

1
@ durron597 แก้ไข; ไม่มีช่องว่าง
Doorknob

แดงทับทิมไม่ต้องการไลน์เพื่อจบด้วยเซมิโคลอน :)
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

เมื่อแปล ROT-47 แล้วเราจะได้

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

ทั้งสองโปรแกรมรวบรวมและ ROT-47- แปลอาร์กิวเมนต์แรก:

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

ฉันมีปัญหาในการทำให้เรื่องนี้เป็นจริง ฉันประทับใจมากที่เห็นคะแนนสูงกว่า 50%!
durron597

@ durron597 มันจะไม่ทำงานใน ideone ตามที่รับการป้อนข้อมูลผ่านการขัดแย้งไม่ใช่ stdin
mniip

1
โหวตขึ้นสำหรับการใช้งาน ROT-47 เพื่อการโต้แย้งไม่ใช่เพื่อการแปลภาษาด้วยตนเอง ที่ควรได้รับในสเป็ค
Jonathan Van Matre

10

GolfScript, 120/120 ไบต์ = 100%

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

หรือใน ROT-47:

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

ไม่มีความคิดเห็นหรือการละเมิดสตริง คำสั่งไม่ได้กำหนดLiUUbamUUZadckYLfZfZhcTbbZNYNT(ซึ่งเท่ากับส่วนที่เหลือของรหัสใน ROT-47) เป็นแบบไม่มี op แต่มันก็ยังคงได้รับการดำเนินการโดยล่ามดังนั้นฉันเชื่อว่ามันนับเป็นใช้

นี่เป็นความท้าทายที่ง่ายมากใน GolfScript ปัญหาหลักคือในการหลีกเลี่ยงหลัก1ซึ่งเป็นแมปโดยเน่า-47 `เข้าไปในคำสั่ง คำสั่ง., -, ,, \, [, /, ]และ^ยังมีการหลีกเลี่ยงได้ แต่ที่ค่อนข้างง่ายในกรณีนี้เนื่องจากงานที่จำเป็นในการสร้างอาร์เรย์ไม่มี

โบนัส:

ต่อไปนี้เป็น GolfScript period-2 quine (เช่นโปรแกรมที่พิมพ์โปรแกรมที่สองที่พิมพ์โปรแกรมแรกอีกครั้ง) โดยที่ทั้งสองโปรแกรมนั้นเป็นการแปลง ROT-47 ของกันและกัน:

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

โปรแกรมนี้มีการเข้ารหัส ROT-47 เพื่อให้โปรแกรม GolfScript อื่นทำงาน:

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

ซึ่งในทางกลับกันก็เอาท์พุทตัวเองเข้ารหัส ROT-47 ทำให้โปรแกรมก่อนหน้าอีกครั้ง ดังนั้นโปรแกรมนี้ยังเป็นควินหมุน


ตัวหารของคุณผิด: "หารด้วยจำนวนไบต์ทั้งหมด (อักขระทั้งหมด) ของทั้งสองเวอร์ชัน" 60/120 = 50%
Jonathan Van Matre

@JonathanVanMatre: ใช้ไบต์ทั้งหมดในทั้งสองเวอร์ชัน (= ดำเนินการโดยล่าม) ดังนั้นจะเป็น 120/120 = ยัง 100%
Ilmari Karonen

ฉันไม่แน่ใจในการให้คะแนนเพราะฉันไม่รู้ Golfscript ฉันรู้ว่าตัวอย่างเช่นAใน brainfuck จะนับในตัวเศษ แต่ไม่ใช่ตัวส่วน สิ่งนี้เป็นสิ่งเดียวกันหรือต่างกันหรือไม่?
durron597

@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTเป็นตัวระบุที่ถูกต้องใน GolfScript และจะถูกดำเนินการเป็นคำสั่ง อย่างไรก็ตามมันไม่ใช่หนึ่งในคำสั่งในตัวและไม่ได้กำหนดความหมายโดยโปรแกรมดังนั้นโดยปกติแล้วมันไม่ทำอะไรเลย
Ilmari Karonen

6

หลาม, 96.1% (?)

ตามคำจำกัดความของคุณสตริงจะนับเป็นรหัสที่ใช้หรือ

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
เมื่อมองย้อนกลับไปพวกเขาไม่ควรมี แต่มันสายเกินไปแล้ว
durron597
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.