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

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

<:> => [>

<::> => []

:>> => ]>

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

: > => : >

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

5

Rétine , 65 octets

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

Essayez-le en ligne! Test un peu gênant à utiliser mais me fait encore économiser 14 octets.

Neil
la source
Pouvez-vous faire \?\?[^:%]?
ETHproductions
( \?\?[^:%?]plutôt)
ETHproductions
@ETHproductions qui aurait un effet secondaire de transformer également ??aen a.
eush77
@ eush77 Oh hmm, vous avez raison ...
ETHproductions
La ligne 8 devrait être %>au lieu de >%.
Dennis
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.

hvd
la source
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

Arnauld
la source
2

Ruby , 104 + 1 = 105 octets

Utilise l' -pindicateur pour +1 octet.

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

Essayez-le en ligne!

Encre de valeur
la source
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))>

nderscore
la source
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!

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

ETHproductions
la source