Stary transmogryfikator kodu C *

13

* Co to jest transmogrifier?

W języku programowania C istnieją formacje zwane digrafami i trigrafami, które są sekwencjami dwu- i trzyznakowymi , które oceniają na mniej popularne znaki. Na przykład możesz użyć, ??-jeśli klawiatura nie ma ~.

Biorąc pod uwagę tekst, zamień wszystkie wystąpienia następujących digrafów i trigrafów (po lewej stronie) na prawidłowy, krótszy znak golfa (po prawej stronie).

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

Źródło

Wejście

Dane wejściowe to tekst ASCII. Dozwolony końcowy znak nowej linii. Nie musi być prawidłowym kodem C.

Wynik

Wyjście jest tym samym tekstem, a wszystkie wystąpienia powyższych digrafów i trigrafów zastąpione skróconą wersją, oceniane od lewej do prawej. Dozwolony końcowy znak nowej linii. Nie musi być prawidłowym kodem C.

Przypadki testowe

=> oddziela wejście i wyjście.

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"; }

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

<:> => [>

<::> => []

:>> => ]>

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

: > => : >

??=%: => ##
Stephen
źródło
3
Usuń `s z przykładów. To sprawia, że ​​tak trudno je odczytać.
caird coinheringaahing
4
"??=%:"to kolejny istotny przypadek testowy: w C, oznacza to, "#%:"gdzie %:nie jest wyjątkowy, ale myślę, że planują wyjście "##".
hvd
@ Satan'sSon zrobi, pierwotnie nie miałem go w bloku kodu, aby uczynić wejście / wyjście bardziej czytelnym, ale Riker to zmienił. Następnym razem możesz edytować coś takiego jak formatowanie :)
Stephen
1
Więc prosisz o kod do gry w golfa. Bonusowy golf :-)
Mast
@Masta to jest pomysł
Stephen

Odpowiedzi:

5

Siatkówka , 65 bajtów

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

Wypróbuj online! Tjest trochę niewygodny w użyciu, ale wciąż oszczędza mi 14 bajtów.

Neil
źródło
Można to zrobić \?\?[^:%]?
ETHprodukcje
( \?\?[^:%?]raczej)
ETHprodukcje
@ETHproductions które byłyby skutkiem ubocznym także obracając ??asię a.
eush77
@ eush77 Oh hmm, masz rację ...
ETHprodukcje
Linia 8 powinna być %>zamiast >%.
Dennis
7

DO, 206 205 bajtów

(-1 dzięki pułapkowi cat)

Nowe linie są tutaj tylko dla czytelności.

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

Modyfikuje sna miejscu. Testowane z GCC i clang na Fedorze Workstation, x86, w trybie 32-bitowym i 64-bitowym.

C nie jest tu najlepszym językiem do gry w golfa.

hvd
źródło
C is not exactly the best language for golfing here.bez żartów. Wygląda dobrze :) Myśląc wstecz, powinienem był zmusić wszystkie pytania, aby dodać +1 lub +2 bajty, jeśli użyły jednej z postaci, którą xD lub Trigraf tworzy xD
Stephen
1
Mogłoby być jeszcze gorzej: +1 lub +2 za każdą postać, która może być częścią di- / trigraph, naprawdę by bolało :)
hvd
5

JavaScript (ES6), 106 bajtów

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

W jaki sposób?

To jest całkiem proste.

Należy jednak pamiętać, że:

  • Gdy i jest mniejsze niż 9 , wyrażenie '<:<%%'[i-9] + ':>%>:'[i-9]ocenia, undefined + undefinedktóry jest równy NaN(fałsz zgodnie z oczekiwaniami).

  • Gdy i jest większe lub równe 9 , wyrażenie '??' + "=/'()!<>-"[i]ocenia, do "??" + undefinedczego jest przymuszany do łańcucha "??undefined"(prawda, gdy spodziewamy się wyniku fałszowania).

Dlatego musimy przetworzyć test w tej kolejności.

Przypadki testowe

Arnauld
źródło
2

Rubinowy , 104 + 1 = 105 bajtów

Używa -pflagi dla bajtu +1.

"=#/\\'^([)]!|<{>}-~".scan(/(.)(.)/){|k,v|gsub'??'+k,v}
"<:[:>]<%{%>}%:#".scan(/(..)(.)/){|k,v|gsub k,v}

Wypróbuj online!

Wartość tuszu
źródło
2

JavaScript (ES6), 131 123 bajtów

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

nderscore
źródło
2

PHP, 112 bajtów

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

Wypróbuj online!

PHP, 115 bajtów

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

Wypróbuj online!

PHP, 124 bajty

Rozwiązanie Regex

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

Wypróbuj online!

Jörg Hülsermann
źródło
1

JavaScript (ES6), 113 bajtów

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

Nie najkrótszy, ale chciałem spróbować innego podejścia.

ETHprodukcje
źródło