- 私のF# → しごとちゅうに書いた小さなコード晒す
- neno
- 2016/6/28 #nagoyakaeru
exeファイルとかdllファイルを右クリック→プロパティ→詳細情報で見れる「ファイルバージョン」とかを一括で取得したい!という要望にこたえる。
.NET1.1しかインストールされてない環境でも動きます。そういう要件だったのです。 C# のコンソールアプリケーションです。
| using System.IO; | |
| namespace Sample | |
| { | |
| public static class EncodingExtension | |
| { | |
| public static byte[] GetUtf8WithBomBytes(this string str) | |
| { | |
| var encoding = new UTF8Encoding(true) | |
| using (var stream = new MemoryStream()) | |
| using (var writer = new StreamWriter(stream, encoding)) |
| type subject = {point: int} | |
| type student = {subjects: subject list} | |
| type classroom = {students: student list} | |
| let data = {students = [ | |
| {subjects = [{point = 10}; {point = 20}]} | |
| {subjects = [{point = 20}; {point = 30}]} | |
| {subjects = [{point = 30}; {point = 40}]} | |
| {subjects = [{point = 40}; {point = 50}]} |
| # -*- mode: python; coding: utf-8-dos -*- | |
| ## | |
| ## Windows の操作を emacs のキーバインドで行うための設定(keyhac版)ver.20151104_02 | |
| ## | |
| # このスクリプトは、keyhac で動作します。 | |
| # https://sites.google.com/site/craftware/keyhac | |
| # スクリプトですので、使いやすいようにカスタマイズしてご利用ください。 | |
| # |
| let join2 (elem: 'a) (lis: 'a list) = | |
| lis | |
| |> List.fold (fun a x -> match a with | [] -> [ x ] | _ -> x :: elem :: a ) [] | |
| |> List.rev | |
| let test1 = join2 0 [1;2;3;4;5;6] = [1;0;2;0;3;0;4;0;5;0;6] // -> true | |
| let test2 = join2 0 [] = [] // -> true |
| let splitBy2 sep xs = | |
| let a, b = List.foldBack (fun x (a, b) -> | |
| if x = sep then (b :: a, []) else (a, x :: b)) xs ([], []) | |
| b :: a | |
| let test1 = splitBy2 0 [1;2;3;0;4;5;0;6] = [[1;2;3];[4;5];[6]] // -> true | |
| let test2 = splitBy2 0 [] = [[]] // -> true | |
| let test3 = splitBy2 0 [1;0;2;0] = [[1];[2];[]] // -> true |
| let join (elm:'a) (lis:'a list) = | |
| lis | |
| |> List.fold (fun a x -> elm::x::a) [] // a=処理済みリスト x=現在の要素 | |
| |> (function | |
| | x::xs -> xs | |
| | xs -> xs) // 要素数2以上なら1つスキップ もう少し簡潔に書けないものか | |
| |> List.rev | |
| let test1 = join 0 [1;2;3;4;5;6] = [1;0;2;0;3;0;4;0;5;0;6] // -> true | |
| let test2 = join 0 [] = [] // -> true |
| let splitBy (elm:'a) (lis:'a list) = | |
| lis | |
| |> (Seq.fold (fun (a,b) x->if x=elm then (b::a,[]) else (a,x::b)) ([],[])) // a=処理済みリスト b=処理中リスト x=現在の要素 | |
| |> (fun (a,b)-> b::a) // 最後の要素だけTuple右辺に残ってしまっているのでリストに結合 | |
| |> List.fold (fun s xs -> (List.rev xs)::s) [] // 個別リストの反転と全体の反転 | |
| let test1 = splitBy 0 [1;2;3;0;4;5;0;6] = [[1;2;3];[4;5];[6]] // -> true | |
| let test2 = splitBy 0 [] = [[]] // -> true | |
| let test3 = splitBy 0 [1;0;2;0] = [[1];[2];[]] // -> true |
| (* | |
| お題: | |
| https://ideone.com/gtRf08 | |
| *) | |
| (* | |
| rankBy 関数 (renameしました withRanking → rankBy) | |
| シーケンスを、指定されたkeySelectorで取得したキーを使用してソートした結果のインデックスとのペアに変換します。 | |
| *) | |
| let rankBy (keySelector: 'a -> 'b when 'b : comparison) (source:'a seq) = |
| ;; 整数値からfizzbuzz結果の値に変換します。 | |
| (define (int->fizzbuzz x) | |
| (let ((is-fizz (= (modulo x 3) 0)); 3で割り切れたらFizz | |
| (is-buzz (= (modulo x 5) 0))); 5で割り切れたらBuzz | |
| (let ((is-fizzbuzz (and is-fizz is-buzz))); FizzかつBuzzならFizzBuzz | |
| (cond | |
| (is-fizzbuzz "FizzBuzz") | |
| (is-fizz "Fizz") | |
| (is-buzz "Buzz") | |
| (else x))))) |