2017-03-14 10 views
0

私は、CoreMotionのGyroDataを使用して、デバイスの動きのZ方向を決定しています。これは私に二倍の配列を返します。前向きに前進、後向きに後退。私は、デバイスが一方向に何回動くかを数えたいと思っています。反対方向への移動は1カウントになります。アレイとカウントの変化を負から正に反復する(逆も同様)

私は値が正の値から負の値に変化するか、または負の値から配列の中に何回変化するかを数えようとしています。これが配列の場合、カウントは3になります。

let array = [1, 2, 3, 4, -1, -1, -2, -3, 1, 2, 3, -1, -2] 

これは1行で行うことはできますか?私は完全にこのコードで物事を複雑にかけてるような気がします:

var count = 0 
var isPositive = false 

for (index, value) in array.enumerated() { 

    if isPositive == false { 
     if value > 0 { 
      isPositive = true 
      count += 1 
     } 
    } else { 
     if value < 0 
      isPositive = false 
      count += 1 
     } 
    } 
} 

感謝!!

+0

この質問はここではなく[codereview](http://codereview.stackexchange.com)には適しています – Honey

+0

あなたは「肯定的な値から負の値まで」と言います。それは2回だけではなく、3であると言います。 '4' - > '-1'と' 3' - > '-1' – erkanyildiz

+0

0は何をプラスかマイナスかと見なしますか? – matt

答えて

0

注:カウントするペアの正確なロジックは、あなたが探しているものが正確にはわからないため変更されることがあります。必要に応じて適切な変更を加えるだけで十分簡単です。

まず、私たちが探している遷移の種類を明確にします。私は、負の数(0未満)から非負の数(0およびすべての正の数)への遷移を見ていきます。あなたはシーケンスのペアを反復処理しようとしているこのようなケースでは、zip(_:_:)は本当に便利になる

extension Integer { 
    var isNonNegative: Bool { return !isNegative } 
    var isNegative: Bool { return self < 0 } 
} 

:私は、次の拡張でこれを簡素化します。これらのペアになり

let array = [1, 2, 3, 4, -1, -1, -2, -3, 1, 2, 3, -1, -2] 
let pairs = zip(array, array.dropFirst(1)) 
print(Array(pairs)) 

:ここから

[(1, 2), (2, 3), (3, 4), (4, -1), (-1, -1), (-1, -2), (-2, -3), (-3, 1), (1, 2), (2, 3), (3, -1), (-1, -2)] 

は、それだけで最初の要素(.0)が負であるペアの数、第二の要素を数えるの問題です(.1)は正である。これと同じように:私はここに私自身の以前の答えを好きではなかった

let numRisingEdges = pairs.reduce(0) { count, pair in 
    if pair.0.isNegative && pair.1.isNonNegative { return count + 1 } 
    else { return count } 
} 

print(numRisingEdges) // => 1 
+0

ありがとう@アレクサンダー - それはショットを与えるでしょう。 – robinyapockets

+0

素晴らしい作品です!ありがとう – robinyapockets

0

がわずかに異なるアプローチです:

let array = [1, 1, 2, 3, 4, -1, -1, -2, -3, 1, 2, 3, -1, -2] 
    func sign(_ i: Int) -> Int { 
     switch true { 
     case i > 0: return 1 
     case i < 0: return -1 
     default: return 0 
     } 
    } 
    let result = array.map{sign($0)}.reduce([Int]()) { arr, cur in 
     var arr = arr 
     if arr.count == 0 { 
      arr.append(cur) 
     } else if arr.last! != cur { 
      arr.append(cur) 
     } 
     return arr 
    } 
    print(result.count-1) // 3 

アイデアは、我々は符号変化のスクラッチパッドとしてarrを維持することです。しかし、の最初のエントリは、前に何もないのでカウントされないので、変更の総数から1を引いて値を減らします。

+0

ありがとう@マット!これは素晴らしい作品です!最初の不明瞭な質問に対する謝罪。私はあなたの時間を感謝します。 – robinyapockets

+0

問題はありません。代わりの方法を示したかっただけです。 – matt

関連する問題