- 私の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))))) |