Use a regular expressions to get indices from one string. Then use those indices to get the content from another. #AdventOfCode2022 #Day5 https://adventofcode.com/2022/day/5
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
let stringA = " 1 2 3 4 5 6 7 8 9" | |
let stringB = "[F] [R] [C] [F] [L] [Q] [F] [D] [P]" | |
let matches = stringA.matches(of: /\b[0-9]+\b/) | |
for match in matches { | |
print(match.0, terminator: " ") | |
print(match.range.lowerBound) // to prove a point about String.Index | |
} | |
print() | |
for match in matches { | |
print(stringB[match.range], terminator: "") | |
} | |
print() | |
func getMatchRanges(from templateString:String, using regEx:String) -> [Range<String.Index>] { | |
guard let regex = try? Regex(regEx) else { | |
print("Regex init from \(regEx) failed") | |
return [] | |
} | |
return templateString.matches(of: regex).map( {$0.range} ) | |
} | |
let ranges = getMatchRanges(from: stringA, using: #"\b[0-9]+\b"#) | |
let results = ranges.compactMap({ stringB[$0] }) | |
print(results) | |
//There is a problem if the lines is shorter | |
var stringC = "[M] [V] [C]" | |
//It's actually pretty hard to check the bounds in a normal way. | |
//String.Index is weird ... | |
//https://stackoverflow.com/questions/39676939/how-does-string-index-work-in-swift | |
stringA[(String.Index(utf16Offset: 3, in: stringA)...String.Index(utf16Offset: 8, in: stringA))] | |
//One solution is just to make the string longer | |
let dif = stringA.count - stringC.count | |
let whiteSpace = String(repeating: " ", count: dif) | |
let longEnough:String = stringC.appending(whiteSpace) | |
let resultsFromShortString = ranges.compactMap({ longEnough[$0] }) | |
print(resultsFromShortString) | |
//Or instead make it fail quietly | |
//https://www.vadimbulavin.com/handling-out-of-bounds-exception/ | |
extension String { | |
subscript(quiet range: (Range<String.Index>)) -> Substring? { | |
return indices.contains(range.lowerBound) && indices.contains(range.upperBound) ? self[range] : nil | |
} | |
} | |
let resultsWithQuietFail = ranges.compactMap({ stringC[quiet: $0] }) | |
print(resultsWithQuietFail) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment