ROT-47에서 ROT-47… 구현


23

도전 과제 : 자체 및 ROT-47 버전으로 작동하는 코드에서 ROT-47 을 구현 하십시오.

채점 :

점수는 프로그램의 두 버전의 총 사용 된 ROT-47 적격 바이트 의 백분율을 두 버전의 총 바이트 (모든 문자)로 나눈 값으로 계산됩니다 .

사용, ROT-47 자격 바이트 하지 않은 ROT-47 암호에 의해 변환 될 수있는 문자 주석의 일부 또는 컴파일러 / 인터프리터에서 무시. 예를 들어, brainfuck 프로그램에서 문자 +-<>[],.가 아닌 문자는 사용 된 바이트로 간주되지 않으며 C 프로그램의 문자와 이후 //또는 내부를 포함하는 문자 /* */는 사용 된 바이트로 간주되지 않습니다. 공백 프로그램의 모든 문자와 마찬가지로 APL의 모든 특수 기호는 사용 된 것으로 간주되지 않습니다 (죄송합니다).

공감 율이 가장 높은 프로그램에 의해 동점이 발생합니다. 여전히 동점이 있다면 가장 짧은 프로그램이 승리합니다.

점수 예 :

C : 62/64 = 96.875 %

이 프로그램에는 공간이 있습니다. 분명히이 프로그램은 컴파일되지 않기 때문에 유효한 항목이 아니지만 점수 매기기 작동 방식을 보여주고 싶었습니다.

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

4
그리고 어떤 언어로 >2:?WXLAC:?E7WQw6==@ (@C=5PQXjN컴파일됩니까?
Hosch250

@ hosch250 lol, 그건 바보 같은 예입니다
durron597

1
"ROT-47 적격"이란 "ASCII 범위 33 ~ 126"을 의미합니까? 즉, C 프로그램에 공백이나 줄 바꿈 또는 탭이 있으면 ROT-47을 사용할 수 있습니까? 프로그램이 많은 언어로 작동하기 위해서는 일부 공간이 필수적이라는 사실은 어떻습니까? R47을 사용할 수 없기 때문에 사용하지 않는 공간이 있습니까?
Jonathan Van Matre

@JonathanVanMatre 공백이나 줄 바꿈 또는 탭은 점수가 너무 복잡하다고 생각하기 때문에 계산되지 않습니다. Whitespace가 100 %의 점수를 매길 수 있기를 원하지 않습니다. 왜냐하면 그것이 목표를 무너 뜨릴 것이기 때문입니다.
durron597

2
내 미친 점수 규칙에 반대하는 모든 사람들에게 여기에 의견 / 답변을 보내
durron597

답변:


28

루비, 100 % (74 자)

STDIN에 입력, STDOUT에 출력

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

두 번째 줄은 첫 번째 줄 ROT-47'd입니다. 따라서 전체 프로그램을 ROT-47하면 다음과 같이됩니다.

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

여기 내 전략은 다음과 같은 사실에 근거합니다.

  • V'경우 ROT-47'd은

  • j;경우 ROT-47'd은

  • 따라서 기본적으로 no-op 인 Vj=...Vj;로 바뀝니다.';l...';

    • 이제 ROT-47을 사용할 때 정상적으로 작동하지 않는 임의의 코드를 작성할 수 있습니다. 가능한 한 Vj=...Vj;모든 코드 실행을 지원할 수 있기 때문에 ROT-47이 실행될 때가 Vj=0;{INSERT ANY CODE};Vj;될 것 '...';입니다. V해당 코드에서 사용하지 않도록주의 해야합니다.
  • 비슷한 논리를 반대로 사용하여 후반부를 생성 할 수 있습니다 ( jV대신 Vj)


좋아, 당신은 내가 그것을 지정하지 않았으며 소급하지 않을 것입니다. 그러나 공백은 여전히 ​​적합한 문자로 간주되지 않습니다. 이것은 내가 생각하는 136/140이어야합니다.
durron597

1
@ durron597 고정; 더 이상 공백이 없습니다.
Doorknob

Dang ruby는 세미콜론으로 끝나는 줄을 요구하지 않습니다 :)
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

ROT-47이 번역되면

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

두 프로그램 모두 첫 번째 인수를 컴파일하고 ROT-47을 번역합니다.

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

나는 이것이 아이디어로 작동하는 데 어려움을 겪었습니다. 그래도 50 % 이상의 점수를받은 것은 매우 인상적입니다!
durron597

@ durron597 그것은 인수를 통해 입력을 허용으로 ideone에없는 일이 아니라 표준 입력합니다
mniip

1
자체 번역뿐만 아니라 인수에 대한 ROT-47 구현에 대한 찬성 그것은 사양에 있었을 것입니다.
Jonathan Van Matre

10

GolfScript, 120/120 바이트 = 100 %

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

또는 ROT-47에서 :

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

댓글이나 문자열 남용이 없습니다. 정의되지 않은 명령 LiUUbamUUZadckYLfZfZhcTbbZNYNT(ROT-47의 나머지 코드와 동일)은 작동하지 않지만 여전히 인터프리터에 의해 실행되므로 사용 된 것으로 간주됩니다.

이것은 실제로 GolfScript에서 매우 쉬운 도전이었습니다. 가장 어려운 점은 1ROT-47에 의해 GolfScript 명령으로 매핑되는 숫자를 피하는 것이 었습니다 `. 명령은 ., -, ,, \, [, /, ]^도 피해야했지만, 작업이 더 배열 건물이 필요 없기 때문에 즉,이 경우 매우 쉬웠다.

보너스:

다음은 GolfScript 기간 2 퀴즈 (즉, 첫 번째 프로그램을 다시 인쇄하는 두 번째 프로그램을 인쇄하는 프로그램)입니다. 여기서 두 프로그램은 서로의 ROT-47 변환입니다.

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

이 프로그램은 자체적으로 ROT-47로 인코딩되어 다른 GolfScript 프로그램을 생성합니다.

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

결과적으로 ROT-47로 인코딩되어 이전 프로그램을 다시 생성합니다. 따라서이 프로그램은 회전하는 퀴네 이기도합니다 .


분모가 잘못되었습니다 : "두 버전의 총 바이트 (모든 문자)로 나뉩니다." 60/120 = 50 %
Jonathan Van Matre

@JonathanVanMatre : 두 버전의 모든 바이트가 사용되므로 (= 인터프리터에 의해 실행 됨) 120/120 = 여전히 100 %입니다.
Ilmari Karonen

골프 스크립트를 모르기 때문에 점수를 잘 모르겠습니다. 예를 들어 Abrainfuck에서 분자는 계산할 수 있지만 분모는 계산하지 않습니다. 이것은 같거나 다른가요?
durron597

@ durron597 : LiUUbamUUZadckYLfZfZhcTbbZNYNT은 GolfScript 의 유효한 식별자이며 명령으로 실행됩니다. 그러나 내장 명령 중 하나도 아니며 프로그램에서 의미를 할당하지 않으므로 기본적으로 아무 것도 수행하지 않습니다.
Ilmari Karonen

6

파이썬, 96.1 % (?)

정의에 따르면 문자열은 사용 된 코드로 계산됩니까?

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
돌이켜 보면
안되지만
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.