Implemente o ROT-47… no ROT-47

23

Desafio: implemente o ROT-47 em um código que funcione tanto como ele mesmo como a versão do ROT-47.

Pontuação:

Sua pontuação é calculada como uma porcentagem de bytes elegíveis ROT-47 usados ​​no total de ambas as versões do programa divididos pelo total de bytes (todos os caracteres) de ambas as versões .

Um byte qualificado e qualificado para o ROT-47 é qualquer caractere que seria convertido pela cifra ROT-47 que não faz parte de um comentário ou ignorado pelo compilador / intérprete. Por exemplo, qualquer caractere em um programa que não +-<>[],.seja o cérebro não é considerado um byte usado, e qualquer caractere em um programa C, incluindo e depois //ou dentro dele, /* */não é considerado um byte usado. Todos os símbolos especiais no APL não são considerados usados, assim como todos os caracteres em um programa de espaço em branco (desculpe).

Os laços serão quebrados pelo programa com mais votos. Se ainda houver um empate, o programa mais curto vence.

Exemplo de pontuação:

C: 62/64 = 96,875%

Observe que há um espaço neste programa. Obviamente, também, este programa não é uma entrada válida, porque nem compila, mas eu queria mostrar como a pontuação funciona.

main(){printf("Hello World!");}
durron597
fonte
4
E em que idioma >2:?WXLAC:?E7WQw6==@ (@C=5PQXjNcompila?
precisa saber é o seguinte
@ hosch250 lol, que era apenas um exemplo mudo
durron597
1
Por "qualificado pelo ROT-47", você quer dizer "no intervalo ASCII de 33 a 126"? Ou seja, se meu programa C tiver espaços, novas linhas ou guias, eles contam como ROT-47 elegíveis ou não? E o fato de que alguns espaços são essenciais para que um programa funcione em muitos idiomas - eles não contam como usados ​​porque não são elegíveis para o R47, mesmo que o programa não funcionasse sem eles?
Jonathan Van Matre
@JonathanVanMatre Os espaços, novas linhas ou tabulações não contam, porque acho que a pontuação seria muito complicada; e não quero que o Whitespace consiga marcar 100%, porque isso derrotaria o objetivo.
precisa saber é o seguinte
2
Para todos que se opuserem às minhas regras malucas de pontuação, comente / responda aqui: meta.codegolf.stackexchange.com/questions/1167/…
durron597 4/14

Respostas:

28

Ruby, 100% (74 caracteres)

Entrada em STDIN, saída em STDOUT.

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

A segunda linha é a primeira linha ROT-47'd. Portanto, quando ROT-47ing o programa inteiro, torna-se:

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

Minha estratégia aqui é baseada no fato de que:

  • Vé 'quando ROT-47'd

  • jé ;quando ROT-47'd

  • Portanto, se Vj=...Vj;transforma em ';l...';, que é essencialmente um não-op

    • Agora você pode criar qualquer código arbitrário que faça qualquer coisa normalmente e não ops quando o ROT-47'd. Isso ocorre porque Vj=...Vj;pode suportar a execução de qualquer código que você possa fazer Vj=0;{INSERT ANY CODE};Vj;, e isso se tornará '...';quando o ROT-47'd. Você só precisa ter cuidado para não usar Vesse código, pois isso o quebrará.
  • Lógica semelhante pode ser usada no sentido inverso para produzir a segunda metade (em jVvez de Vj)

Maçaneta da porta
fonte
Tudo bem, você está correto. Eu nunca especifiquei isso e não o retribuirei. No entanto, os espaços ainda não contam como caracteres elegíveis; isso deve ser 136/140, eu acho.
precisa saber é o seguinte
1
@ durron597 Fixed; não há mais espaços.
Maçaneta
Dang rubi não necessitando de linhas para acabar com um ponto e vírgula :)
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

Quando traduzido pelo ROT-47, obtemos

*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 os programas compilam e o ROT-47-converte o primeiro argumento:

$ ./a "hello world"
96==@ H@C=5
mniip
fonte
Eu tive problemas para fazer isso funcionar com ideone. Estou muito impressionado ao ver uma pontuação acima de 50%!
precisa saber é o seguinte
@ durron597 não vai funcionar em ideone como ele aceita a entrada por meio de argumentos, não stdin
mniip
1
Upvote para implementar o ROT-47 para argumentos, não apenas para auto-tradução. Isso deveria estar na especificação.
precisa
10

GolfScript, 120/120 bytes = 100%

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

ou, no ROT-47:

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

Sem comentários ou abuso de string. O comando indefinido LiUUbamUUZadckYLfZfZhcTbbZNYNT(que é igual ao restante do código no ROT-47) é no-op, mas ainda é executado pelo intérprete, por isso acredito que conta como usado.

Este foi realmente um desafio bastante fácil no GolfScript. A principal dificuldade estava em evitar o dígito 1, que é mapeado pelo ROT-47 no comando GolfScript `. Os comandos ., -, ,, \, [, /, ]e ^também teve de ser evitado, mas que foi bastante fácil, neste caso, uma vez que a tarefa necessária nenhuma construção array.

Bônus:

Aqui está um quine do período 2 do GolfScript (ou seja, um programa que imprime um segundo programa que imprime o primeiro programa novamente) em que os dois programas são as transformações ROT-47:

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

Este programa gera o código ROT-47, produzindo outro programa GolfScript:

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

que, por sua vez, também gera o código ROT-47, produzindo o programa anterior novamente. Assim, este programa também é uma solução rotativa .

Ilmari Karonen
fonte
Seu denominador está errado: "dividido pelo total de bytes (todos os caracteres) de ambas as versões". 60/120 = 50%
Jonathan Van Matre
@ JonathanVanMatre: Todos os bytes nas duas versões são usados ​​(= executados pelo intérprete), de modo que seria 120/120 = ainda 100%.
Ilmari Karonen
Não tenho certeza da pontuação, porque não conheço o golfscript. Eu sei que, por exemplo, Ano cérebro, contaria no numerador, mas não no denominador. É a mesma coisa ou diferente?
precisa saber é o seguinte
@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTé um identificador válido no GolfScript e será executado como um comando. No entanto, não é um dos comandos internos , nem é atribuído um significado pelo programa; portanto, por padrão, ele simplesmente não faz nada.
Ilmari Karonen
6

python, 96,1% (?)

De acordo com sua definição, as strings contam 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
fonte
1
Em retrospecto, eles não deveriam ter, mas agora é tarde demais
durron597 3/14