他の回答で述べたように、24時間方式は複数のタイムゾーンに対してより使いやすく、各ユーザーの最後に成功したタイムスタンプを保存するのと同じくらい簡単にコーディングできます。
また、毎日のアクションをすべて取得するために、ユーザーが毎日アプリと対話することを実際に要求するという「利点」が追加されています。真夜中にリセットが発生した場合、ユーザーは午後11時59分にアクションを実行し、その後午前12:00にアクションを実行できます。彼らは一日おきにこれを行うことができ、それでもすべてのアクションを取得できます。一部のアプリでは、毎日のアクションの目的は、ユーザーがアプリを毎日操作できるようにすることであるため、あまり理想的ではありません。
両方のUIの落とし穴を回避する3番目の選択肢がありますが、コーディングが少し難しくなります。
3)(n-0.75)* 24時間でnを超えるアクションの縞がない
2つの変数を保存する必要がありますが、システムを悪用しようとしない人は、タイムゾーンやリセットを気にすることなく、1日中いつでも1つのアクションを使用できます。
また、誰もが複数の「余分な」アクションを使用できないようにします。
そのため、ストリークの開始時間、最終再生時間、ストリークのアクション数を保存するために必要なアルゴリズムを実際に実装します。
最終アクション時間を追跡することにより、近すぎる2つのアクションを拒否できます。ただし、ストリークにより1日の早い段階でクリープが防止されるため、この制限を24時間未満に設定できます。
あなたが毎日あなたの行動をとる限り、連勝は進み続けます。アクションを実行すると、連続した日数よりも多くのアクションが発生することになり、拒否されます。これにより、ストリークの開始時間が変更されないため、ゆっくりと前方に忍び寄るのを防ぎ、「余分な」アクションを詰め込みます。
チェックを実装して時間を追跡するための擬似コード:
//precondition: streakStart and lastAction are initialized as in the far past
// streakCount is initialized as 0
graceHours=18;
checkAllowed(currentTime,&streakStart,&streakCount, &lastAction){
diffhours=hoursDifferent(lastAction,currentTime);
if(diffhours< 24 - graceHours){
return false;
}
diffhours=hoursDifferent(streakStart,currentTime);
if(diffhours <= 24*streakCount - graceHours){
return false;
}
if(diffhours > 24*(streakCount+2)-graceHours){
streakStart=currentTime;
streakCount=0;
}
streakCount++;
lastActionTime=currentTime;
return true;
}
追加ボーナスとして、必要に応じてストリークカウンターを取得します。