Memaksa Kuda

8

Ini sederhana: buat skrip peramban terpendek untuk mengubah setiap tampilan gaya pada halaman web menjadi kuda. Skrip ini harus dapat ditempelkan ke konsol dan berfungsi di sebagian besar browser modern.

Anda harus mengganti semua kemunculan kata force dan konjugat dari force word (memaksa, memaksa, memperkuat). Kasing juga harus dilestarikan.

Anda tidak boleh mengubah kejadian apa pun yang tidak terlihat ketika halaman ditampilkan di browser. Misalnya, tag meta atau komentar.

Contoh

Ini adalah fOrcE log. Itu membuat orang yang menyentuhnya sangat kuat. Jangan mencoba memaksanya.

Ini adalah hOrsE log. Itu membuat orang yang menyentuhnya sangat berkuda. Jangan coba menungganginya.

Sayangnya ini hanya tantangan Javascript. Kode terpendek menang.

Peluruhan Beta
sumber
2
Lol untuk xkcd XD
ThreeFx
9
pemaksaan tidak mengandung kata force .
Dennis
2
Entah pertanyaannya memungkinkan penggantian forcke hors- atau itu adalah penggantian semua konjugasi berbeda forceke dalam versi kuda mereka. Dalam kasus sebelumnya, kita mendapatkan hal-hal seperti "Reinhorsing", dll. Dalam yang terakhir, hanya forcingakan menjadi pengecualian. OP harus mengklarifikasi.
absinthe
2
Bagaimana dengan setara kuda dari memaksa , secara paksa , tang ...?
Sean Latham
2
"... setiap kejadian yang tidak terlihat ketika halaman ditampilkan di browser." terlalu umum. Secara khusus, ada puluhan atau bahkan ratusan cara berbeda untuk memasukkan konten yang tidak terlihat ke halaman web. Mungkin Anda harus membatasi pengecualian pada satu atau dua jenis tag tertentu. Ini mencegah .innerHTMLganti semua solusi, yang saya duga adalah alasan mengapa Anda menginginkan pengecualian.
COTO

Jawaban:

5

175 byte, ES5, XPATH

Tes ini berhasil di Firefox dan Chrome terbaru. Kritik dipersilahkan! Ini adalah ayunan golf pertama saya, dan saya harap saya melakukannya dengan benar.

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

The document.evaluate()Metode didukung oleh semua browser utama kecuali IE , yang saya harap memenuhi persyaratan untuk "sebagian besar browser modern". Dan karena pemilih XPath hanya memilih node teks , ini harus meninggalkan atribut, komentar, ruang nama, dan data lainnya yang tidak dimaksudkan untuk tampilan tidak tersentuh tanpa perlu memeriksa setiap node offsetParent.

Versi tidak disatukan:

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

Atau jika saya ganti function / returndengan notasi lemak panah ECMA6, saya bisa mendapatkannya hingga 163 karakter.

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

Sintaks ini saat ini hanya berfungsi di Firefox, saya pikir. Sampai lebih banyak browser mengadopsi sintaks ini, solusi 175-byte di atas akan tetap menjadi entri resmi saya untuk game.

rojo
sumber
Pendekatan yang sangat menarik! Ada dua perbedaan antara jawaban kami (jawaban yang berperilaku benar untuk OP untuk menilai): 1. Regex Anda akan mengubah FORC menjadi HORS . 2. Kode Anda mengubah semua node teks, sambil memeriksa offsetParentfilter semua tag dengan display:nonegaya (yang tidak ditampilkan di browser).
Dennis
@Dennis Terima kasih! Ya, saya bisa menambah (?=e|ing)regexp saya jika OP menganggap perlu. Mengenai display: none, saya menafsirkan "Misalnya, tag meta atau komentar." berarti hal-hal yang bukan simpul teks harus dibiarkan sendiri, sementara simpul teks, termasuk simpul yang tidak terlihat, harus diubah. Saya akan tertarik melihat OP mengkonfirmasi niatnya.
rojo
@rojo Yap, Anda mengartikannya dengan benar
Beta Decay
3

ECMAScript 5, 248 233 193 191 182 byte

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

Diuji di Chrome dan Firefox.

Versi tidak disatukan

Kita hanya harus mengubah TextNodes yang terlihat; URL, atribut, dll. Tidak ditampilkan di browser. Kita bisa menggunakan TreeWalker untuk menemukan semuanya. TextNodes yang terlihat akan diidentifikasi dengan memeriksa apakah ParentNode mereka memiliki offsetParent yang sebenarnya . 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 Ini bermasalah di IE 9.

Dennis
sumber
Anda tahu, Anda dapat menurunkan ini ke 193 byte jika Anda menyingkirkan n=[],c=0,populasinya kemudian kembali n. Lakukan saja if(t.parentNode.offsetParent)t.data=t.data.replacedll.
rojo
2

200 byte, ES6

Ini adalah versi ES6. Jalankan di konsol web Firefox terbaru.

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)

Saya akan menambahkan versi ungolfed jika diminta :)

Ini adalah versi yang tidak diserang

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("");
    })
  }
}
Pengoptimal
sumber
1
Saya meminta versi yang tidak disunat = P
flawr
Wow ... Saya pikir ini akan menjadi satu-baris ... Semacam replace('forc','hors')dan hanya itu. Menunjukkan berapa banyak javascript yang saya tahu ...
Beta Decay
1
1. Pendekatan ini tidak berhasil. innerHTMLakan mengubah semua kejadian di dalam elemen yang terlihat, jadi jika ada komentar di dalamnya, itu akan tersentuh juga. 2. Orang bisa berpendapat bahwa ES6 tidak benar-benar berfungsi pada sebagian besar browser modern .
Dennis
Seperti yang dikatakan Dennis di atas, ini tidak memenuhi semua persyaratan, oleh karena itu saya telah menerima jawaban ini.
Beta Decay