Transfigurador de código C antiguo *

13

* ¿Qué es un transfigurador?

En el lenguaje de programación C , hay formaciones llamadas dígrafos y trigrafos que son secuencias de dos y tres caracteres que se evalúan como caracteres menos comunes. Por ejemplo, puede usar ??-si su teclado no tiene ~.

Dado el texto, reemplace todas las instancias de los siguientes dígrafos y trigráficos (lado izquierdo) con el carácter correcto, más corto y golfizado (lado derecho).

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

Fuente

Entrada

La entrada es texto ASCII. Nueva línea final permitida. No necesita ser un código C válido.

Salida

La salida es el mismo texto, con todas las instancias de los dígrafos y trigrafos anteriores reemplazados por la versión abreviada, evaluada de izquierda a derecha. Nueva línea final permitida. No necesita ser un código C válido.

Casos de prueba

=> separa entrada y salida.

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
fuente
3
Por favor, elimine las `s de los ejemplos. Los hace tan difíciles de leer.
caird coinheringaahing
44
"??=%:"Es otro caso de prueba relevante: en C, esto significa "#%:"que %:no es especial, pero creo que su salida esperada es "##".
hvd
@ Satan'sSon lo hará, originalmente no lo tenía en un bloque de código para que la entrada / salida fuera más legible, pero Riker lo cambió. Siéntase libre de editar algo como formatearse la próxima vez :)
Stephen
1
Entonces, está pidiendo un código de golf para el código de golf. Golf extra :-)
Mástil
@Mast esa es la idea
Stephen

Respuestas:

5

Retina , 65 bytes

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

Pruébalo en línea! Tes un poco incómodo de usar pero todavía me ahorra 14 bytes.

Neil
fuente
Puedes hacer \?\?[^:%]?
ETHproductions
( \?\?[^:%?]más bien)
ETHproductions
@ETHproductions Eso tendría un efecto secundario de convertirse también ??aen a.
eush77
@ eush77 Oh hmm, tienes razón ...
ETHproductions
La línea 8 debería ser en %>lugar de >%.
Dennis
7

C, 206 205 bytes

(-1 gracias a ceilingcat)

Las nuevas líneas están aquí para facilitar la lectura.

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

Modifica s en su lugar. Probado con GCC y clang en Fedora Workstation, x86, en modo de 32 bits y 64 bits.

C no es exactamente el mejor lenguaje para jugar golf aquí.

hvd
fuente
C is not exactly the best language for golfing here.en serio. Parece bueno :) Pensando en retrospectiva, debería haber obligado a todas las preguntas a agregar +1 o +2 bytes si usaran uno de los caracteres que hace un dígrafo o trigrafo xD
Stephen
1
Podría empeorar las cosas: +1 o +2 para cada personaje que puede ser parte de un di- / trigrafo realmente dolería :)
hvd
5

JavaScript (ES6), 106 bytes

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

¿Cómo?

Esto es bastante sencillo.

Sin embargo, debemos tener en cuenta que:

  • Cuando i es menor que 9 , la expresión '<:<%%'[i-9] + ':>%>:'[i-9]evalúa undefined + undefinedcuál es igual NaN(falso como se esperaba).

  • Cuando i es mayor o igual que 9 , la expresión '??' + "=/'()!<>-"[i]evalúa "??" + undefinedcuál es coaccionado a la cadena "??undefined"(verdadero cuando esperamos un resultado falso).

Es por eso que debemos procesar la prueba en este orden.

Casos de prueba

Arnauld
fuente
2

Ruby , 104 + 1 = 105 bytes

Utiliza la -pbandera para +1 byte.

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

Pruébalo en línea!

Tinta de valor
fuente
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
fuente
2

PHP, 112 bytes

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

Pruébalo en línea!

PHP, 115 bytes

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

Pruébalo en línea!

PHP, 124 bytes

Solución Regex

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

Pruébalo en línea!

Jörg Hülsermann
fuente
1

JavaScript (ES6), 113 bytes

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

No es el más corto, pero quería probar un enfoque diferente.

ETHproductions
fuente