【Mac】ターミナル, bash コマンド, シンボリックリンク

頻繁に使うコマンドを列挙。 シンボリックリンクの変更に関しては参考URLより。

Command + t … 新しいタブを開く
Command + w … 現在のタブを閉じる
Shift + Command + → … 右のタブに移動
Shift + Command + ← … 左のタブに移動
ショートカットキー  説明
Ctrl + A    カーソルを行頭へ
Ctrl + E    カーソルを行末へ
Ctrl + K    カーソル位置から行末までを削除
Ctrl + U    カーソル位置から行頭までを削除
Ctrl + W    カーソル位置から単語の先頭までを削除
Ctrl + D    カーソル位置の文字を削除

参考:
コマンドラインの操作(カーソル移動・文字削除・補完) - Linux入門 - Webkaru
シンボリックリンクを上書きしてリンク先を変更する | 俺的備忘録 〜なんかいろいろ〜
Bashのコンソールで単語移動するショートカット - Qiita
Macでターミナルを使うときはショートカットキーを覚えよう!! - よんちゅBlog

LINQ基礎

クエリ演算子

LINQが用意しているメソッドのこと。
クエリ演算子は全て IEnumerable<T> に対する拡張メソッドとして定義されている。

シーケンス

標準クエリ演算子の操作対象のデータをシーケンスと呼ぶ。配列や List<T> 等。

クエリ遅延実行/即時実行

遅延実行

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 
  5 namespace Program
  6 {
  7     class Program
  8     {
  9         static void Main(string[] args)
 10         {
 11             string[] names = {
 12                 "Tokyo", "New Delhi", "Bangkok", "Paris",
 13             };
 14             var query = names.Where(x => x.Length <= 5);
 15             
 16             foreach (var item in query)
 17                 Console.WriteLine(item);
 18             
 19             Console.WriteLine("----------------");
 20           
 21             names[0] = "Osaka";
 22             foreach (var item in query)
 23                 Console.WriteLine(item);
 24         }
 25     }   
 26 }
Tokyo
Paris
----------------
Osaka
Paris

Whereメソッドが呼び出されても、検索はその時には行われずに、
実際に値が必要になったとき(foreachで要素を取り出したとき)に、クエリが実行される。

即時実行

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 
  5 namespace Program
  6 {
  7     class Program
  8     {
  9         static void Main(string[] args)
 10         {
 11             string[] names = {
 12                 "Tokyo", "New Delhi", "Bangkok", "Paris",
 13             };
 14             var query = names.Where(x => x.Length <= 5).ToArray(); // 配列に変換
 15             
 16             foreach (var item in query)
 17                 Console.WriteLine(item);
 18             
 19             Console.WriteLine("----------------");
 20           
 21             names[0] = "Osaka";
 22             foreach (var item in query)
 23                 Console.WriteLine(item);
 24         }
 25     }   
 26 }
Tokyo
Paris
----------------
Tokyo
Paris

ToArrayメソッドが呼び出されたときにクエリが実行され、結果が配列に格納される。
ToList メソッドに変えても同じ。Countメソッドとかも即時実行。

参考 :
実戦で役立つ C#プログラミングのイディオム/定石&パターン:書籍案内|技術評論社
LINQ クエリの概要 (C#) | Microsoft Docs

【C#】Lake Counting

大きさがNxMの庭があります。そこに雨が降り、水溜まりができました。
水溜りは8近傍で隣接している場合につながっているとみなします。全部でいくつかの水たまりがあるでしょうか?(8近傍とは、次のWに対する*の部分を指します。)

***
*W*
***

制約 N,M ≦ 100
using System;

namespace Program
{
    class Program
    {
        public static int N = 10; // 庭の広さ(縦)
        public static int M = 12; // 庭の広さ(横)
        public static int MAX_N = 0;
        public static int MAX_M = 0;
        
        public static char[][] field = 
        {
            new []{'W', '.', '.', '.', '.', '.', '.', '.', '.', 'W', 'W', '.'},
            new []{'.', 'W', 'W', 'W', '.', '.', '.', '.', '.', 'W', 'W', 'W'},
            new []{'.', '.', '.', '.', 'W', 'W', '.', '.', '.', 'W', 'W', '.'},
            new []{'.', '.', '.', '.', '.', '.', '.', '.', '.', 'W', 'W', '.'},
            new []{'.', '.', '.', '.', '.', '.', '.', '.', '.', 'W', '.', '.'},
            new []{'.', '.', 'W', '.', '.', '.', '.', '.', '.', 'W', '.', '.'},
            new []{'.', 'W', '.', 'W', '.', '.', '.', '.', '.', 'W', 'W', '.'},
            new []{'W', '.', 'W', '.', 'W', '.', '.', '.', '.', '.', 'W', '.'},
            new []{'.', 'W', '.', 'W', '.', '.', '.', '.', '.', '.', 'W', '.'},
            new []{'.', '.', 'W', '.', '.', '.', '.', '.', '.', '.', 'W', '.'}
        };
        
        public static void dfs(int x = 0, int y = 0)
        {
            field[x][y] = '.';
            
            for (int dx = -1; dx <= 1; dx++)
            {
                for (int dy = -1; dy <= 1; dy++)
                {
                    int nx = x + dx;
                    int ny = y + dy;

                    if (0 <= nx && nx < N && 0 <= ny && ny < M && field[nx][ny] == 'W')
                    {
                        dfs(nx, ny);
                    }
                }
            }
        }
        
        public static void solve()
        {
            int res = 0;

            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < M; j++)
                {
                    if (field[i][j] == 'W')
                    {
                        dfs(i, j);
                        res++;
                    }
                }
            }
            
            Console.WriteLine(res); // 3
        }

        public static void Main(string[] args)
        {
            solve();
        }
    }
}

JSのnullチェック

掘り起こし整理案件

[JavaScript] null とか undefined とか 0 とか 空文字('') とか false とかの判定について - Qiita
javascriptでオブジェクト({ }とか連想配列であるobject)の判定をしたいがnullや配列([ ])に悩まされる問題をまじめに自分用まとめ - tweeeetyのぶろぐ的めも

チェック

f:id:danker512:20180111232357p:plain

f:id:danker512:20180111232503p:plain

val() は String

競技プログラミング

競技プログラミングを始めるにあたって参考にさせてもらった記事

TopCorder登録

TopCoderの設定 - ferinの競プロ帳

Adventer

「競プロ!!」 競技プログラミング Advent Calendar 2017 - Adventar
C# で競プロをする話 - うにゅーん、って感じだ
競技プログラミングのための C# (4.0 以降) の Tips 詰め合わせ - C♯の勉強

環境構築

MacでC#のコードをコンパイルして実行する - Qiita
MacのAtomでOmniSharpを使う | C# / note.nkmk.me

Tips

[Sy] Topcoder SRM に初参加してハマったこと&感想 | Syntax Error.
競技プログラミングのための C# (4.0 以降) の Tips 詰め合わせ - C♯の勉強
TopCoder SRM 648 Div1 | tatsyblog
Configuring the TopCoder Arena for C# developers - Productive C#

例外処理

例外処理

例外処理とは、本来ならばプログラム中で起こってはいけないことが起こってしまうことを言う。 例外が起こったときでもプログラムが異常な動作をしないよう、例外処理(exception handling)を行う必要がある。 例外をキャッチするのは、異常な状態を回復させ、処理を継続する場合のみ。

例外が発生する可能性のある側では、 throw 文を使って例外が起こったことを利用側に知らせる。

throw 例外クラスのインスタンス

この throw 文は想定外のことが起こった場所に挿入する。 throw 文によって投げられる例外は、 System.Exception クラスの派生クラスのインスタンスである。 それ以外のクラスのインスタンスを throw することは出来ない。

ex:

try
{
  例外が投げられる可能性のあるコード
}
catch(例外の種類)
{
  例外処理コード
}
finally
{
  例外発生の有無にかかわらず実行したいコード
  リソースの破棄などを行う
}

別の例外をスローする

try {

} catch (FileNotFoundException ex) {
    throw new MyAppException("ファイルが見つかりませんでした", ex)
}

変数 ex には例外オブジェクトが格納されている。
例外オブジェクトを参照することで、例外の詳細情報を知ることが出来る。

例外が発生したことを把握したい場合・例外の再スロー

try {

} catch (FileNotFoundException ex) {
    Log.Write(ex.ToString()); // Log出力
    throw;
}

特定の例外発生時に、それを無視して処理を継続させたいケースもある。 その場合は、なんの目的でその例外をキャッチするのか、なぜその例外を無視するのかをコメントで残すようにする。 例外を throw する場合、InnerException を破棄してはいけない。

参考: 例外処理 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 実戦で役立つ C#プログラミングのイディオム/定石&パターン:書籍案内|技術評論社