[プログラマー(LV 1)]楽透の最高と最低ランキング


問題の説明


0以上45以下の6つの整数を入力し、当選番号と比較します.
この場合、認識できない数字を0にして、最も低い数字と最も高い数字を出力します.
例)

私が書いたコード
import Foundation

var zeroCount: Int = 0
var numCount: Int = 0
var high: Int = 0 
var low: Int = 0
var resultHigh: Int = 0
var resultLow: Int = 0

func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
    
    
    for i in 0...5{
        for j in 0...5{
            if lottos[i] == 0{
                zeroCount += 1
                break
            } else {
                if lottos[i] == win_nums[j]{
                    numCount += 1
                }
            }
        }
    }
    
    high = numCount + zeroCount
    low = numCount
    
    switch high {
    case 6:
        resultHigh = 1
    case 5:
        resultHigh = 2
    case 4:
        resultHigh = 3
    case 3:
        resultHigh = 4
    case 2:
        resultHigh = 5
    default:
        resultHigh = 6
    }
    
    switch low {
    case 6:
        resultLow = 1
    case 5:
        resultLow = 2
    case 4:
        resultLow = 3
    case 3:
        resultLow = 4
    case 2:
        resultLow = 5
    default:
        resultLow = 6
    }
    
    return [resultHigh, resultLow]
}
見るからにめちゃくちゃだ複文を用いて2つの並び順を比較した.答えを提出して、他の人の答えを見た後、コードの効率を高めるために、もっと勉強すべきだと思います.
修正されたコード
import Foundation


func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
    
    let zeroCount = lottos.filter{$0 == 0}.count
    let winCount = win_nums.filter{lottos.contains($0)}.count
    return [min(7-zeroCount-winCount, 6), min(7-winCount, 6)]
}
明らかに短くなっているのが見えます.filterを用いてlottos配列のうち何個が0であるかを探し出し,同様にlottos配列の値がwin nums配列のうち何個を含むかを探し出し,最高,最低次数を求めた.このとき7−ZeroCount−WinCountまたは7−WinCountの式は7である可能性があるので,最低の6等号と比較した.

filter


抽出内部値を文字通りにフィルタします.例:
let x = [1, 2, 3, 4, 5]
var y = x.filter{$0 < 5}
上記のコードがあれば、yの出力値は1,2,3,4になります.
2つのコードを比較すると,可読性の差が大きい.さらに学び、徐々に発展する.
楽透の最高と最低ランキング