Zalgolf ('unuse strict')

    @@ -1,13 +1,133 @@ /* - * @title Zalgolf - * @description glitch text w/ Zalgo Scrambled Text + * @title Zalgolf ('unuse strict') + * @description ?ードでもじゃもじゃさせます。 * @include http://* * @include https://* * @contributor aTakaakiSeki http://qiita.com/aTakaakiSeki/items/614d5d178f717c6b2997 + * @contributor noromanba http://let.hatelabo.jp/noromanba/let/hJmfhMi96I0W * @license WTFTPL http://www.wtfpl.net/about/ * @javascript_url */ +/* +javascript:d=document;r=n=>Math.random()*n|0;x=d.evaluate('//text()',d,d,4,d);for(a=[];d=x.iterateNext();v='nodeValue')a.push(d);a.forEach(n=>n[v]=n[v].replace(/[a-z]/ig,c=>[...c+URL].map(_=>c+=eval('"\\u03'+r(7)+r(10)+'"'))[r(30)])) +*/ + +/* グローバルにめっちゃくっつくから気になる場合は宣言した方がいいと思うけど長い */ +/* { let d, r, x, v, a; */ + +/* "document" が長いから短縮、変数名は後で使い回す */ +d = document; +/* +複数回使うからおまとめ。ついでに小数点削る +よいこは Math.trunc() をつかおうね +*/ +r = n => Math.random() * n | 0; +/* +document.evaluate は取った後の記述が長くなるけど取るとこの記述が短いからつよい +document.evaluate( + 'ぺけぱす', + document とか, + その辺にある適当なオブジェクト, + XPathResult の定数直書き, + 適当な捨て変数 +) +で最短を狙うけど、よいこは適宜 null 等をいれてね +*/ +x = d.evaluate('//text()', d, d, 4, d); +/* +for(;;) と while() は大体おんなじだけど、for の方は +for(ここ;;ここ) の部分にちょっとした式をつっこんでおけて +; の削減とか、うまくいけば {} の省略とかできるから、for(;;) の方がお得 +for(;;ここ) に入れるとループ回数分実行されちゃうから軽めの式を入れようね +今回は短縮用の文字列入れてる +*/ +for (a = []; d = x.iterateNext(); v = 'nodeValue') +/* +XPathResult.UNORDERED_NODE_ITERATOR_TYPE (4) の結果はイテレータっぽいけど +document.evaluate('//text()', document, null, 4, null)[Symbol.iterator] +とかやっても undefined が返ってくるなんちゃってイテレータな上、 +そのまま使うと DOM が変更された途端エラーになるので、一旦配列にとっとく必要がある + +かといって XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE (6) にすると +snapshotLength とか snapshotItem とかの長い名称を避けられない上 +for とかで回していく取り方しかできないから、*_NODE_ITERATOR_TYPE より短くならない + +別に ORDERED でもいいけど今回は UNORDERED でいいかなってなった +*/ + a.push(d); +/* +ブックマークレットだから最後に undefined 返してる + +map() は短くて使いやすいけど、void つけるくらいなら forEach にした方が短い +[].map();void(0) +void([].map()) -2 +void [].map() -3 +[].forEach() -4 + +普段はローカル変数宣言かねて ((変数)=>{式})() にしてる +*/ +a.forEach( +/* +n.nodeValue は変数に取っておこうとすると文字列として取っておかれる +だからせめて nodeValue って名前を短縮して字数を稼ぐ +*/ + n => n[v] = n[v].replace( +/* +関数で replace する場合、括弧はなるべく使わないようにすると +(_,c)=>c が c=>c になって文字数を削減できる +\w でもいいかなと思ったら数字の横についた +*/ + /[a-z]/ig, +/* +名前の短い最初からある関数に、その辺にある適当な文字列を足して +「cfunction Set() { + [native code] +}」 +っていう 30字よりちょっと長い文字列を作ってる +それをスプレッド演算子でひらくと文字数分の長さの中身入り配列ができる +*/ + c => [...c+URL].map( +/* +文字列を反復で繋げていくときは、配列に入れて join() より +ループの外で用意した変数に += していく方が短くなる傾向 +文字列型の変数が用意できない時は逆転の可能性あり + +['a','b','c'].map(c=>c).join('') +['a','b','c'].map(c=>c).join`` -2 +['a','b','c'].map(c=>v+=c),v -4 +*/ + _ => c += +/* +我が家では \u0370 からくっつかなくなったから範囲狭めてる +「̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ ̀ ́ ͂ ̓ ̈́ ͅ ͆ ͇ ͈ ͉ ͊ ͋ ͌ ͍ ͎ ͏ ͐ ͑ ͒ ͓ ͔ ͕ ͖ ͗ ͘ ͙ ͚ ͛ ͜ ͝ ͞ ͟ ͠ ͡ ͢ ͣ ͤ ͥ ͦ ͧ ͨ ͩ ͪ ͫ ͬ ͭ ͮ ͯ 」 + +16進数で短くなることは 0xe8d4a51000 までないから基本的に十進数で書く +いや 0xe8d4a51000 なら 1e12 って書いた方が短いけど + +String.fromCharCode(0x300+(Math.random()*70|0)) +String.fromCharCode(768+Math.random()*70|0) -4 +eval('"\\u03'+r(7)+r(10)+'"') -18 + +('0'+num).slice(-2) とか (''+num).padStart(2,'0') とかだと +縮まりそうにもなかったから Math.random() 短くして二回回した +よいこは String.fromCharCode() をつかおうね +*/ + eval('"\\u03'+r(7)+r(10)+'"') +/* +['c0', 'c01', 'c012', 'c0123'…] みたいな配列ができてるから +その中からランダムで 30個目より前の要素を選んでる +30個目以降は無駄に生成してる訳だけどきにしない +*/ + )[r(30)] + ) +) + +/* 変数宣言したときに閉じるための括弧 */ +/* } */ + +/* 以下 Fork 元のコード */ + // orig code and reference c.f. // http://qiita.com/aTakaakiSeki/items/614d5d178f717c6b2997 @@ -23,6 +143,7 @@ */ // unminified and reference +/* { 'use strict'; @@ -54,7 +175,7 @@ // TBD handle autopaging } - +*/ // TIPS and TRICKS // // pseudo `Array#times()` idioms @@ -86,5 +207,4 @@ // '0x0' + (0x300 + 1 * 79).toString(16).toUpperCase() // "0x034F" // '0x0' + (0x300 + 1 * 0x04F).toString(16).toUpperCase() -// "0x034F" - +// "0x034F"
  • /*
     * @title Zalgolf ('unuse strict')
     * @description ?ードでもじゃもじゃさせます。
     * @include http://*
     * @include https://*
     * @contributor aTakaakiSeki    http://qiita.com/aTakaakiSeki/items/614d5d178f717c6b2997
     * @contributor noromanba       http://let.hatelabo.jp/noromanba/let/hJmfhMi96I0W
     * @license     WTFTPL          http://www.wtfpl.net/about/
     * @javascript_url
     */
    
    /*
    javascript:d=document;r=n=>Math.random()*n|0;x=d.evaluate('//text()',d,d,4,d);for(a=[];d=x.iterateNext();v='nodeValue')a.push(d);a.forEach(n=>n[v]=n[v].replace(/[a-z]/ig,c=>[...c+URL].map(_=>c+=eval('"\\u03'+r(7)+r(10)+'"'))[r(30)]))
    */
    
    /* グローバルにめっちゃくっつくから気になる場合は宣言した方がいいと思うけど長い */
    /* { let d, r, x, v, a; */
    
    /* "document" が長いから短縮、変数名は後で使い回す */
    d = document;
    /*
    複数回使うからおまとめ。ついでに小数点削る
    よいこは Math.trunc() をつかおうね
    */
    r = n => Math.random() * n | 0;
    /*
    document.evaluate は取った後の記述が長くなるけど取るとこの記述が短いからつよい
    document.evaluate(
     'ぺけぱす',
     document とか,
     その辺にある適当なオブジェクト,
     XPathResult の定数直書き,
     適当な捨て変数
    )
    で最短を狙うけど、よいこは適宜 null 等をいれてね
    */
    x = d.evaluate('//text()', d, d, 4, d);
    /*
    for(;;) と while() は大体おんなじだけど、for の方は
    for(ここ;;ここ) の部分にちょっとした式をつっこんでおけて
    ; の削減とか、うまくいけば {} の省略とかできるから、for(;;) の方がお得
    for(;;ここ) に入れるとループ回数分実行されちゃうから軽めの式を入れようね
    今回は短縮用の文字列入れてる
    */
    for (a = []; d = x.iterateNext(); v = 'nodeValue')
    /*
    XPathResult.UNORDERED_NODE_ITERATOR_TYPE (4) の結果はイテレータっぽいけど
    document.evaluate('//text()', document, null, 4, null)[Symbol.iterator]
    とかやっても undefined が返ってくるなんちゃってイテレータな上、
    そのまま使うと DOM が変更された途端エラーになるので、一旦配列にとっとく必要がある
    
    かといって XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE (6) にすると
    snapshotLength とか snapshotItem とかの長い名称を避けられない上
    for とかで回していく取り方しかできないから、*_NODE_ITERATOR_TYPE より短くならない
    
    別に ORDERED でもいいけど今回は UNORDERED でいいかなってなった
    */
     a.push(d);
    /*
    ブックマークレットだから最後に undefined 返してる
    
    map() は短くて使いやすいけど、void つけるくらいなら forEach にした方が短い
    [].map();void(0)
    void([].map())  -2
    void [].map()   -3
    [].forEach()    -4
    
    普段はローカル変数宣言かねて ((変数)=>{式})() にしてる
    */
    a.forEach(
    /*
    n.nodeValue は変数に取っておこうとすると文字列として取っておかれる
    だからせめて nodeValue って名前を短縮して字数を稼ぐ
    */
     n => n[v] = n[v].replace(
    /*
    関数で replace する場合、括弧はなるべく使わないようにすると
    (_,c)=>c が c=>c になって文字数を削減できる
    \w でもいいかなと思ったら数字の横についた
    */
      /[a-z]/ig,
    /*
    名前の短い最初からある関数に、その辺にある適当な文字列を足して
    「cfunction Set() {
        [native code]
    }」
    っていう 30字よりちょっと長い文字列を作ってる
    それをスプレッド演算子でひらくと文字数分の長さの中身入り配列ができる
    */
      c => [...c+URL].map(
    /*
    文字列を反復で繋げていくときは、配列に入れて join() より
    ループの外で用意した変数に += していく方が短くなる傾向
    文字列型の変数が用意できない時は逆転の可能性あり
    
    ['a','b','c'].map(c=>c).join('')
    ['a','b','c'].map(c=>c).join``  -2
    ['a','b','c'].map(c=>v+=c),v    -4
    */
       _ => c += 
    /*
    我が家では \u0370 からくっつかなくなったから範囲狭めてる
    「̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ ̀ ́ ͂ ̓ ̈́ ͅ ͆ ͇ ͈ ͉ ͊ ͋ ͌ ͍ ͎ ͏ ͐ ͑ ͒ ͓ ͔ ͕ ͖ ͗ ͘ ͙ ͚ ͛ ͜ ͝ ͞ ͟ ͠ ͡ ͢ ͣ ͤ ͥ ͦ ͧ ͨ ͩ ͪ ͫ ͬ ͭ ͮ ͯ 」
    
    16進数で短くなることは 0xe8d4a51000 までないから基本的に十進数で書く
    いや 0xe8d4a51000 なら 1e12 って書いた方が短いけど
    
    String.fromCharCode(0x300+(Math.random()*70|0))
    String.fromCharCode(768+Math.random()*70|0)    -4
    eval('"\\u03'+r(7)+r(10)+'"')                  -18
    
    ('0'+num).slice(-2) とか (''+num).padStart(2,'0') とかだと
    縮まりそうにもなかったから Math.random() 短くして二回回した
    よいこは String.fromCharCode() をつかおうね
    */
       eval('"\\u03'+r(7)+r(10)+'"')
    /*
    ['c0', 'c01', 'c012', 'c0123'…] みたいな配列ができてるから
    その中からランダムで 30個目より前の要素を選んでる
    30個目以降は無駄に生成してる訳だけどきにしない
    */
      )[r(30)]
     )
    )
    
    /* 変数宣言したときに閉じるための括弧 */
    /* } */
    
    /* 以下 Fork 元のコード */
    
    // orig code and reference c.f.
    // http://qiita.com/aTakaakiSeki/items/614d5d178f717c6b2997
    
    // slightly code-golf and ref/descr et al. c.f.
    // https://gist.github.com/noromanba/3062530dc3970d93762a5775080715f8
    
    /* oneliner-min
    javascript:[].concat(...[...document.querySelectorAll(':not(style):not(script):not(:empty)')].map(e=>[...e.childNodes])).filter(n=>n.nodeName==='#text').map(n=>n.textContent=n.textContent.replace(/([a-z])/ig,(_,c)=>c+[...Array(Math.random()*30|0)].map(()=>String.fromCharCode(0x300+(Math.random()*79|0))).join('')));
    */
    
    /* Devtools/Scratchpad-min
    $x('//text()').map(n=>n.textContent=n.textContent.replace(/([a-z])/ig,(_,c)=>c+[...Array(Math.random()*30|0)].map(()=>String.fromCharCode(0x300+(Math.random()*79|0))).join('')));
    */
    
    // unminified and reference
    /*
    {
        'use strict';
    
        const combiningChar = () => {
            // 0-29 random N times repeat
            return Array.from(Array(Math.trunc(Math.random() * 30)), () => {
                // http://www.unicode.org/charts/PDF/U0300.pdf
                // U0300-U034E: 79 = 0x04F
                return String.fromCharCode(0x300 + Math.trunc(Math.random() * 0x04F))
            }).join('');
        };
    
        // TBD
        // - select text-node w/ Xpath and XPath's not()
        // - unchain methods
        // - extract flatten
        Array.prototype.concat.apply([], Array.from(document.querySelectorAll([
            'head title',
            'body :not(style):not(script):not(:empty)',
        ]), node => [...node.childNodes]))
        .filter(node => node.nodeType === Node.TEXT_NODE)
        .forEach(textNode => {
            textNode.textContent =
                // TBD alnum
                textNode.textContent.replace(/([a-z])/ig, (_, captured) => {
                    return captured + combiningChar();
            });
        });
    
        // TBD handle autopaging
    }
    */
    // TIPS and TRICKS
    //
    // pseudo `Array#times()` idioms
    //
    // ES6/ES2015
    // [...Array(10)].map((_, i) => i);
    // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    // Array.from(Array(10), (_, i) => i);
    // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    // Array.from(Array(10)).map((_, i) => i);
    // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    // Array.from(Array(10).keys());
    // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    //
    // ES5
    // Array.apply(null, Array(10)).map(function(_, i) { return i; });
    // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    // Array(10).join().split(',').map(function(_, i) { return i; });
    // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    //
    //
    // hex <-> decimal of Unicode Combining Character
    //
    // (79).toString(16)
    // "4f"
    // (0x4F).toString(10)
    // "79"
    //
    // '0x0' + (0x300 + 1 * 79).toString(16).toUpperCase()
    // "0x034F"
    // '0x0' + (0x300 + 1 * 0x04F).toString(16).toUpperCase()
    // "0x034F"
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2017/06/14 16:54:12 - 2017-06-14
  2. 2017/05/24 17:48:19 - 2017-05-24
  3. 2017/05/23 23:09:50 - 2017-05-23
  4. 2017/05/23 22:53:58 - 2017-05-23
  5. 2017/05/23 22:50:17 - 2017-05-23
  6. 2017/05/22 16:49:25 - 2017-05-22
  7. 2017/05/22 16:14:58 - 2017-05-22
  8. 2017/05/22 16:14:43 - 2017-05-22