読者です 読者をやめる 読者になる 読者になる

【JavaScript実践】 言語処理100本ノック

JavaScript

「第1章: 準備運動」の途中まで。

www.cl.ecei.tohoku.ac.jp

(function() {
  console.log(q03());
  
  function q00() {
    // 文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.
    
    var str = "stressed";
    var result = "";
    
    for(var i = str.length; i > 0; i--) {
      result += str[i - 1];
    }
    
    return result;
  }
  
  function q01() {
    // 「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.
    
    var str = "パタトクカシーー";
    
    return str[0] + str[2] + str[4] + str[6];
  }
  
  function q02() {
    // 「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.
    
    var strArr = "パトカー".split("");
    var str2Arr = "タクシー".split("");
    var result = "";
    
    while(strArr.length > 0 && str2Arr.length > 0) {
      result += strArr.length > 0? strArr.shift(): "";
      result += str2Arr.length > 0? str2Arr.shift(): "";
    }
    
    return result;
  }
  
  function q03() {
    // "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,
    // 各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.
    
    var str = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.";
    var wordsArr = str.match(/[a-zA-Z]+/g);
    var result = wordsArr.map(function(word) {
      return word.length;
    });
    
    return result;
  }
  
  function q04() {
    // "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し,
    // 1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,
    // 取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.
    
    var str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.";
    var wordsArr = str.match(/[a-zA-Z]+/g);
    var result = wordsArr.map(function(word, i) {
      var r = {};
      
      switch(i + 1) {
        case 1:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 15:
        case 16:
        case 19:
          r[word.substr(0, 1)] = i + 1;
          break;
        default:
          r[word.substr(0, 2)] = i + 1;
      }
      
      return r;
    });
    
    return result;
  }
  
  function q05() {
    // 与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.
    // この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.
    
    var str = "I am an NPLer";
    
    console.log(getNGram(str.match(/[a-zA-Z]+/g), 2));
    
    return {
      "words": getNGram(str.match(/[a-zA-Z]+/g), 2),
      "chars": getNGram(str.split(""), 2)
    };
    
    function getNGram(arr, n) {
      var nGram = [];
      var i = 0, j = 0;
      
      for(i = 0; i < n; i++) {
        nGram[j] = (function() {
          var charsArr = nGram[j] || [];
          
          charsArr.push(arr.shift() || "");
          
          return charsArr;
        })();
      }
      
      while(arr.length > 0) {
        nGram.push((function() {
          var charsArr = [].concat(nGram[j]);
          
          charsArr.push(arr.shift());          
          charsArr.shift();
          
          return charsArr;
        }()));
        
        j = j + 1;
      }
      
      return nGram;
    }
  }
  
  function q06() {
    // "paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.
    // さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ.
  }
  
  function q07() {
    // 引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.
    // さらに,x=12, y="気温", z=22.4として,実行結果を確認せよ.
  }
  
  function q08() {
    // 与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.
    //   * 英小文字ならば(219 - 文字コード)の文字に置換
    //   * その他の文字はそのまま出力
    // この関数を用い,英語のメッセージを暗号化・復号化せよ.
  }
  
  function q09() {
    // スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.
    // ただし,長さが4以下の単語は並び替えないこととする.
    // 適当な英語の文(例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .")を与え,
    // その実行結果を確認せよ.
  }
})();