Старий трансмогрифікатор коду C *


13

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

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

Наданий текст, замініть всі екземпляри наступних диграфів і триграфів (лівий бік) правильним, коротшим символом для гольфу (правий бік).

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

Джерело

Вхідні дані

Вхід - текст ASCII. Дозволений трейлінг нового рядка. Не потрібно бути дійсним кодом С.

Вихідні дані

Вихід - це той самий текст, усі екземпляри вищезазначених діаграм і триграфів замінені на скорочену версію, оцінену зліва направо. Дозволений трейлінг нового рядка. Не потрібно бути дійсним кодом С.

Випробування

=> розділяє вхід і вихід.

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 coinheringaahing

4
"??=%:"є іншим відповідним тестом: в C, це означає , "#%:"де %:не є особливим, але я думаю , що ваш очікуваний вихід "##".
hvd

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

1
Отже, ви просите код гольфу на код гольфу. Бонусний гольф :-)
Mast

@Mast така ідея
Стівен

Відповіді:


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 та клаксу на Fedora Workstation, x86, у 32-бітному та 64-бітному режимах.

Звідси не найкраща мова для гри в гольф.


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

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"(truthy, коли ми очікуємо хибного результату).

Тому ми повинні обробити тест у такому порядку.

Тестові справи



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 байти

Розчин Регексу

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.