スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#雑記 alphabet ranges

 anarchy golf の問題より 
 
> alphabetRanges "defghijklmnoqvwxyzABCDEFGHIJKLMNOPQRSVWXZ";; 
val it : string = "d-oqv-zA-SV-XZ" 
 
> alphabetRanges "abcdeflmnopqrvwIJKNOPQRSTUVWXYZ";; 
val it : string = "a-fl-rvwI-KN-Z" 
 
となる関数を書いてみました。 
 
方針としては、stringはchar[]にして、さらにlist<int>として扱うことにします。 
3つづつの部分を取り出して、増加方向の連続3整数になっていれば、真ん中の数を0に置き換えていきます。(0は連続しないように結果リストに付け加えます) 
(0など使わずにoption型かdiscriminated unionの方が本当は良いとは思うのですが、手抜きです。)
こうしてできたものに、最初と最後の数を付け加えて、lisr<int>をlist<char>さらにstringに戻すと出来上がりです。 
 
> let rec copeSub (lst:list<int>) (res:list<int>)= 
    match lst with 
    |hd1::hd2::hd3::tl -> 
         if hd2 = hd1 + 1 && hd3 = hd2 + 1 then 
            //resに0が連続しないようにするための場合分け 
            if List.length res = 0 || List.head res <> 0 then  
               copeSub (List.tail lst) (0 :: res) 
            else  
               copeSub (List.tail lst) res  
         else copeSub (List.tail lst) (hd2 :: res) 
    | _ -> (List.rev res)  
 
//最初と最後の数を付け加える 
let cope (lst:list<int>) = 
    (List.head lst) :: (copeSub lst []) @ [List.head (List.rev lst)] 
 
//制限..strは2文字以上 
let alphabetRanges (str:string) = 
    let resCharArr = 
        str.ToCharArray() 
        |> List.ofArray 
        |> List.map (fun c -> int c) 
        |> cope 
        |> List.map (fun i -> if i <> 0 then (char i) else '-') 
        |> Array.ofList 
    new string(resCharArr);; 
 
val copeSub : int list -> int list -> int list 
val cope : int list -> int list 
val alphabetRanges : string -> string 
 
(実行例) 
> alphabetRanges "abcdefgstvwxyzACDEFGHINOPQRS";; 
val it : string = "a-gstv-zAC-IN-S" 
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

trackback


この記事にトラックバックする(FC2ブログユーザー)

alphabet ranges

【F#】alphabet ranges

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。