2012-04-02 5 views
2

私は長い間懸命に考えてきましたが、これを解決できませんでした。すべてのシーケンスが特定の基準を満たしている場合の交差時間を計算しますか?

A = [(10:00、1)、(11:00、0)、(12:00、1)、(12:30、12:30)]スイッチの状態を記録する、 0)、...、(23:00、1)]#スイッチAが10:00にオン、11:00にオフなど

B = [(10:30、1)、11 :15、0)、(11:30、1)、(12:15、0)、...、(午後11時30分、0)]#同様

C = ...

(実際には、時間はPythonのtime.struct_timeの形式になっています)。

be [(time1、status1)、(time2、status2)...]です。リストには24時間以内のデータが含まれ、切り替えインスタンスのみが記録されます(したがって、隣接する「ステータス」は常に互いに反対です)。すべてのスイッチA、B、Cがオンのときの合計時間を計算したい。この一見単純な質問は、何か役に立つものを考え出すのに何日もかかりました。あなたの知恵を共有してください!

答えて

4

最初にすべてのリストを(time, switch, state)の形式のタプルの1つのリストにマージします。次に、すべてのステータススイッチを時間順にソートし、イベントのタイムラインを与えます。

次に、3つの変数、a_on,b_onおよびc_onがあります。問題が指定されたときにそれらを初期化します(すべて開始または終了するかなど)。

last_time = 0 # starting time of data, 0 is here as example 
total_time = 0 # 0 seconds 

for time, switch, state in state_switches: 
    if a_on and b_on and c_on: 
     total_time += time - last_time 

    if switch == "A": 
     a_on = state 
    if switch == "B": 
     b_on = state 
    if switch == "C": 
     c_on = state 

    last_time = time 
+0

ただし、文字通りa_onとb_onとc_onという条件を記述すると、a、b、cがすべてオンになっても必ずしも成立しないため、格納された時間が離散的であるため動作しません。 – agriprop

+0

私はここにあなたのポイントを参照してください。私はこれについて考えていたはずです!ありがとうございました – agriprop

+0

入力として2つのスイッチのタイムラインを取り、タイムラインを返す関数を実装することで、これを単純化できます。そうすれば、任意の数のスイッチで動作するようにこの機能を拡張することができます。 – GeneralBecos

0

どのスイッチが有効になっている場合、スイッチはその日の分のリストとして有効になっている時間を表すについて、例えば:そして、このような何かを行いますA=[600, 601, 602, ..., 659, ..., ]、ここで10amは1日の分600に対応します。リストをセットに変換し、その交点の合計を使用します。

関連する問題