Implementar ROT-47 ... en ROT-47

23

Desafío: Implemente ROT-47 en un código que funcione tanto como sí mismo como como la versión ROT-47 de sí mismo.

Tanteo:

Su puntaje se calcula como un porcentaje de bytes usados ​​elegibles para ROT-47 en total de ambas versiones del programa dividido por el total de bytes (todos los caracteres) de ambas versiones .

Un byte usado elegible para ROT-47 es cualquier carácter que el cifrado ROT-47 convertiría que no sea parte de un comentario o que el compilador / intérprete ignore. Por ejemplo, cualquier carácter en un programa de brainfuck que no lo +-<>[],.sea ​​no se considera un byte usado, y cualquier personaje en un programa C que incluya y después //o dentro /* */no se considera un byte usado. Todos los símbolos especiales en APL no se consideran usados, como lo son todos los caracteres en un programa de espacios en blanco (lo siento).

El programa con más votos positivos romperá los lazos. Si todavía hay un empate, entonces gana el programa más corto.

Ejemplo de puntuación:

C: 62/64 = 96.875%

Observe que hay un espacio en este programa. Obviamente también, este programa no es una entrada válida porque ni siquiera se compila, pero quería mostrar cómo funciona la puntuación.

main(){printf("Hello World!");}
durron597
fuente
44
¿Y en qué idioma se >2:?WXLAC:?E7WQw6==@ (@C=5PQXjNcompila?
Hosch250
@ hosch250 lol, eso fue solo un ejemplo tonto
durron597
1
Por "elegible para ROT-47", ¿quiere decir "en el rango ASCII 33 a 126"? Es decir, si mi programa C tiene espacios o líneas nuevas o pestañas, ¿cuentan como elegibles para ROT-47 o no? ¿Qué pasa con el hecho de que algunos espacios son esenciales para que un programa funcione en muchos idiomas? ¿Los que no cuentan como utilizados porque no son elegibles para R47, a pesar de que el programa se rompería sin ellos?
Jonathan Van Matre
@JonathanVanMatre Los espacios o las nuevas líneas o pestañas no cuentan porque siento que la puntuación sería demasiado complicada de lo contrario; y no quiero que Whitespace pueda obtener un puntaje del 100%, ya que eso frustraría el propósito.
durron597
2
Para todos los que se oponen a mis locas reglas de puntuación, por favor comenten / respondan aquí: meta.codegolf.stackexchange.com/questions/1167/…
durron597

Respuestas:

28

Ruby, 100% (74 caracteres)

Entrada en STDIN, salida en STDOUT.

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

La segunda línea es la primera línea ROT-47'd. Por lo tanto, cuando ROT-47 ejecuta todo el programa, se convierte en:

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

Mi estrategia aquí se basa en el hecho de que:

  • Ves 'cuando ROT-47'd

  • jes ;cuando ROT-47'd

  • Por lo tanto, se Vj=...Vj;convierte en ';l...';, que es esencialmente un no-op

    • Ahora puede crear cualquier código arbitrario que haga cualquier cosa normalmente y sin operaciones cuando ROT-47'd. Esto se debe a que Vj=...Vj;puede admitir la ejecución de cualquier código como podría hacerlo Vj=0;{INSERT ANY CODE};Vj;, y eso se hará '...';cuando ROT-47'd. Solo debes tener cuidado de no usar Vese código, ya que eso lo romperá.
  • Se puede usar una lógica similar en reversa para producir la segunda mitad (en jVlugar de Vj)

Pomo de la puerta
fuente
bien, tienes razón, nunca especifiqué eso y no lo haré retroactivamente. Sin embargo, los espacios aún no cuentan como caracteres elegibles; Esto debería ser 136/140, creo.
durron597
1
@ durron597 fijo; No más espacios.
Pomo de la puerta
Dang ruby ​​no requiere que las líneas terminen con punto y coma :)
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

Cuando ROT-47-traducido, obtenemos

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

Ambos programas compilan y ROT-47 traduce el primer argumento:

$ ./a "hello world"
96==@ H@C=5
mniip
fuente
Tuve problemas para hacer que esto funcionara en ideone. Sin embargo, estoy muy impresionado al ver una puntuación superior al 50%.
durron597
@ durron597 No funcionará en ideone ya que acepta la entrada a través de argumentos, no stdin
mniip
1
Voto a favor para implementar ROT-47 para argumentos, no solo para autotraducción. Eso debería haber estado en la especificación.
Jonathan Van Matre
10

GolfScript, 120/120 bytes = 100%

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

o, en ROT-47:

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

Sin comentarios ni abuso de cadenas. El comando indefinido LiUUbamUUZadckYLfZfZhcTbbZNYNT(que equivale al resto del código en ROT-47) no funciona, pero el intérprete todavía lo ejecuta, por lo que creo que cuenta como usado.

Este fue realmente un desafío bastante fácil en GolfScript. La principal dificultad fue evitar el dígito 1, que ROT-47 asigna al comando GolfScript `. Los comandos ., -, ,, \, [, /, ]y ^también tuvieron que ser evitado, pero que era bastante fácil, en este caso, ya que la tarea requiere ningún edificio matriz.

Prima:

Aquí hay una quine del período 2 de GolfScript (es decir, un programa que imprime un segundo programa que imprime el primer programa nuevamente) donde los dos programas son las transformaciones ROT-47 entre sí:

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

Este programa se genera con codificación ROT-47, produciendo otro programa GolfScript:

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

que, a su vez, también se genera con codificación ROT-47, produciendo el programa anterior nuevamente. Por lo tanto, este programa también es una quine giratoria .

Ilmari Karonen
fuente
Su denominador es incorrecto: "dividido por el total de bytes (todos los caracteres) de ambas versiones". 60/120 = 50%
Jonathan Van Matre
@JonathanVanMatre: se utilizan todos los bytes en ambas versiones (= ejecutado por el intérprete), por lo que sería 120/120 = todavía 100%.
Ilmari Karonen
No estoy seguro de la puntuación porque no sé golfscript. Sé que, por ejemplo, Aen brainfuck contaría en el numerador pero no en el denominador. ¿Es esto lo mismo o diferente?
durron597
@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTes un identificador válido en GolfScript y se ejecutará como un comando. Sin embargo, no es uno de los comandos integrados , ni el programa le asigna un significado, por lo que, por defecto, simplemente no hace nada.
Ilmari Karonen
6

pitón, 96.1% (?)

Según su definición, ¿las cadenas cuentan como código usado?

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
fuente
1
En retrospectiva, que no debería tener, pero es demasiado tarde ahora
durron597