Alter C-Code-Transmogrifier *


13

* Was ist ein Transmogrifier?

In der Programmiersprache C gibt es Formationen, die als Digraphen und Trigraphen bezeichnet werden. Dabei handelt es sich um Sequenzen mit zwei und drei Zeichen, die mit weniger gebräuchlichen Zeichen bewertet werden. Zum Beispiel können Sie verwenden, ??-wenn Ihre Tastatur nicht hat ~.

Ersetzen Sie bei gegebenem Text alle Instanzen der folgenden Digraphen und Trigraphen (linke Seite) durch das richtige, kürzere, golfene Zeichen (rechte Seite).

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

Quelle

Eingang

Eingabe ist ASCII-Text. Zeilenumbruch erlaubt. Muss kein gültiger C-Code sein.

Ausgabe

Es wird derselbe Text ausgegeben, wobei alle oben genannten Digraphen und Trigraphen durch die verkürzte Version ersetzt und von links nach rechts ausgewertet werden. Zeilenumbruch erlaubt. Muss kein gültiger C-Code sein.

Testfälle

=> trennt Eingang und Ausgang.

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
Bitte entfernen Sie die `s aus den Beispielen. Es macht sie so schwer zu lesen.
Caird Coinheringaahing

4
"??=%:"ist ein weiterer relevanter Testfall: In C bedeutet dies, "#%:"dass %:nichts Besonderes vorliegt, aber ich denke, Ihre erwartete Ausgabe ist "##".
HDV

@ Satan'sSon reicht, ich hatte es ursprünglich nicht in einem Codeblock, um die Ein- / Ausgabe lesbarer zu machen, aber Riker hat es umgestellt. Fühlen Sie sich frei, etwas zu bearbeiten, wie sich das nächste Mal zu formatieren :)
Stephen

1
Sie fordern also Code für Code für Golf. Bonus Golf :-)
Mast

@ Mast das ist die Idee
Stephen

Antworten:



7

C, 206 205 Bytes

(-1 dank ceilingcat)

Die Zeilenumbrüche dienen lediglich der Lesbarkeit.

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

Wird san Ort und Stelle geändert . Getestet mit GCC und Clang auf Fedora Workstation, x86, im 32-Bit- und 64-Bit-Modus.

C ist hier nicht gerade die beste Sprache zum Golfen.


C is not exactly the best language for golfing here.Im Ernst. Sieht gut aus :) Wenn ich zurückdenke, hätte ich alle Fragen zwingen müssen, +1 oder +2 Bytes hinzuzufügen, wenn sie eines der Zeichen verwendet hätten, die ein Digraph oder Trigraph xD ergibt
Stephen

1
Du
könntest

5

JavaScript (ES6), 106 Byte

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

Wie?

Das ist ziemlich einfach.

Wir sollten jedoch beachten, dass:

  • Wenn i kleiner als 9 ist , wird der Ausdruck '<:<%%'[i-9] + ':>%>:'[i-9]ausgewertet, undefined + undefinedder gleich ist NaN(falsy as expected).

  • Wenn i größer als oder gleich 9 ist , wird der Ausdruck '??' + "=/'()!<>-"[i]ausgewertet, "??" + undefinedder zur Zeichenfolge gezwungen wird "??undefined"(wahr, wenn wir ein falsches Ergebnis erwarten).

Deshalb müssen wir den Test in dieser Reihenfolge durchführen.

Testfälle



2

Javascript (ES6), 131 123 Bytes

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 Bytes

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

Probieren Sie es online!

PHP, 115 Bytes

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

Probieren Sie es online!

PHP, 124 Bytes

Regex-Lösung

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

Probieren Sie es online!


1

JavaScript (ES6), 113 Byte

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

Nicht die kürzeste, aber ich wollte einen anderen Ansatz ausprobieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.