番号のリストが正しい順序であるかどうかを識別する必要があります。具体的には5のシーケンス。
例1:
- (オリジナルシリーズ)
1,3,4,67,43,20
- (注文シリーズ)
1,3,4,20,43,67
- それは5のシーケンスですか?
FALSE
例2
- (オリジナルシリーズ)
147,10,143,432,144,23,145,146
- (注文シリーズ)
10,23,143,144,145,146,147,432
- それは5のシーケンスですか?
TRUE
(すなわち143-147)
現在-順序付きリストをループし、現在の番号が最後の番号+1と等しいかどうかを確認し、カウンターを保持します。これは機能しますが、これを数学的に、またはプログラムで行うためのより良い方法があるかどうか興味があります。
<cfscript>
_list1 = [1,3,4,67,43,20]; // should evaluate to FALSE
_list2 = [147,10,143,432,144,23,145,146]; // should evaluate to TRUE
_list = _list2; // switch list in one place - test purposes only.
_seq = 1; // sequence counter
_cap = ''; // value of the upper most number of the sequence
_msg = 'There is not a consecutive sequence of 5.'; // message to user
// sort the array smallest to largest
arraySort( _list, 'numeric' );
// loop the array - compare the last number with the current number
for ( i=2; i LTE arrayLen( _list ); i++ ) {
_last = _list[i-1]; // the LAST number - we started at the second element, so we shouldn't error.
_this = _list[i]; // this current number
// compare the two numbers
if ( val( _this ) EQ val( _last ) + 1 ) {
_seq = _seq + 1; // increment our sequence
_cap = _this; // set the top number
}
}
// re-set the message if we meet some threshold (5) is hardcoded here
if ( val( _seq ) GTE 5 ) {
_msg = 'Sequence of ' & _seq & ' to ' & _cap;
}
// write the message
writeoutput( _msg );
</cfscript>