3


1

25日という日数を考えて、それを「3週間、4日」などの期間テキストに変換します。

F#のバリエーションがC#よりも改善されていれば、C#とF#のソリューションはどちらも優れたものになります。

編集:解決策は過去数週間を数ヶ月と数年を含むように拡張する必要があります。 何世紀にもわたるなどのボーナスポイント それが多少構成可能なら追加のボーナス、つまりあなたは数週間の正規化を除外するようにメソッドに伝えることができます。

4 Answer


5


String.Format( "{0}週、{1}日"、days / 7、days%7);


1


これは再帰的な解決策です。 月と年の長さが異なるため、期間は特定のカレンダーの特定の時点に対して測定された場合にのみ意味があります。 しかし、これは固定長を仮定した簡単な解決策です。

divmod n m = n / m、n%mとします。

units = [( "Centuries"、TimeSpan.TicksPerDay * 365L * 100L);とします。 ( "年"、TimeSpan.TicksPerDay * 365L); ( "週"、TimeSpan.TicksPerDay * 7L); ( "日数"、TimeSpan.TicksPerDay)]

期間の日数=レック期間の目盛りの単位を単位とする[]  - > acc | (u :: us) - > let(wholeUnits、ticksRemaining)= divmod ticks(snd u)duration 'ticksRemaining us((((fst u)、wholeUnits):: acc)duration'(TimeSpan.FromDays(float days).Ticks) )単位[]


0


パブリッククラスUnitOfMeasure {public UnitOfMeasure(文字列名、整数値){名前=名前;値=値。 }

パブリック文字列Name {get;セット; public int値{get;}セット; }

public static UnitOfMeasure []すべて= new UnitOfMeasure [] {new UnitOfMeasure( "年"、356)、新しいUnitOfMeasure( "月"、30)、新しいUnitOfMeasure( "週"、7)、新しいUnitOfMeasure( "日"、1 ;};

public static string ConvertToDuration(int days){リスト結果= new List();

for(int i = 0; i <All.Length; i){int count =日/ All [i] .Value;

if(count> = 1){results.Add((count "" All [i] .Name)(count == 1? string.Empty: "s")); days  -  = count * All [i] .Value; }}

string.Join( "、"、results.ToArray());を返します。 }}


0


これは以前に投稿されたC#バージョンに基づくF#バージョンです。 主な違いは、命令型ではなく適用型であることです(変更可能な変数はありません)。

#light let conversions = [| | 365、 "年"、 "年" 30、 "月"、 "月" 7、 "週"、 "週" 1、 "日"、 "日" |] let ToDuration numDays = conversions |> Array.fold_left(fun) (残り日数、結果)(n、sing、plur) - > count = = 1の場合はcount = remainsDays / n、その後leaveDays  - (count * n)、(count = 1の場合はsing)そうでなければplur)):: results else elseDays、results)(numDays、[])|> snd |>(fun rs  - > System.String.Join( "、"、List.rev rs |> List.to_array))printfn "%s"(ToDuration 1008)