Buộc ngựa


8

Đây là một cách đơn giản: tạo tập lệnh trình duyệt ngắn nhất để thay đổi mọi lần xuất hiện lực lượng trên một trang web thành ngựa. Kịch bản này cần có khả năng được dán vào bảng điều khiển và hoạt động trên hầu hết các trình duyệt hiện đại.

Bạn phải thay thế tất cả các lần xuất hiện của lực từ và liên hợp của lực từ (buộc, buộc, củng cố). Các trường hợp cũng phải được bảo tồn.

Bạn không được thay đổi bất kỳ sự cố nào không hiển thị khi trang được hiển thị trong trình duyệt. Ví dụ: thẻ meta hoặc bình luận.

Thí dụ

Đây là một fOrcE log. Nó làm cho những người chạm vào nó rất mạnh mẽ. Đừng cố ép buộc nó.

Đây là một hOrsE log. Nó làm cho những người chạm vào nó rất ngựa. Đừng cố gắng cưỡi nó.

Thật không may, đây chỉ là một thử thách Javascript. Mã ngắn nhất sẽ thắng.


2
Lol cho xkcd XD
ThreeFx

9
buộc không chứa lực từ .
Dennis

2
Câu hỏi cho phép thay thế forcthành hors- hoặc đó là sự thay thế của tất cả các cách chia khác nhau forcethành các phiên bản ngựa của họ. Trong trường hợp trước, chúng ta có được những thứ như "Reinhorsing", v.v. Trong trường hợp sau, chỉ forcingcó một ngoại lệ. OP nên làm rõ.
absinthe

2
Còn về tương đương ngựa của buộc , cưỡng chế , kẹp ...?
Sean Latham

2
"... bất kỳ sự cố nào không hiển thị khi trang được hiển thị trên trình duyệt." là quá chung chung. Đặc biệt, có hàng chục hoặc thậm chí hàng trăm cách khác nhau để chèn nội dung không nhìn thấy vào các trang web. Có lẽ bạn chỉ nên giới hạn loại trừ ở một hoặc hai loại thẻ cụ thể. Điều này ngăn chặn .innerHTMLtất cả các giải pháp thay thế, mà tôi đoán là lý do tại sao bạn muốn các ngoại lệ ở nơi đầu tiên.
COTO

Câu trả lời:


5

175 byte, ES5, XPATH

Thử nghiệm này thành công trong Firefox và Chrome mới nhất. Phê bình được chào đón! Đây là cú đánh golf đầu tiên của tôi và tôi hy vọng mình sẽ làm đúng.

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

Các document.evaluate()phương pháp được hỗ trợ bởi tất cả các trình duyệt chính trừ IE , mà tôi hy vọng đáp ứng các yêu cầu về "hầu hết các trình duyệt hiện đại". Và vì bộ chọn XPath chỉ chọn các nút văn bản , nên phải để các thuộc tính, nhận xét, không gian tên và các dữ liệu khác không được hiển thị để không bị chạm mà không cần kiểm tra từng nút offsetParent.

Phiên bản bị đánh cắp:

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

Hoặc nếu tôi thay thế function / returnbằng ký hiệu mũi tên béo ECMA6, tôi có thể giảm xuống còn 163 ký tự.

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

Cú pháp này hiện chỉ hoạt động trong Firefox, tôi nghĩ vậy. Cho đến khi nhiều trình duyệt chấp nhận cú pháp này, giải pháp 175 byte ở trên sẽ vẫn là mục nhập chính thức của tôi cho trò chơi.


Cách tiếp cận rất thú vị! Có hai sự khác biệt giữa các câu trả lời của chúng tôi (câu trả lời đang hành xử đúng là để OP đánh giá): 1. Regex của bạn sẽ biến FORC thành HORS . 2. Mã của bạn sửa đổi tất cả các nút văn bản, trong khi kiểm tra offsetParentcác bộ lọc với tất cả các thẻ có display:nonekiểu (không được hiển thị trong trình duyệt).
Dennis

@Dennis Cảm ơn! Vâng, tôi có thể thêm (?=e|ing)vào regrec của mình nếu OP thấy cần thiết. Về display: none, tôi đã giải thích "Ví dụ: thẻ meta hoặc nhận xét." có nghĩa là những thứ không phải là nút văn bản nên được để lại một mình, trong khi các nút văn bản, bao gồm các nút vô hình, nên được thay đổi. Tôi sẽ rất thích thú khi thấy OP xác nhận ý định của anh ấy.
rojo

@rojo Yep, bạn đã giải thích chính xác
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')})

Đã thử nghiệm trong Chrome và Firefox.

Phiên bản ung dung

Chúng ta chỉ nên sửa đổi TextNodes hiển thị; URL, thuộc tính, vv không được hiển thị trong trình duyệt. Chúng ta có thể sử dụng TreeWalker để tìm tất cả chúng. TextNodes hiển thị sẽ được xác định bằng cách kiểm tra xem ParentNode của chúng có offsetParent trung thực không . 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 Đây là lỗi trong IE 9.


Bạn biết đấy, bạn có thể giảm xuống còn 193 byte nếu bạn thoát khỏi n=[],c=0,dân cư sau đó lặp lại n. Chỉ cần làm if(t.parentNode.offsetParent)t.data=t.data.replacevv
rojo

2

200 byte, ES6

Đây là phiên bản ES6. Chạy nó trong bảng điều khiển web mới nhất của 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)

Tôi sẽ thêm phiên bản chưa được chỉnh sửa nếu được yêu cầu :)

Đây là phiên bản chưa được chỉnh sửa

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("");
    })
  }
}

1
Tôi yêu cầu một phiên bản không được chỉnh sửa = P
flawr

Wow ... Tôi nghĩ rằng đây sẽ là một lớp lót ... Sắp xếp replace('forc','hors')và đó là nó. Hiển thị bao nhiêu javascript tôi biết ...
Beta Decay

1
1. Cách tiếp cận này không hiệu quả. innerHTMLsẽ thay đổi tất cả các lần xuất hiện bên trong các yếu tố có thể nhìn thấy, vì vậy nếu có một bình luận bên trong, nó cũng sẽ bị chạm vào. 2. Người ta có thể lập luận rằng ES6 không thực sự hoạt động trên hầu hết các trình duyệt hiện đại .
Dennis

Như Dennis nói ở trên, điều này không đáp ứng tất cả các yêu cầu, do đó tôi đã không chấp nhận câu trả lời này.
Beta Decay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.