Untitled

 avatar
unknown
swift
a year ago
1.5 kB
5
Indexable
import Foundation

enum SolutionError: String, Error {
    case characterError = "Please provide only 0 or 1"
    case convertStringError = "Can't convert string to int"
    case intValueNotAllowable = "Converted binary string is not allowable"
}

final class SolutionHelper {
    static func containsOnlyBinaryCharacters(_ input: String) -> Bool {
        let binaryCharacterSet = CharacterSet(charactersIn: "01")
        return input.unicodeScalars.allSatisfy { binaryCharacterSet.contains($0) }
    }
    
    static func convertBinaryStringToInt(value: String) -> Int? {
        guard let value = Int(value, radix: 2) else {
            return 0
        }
        return value
    }
    
    static func isIntAllowable(value: Int) -> Bool {
        value >= 1 && value <= 1_000_000
    }
}

public func solution(_ S : inout String) throws -> Int {
    guard SolutionHelper.containsOnlyBinaryCharacters(S) else {
        throw SolutionError.characterError
    }
    
    guard var value = SolutionHelper.convertBinaryStringToInt(value: S) else {
        throw SolutionError.convertStringError
    }
    
    guard SolutionHelper.isIntAllowable(value: value) else {
        throw SolutionError.intValueNotAllowable
    }
    
    var operations = 0
    
    while value > 0 {
        if value % 2 == 0 {
            value /= 2
        } else if value % 2 != 0 {
            value -= 1
        }
        operations += 1
    }
    
    return operations
}


var str = "1111010101111"
print(try solution(&str))
Editor is loading...
Leave a Comment