Zaimplementuj ROT-47… w ROT-47

23

Wyzwanie: Zaimplementuj ROT-47 w kodzie, który działa zarówno jako on sam, jak i jako jego wersja ROT-47.

Punktacja:

Twój wynik jest obliczany jako odsetek wykorzystanych bajtów ROT-47 ogółem obu wersji programu podzielony przez całkowitą liczbę bajtów (wszystkich znaków) obu wersji .

Używany, ROT-47 kwalifikuje bajt jest dowolny znak, który będzie przekształcony przez ROT-47 szyfru, który nie jest częścią komentarzu lub ignorowane przez kompilator / interpreter. Na przykład, dowolny znak w programie typu „pieprzenie mózgu”, który nie +-<>[],.jest uważany za używany bajt, a jakikolwiek znak w programie C, w tym i po nim //lub wewnątrz, /* */nie jest uważany za używany bajt. Wszystkie specjalne symbole w APL nie są uważane za używane, podobnie jak wszystkie znaki w programie Whitespace (przepraszam).

Więzi zostaną zerwane przez program z największą popularnością. Jeśli nadal jest remis, wygrywa najkrótszy program.

Przykład punktacji:

C: 62/64 = 96,875%

Zauważ, że w tym programie jest miejsce. Oczywiście ten program nie jest prawidłowym wpisem, ponieważ nawet się nie kompiluje, ale chciałem pokazać, jak działa ocenianie.

main(){printf("Hello World!");}
durron597
źródło
4
A w jakim języku się >2:?WXLAC:?E7WQw6==@ (@C=5PQXjNkompiluje?
Hosch250
@ hosch250 lol, to był tylko głupi przykład
durron597
1
Przez „kwalifikujący się do ROT-47” masz na myśli „w zakresie ASCII od 33 do 126”? To znaczy, jeśli mój program C ma spacje, znaki nowej linii lub tabulatory, czy te liczą się jako kwalifikujące się do ROT-47, czy nie? A co z faktem, że niektóre spacje są niezbędne do działania programu w wielu językach - czy nie są one liczone jako używane, ponieważ nie kwalifikują się do R47, nawet jeśli program się bez nich zepsuje?
Jonathan Van Matre
@JonathanVanMatre Spacje, znaki nowej linii lub tabulatory nie liczą się, ponieważ uważam, że w przeciwnym razie punktacja byłaby zbyt skomplikowana; i nie chcę, aby biała spacja była w stanie zdobyć 100%, ponieważ to zniweczyłoby cel.
durron597
2
Wszystkim, którzy sprzeciwiają się moim szalonym regułom punktacji, prosimy o komentarz / odpowiedź tutaj: meta.codegolf.stackexchange.com/questions/1167/…
durron597

Odpowiedzi:

28

Rubinowy, 100% (74 znaków)

Wejście na STDIN, wyjście na STDOUT.

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

Druga linia to pierwsza linia ROT-47'd. Dlatego gdy ROT-47ing całego programu, staje się:

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

Moja strategia tutaj opiera się na tym, że:

  • Vjest 'kiedy ROT-47'd

  • jjest ;kiedy ROT-47'd

  • Dlatego Vj=...Vj;zamienia się w ';l...';, co w zasadzie jest zakazem

    • Teraz możesz utworzyć dowolny dowolny kod, który robi wszystko normalnie i nie ma żadnych operacji po ROT-47. Wynika to z faktu, że Vj=...Vj;można obsługiwać dowolny kod tak, jak można to zrobić Vj=0;{INSERT ANY CODE};Vj;, i stanie się to, '...';gdy ROT-47'd. Musisz tylko uważać, aby nie używać Vtego kodu, ponieważ spowoduje to jego uszkodzenie.
  • Podobną logikę można zastosować odwrotnie, aby uzyskać drugą połowę ( jVzamiast Vj)

Klamka
źródło
ok masz rację, nigdy tego nie określiłem i nie będę działał z mocą wsteczną. Jednak spacje nadal nie liczą się jako kwalifikujące się postacie; myślę, że powinno to być 136/140.
durron597
1
@ durron597 Naprawiono; nigdy więcej spacji.
Klamka
Dang ruby ​​nie wymagający wierszy kończących się średnikiem :)
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

Po przetłumaczeniu ROT-47 otrzymujemy

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

Oba programy się kompilują, a ROT-47-tłumaczy pierwszy argument:

$ ./a "hello world"
96==@ H@C=5
mniip
źródło
Miałem problem z uruchomieniem tego na ideone. Jestem pod wielkim wrażeniem, że widzę wynik powyżej 50%!
durron597
@ durron597 Nie działa na ideone, ponieważ przyjmuje dane wejściowe za pomocą argumentów, a nie standardowego
mniip
1
Głosowanie za implementacją ROT-47 dla argumentów, nie tylko dla własnego tłumaczenia. To powinno być w specyfikacji.
Jonathan Van Matre
10

GolfScript, 120/120 bajtów = 100%

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

lub w ROT-47:

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

Brak komentarzy lub nadużyć ze względu na ciąg Niezdefiniowane polecenie LiUUbamUUZadckYLfZfZhcTbbZNYNT(które równa się reszcie kodu w ROT-47) nie działa, ale nadal jest wykonywane przez interpreter, więc uważam, że liczy się jako używane.

To było w rzeczywistości dość łatwe wyzwanie w GolfScript. Główną trudnością było uniknięcie cyfry 1, która jest odwzorowywana przez ROT-47 na polecenie GolfScript `. Polecenia ., -, ,, \, [, /, ]a ^także należało unikać, ale to było dość łatwo w tym przypadku, ponieważ zadanie nie wymagało budowy tablicy.

Premia:

Oto quine z okresu 2 w języku GolfScript (tj. Program, który drukuje drugi program, który drukuje ponownie pierwszy program), w którym oba programy są wzajemnie transformacjami ROT-47:

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

Ten program sam wysyła kodowanie ROT-47, uzyskując inny program GolfScript:

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

który z kolei sam również wysyła kodowanie ROT-47, co ponownie daje poprzedni program. Tak więc ten program jest również obrotowym quine .

Ilmari Karonen
źródło
Twój mianownik jest niepoprawny: „podzielony przez całkowitą liczbę bajtów (wszystkie znaki) obu wersji”. 60/120 = 50%
Jonathan Van Matre
@JonathanVanMatre: Wszystkie bajty w obu wersjach są używane (= wykonywane przez interpretera), więc będzie to 120/120 = wciąż 100%.
Ilmari Karonen
Nie jestem pewien co do wyniku, ponieważ nie znam gry w golfa. Wiem, że na przykład Aw pieprzeniu mózgu liczyłby się licznik, ale nie mianownik. Czy to to samo, czy inne?
durron597
@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTjest poprawnym identyfikatorem w GolfScript i zostanie wykonany jako polecenie. Nie jest to jednak jedna z wbudowanych komend ani program nie przypisuje znaczenia, więc domyślnie po prostu nic nie robi.
Ilmari Karonen
6

python, 96,1% (?)

Zgodnie z Twoją definicją ciągi liczą się jako użyty kod?

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
źródło
1
Patrząc