Transmogrificateur ancien code C *


13

* Qu'est-ce qu'un transmogrificateur?

Dans le langage de programmation C , il existe des formations appelées digraphes et trigraphes qui sont des séquences de deux et trois caractères évaluées en caractères moins courants. Par exemple, vous pouvez utiliser ??-si votre clavier n'en a pas ~.

Étant donné le texte, remplacez toutes les instances des digraphes et trigraphes suivants (côté gauche) par le caractère golfé correct, le plus court (côté droit).

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

La source

Contribution

L'entrée est du texte ASCII. Retour à la ligne autorisé. N'a pas besoin d'être un code C valide.

Production

La sortie est le même texte, avec toutes les instances des digraphes et trigraphes ci-dessus remplacées par la version raccourcie, évaluée de gauche à droite. Retour à la ligne autorisé. N'a pas besoin d'être un code C valide.

Cas de test

=> sépare l'entrée et la sortie.

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
Veuillez supprimer les `s des exemples. Cela les rend si difficiles à lire.
caird coinheringaahing

4
"??=%:"est un autre cas de test pertinent: en C, cela signifie "#%:"%:n'est pas spécial, mais je pense que votre sortie attendue est "##".
hvd

@ Satan'sSon fera l'affaire, je ne l'avais pas à l'origine dans un bloc de code pour rendre les entrées / sorties plus lisibles, mais Riker l'a changé. N'hésitez pas à modifier quelque chose comme le formatage vous-même la prochaine fois :)
Stephen

1
Donc, vous demandez du code golfé au code golf. Golf bonus :-)
Mât

@Mast c'est l'idée
Stephen

Réponses:



7

C, 206 205 octets

(-1 grâce au plafond)

Les nouvelles lignes sont juste là pour plus de lisibilité.

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

Modifie ssur place. Testé avec GCC et clang sur Fedora Workstation, x86, en mode 32 bits et 64 bits.

C n'est pas exactement le meilleur langage pour jouer au golf ici.


C is not exactly the best language for golfing here.sans blague. Ça a l'air bien :) En y repensant, j'aurais dû forcer toutes les questions à ajouter +1 ou +2 octets s'ils utilisaient l'un des caractères qu'un digraphe ou un trigraphe fait xD
Stephen

1
Cela pourrait être encore pire: +1 ou +2 pour chaque personnage qui peut faire partie d'un di- / trigraphe ferait vraiment mal :)
hvd

5

JavaScript (ES6), 106 octets

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

Comment?

C'est assez simple.

Notons cependant que:

  • Lorsque i est inférieur à 9 , l'expression '<:<%%'[i-9] + ':>%>:'[i-9]évalue à undefined + undefinedqui est égal NaN(fausse comme prévu).

  • Lorsque i est supérieur ou égal à 9 , l'expression '??' + "=/'()!<>-"[i]évalue à "??" + undefinedlaquelle est contraint la chaîne "??undefined"(véridique lorsque nous attendons un résultat falsifié).

C'est pourquoi nous devons traiter le test dans cet ordre.

Cas de test



2

Javascript (ES6), 131 123 octets

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 octets

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

Essayez-le en ligne!

PHP, 115 octets

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

Essayez-le en ligne!

PHP, 124 octets

Solution Regex

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

Essayez-le en ligne!


1

JavaScript (ES6), 113 octets

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

Pas le plus court, mais je voulais essayer une approche différente.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.