Implémenter ROT-47… dans ROT-47

23

Défi: implémenter ROT-47 dans un code qui fonctionne à la fois lui-même et en tant que version ROT-47 de lui-même.

Notation:

Votre score est calculé en pourcentage des octets éligibles ROT-47 utilisés au total des deux versions du programme divisé par le nombre total d'octets (tous les caractères) des deux versions .

Un octet éligible ROT-47 utilisé est tout caractère qui serait converti par le chiffrement ROT-47 qui ne fait pas partie d'un commentaire ou ignoré par le compilateur / interprète. Par exemple, tout caractère d'un programme brainfuck qui ne l'est pas +-<>[],.n'est pas considéré comme un octet utilisé et tout caractère d'un programme C incluant et après //ou à l'intérieur /* */n'est pas considéré comme un octet utilisé. Tous les symboles spéciaux dans APL ne sont pas considérés comme utilisés, de même que tous les caractères d'un programme Espaces (désolé).

Les égalités seront rompues par le programme avec le plus de votes positifs. S'il y a toujours égalité, le programme le plus court l'emporte.

Exemple de notation:

C: 62/64 = 96,875%

Notez qu'il y a un espace dans ce programme. Évidemment aussi, ce programme n'est pas une entrée valide car il ne compile même pas, mais je voulais montrer comment fonctionne la notation.

main(){printf("Hello World!");}
durron597
la source
4
Et dans quelle langue est >2:?WXLAC:?E7WQw6==@ (@C=5PQXjNcompilé?
Hosch250
@ hosch250 lol, ce n'était qu'un exemple stupide
durron597
1
Par «éligible au ROT-47», voulez-vous dire «dans la gamme ASCII 33 à 126»? Autrement dit, si mon programme C comporte des espaces, des nouvelles lignes ou des tabulations, ceux-ci comptent-ils comme éligibles au ROT-47 ou non? Qu'en est-il du fait que certains espaces sont essentiels pour qu'un programme fonctionne dans de nombreuses langues - celles-ci ne comptent-elles pas comme utilisées parce qu'elles ne sont pas éligibles à la R47, même si le programme s'arrêterait sans elles?
Jonathan Van Matre
@JonathanVanMatre Les espaces ou les nouvelles lignes ou les tabulations ne comptent pas parce que je pense que la notation serait trop compliquée sinon; et je ne veux pas que Whitespace soit capable de marquer 100%, car cela irait à l'encontre du but.
durron597
2
À tous ceux qui s'opposent à mes règles de score folles, veuillez commenter / répondre ici: meta.codegolf.stackexchange.com/questions/1167/…
durron597

Réponses:

28

Ruby, 100% (74 caractères)

Entrée sur STDIN, sortie sur STDOUT.

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

La deuxième ligne est la première ligne ROT-47'd. Par conséquent, lorsque ROT-47ing l'ensemble du programme, il devient:

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

Ma stratégie repose ici sur le fait que:

  • Vest 'quand ROT-47'd

  • jest ;quand ROT-47'd

  • Par conséquent, se Vj=...Vj;transforme en ';l...';, qui est essentiellement un no-op

    • Maintenant, vous pouvez créer n'importe quel code arbitraire qui fait quoi que ce soit normalement et sans opération lorsque ROT-47. C'est parce que Vj=...Vj;peut prendre en charge l'exécution de n'importe quel code comme vous pourriez le faire Vj=0;{INSERT ANY CODE};Vj;, et cela deviendra '...';lorsque ROT-47. Vous devez juste faire attention à ne pas l'utiliser Vdans ce code, car cela le briserait.
  • Une logique similaire peut être utilisée à l'envers pour produire la seconde moitié ( jVau lieu de Vj)

Poignée de porte
la source
vous avez raison, je n'ai jamais précisé cela et je ne le ferai pas rétroactivement. Cependant, les espaces ne comptent toujours pas comme caractères éligibles; cela devrait être 136/140 je pense.
durron597
1
@ durron597 Fixed; plus d'espaces.
Poignée de porte
Dang ruby ​​n'exige pas que les lignes se terminent par un point-virgule :)
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

Lorsque ROT-47-traduit, nous obtenons

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

Les deux programmes compilent et ROT-47-traduit le premier argument:

$ ./a "hello world"
96==@ H@C=5
mniip
la source
J'ai eu du mal à faire fonctionner cela sur l'idéone. Je suis très impressionné de voir un score supérieur à 50%!
durron597
@ durron597 Cela ne fonctionnera pas sur ideone car il accepte les entrées via des arguments, pas stdin
mniip
1
Vote positif pour l'implémentation de ROT-47 pour les arguments, pas seulement pour l'auto-traduction. Cela aurait dû être dans la spécification.
Jonathan Van Matre
10

GolfScript, 120/120 octets = 100%

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

ou, dans ROT-47:

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

Aucun commentaire ou abus de chaîne. La commande non définie LiUUbamUUZadckYLfZfZhcTbbZNYNT(qui équivaut au reste du code dans ROT-47) est un no-op, mais elle est toujours exécutée par l'interpréteur, donc je pense qu'elle compte comme utilisée.

C'était en fait un défi assez facile dans GolfScript. La principale difficulté était d'éviter le chiffre 1, qui est mappé par ROT-47 dans la commande GolfScript `. Les commandes ., -, ,, \, [, /, ]et ^devaient également être évité, mais était assez facile dans ce cas, puisque la tâche requise aucun bâtiment de tableau.

Prime:

Voici une quine GolfScript période-2 (c'est-à-dire un programme qui imprime un deuxième programme qui imprime à nouveau le premier programme) où les deux programmes sont les transformations ROT-47 l'une de l'autre:

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

Ce programme sort lui-même encodé ROT-47, ce qui donne un autre programme GolfScript:

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

qui, à son tour, sort également lui-même codé ROT-47, ce qui donne à nouveau le programme précédent. Ainsi, ce programme est également une quine tournante .

Ilmari Karonen
la source
Votre dénominateur est erroné: "divisé par le nombre total d'octets (tous les caractères) des deux versions". 60/120 = 50%
Jonathan Van Matre
@JonathanVanMatre: Tous les octets dans les deux versions sont utilisés (= exécutés par l'interpréteur), donc ce serait 120/120 = toujours 100%.
Ilmari Karonen
Je ne suis pas sûr du score car je ne connais pas le golf. Je sais que, par exemple, Adans brainfuck compterait dans le numérateur mais pas dans le dénominateur. Est-ce la même chose ou différent?
durron597
@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTest un identifiant valide dans GolfScript, et sera exécuté comme une commande. Cependant, ce n'est pas l'une des commandes intégrées , ni une signification par le programme, donc par défaut, il ne fait rien.
Ilmari Karonen
6

python, 96,1% (?)

Selon votre définition, les chaînes comptent comme du code utilisé?

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
la source
1
Rétrospectivement, ils n'auraient pas dû, mais il est beaucoup trop tard maintenant
durron597