Let's suppose I have an Int like 30, how can i take ranged numbers by 7 and put them into a list of pairs in Swift?
For example in this case it would be [(1, 7), (8, 14), (15, 21), (22, 28), (29, 30)] where the last couple is 29-30.
I found a code in Kotlin that may do that but I don't know how could it be in Swift since I don't know Kotlin. I post it in case it is helpful.
val myInt = 28
val list = (1..ceil(myInt/7.0).toInt()).mapIndexed { index, i ->
7*index 1 to (7*index 7).coerceAtMost(myInt)
}
print(list)
Update:
I tried this code so far:
var days = 30
var daysInt: [Int] = []
var index = 0
for i in 1...days {
if index <= days {
if i == 1 {
index = 1
daysInt.append(index)
index = 6
daysInt.append(index)
} else {
index = 1
daysInt.append(index)
index = 6
daysInt.append(index)
}
}
}
And the output is:
- 0 : 1
- 1 : 7
- 2 : 8
- 3 : 14
- 4 : 15
- 5 : 21
- 6 : 22
- 7 : 28
- 8 : 29
- 9 : 35
All fine but the 35 should be 30.
I'm sure there is a better way.
CodePudding user response:
The Kotlin code
(1..myInt step 7).map { it to min(it 6, myInt) }
which was suggested in a comment can almost literally be translated to Swift.
With stride()
you can create the sequence 1, 8, 15, ..., 29, and with map()
you can map each value to a tuple:
let days = 30
let list = stride(from: 1, to: days, by: 7).map { ($0, min($0 6, days)) }
print(list)
// [(1, 7), (8, 14), (15, 21), (22, 28), (29, 30)]
CodePudding user response:
Almost similar apprach
import Foundation
let numbers = 1...7
let myInt = 28
let indexAndNum = numbers.enumerated().map { (index, element) in
return (((7*index) 1) ,((7*index) 7))
}
print(indexAndNum.filter { $0.0 <= myInt})
Update
import Foundation
let numbers = 1...7
let myInt = 30
let indexAndNum = numbers.enumerated().map { (index, element) in
return (((7*index) 1) ,((7*index) 7))
}
let f: [(Int,Int)] = indexAndNum.filter { $0.0 <= myInt }
print(f.map {
if $0.1 < myInt { return ($0.0,$0.1) } else {return ($0.0,myInt)}
} as [(Int,Int)]
)