Implementare ROT-47 ... in ROT-47


23

Sfida: implementare ROT-47 nel codice che funziona sia come se stesso che come versione ROT-47 di se stesso.

punteggio:

Il tuo punteggio viene calcolato come percentuale di byte ammissibili ROT-47 utilizzati in totale di entrambe le versioni del programma divisi per byte totali (tutti i caratteri) di entrambe le versioni .

Un byte idoneo ROT-47 utilizzato è qualsiasi carattere che verrebbe convertito dal codice ROT-47 che non fa parte di un commento o ignorato dal compilatore / interprete. Ad esempio, qualsiasi carattere in un programma Brainfuck che non è non +-<>[],.è considerato un byte utilizzato e qualsiasi carattere in un programma C incluso e dopo //o all'interno /* */non è considerato un byte utilizzato. Tutti i simboli speciali in APL non sono considerati usati, come lo sono tutti i caratteri in un programma di spazi bianchi (scusate).

I legami verranno interrotti dal programma con il maggior numero di voti. Se c'è ancora un pareggio, vince il programma più corto.

Esempio di punteggio:

C: 62/64 = 96.875%

Si noti che c'è uno spazio in questo programma. Ovviamente anche questo programma non è una voce valida perché non si compila nemmeno, ma volevo mostrare come funziona il punteggio.

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

4
E in che lingua si >2:?WXLAC:?E7WQw6==@ (@C=5PQXjNcompila?
Hosch250,

@ hosch250 lol, che era solo un esempio stupido
durron597

1
Per "idoneo per ROT-47" intendi "nell'intervallo ASCII da 33 a 126"? Vale a dire se il mio programma C ha spazi o newline o tab, quelli contano come idonei ROT-47 o no? Che dire del fatto che alcuni spazi sono essenziali per far funzionare un programma in molte lingue - quelli non contano come usati perché non sono idonei per R47, anche se il programma si spezzerebbe senza di loro?
Jonathan Van Matre,

@JonathanVanMatre Gli spazi o le nuove righe o schede non contano perché ritengo che il punteggio sarebbe troppo complicato altrimenti; e non voglio che Whitespace sia in grado di segnare il 100%, perché ciò vanificherebbe lo scopo.
durron597,

2
A tutti coloro che si oppongono alle mie pazze regole sul punteggio, si prega di commentare / rispondere qui: meta.codegolf.stackexchange.com/questions/1167/…
durron597

Risposte:


28

Ruby, 100% (74 caratteri)

Ingresso su STDIN, uscita su STDOUT.

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

La seconda riga è la prima riga ROT-47'd. Pertanto, quando ROT-47 esegue l'intero programma, diventa:

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

La mia strategia qui si basa sul fatto che:

  • Vè 'quando ROT-47'd

  • jè ;quando ROT-47'd

  • Pertanto, Vj=...Vj;si trasforma in ';l...';, che è essenzialmente una no-op

    • Ora puoi creare qualsiasi codice arbitrario che fa qualsiasi cosa normalmente e senza operazioni quando ROT-47. Questo perché Vj=...Vj;può supportare l'esecuzione di qualsiasi codice come si potrebbe fare Vj=0;{INSERT ANY CODE};Vj;e ciò avverrà '...';quando ROT-47. Devi solo stare attento a non usare Vquel codice, poiché ciò lo spezzerà.
  • Logica simile può essere utilizzata al contrario per produrre la seconda metà ( jVanziché Vj)


ok hai ragione non l'ho mai specificato e non lo farò retroattivamente. Tuttavia, gli spazi non contano ancora come caratteri idonei; questo dovrebbe essere 136/140 credo.
durron597,

1
@ durron597 Risolto; niente più spazi.
Maniglia della porta

Dang ruby ​​non richiede la fine delle righe con un punto e virgola :)
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 viene tradotto ROT-47, otteniamo

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

Entrambi i programmi vengono compilati e ROT-47 traduce il primo argomento:

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

Ho avuto problemi a far funzionare questo su ideone. Sono comunque molto colpito nel vedere un punteggio superiore al 50%!
durron597,

@ durron597 Non funzionerà su ideone in quanto accetta input tramite argomenti, non stdin
mniip

1
Voto per l'implementazione di ROT-47 per argomenti, non solo per l'auto-traduzione. Questo avrebbe dovuto essere nelle specifiche.
Jonathan Van Matre,

10

GolfScript, 120/120 byte = 100%

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

o, in ROT-47:

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

Nessun commento o abuso di stringa. Il comando indefinito LiUUbamUUZadckYLfZfZhcTbbZNYNT(che equivale al resto del codice in ROT-47) è un no-op, ma viene comunque eseguito dall'interprete, quindi credo che conti come usato.

Questa è stata in realtà una sfida abbastanza semplice in GolfScript. La difficoltà principale consisteva nell'evitare la cifra 1, che è mappata da ROT-47 nel comando GolfScript `. I comandi ., -, ,, \, [, /, ]e ^dovevano essere evitato, ma che era abbastanza facile in questo caso, poiché il compito richiesto nessun edificio matrice.

Bonus:

Ecco un quinto periodo 2 di GolfScript (ovvero un programma che stampa un secondo programma che stampa nuovamente il primo programma) in cui i due programmi sono le trasformazioni ROT-47 l'una dell'altra:

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

Questo programma genera se stesso codificato ROT-47, producendo un altro programma GolfScript:

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

che, a sua volta, emette anche se stesso codificato ROT-47, restituendo nuovamente il programma precedente. Pertanto, questo programma è anche un quine rotante .


Il tuo denominatore è errato: "diviso per byte totali (tutti i caratteri) di entrambe le versioni". 60/120 = 50%
Jonathan Van Matre

@JonathanVanMatre: vengono utilizzati tutti i byte in entrambe le versioni (= eseguito dall'interprete), quindi sarebbe 120/120 = ancora 100%.
Ilmari Karonen,

Non sono sicuro del punteggio perché non conosco golfscript. So che, per esempio, Ain Brainfuck conterebbe nel numeratore ma non nel denominatore. È la stessa cosa o è diversa?
durron597

@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTè un identificatore valido in GolfScript e verrà eseguito come comando. Tuttavia, non è uno dei comandi integrati , né viene assegnato un significato dal programma, quindi per impostazione predefinita semplicemente non fa nulla.
Ilmari Karonen,

6

pitone, 96,1% (?)

Secondo la tua definizione, le stringhe contano come codice usato?

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
A posteriori non avrebbero dovuto, ma ormai è troppo tardi
durron597,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.