Впровадити ROT-47… в ROT-47


23

Завдання: Внесіть ROT-47 у код, який працює як сам, так і як версія ROT-47.

Оцінка:

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

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

Зв'язки будуть порушені програмою з найбільшою кількістю результатів. Якщо все-таки є нічия, то виграє найкоротша програма.

Приклад оцінки:

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, хоча програма без них перерветься?
Джонатан Ван Матре

@JonathanVanMatre Пробіли чи нові рядки чи вкладки не враховуються, тому що я вважаю, що оцінка в іншому випадку буде занадто складною; і я не хочу, щоб Whitespace зміг набрати 100%, тому що це переможе мету.
durron597

2
Всім, хто заперечує проти моїх шалених правил балів, будь ласка, прокоментуйте / відповідь тут: meta.codegolf.stackexchange.com/questions/1167/…
durron597

Відповіді:


28

Ruby, 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'd. Це тому, що Vj=...Vj;може підтримувати виконання будь-якого коду, як ви могли Vj=0;{INSERT ANY CODE};Vj;, і це стане, '...';коли ROT-47'd. Ви просто повинні бути обережними, щоб не використовувати Vв цьому коді, оскільки це порушить його.
  • Подібна логіка може використовуватися в зворотному напрямку для отримання другої половини ( jVзамість Vj)


гаразд, ти прав, я ніколи цього не уточнював і не буду робити заднім числом. Однак пробіли все ще не вважаються прийнятними символами; це повинно бути 136/140, я думаю.
durron597

1
@ durron597 Виправлено; більше немає пробілів.
Дверна ручка

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

У мене були проблеми з тим, щоб це працювало на ideone. Я дуже вражений, бачачи вище 50%!
durron597

@ durron597 Він не буде працювати на ideone, оскільки він приймає введення через аргументи, а не stdin
mniip

1
Заявка на впровадження ROT-47 для аргументів, а не лише для самоперекладу. Це повинно було бути у специфікації.
Джонатан Ван Матре

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. Основна складність полягала в уникненні цифри 1, яка ROT-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%
Джонатан Ван Матре

@JonathanVanMatre: Усі байти в обох версіях використовуються (= виконується інтерпретатором), так що це було б 120/120 = все ще 100%.
Ільмарі Каронен

Я не впевнений у оцінці, тому що не знаю гольфскрипту. Я знаю, що, наприклад, Aу "мозковій епізоді" буде рахуватися в чисельнику, але не в знаменнику. Це одне і те ж чи інше?
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'

1
У ретроспективі їх не повинно було бути, але зараз вже занадто пізно
durron597
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.