言語処理100本ノック04(C#)

04. 元素記号

"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文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

C#

using System;
using System.Collections.Generic;
using System.Linq;

public class Hello{
    public static void Main(){
        var text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.";
        var words = text.Split(' ');
        
        //1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字
        int[] positionA = {1, 5, 6, 7, 8, 9, 15, 16, 19};
        //それ以外の単語は先頭に2文字
        
        Dictionary<string, int> result = new Dictionary<string, int>();
        int i=1;
        foreach(var word in words){
            string symbol = null;
            int position = 0;
            if(Array.IndexOf(positionA, i) != -1){
                //最初の1文字を取得
                symbol = word.Substring(0, 1);
                position = 1;
            }else{
                //最初の2文字を取得
                symbol = word.Substring(0, 2);
                position = 2;
            }
            result.Add(symbol, position);
            i++;
        }
    }
}

言語処理100本ノック03(C#)

03. 円周率

"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

C#

  • 正規表現System.Text.RegularExpressionsパッケージを使う
using System.Text;
using System.Text.RegularExpressions;

public class Hello{
    public static void Main(){
        string text = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.";
        string[] words = text.Split(" ");
        var pattern = @"[^a-zA-z0-9]";
        var resultList = new List<int>();
        foreach(var word in words){
            var charList = word.Split("").AsList();
            int i=0;
            foreach(var c in charList){
                if(!Regex.IsMatch(c, pattern)){
                    charList.RemoveAt(i);
                    continue;
                }
                i++;
            }
            resultList.Add(charList.Count());
        }
        resultList.Select(item => System.Console.WriteLine(item + " "));
    }
}

言語処理100本ノック02(C#)

02. 「パトカー」+「タクシー」=「パタトクカシーー」

「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

C#

using System.Text;

public class Hello{
    public static void Main(){
        var patrolCar = "パトカー".ToCharArray();
        var taxi = "タクシー".ToCharArray();
        StringBuilder sb = new StringBuilder();
        
        for(var i=0; i<patrolCar.Length; i++){
            sb.Append(patrolCar[i]);
            sb.Append(taxi[i]);
        }
        System.Console.WriteLine(sb.ToString());
    }
}

言語処理100本ノック01(C#、Java)

01. 「パタトクカシーー」

「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

C#

using System.Text;
using System.Linq;

public class MainClass{
    public static void Main(){
        var targetArray = "パタトクカシーー".ToCharArray();
        StringBuilder sb = new StringBuilder();
        targetArray.Where((c, index) => index%2 == 0).ToList().ForEach(c => sb.Append(c));
        
        System.Console.Write(sb.ToString());
    }
}

Java

  • StreamAPI使いたかったけど標準ではindexが使えなくてやめた。
  • カタカナに対してString#toCharArray()するとcharの配列になってくれなくて調べたら、charは1バイト文字専用だからだった。
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        
        var list = Arrays.asList("パタトクカシーー".split(""));

        StringBuilder sb = new StringBuilder();
        for(int i=0; i<list.size(); i++){
            if(i%2 == 0){
                sb.append(list.get(i));
            }
        }
        System.out.println(sb.toString());
    }
}

Swift

var array = "パタトクカシーー".map { String($0) }
var resultStr = "";
for i in 0...array.count-1 {
    if(i%2 == 0){
        resultStr.append(array[i])
    }
}
print(resultStr)

追加された要素のイベントをJQueryで取得する

こういうコードあるじゃないですか。ID=hogeの要素がクリックされた時に動作させるコード。

$('#hoge').on('click', function(){
  alert('clicked.');
});

でもこのhogeが、JQueryによって追加された要素だったり、.NET MVCのPartialViewで全画面読み込み後に追加・更新された要素だと、上のコードではイベントを取得できないんですよ。

なのでこう書けば、追加された要素のイベントも取得できます。イベントは、clickblurでは動作確認しました。

$(document).on('click', '#hoge', function(){
  alert('clicked.');
});

documentに対してイベント(クリック)を張って、イベントが発生した要素がID=hogeだった時に関数の中の処理が動く仕組みみたいです。

生のJavaScriptで書くとこうです。

document.addEventListener('click', function(e) {
    if(e.target.id === 'hoge') {
        alert('clicked.');
    }
}, false);

参考

言語処理100本ノック00(C#、Java、Swift)

GitHubにあげるのも面倒だからここに置いておく。C#で書いた。LINQ使いこなせたらもっと簡潔に書けそうなんだけど〜〜〜

00. 文字列の逆順

文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

C#

  • List#Reverse()便利。
  • List#ForEach()便利。
using System.Text;

public class MainClass{
    public static void Main(){
        var str = "stressed";
        StringBuilder sb = new StringBuilder();
        
        for(var i=str.Length-1; 0<=i; i--)
        {
            sb.Append(str[i]);
        }
        System.Console.Write(sb.ToString());
    }
}
using System.Text;
using System.Collections.Generic;
using System.Linq;

public class MainClass{
    public static void Main(){
        List<char> charList = "stressed".ToCharArray().ToList();
        StringBuilder sb = new StringBuilder();
        
        charList.Reverse();
        charList.ForEach(c => sb.Append(c));
        System.Console.WriteLine(sb.ToString());
    }
}

Java

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        String str = "stressed";
        StringBuilder sb = new StringBuilder();
        for(int i=str.length()-1; i>=0; i--){
            sb.append(str.charAt(i));
        }
        System.out.println(sb.toString());
    }
}

Swift

  • String型:文字列型。
  • Character型:単一の文字の型。
  • String.CharacterView型:Character型のコレクション。String型のプロパティに存在する。
  • Swiftの変数宣言はvar hoge:型 = 1みたいな感じ。
  • 文字列の初期化は= ""= String()でする。
  • いわゆるfor文の書き方はSwift3.0で書けなくなったので、for-inを使う。
  • いわゆるStringBuilder#append()は、SwiftではString#append()を使う。
  • String.CharacterView#index(開始, 範囲):開始文字目から範囲文字目までの文字を取得できる。
  • String#charactersはdeprecated。
var str: String = "stressed"
var characters: String.CharacterView = str.characters
var reverseStr: String = String()

for i in (0...str.count-1).reversed(){
    var c = characters.index(characters.startIndex, offsetBy: i)
    reverseStr.append(str[c])
}

print(reverseStr)
var str: String = "stressed"
var charArray: Array<Character> = Array(str.characters)
var reverseStr: String = String()

for i in (0...str.count-1).reversed(){
    var c = charArray[i]
    reverseStr.append(String(c))
}

print(reverseStr)

Woman Who Go Tokyo #29に参加した

2019年1月16日(水)、Woman Who Go Tokyo #29に参加したので記録。

やったこと

感想

  • GoogleAppEngineを触るのは二度目だったのでそこまで詰まることなかった。
  • 一通りの作業が終わって各自の作り込みをするのに、簡単だしと思ってページング実装し始めたら、DB接続のAPIとかhtml templateとかにはまって終わらなかった。しかもNoSQLだからページングするのめっちゃ重いんじゃ・・・って帰りながら思った。
  • NoSQL触ったことないけどカラム追加せずに項目増やせるってオブジェクトDB?みたい。以前業務で触ってたCassandraはNoSQLじゃなかったっけ。
  • このリクエストきたらこのメソッド呼び出すみたいなハンドリングを init.go ってファイルに一行で書くだけで終わるのが気持ちいい。
  • スタッフのみっちーさんに、go getしたライブラリはどこに配置されるか聞いたら、GOPATH配下のsrcディレクトリだよって教えて貰った。
  • Goの標準ライブラリにhtml templateってのが入ってて、JavaJSPでいう(忘れた)みたいな、.Netの@Model.hogeみたいなのがクライアント側で使えるみたいだけど、JSPもrazorも嫌いだから使いたくないなって思った。サーバはAPI返して終わりであとはクライアントに任せたいな。
  • GoogleAppEngineでブラウザ上で開発もデプロイも終わるのはいいけど、エディタはやっぱ使いづらいからローカルでの開発がいいな。F12できないの辛い。
  • このコミュニティに参加するのは2回目だけど、今回も色々教わったし雰囲気もよいし、優しいし、何らかの貢献ができたらいいなって思った。