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

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

<:> => [>

<::> => []

:>> => ]>

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

: > => : >

??=%: => ##
Stephen
quelle
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:

5

Netzhaut , 65 Bytes

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

Probieren Sie es online! Tist etwas umständlich zu bedienen spart mir aber trotzdem 14 bytes.

Neil
quelle
Schaffst du das \?\?[^:%]?
ETHproductions
( \?\?[^:%?]eher)
ETHproductions
@ETHproductions Das hätte den Nebeneffekt auch ??azu werden a.
eush77
@ eush77 Oh hmm, du hast recht ...
ETHproductions
Zeile 8 sollte %>statt sein >%.
Dennis
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.

hvd
quelle
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

Arnauld
quelle
2

Ruby , 104 + 1 = 105 Bytes

Verwendet das -pFlag für +1 Byte.

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

Probieren Sie es online!

Wert Tinte
quelle
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))>

nderscore
quelle
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!

Jörg Hülsermann
quelle
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.

ETHproductions
quelle