Transmogrificador de código C antigo *

13

* O que é um transmogrificador?

Na linguagem de programação C , há formações chamadas digrafos e trigramas que são sequências de dois e três caracteres que avaliam caracteres menos comuns. Por exemplo, você pode usar ??-se o teclado não tiver ~.

Com o texto, substitua todas as instâncias dos seguintes dígrafos e trigramas (lado esquerdo) pelo caractere correto, mais curto e em forma de golf (lado direito).

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

Fonte

Entrada

A entrada é texto ASCII. Nova linha à direita permitida. Não precisa ser um código C válido.

Resultado

A saída é o mesmo texto, com todas as instâncias dos dígrafos e trigramas acima substituídas pela versão reduzida, avaliadas da esquerda para a direita. Nova linha à direita permitida. Não precisa ser um código C válido.

Casos de teste

=> separa entrada e saída.

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
fonte
3
Por favor, remova os `s dos exemplos. Isso os torna tão difíceis de ler.
Caird coinheringaahing
4
"??=%:"é outro caso de teste relevante: em C, isso significa "#%:"que %:não é especial, mas acho que é o resultado esperado "##".
hvd 20/05
@ Satan'sSon serve, eu originalmente não tinha um bloco de código para tornar a entrada / saída mais legível, mas Riker mudou. Sinta-se livre para editar algo como formatar-se na próxima vez :)
Stephen
1
Então, você está solicitando código de golfe para código de golfe. Bonus golf :-)
Mastro
@Mast essa é a idéia
Stephen

Respostas:

5

Retina , 65 bytes

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

Experimente online! Té um pouco estranho de usar, mas ainda me salva 14 bytes.

Neil
fonte
Você pode fazer \?\?[^:%]?
ETHproductions
( \?\?[^:%?]sim)
ETHproductions
@ETHproductions Isso teria um efeito colateral de também transformar ??aem a.
eush77
@ eush77 Oh hmm, você está certo ...
ETHproductions
A linha 8 deve estar em %>vez de >%.
Dennis
7

C, 206 205 bytes

(-1 graças a ceilingcat)

As novas linhas estão aqui apenas para facilitar a leitura.

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 sno local. Testado com GCC e clang na Estação de Trabalho Fedora, x86, no modo de 32 bits e 64 bits.

C não é exatamente o melhor idioma para jogar golfe aqui.

hvd
fonte
C is not exactly the best language for golfing here.sem brincadeiras. Looks good :) volta Pensando, eu deveria ter forçado todas as perguntas para adicionar +1 ou +2 bytes se eles usaram um dos caracteres que um dígrafo ou trigraph faz xD
Stephen
1
Você pode piorar ainda mais: +1 ou +2 para cada personagem que pode fazer parte de um di- / trigraph seria realmente prejudicial :) #
301
5

JavaScript (ES6), 106 bytes

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

Quão?

Isso é bem direto.

No entanto, devemos observar que:

  • Quando i é menor que 9 , a expressão '<:<%%'[i-9] + ':>%>:'[i-9]avalia como undefined + undefinedigual NaN(falso conforme o esperado).

  • Quando i é maior ou igual a 9 , a expressão '??' + "=/'()!<>-"[i]avalia "??" + undefinedqual é a coerção da string "??undefined"(na verdade quando esperamos um resultado falso).

É por isso que devemos processar o teste nesta ordem.

Casos de teste

Arnauld
fonte
2

Ruby , 104 + 1 = 105 bytes

Usa o -psinalizador para +1 byte.

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

Experimente online!

Value Ink
fonte
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
fonte
2

PHP, 112 bytes

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

Experimente online!

PHP, 115 bytes

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

Experimente online!

PHP, 124 bytes

Solução Regex

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

Experimente online!

Jörg Hülsermann
fonte
1

JavaScript (ES6), 113 bytes

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

Não é o mais curto, mas eu queria tentar uma abordagem diferente.

ETHproductions
fonte