Трансмогрификатор старого кода C *


13

* Что такое трансмогрификатор?

В языке программирования C существуют формации, называемые орграфами и триграфами, которые представляют собой последовательности из двух и трех символов, которые оцениваются в менее общие символы. Например, вы можете использовать, ??-если ваша клавиатура не имеет ~.

В данном тексте замените все экземпляры следующих орграфов и триграфов (слева) на правильные, более короткие символы гольфа (справа).

??=  #
??/  \
??'  ^
??(  [
??)  ]
??!  |
??<  {
??>  }
??-  ~
<:   [
:>   ]
<%   {
%>   }
%:   #

Источник

вход

Ввод текста ASCII. Трейлинг новой строки разрешен. Не должен быть действительный код C.

Выход

Вывод - один и тот же текст, все экземпляры вышеприведенных орграфов и триграфов заменены на сокращенную версию, оцениваемую слева направо. Трейлинг новой строки разрешен. Не должен быть действительный код C.

Тестовые случаи

=> разделяет ввод и вывод.

if (true ??!??! false) { => if (true || false) {

??-arr.indexOf(n) => ~arr.indexOf(n)

function f(??) { console.log('test??'); } => function f(] { console.log('test^); }

/* comment :> :) *??/ => /* comment ] :) *\

%:What am I doing??!!??` => `#What am I doing|!??

??(??)??(??) <:-- not a palindrome => [][] [-- not a palindrome

?????????? => ??????????

int f(int??(??) a) ??< return a??(0??)??'a??(1??) + "??/n"; ??> => int f(int[] a) { return a[0]^a[1] + "\n"; }

??<:>??<% => {]{%

<:> => [>

<::> => []

:>> => ]>

#\^[]|{}~ => #\^[]|{}~

: > => : >

??=%: => ##

3
Пожалуйста, удалите `s из примеров. Это делает их так трудно читать.
Caird Coneheringaahing

4
"??=%:"является другим соответствующим тестом: в C, это означает , "#%:"где %:не является особенным, но я думаю , что ваш ожидаемый выход "##".
HVd

@ Satan'sSon подойдет, у меня изначально это было не в блоке кода, чтобы сделать ввод / вывод более читабельным, но Райкер изменил его. Не стесняйтесь редактировать что-то вроде форматирования в следующий раз :)
Стивен

1
Итак, вы запрашиваете гольф-код для гольф-кода. Бонус гольф :-)
Мачта

@ Это идея
Стивен

Ответы:


5

Сетчатка , 65 байт

T`-=/'()!<>?`~#\\^[]|{}_`\?\?[-=/'()!<>]
<:
[
:>
]
<%
{
>%
}
%:
#

Попробуйте онлайн! Tнемного неудобно в использовании, но все равно экономит 14 байт.


Вы можете сделать \?\?[^:%]?
ETHproductions

( \?\?[^:%?]скорее)
ETHproductions

@ETHproductions Это будет иметь побочный эффект также превращается ??aв a.
eush77

@ eush77 Ой, хм, ты прав ...
ETHproductions

Строка 8 должна быть %>вместо >%.
Деннис

7

C, 206 205 байтов

(-1 благодаря потолочной кошке)

Новые строки просто для удобства чтения.

c,d,q;f(char*s){for(char*S,*T,*t=s;c-63?q=0:q++,d=c<<8|*s,*s?
q>1&&(T=index(S="=/'()!<>-",*s))?t-=2,*s="#\\^[]|{}~"[T-S]:
d>*s&&(T=strstr(S=">:<>%<:%",&d))&&(c="][ }{ # "[T-S])&1?--t,*s=c:0:
0,*t++=c=*s++;);}

Модифицируется sна месте. Протестировано с GCC и clang на Fedora Workstation, x86, в 32-битном и 64-битном режиме.

С не совсем лучший язык для игры в гольф.


C is not exactly the best language for golfing here.без шуток. Выглядит хорошо :) Вспоминая, я должен был заставить все вопросы добавить +1 или +2 байта, если бы они использовали один из символов, которые диграф или триграф делают xD
Стивен

1
Вы могли бы сделать это еще хуже: +1 или +2 для каждого персонажа, который может быть частью ди-триграфа, действительно повредило бы :)
hvd

5

JavaScript (ES6), 106 байт

s=>[...'#\\^[]|{}~[]{}#'].map((c,i)=>s=s.split('<:<%%'[i-9]+':>%>:'[i-9]||'??'+"=/'()!<>-"[i]).join(c))&&s

Как?

Это довольно просто.

Однако следует отметить, что:

  • Когда i меньше 9 , выражение '<:<%%'[i-9] + ':>%>:'[i-9]оценивает, undefined + undefinedчему равен NaN(ложь, как и ожидалось).

  • Когда i больше или равно 9 , выражение '??' + "=/'()!<>-"[i]оценивает, "??" + undefinedкакое значение приведено к строке "??undefined"(правда, когда мы ожидаем ложный результат).

Вот почему мы должны обрабатывать тест в таком порядке.

Контрольные примеры



2

Javascript (ES6), 131 123 байта

f=
s=>"#??= \\??/ ^??' [??( ]??) |??! {??< {??> ~??- [<: ]:> {<% }%> #%:".split` `.map(x=>s=s.split(x.slice(1)).join(x[0]))&&s
<input oninput=console.log(f(this.value))>


2

PHP, 112 байт

<?=str_replace(explode(_,strtr("<:_:>_<%_%>_%:0=0/0'0(0)0!0<0>0-",["_??"])),str_split("[]{}##\\^[]|{}~"),$argn);

Попробуйте онлайн!

PHP, 115 байт

<?=str_replace(explode(_,"??=_??/_??'_??(_??)_??!_??<_??>_??-_<:_:>_<%_%>_%:"),str_split("#\\^[]|{}~[]{}#"),$argn);

Попробуйте онлайн!

PHP, 124 байта

Regex решение

foreach(explode(_,"=|%:_/_'_\(|<:_\)|:>_!_<|<%_>|%>_-")as$v)$a=preg_replace("#\?\?$v#","#\\^[]|{}~"[$k++],$a=&$argn);echo$a;

Попробуйте онлайн!


1

JavaScript (ES6), 113 байт

s=>s.replace(/\?\?[^:%?]|[<:%]./g,c=>"#\\^[]|{}~"["=/'()!<>-".indexOf(c[2])]||"[] {} #"["<:><%>%:".indexOf(c)]||c)

Не самое короткое, но я хотел попробовать другой подход.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.