Implementiere ROT-47… in ROT-47


23

Herausforderung: Implementieren Sie ROT-47 in Code, der sowohl als sich selbst als auch als ROT-47-Version von sich selbst funktioniert.

Wertung:

Ihre Punktzahl wird als Prozentsatz der verwendeten, ROT-47-fähigen Bytes in beiden Programmversionen geteilt durch die Gesamtzahl der Bytes (alle Zeichen) beider Versionen berechnet .

Ein verwendetes, ROT-47-fähiges Byte ist ein beliebiges Zeichen, das von der ROT-47-Chiffre konvertiert wird, das nicht Teil eines Kommentars ist oder vom Compiler / Interpreter ignoriert wird. Beispielsweise wird jedes Zeichen in einem Brainfuck-Programm, das nicht +-<>[],.als verwendetes Byte betrachtet wird, und jedes Zeichen in einem C-Programm, das und nach //oder innerhalb von C einschließt, /* */wird nicht als verwendetes Byte betrachtet. Alle Sonderzeichen in APL werden nicht als verwendet betrachtet, ebenso wie alle Zeichen in einem Whitespace-Programm (sorry).

Krawatten werden vom Programm mit den meisten positiven Stimmen gebrochen. Wenn es immer noch ein Unentschieden gibt, gewinnt das kürzeste Programm.

Beispiel Bewertung:

C: 62/64 = 96,875%

Beachten Sie, dass dieses Programm ein Leerzeichen enthält. Natürlich ist dieses Programm auch kein gültiger Eintrag, da es nicht einmal kompiliert, aber ich wollte zeigen, wie das Scoring funktioniert.

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

4
Und in welcher Sprache >2:?WXLAC:?E7WQw6==@ (@C=5PQXjNkompiliert?
Hosch250

@ Hosch250 lol, das war nur ein dummes Beispiel
Durron597

1
Mit "ROT-47-fähig" meinen Sie "im ASCII-Bereich von 33 bis 126"? Dh, wenn mein C-Programm Leerzeichen oder Zeilenumbrüche oder Tabulatoren enthält, zählen diese als ROT-47-fähig oder nicht? Was ist mit der Tatsache, dass einige Leerzeichen unabdingbar sind, damit ein Programm in vielen Sprachen funktioniert? Werden diese nicht als verwendet gewertet, weil sie nicht für R47 geeignet sind, obwohl das Programm ohne sie nicht funktioniert?
Jonathan Van Matre

@JonathanVanMatre Die Leerzeichen oder Zeilenumbrüche oder Tabulatoren zählen nicht, da ich der Meinung bin, dass die Wertung ansonsten zu kompliziert wäre. und ich möchte nicht, dass Whitespace 100% erzielt, da dies den Zweck zunichte macht.
Durron597

2
Für alle, die gegen meine verrückten Bewertungsregeln Einwände
erheben

Antworten:


28

Ruby, 100% (74 Zeichen)

Eingang bei STDIN, Ausgang bei STDOUT.

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

Die zweite Zeile ist die erste Zeile ROT-47'd. Wenn Sie das gesamte Programm mit ROT-47 bearbeiten, wird dies zu:

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

Meine Strategie basiert hier auf der Tatsache, dass:

  • Vist, 'wenn ROT-47 würde

  • jist, ;wenn ROT-47 würde

  • Daher Vj=...Vj;verwandelt sich in ';l...';, der im wesentlichen eine no-op

    • Jetzt können Sie beliebigen Code erstellen, der beim Ausführen von ROT-47 alles normal macht und keine Aktionen ausführt. Dies liegt daran, dass es möglich Vj=...Vj;ist, jeden Code so auszuführen, wie Sie es könnten Vj=0;{INSERT ANY CODE};Vj;, und das wird '...';mit ROT-47. Sie müssen nur aufpassen, Vdass Sie diesen Code nicht verwenden , da er sonst beschädigt wird.
  • Eine ähnliche Logik kann umgekehrt verwendet werden, um die zweite Hälfte ( jVanstelle von Vj) zu erzeugen.


Okay, Sie haben Recht. Ich habe das nie angegeben und werde es auch nicht rückwirkend tun. Leerzeichen gelten jedoch weiterhin nicht als zulässige Zeichen. Das sollte 136/140 sein, denke ich.
Durron597

1
@ durron597 Behoben; keine Leerzeichen mehr.
Türklinke

Dang Ruby erfordert keine Zeilen mit einem Semikolon enden :)
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

Wenn ROT-47-übersetzt, bekommen wir

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

Beide Programme kompilieren und ROT-47-übersetzen das erste Argument:

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

Ich hatte Probleme damit, Ideone zum Laufen zu bringen. Ich bin sehr beeindruckt, wenn ich eine Punktzahl von über 50% sehe!
Durron597

@ Durron597 Es funktioniert nicht auf Ideone, da es Eingaben über Argumente akzeptiert, nicht stdin
mniip

1
Upvote für die Implementierung von ROT-47 für Argumente, nicht nur für die Selbstübersetzung. Das hätte in der Spezifikation sein sollen.
Jonathan Van Matre

10

GolfScript, 120/120 Byte = 100%

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

oder in ROT-47:

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

Keine Kommentare oder Saitenmissbrauch. Der undefinierte Befehl LiUUbamUUZadckYLfZfZhcTbbZNYNT(der dem Rest des Codes in ROT-47 entspricht) ist ein No-Op, wird aber dennoch vom Interpreter ausgeführt. Ich glaube, er zählt als verwendet.

Dies war in GolfScript eigentlich eine ziemlich einfache Herausforderung. Die Hauptschwierigkeit bestand darin, die Ziffer zu vermeiden 1, die von ROT-47 in den GolfScript-Befehl abgebildet wird `. Die Befehle ., -, ,, \, [, /, ]und ^auch zu vermeiden hatten, aber das war ziemlich einfach , in diesem Fall, da die Aufgabe kein Array Gebäude erforderlich.

Bonus:

Hier ist ein GolfScript -Quine der Periode 2 (dh ein Programm, das ein zweites Programm druckt, das das erste Programm erneut druckt), wobei die beiden Programme die ROT-47-Transformationen voneinander sind:

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

Dieses Programm gibt sich selbst ROT-47-codiert aus und liefert ein weiteres GolfScript-Programm:

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

Das wiederum gibt sich selbst ROT-47-codiert aus und gibt das vorherige Programm wieder zurück. Somit ist dieses Programm auch eine rotierende Quine .


Ihr Nenner ist falsch: "geteilt durch die Gesamtzahl der Bytes (alle Zeichen) beider Versionen". 60/120 = 50%
Jonathan Van Matre

@JonathanVanMatre: Alle Bytes in beiden Versionen werden verwendet (= vom Interpreter ausgeführt), das wäre also 120/120 = immer noch 100%.
Ilmari Karonen

Ich bin mir der Wertung nicht sicher, da ich kein Golfscript kenne. Ich weiß, dass zum Beispiel Ain Brainfuck im Zähler zählen würde, aber nicht im Nenner. Ist das dasselbe oder anders?
Durron597

@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTist ein gültiger Bezeichner in GolfScript und wird als Befehl ausgeführt. Es ist jedoch weder einer der integrierten Befehle , noch wird ihm vom Programm eine Bedeutung zugewiesen. Standardmäßig führt es also einfach nichts aus.
Ilmari Karonen

6

Python, 96,1% (?)

Zeichenfolgen gelten Ihrer Definition nach als verwendeter Code?

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
Im Nachhinein hätten sie es nicht
tun
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.