Forçando o cavalo

8

É simples: crie o script mais curto do navegador para transformar todas as aparências de força em uma página da Web em cavalo. Esse script precisa poder ser colado no console e funcionar nos navegadores mais modernos.

Você deve substituir todas as ocorrências da palavra força e conjugados da palavra força (forçar, forçar, reforçar). Os casos também devem ser preservados.

Você não deve alterar nenhuma ocorrência que não esteja visível quando a página for exibida em um navegador. Por exemplo, meta tags ou comentários.

Exemplo

Isto é um fOrcE log. Isso torna as pessoas que o tocam com muita força. Não tente forçá-lo.

Isto é um hOrsE log. Faz com que as pessoas que a tocam sejam muito sinceras. Não tente detê-lo.

Infelizmente, este é um desafio apenas para Javascript. O código mais curto vence.

Beta Decay
fonte
2
Lol para xkcd XD
ThreeFx 08/08
9
forçar não contém a palavra força .
Dennis
2
Ou a pergunta permite a substituição de forcem hors- ou é a substituição de todas as diferentes conjugações de forceem suas versões de cavalos. No primeiro caso, temos coisas como "Reinhorsing", etc. No último, apenas forcingseria uma exceção. O OP deve esclarecer.
absinto
2
E os equivalentes eqüinos de forçar , forçosamente , pinças ...?
Sean Latham
2
"... quaisquer ocorrências que não sejam visíveis quando a página é exibida em um navegador." é muito geral. Em particular, existem dezenas ou mesmo centenas de maneiras diferentes de inserir conteúdo não visível nas páginas da web. Talvez você deva limitar a exclusão a um ou dois tipos específicos de tags. Isso impede a .innerHTMLsubstituição de todas as soluções, e acho que é por isso que você deseja as exceções em primeiro lugar.
COTO 9/09

Respostas:

5

175 bytes, ES5, XPATH

É testado com sucesso no Firefox e Chrome mais recentes. Críticas são bem-vindas! Este é o meu primeiro balanço do golfe, e espero estar fazendo certo.

d=document,f=d.evaluate('//text()',d,{},7,{});for(i=0;t=f.snapshotItem(i++);)t.data=t.data.replace(/(f)(or)(c)/ig,function(a,b,c,e){return(b=='f'?'h':'H')+c+(e=='c'?'s':'S')})

O document.evaluate()método é suportado por todos os principais navegadores, exceto o IE , que espero satisfaça os requisitos dos "navegadores mais modernos". E como o seletor XPath seleciona apenas nós de texto , isso deve deixar atributos, comentários, espaços para nome e outros dados não destinados a serem exibidos intactos, sem a necessidade de verificar cada nó offsetParent.

Versão não destruída:

var force = document.evaluate('//text()', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

for (var i = 0; textNode = force.snapshotItem(i++); /* nothing */) {
    textNode.data = textNode.data.replace(
        /(f)(or)(c)/ig,
        function (full, $1, $2, $3) {
            return ($1 == 'f' ? 'h' : 'H' )
                + $2
                + ($3 == 'c' ? 's' : 'S' );
        }
    );
}

Ou, se eu substituir function / returnpela notação de seta com gordura ECMA6, posso reduzi-la para 163 caracteres.

d=document,f=d.evaluate('//text()',d,{},7,{});for(i=0;t=f.snapshotItem(i++);)t.data=t.data.replace(/(f)(or)(c)/ig,r=(a,b,c,e)=>(b=='f'?'h':'H')+c+(e=='c'?'s':'S'))

Essa sintaxe atualmente só funciona no Firefox, eu acho. Até que mais navegadores adotem essa sintaxe, a solução de 175 bytes acima permanecerá minha entrada oficial no jogo.

rojo
fonte
Abordagem muito interessante! Existem duas diferenças entre nossas respostas (qual resposta está se comportando corretamente é para o OP julgar): 1. Seu regex transformará FORC em HORS . 2. Seu código modifica todos os nós de texto enquanto verifica offsetParentfiltros de todas as tags com display:noneestilo (que não são exibidas no navegador).
Dennis
@Dennis Thanks! Sim, posso adicionar (?=e|ing)ao meu regexp se o OP considerar necessário. Em relação a isso display: none, interpretei "Por exemplo, meta tags ou comentários". para significar coisas que não são nós de texto devem ser deixadas em paz, enquanto nós de texto, incluindo nós invisíveis, devem ser alterados. Eu estaria interessado em ver o OP confirmar suas intenções.
Roger27
@rojo Sim, você interpretou corretamente #
Decay Beta
3

ECMAScript 5, 248 233 193 191 182 bytes

for(w=(d=document).createTreeWalker(d,4);t=w.nextNode();)
if(t.parentNode.offsetParent)t.data=t.data.replace(/(f)(or)(c)/gi,
function(a,b,c,d){return(b<'f'?'H':'h')+c+(d<'c'?'S':'s')})

Testado no Chrome e Firefox.

Versão ungolfed

Só devemos modificar os TextNodes visíveis; URLs, atributos etc. não são exibidos no navegador. Podemos usar um TreeWalker para encontrar todos eles. Os TextNodes visíveis serão identificados verificando se o ParentNode possui um offsetParent verdade . 1

// Create a TreeWalker that walks through all TextNodes. 

var walker = document.createTreeWalker(document, NodeFilter.SHOW_TEXT, null, false);

// While there are nodes left,

while(node = walker.nextNode())

// if the node is visible,

    if(node.parentNode.offsetParent)

// search for the string "forc" (ignoring case)

        node.data = node.data.replace(/(f)(or)(c)/gi,

// and replace an uppercase/lowercase F/C with an uppercase/lowercase H/S.

            function(match, F, OR, C)
            {
                return (F != 'f' ? 'H' : 'h') + OR + (C != 'c' ? 'S' : 's')
            }
)

1 Este é um bug no IE 9.

Dennis
fonte
Você sabe, você pode reduzir isso para 193 bytes, se você se livrar de n=[],c=0,preencher e fazer um loop n. Just do if(t.parentNode.offsetParent)t.data=t.data.replaceetc
rojo
2

200 bytes, ES6

Aqui está uma versão do ES6. Execute-o no console mais recente do Firefox.

for(a=document.all,i=0;n=a[i++];)(p=>p&&p.offsetParent?n.innerHTML=n.innerHTML.replace(/f[o0]rc(e|ing)/gi,m=>(v=>{k=[...m];k[0]=k[0]<'F'?'H':'h';k[3]=k[3]<'C'?'S':'s'})()||k.join("")):0)(n.parentNode)

Vou adicionar a versão não-gasta, se solicitado :)

Aqui está a versão ungolfed

var all = document.all;
for (var i = 0; i < all.length; i++) {
  if (all[i].parentNode && all[i].parentNode.offsetParent) {
    all[i].innerHTML = all[i].innerHTML.replace(/f[o0]rc(e|ing)/gi, function(matched) {
      var k = matched.split(""); // convert to array
      k[0] = k[0] == "F"? "H" : "h";
      k[3] = k[3] == "C"? "S" : "s";
      return k.join("");
    })
  }
}
Optimizer
fonte
1
Eu peço uma versão ungolfed = P
flawr
Uau ... eu pensei que estes seriam one-liners ... Mais ou menos replace('forc','hors')e é isso. Mostra o quanto de javascript eu sei ...
Decay Beta 9/09
1
1. Essa abordagem não funciona. innerHTMLmudará todas as ocorrências dentro dos elementos visíveis; portanto, se houver um comentário dentro, ele também será tocado. 2. Pode-se argumentar que o ES6 não funciona realmente na maioria dos navegadores modernos .
Dennis
Como Dennis disse acima, isso não atende a todos os requisitos, portanto, eu inaceitei esta resposta.
Beta Decay