Das Pferd zwingen

8

Dies ist ganz einfach: Erstellen Sie das kürzeste Browserskript, um jedes Auftreten von Gewalt auf einer Webseite in Pferd umzuwandeln. Dieses Skript muss in die Konsole eingefügt werden können und auf den meisten modernen Browsern funktionieren.

Sie müssen alle Vorkommen des Wortes Kraft und Konjugate des Wortes Kraft ersetzen (erzwingen, erzwingen, verstärken). Die Fälle müssen auch erhalten bleiben.

Sie dürfen keine Vorkommen ändern, die nicht sichtbar sind, wenn die Seite in einem Browser angezeigt wird. Zum Beispiel Meta-Tags oder Kommentare.

Beispiel

Dies ist ein fOrcE log. Es macht Menschen, die es berühren, sehr kraftvoll. Versuchen Sie nicht, es zu erzwingen.

Dies ist ein hOrsE log. Es macht Leute, die es berühren, sehr pferdig. Versuchen Sie nicht, es zu reiten.

Leider ist dies nur eine Javascript-Herausforderung. Der kürzeste Code gewinnt.

Beta-Zerfall
quelle
2
Lol für xkcd XD
ThreeFx
9
Forcen enthält nicht das Wort Kraft .
Dennis
2
Entweder erlaubt die Frage das Ersetzen von forcin hors- oder es ist das Ersetzen aller verschiedenen Konjugationen von forcein ihre Pferdeversionen. Im ersteren Fall bekommen wir Dinge wie "Reinhorsing" usw. Im letzteren Fall forcingwäre nur eine Ausnahme. OP sollte klarstellen.
Absinth
2
Was ist mit den Pferde-Äquivalenten zu zwingen , mit Gewalt , Zange ...?
Sean Latham
2
"... alle Vorkommnisse, die nicht sichtbar sind, wenn die Seite in einem Browser angezeigt wird." ist viel zu allgemein. Insbesondere gibt es Dutzende oder sogar Hunderte verschiedener Möglichkeiten, nicht sichtbare Inhalte in Webseiten einzufügen. Vielleicht sollten Sie den Ausschluss nur auf einen oder zwei bestimmte Tag-Typen beschränken. Dies verhindert .innerHTML, dass alle Lösungen ersetzt werden. Ich vermute, deshalb möchten Sie die Ausnahmen überhaupt.
COTO

Antworten:

5

175 Bytes, ES5, XPATH

Dies wird erfolgreich in den neuesten Versionen von Firefox und Chrome getestet. Kritik ist willkommen! Dies ist mein erster Golfschwung und ich hoffe, ich mache es richtig.

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')})

Die document.evaluate()Methode wird von allen gängigen Browsern unterstützt, mit Ausnahme des IE , der hoffentlich die Anforderungen für "modernste Browser" erfüllt. Und weil der einzigen wählen XPath - Auswahltextknoten , dies sollte Attribute, Kommentare, Namensräume verlassen, und andere Daten nicht für die Anzeige bestimmt unberührt ohne für jeden Knotens prüfen muss offsetParent.

Ungolfed Version:

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

Oder wenn ich durch die function / returnECMA6-Fettpfeil-Notation ersetze, kann ich sie auf 163 Zeichen reduzieren.

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'))

Diese Syntax funktioniert derzeit allerdings nur in Firefox, denke ich. Bis mehr Browser diese Syntax übernehmen, bleibt die obige 175-Byte-Lösung mein offizieller Eintrag für das Spiel.

Rojo
quelle
Sehr interessanter Ansatz! Es gibt zwei Unterschiede zwischen unseren Antworten (welche Antwort sich richtig verhält, muss vom OP beurteilt werden): 1. Ihre Regex verwandelt FORC in HORS . 2. Ihr Code ändert alle Textknoten, während das Auschecken offsetParentalle Tags mit display:noneStil herausfiltert (die nicht im Browser angezeigt werden).
Dennis
@ Tennis Danke! Ja, ich kann (?=e|ing)meinen regulären Ausdruck erweitern, wenn OP dies für notwendig hält. In Bezug auf display: noneinterpretierte ich "Zum Beispiel Meta-Tags oder Kommentare." Dies bedeutet, dass Dinge, die keine Textknoten sind, in Ruhe gelassen werden sollten, während Textknoten, einschließlich unsichtbarer Knoten, geändert werden sollten. Es würde mich jedoch interessieren, wenn das OP seine Absichten bestätigt.
Rojo
@rojo Ja, Sie haben es richtig interpretiert
Beta Decay
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')})

Getestet in Chrome und Firefox.

Ungolfed Version

Wir sollten nur sichtbare TextNodes ändern. URLs, Attribute usw. werden im Browser nicht angezeigt. Wir können einen TreeWalker verwenden , um alle zu finden. Visible TextNodes wird durch Überprüfung identifiziert werden , falls ihre ParentNode eine truthy hat offset . 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 Dies ist in IE 9 fehlerhaft.

Dennis
quelle
Sie können dies auf 193 Bytes reduzieren, wenn Sie das Auffüllen loswerden und n=[],c=0,dann eine Schleife durchlaufen n. Tun Sie einfach if(t.parentNode.offsetParent)t.data=t.data.replaceusw.
Rojo
2

200 Bytes, ES6

Hier ist eine ES6-Version. Führen Sie es in der neuesten Firefox-Webkonsole aus.

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)

Ich werde die ungolfed Version hinzufügen, wenn gewünscht :)

Hier ist die ungolfed Version

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("");
    })
  }
}
Optimierer
quelle
1
Ich bitte um eine ungolfed Version = P
Fehler
Wow ... ich dachte, das wären Einzeiler ... Irgendwie replace('forc','hors')und das war's. Zeigt, wie viel Javascript ich kenne ...
Beta Decay
1
1. Dieser Ansatz funktioniert nicht. innerHTMLändert alle Vorkommen in sichtbaren Elementen. Wenn also ein Kommentar darin enthalten ist, wird er ebenfalls berührt. 2. Man könnte argumentieren, dass ES6 in den meisten modernen Browsern nicht wirklich funktioniert .
Dennis
Wie Dennis oben sagt, erfüllt dies nicht alle Anforderungen, daher habe ich diese Antwort nicht akzeptiert.
Beta Decay