Внедрить ROT-47… в ROT-47

23

Задача: реализовать ROT-47 в коде, который работает как сам по себе, так и в качестве версии ROT-47.

Подсчет очков:

Ваша оценка рассчитывается как процент использованных, ROT-47 приемлемых байтов в сумме обеих версий программы, деленный на общее количество байтов (всех символов) обеих версий .

Используется, ROT-47 байт право любой символ , который будет преобразован в ROT-47 шифром , который не является частью комментария или игнорируется компилятором / переводчика. Например, любой символ в программе brainfuck, который не +-<>[],.является неиспользуемым байтом, не считается используемым байтом, а любой символ в программе на C, включая и после //или внутри /* */, не считается использованным байтом. Все специальные символы в APL не считаются используемыми, как и все символы в программе Whitespace (извините).

Связи будут нарушены программой с наибольшим количеством голосов. Если все еще есть ничья, выигрывает самая короткая программа.

Пример оценки:

С: 62/64 = 96,875%.

Обратите внимание, что в этой программе есть пробел. Очевидно также, что эта программа не является допустимой записью, потому что она даже не компилируется, но я хотел показать, как работает скоринг.

main(){printf("Hello World!");}
durron597
источник
4
И на каком языке >2:?WXLAC:?E7WQw6==@ (@C=5PQXjNкомпилируется?
Hosch250
@ hosch250 лол, это был просто глупый пример
durron597
1
Под «ROT-47, отвечающим требованиям» вы имеете в виду «в диапазоне ASCII от 33 до 126»? Т.е., если в моей программе на С есть пробелы, символы новой строки или табуляции, они считаются подходящими для ROT-47 или нет? Как насчет того факта, что некоторые пробелы необходимы для того, чтобы программа функционировала на многих языках - не считаются ли они используемыми, потому что они не соответствуют требованиям R47, даже если программа обойдется без них?
Джонатан Ван Матр
@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

  • Следовательно, Vj=...Vj;превращается в ';l...';, который по сути является неоперацией

    • Теперь вы можете создать любой произвольный код, который делает что-нибудь нормально и не работает при ROT-47. Это потому, что Vj=...Vj;может поддерживать запуск любого кода, как вы могли бы Vj=0;{INSERT ANY CODE};Vj;, и это станет, '...';когда ROT-47'd. Вы просто должны быть осторожны, чтобы не использовать Vэтот код, так как это сломает его.
  • Аналогичная логика может быть использована в обратном порядке для производства второй половины ( jVвместо Vj)

Дверная ручка
источник
хорошо, вы правы, я никогда не указывал это, и я не буду задним числом. Однако пробелы по-прежнему не считаются подходящими символами; это должно быть 136/140, я думаю.
durron597
1
@ durron597 Исправлено; больше нет пробелов
Дверная ручка
Dang ruby ​​не требует, чтобы строки заканчивались точкой с запятой :)
durron597
16

С - 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
МНИИП
источник
У меня были проблемы с тем, чтобы заставить это работать на ideone. Я очень впечатлен, увидев результат выше 50%!
durron597
@ durron597 Он не будет работать на ideone, так как он принимает входные данные через аргументы, а не через stdin
mniip
1
Upvote для реализации ROT-47 для аргументов, а не только для самостоятельного перевода. Это должно было быть в спецификации.
Джонатан Ван Матре
10

GolfScript, 120/120 байт = 100%

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

или в ROT-47:

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

Нет комментариев или злоупотребления строкой. Команда undefined LiUUbamUUZadckYLfZfZhcTbbZNYNT(равная остальной части кода в ROT-47) не работает, но все равно выполняется интерпретатором, поэтому я считаю, что она считается использованной.

На самом деле это было довольно легко выпустить в GolfScript. Основная трудность заключалась в том, чтобы избежать цифры 1, которая отображается ROT-47 в команде GolfScript `. Команды ., -, ,, \, [, /, ]и ^также было избежать, но это было довольно легко в этом случае, поскольку задача не требует строительства массива.

Бонус:

Вот квин - код GolfScript period-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%
Джонатан Ван Матре
@JonathanVanMatre: все байты в обеих версиях используются (= выполняются интерпретатором), так что это будет 120/120 = все еще 100%.
Ильмари Каронен,
Я не уверен в выигрыше, потому что я не знаю сценарий игры в гольф. Я знаю, что, например, Aв Brainfuck будет учитываться в числителе, но не знаменатель. Это одно и то же или другое?
durron597
@ durron597: LiUUbamUUZadckYLfZfZhcTbbZNYNTявляется допустимым идентификатором в GolfScript и будет выполнен как команда. Однако это не одна из встроенных команд , и ей не присваивается значение программой, поэтому по умолчанию она просто ничего не делает.
Ильмари Каронен,
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'
qwr
источник
1
Оглядываясь назад, они не должны были этого делать, но сейчас уже слишком поздно
durron597