将数字转换为特定范围内的等效数字
Converting a number to its equivalent in a specific range
我做某事有困难,我想将一个数字转换为给定范围内的 "equivalent"。
虽然这个概念真的很简单,但很难解释,所以我会尽力而为。
假设您有无限行瓷砖,但尽管有无限数量的瓷砖,但重复的是完全相同的颜色图案,如下所示:
如您所见,我已经为每个图块指定了一个数字,但我们可以取一个范围,从 0 到 4,然后说:
0 是紫色
1 是蓝色
2 是红色的
3 是绿色
4 是黄色
但是因为这种颜色模式无限重复,实际上,5 与 0 的颜色相同,6 与 1 的颜色相同,8 与 3 的颜色相同。
此外,我们不能忘记负数,例如 -1 与 4 具有相同的颜色。
实际上我想做的是将任何给定的数字转换成我选择的范围内的数字,这里是范围 [0;4] 这样我就可以知道什么颜色对应于这个特定的图块。
我还希望此方法适用于其他范围,例如,如果我的范围是 [1;5] 甚至 [-7;-3],它也应该适用。
我已经找到了适用于 [0;n]
范围(n
一个正整数)和 a
另一个正整数的方法:
convertedNumber = a % (n+1)
这是游乐场带来的好处:
但它只适用于我描述的条件,经过几个小时的努力,我仍然找不到任何好的解决方案来让它适用于任何数字,正数或负数,以及任何范围。
不要犹豫,在评论中询问更多详情。
谢谢。
func modFromRange(range: Range<Int>, ind: Int) -> Int {
let endIndex = abs(range.endIndex.predecessor() - range.startIndex).successor()
let i = (ind - range.startIndex) % endIndex
return i < 0 ? (range.startIndex + i + endIndex) : (range.startIndex + i)
}
modFromRange(1...5, ind: 1) // 1
modFromRange(-7...(-3), ind: -8) // -3
工作方式如下:
modFromRange(-7...(-3), ind: -7) // -7
modFromRange(-7...(-3), ind: -2) // -7
modFromRange(-7...(-3), ind: -8) // -3
modFromRange(-7...(-3), ind: 1) // -4
modFromRange(1...5, ind: 1) // 1
modFromRange(1...5, ind: 5) // 5
modFromRange(1...5, ind: 6) // 1
modFromRange(1...5, ind: 0) // 5
modFromRange(1...5, ind: -1) // 4
modFromRange(1...5, ind: -9) // 1
For -7...-3:
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
[ -5, -4, -3, -7, -6, -5, -4, -3, -7, -6, -5, -4, -3, -7, -6, -5, -4, -3]
For 1...5:
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[ 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
或者,在 Swift 2 上,您可以将其作为一种方法:
extension Range where T : IntegerLiteralConvertible, T : IntegerArithmeticType {
func mod(ind: T) -> T {
let _endIndex = {[=12=] >= 0 ? [=12=] : [=12=] * -1}(endIndex - startIndex)
let i = (ind - startIndex) % _endIndex
return i < 0 ? (startIndex + i + _endIndex) : (startIndex + i)
}
}
哪个会这样工作:
(1...5).mod(1) // 1
(1...5).mod(6) // 1
给你。该函数采用您要映射的数字、范围的低值和高值以及 returns 范围内的值:
func mapNum(n: Int, low lo: Int, high hi: Int) -> Int {
let spread = hi - lo + 1
return ((n - lo) % spread + spread) % spread + lo
}
示例:
mapNum(-9, low: 0, high: 4) // returns "1"
mapNum(-9, low: -3, high: 1) // returns "1"
mapNum(1, low: -11, high: -7) // returns "-9"
mapNum(3, low: -8, high: -4) // returns "-7"
mapNum(-5, low: 4, high: 8) // returns "5"
mapNum(-5, low: -6, high: -2) // returns "-5"
mapNum(-9, low: -7, high: -3) // returns "-4"
extension Int {
var convertedNumber: Int {
if self < 0 {
return self * -4 % 5 + 1
}
return ( self % 5 ) + 1
}
}
let n = -9
let result = n.convertedNumber // 2
println(result) // 2
(-9).convertedNumber // 2
(-8).convertedNumber // 3
(-7).convertedNumber // 4
(-6).convertedNumber // 5
(-5).convertedNumber // 1
(-4).convertedNumber // 2
(-3).convertedNumber // 3
(-2).convertedNumber // 4
(-1).convertedNumber // 5
(0).convertedNumber // 1
(1).convertedNumber // 2
(2).convertedNumber // 3
(3).convertedNumber // 4
(4).convertedNumber // 5
(5).convertedNumber // 1
(6).convertedNumber // 2
(7).convertedNumber // 3
(8).convertedNumber // 4
(9).convertedNumber // 5
(10).convertedNumber // 1
我做某事有困难,我想将一个数字转换为给定范围内的 "equivalent"。
虽然这个概念真的很简单,但很难解释,所以我会尽力而为。
假设您有无限行瓷砖,但尽管有无限数量的瓷砖,但重复的是完全相同的颜色图案,如下所示:
如您所见,我已经为每个图块指定了一个数字,但我们可以取一个范围,从 0 到 4,然后说:
0 是紫色
1 是蓝色
2 是红色的
3 是绿色
4 是黄色
但是因为这种颜色模式无限重复,实际上,5 与 0 的颜色相同,6 与 1 的颜色相同,8 与 3 的颜色相同。
此外,我们不能忘记负数,例如 -1 与 4 具有相同的颜色。
实际上我想做的是将任何给定的数字转换成我选择的范围内的数字,这里是范围 [0;4] 这样我就可以知道什么颜色对应于这个特定的图块。
我还希望此方法适用于其他范围,例如,如果我的范围是 [1;5] 甚至 [-7;-3],它也应该适用。
我已经找到了适用于 [0;n]
范围(n
一个正整数)和 a
另一个正整数的方法:
convertedNumber = a % (n+1)
这是游乐场带来的好处:
但它只适用于我描述的条件,经过几个小时的努力,我仍然找不到任何好的解决方案来让它适用于任何数字,正数或负数,以及任何范围。
不要犹豫,在评论中询问更多详情。
谢谢。
func modFromRange(range: Range<Int>, ind: Int) -> Int {
let endIndex = abs(range.endIndex.predecessor() - range.startIndex).successor()
let i = (ind - range.startIndex) % endIndex
return i < 0 ? (range.startIndex + i + endIndex) : (range.startIndex + i)
}
modFromRange(1...5, ind: 1) // 1
modFromRange(-7...(-3), ind: -8) // -3
工作方式如下:
modFromRange(-7...(-3), ind: -7) // -7
modFromRange(-7...(-3), ind: -2) // -7
modFromRange(-7...(-3), ind: -8) // -3
modFromRange(-7...(-3), ind: 1) // -4
modFromRange(1...5, ind: 1) // 1
modFromRange(1...5, ind: 5) // 5
modFromRange(1...5, ind: 6) // 1
modFromRange(1...5, ind: 0) // 5
modFromRange(1...5, ind: -1) // 4
modFromRange(1...5, ind: -9) // 1
For -7...-3:
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
[ -5, -4, -3, -7, -6, -5, -4, -3, -7, -6, -5, -4, -3, -7, -6, -5, -4, -3]
For 1...5:
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[ 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
或者,在 Swift 2 上,您可以将其作为一种方法:
extension Range where T : IntegerLiteralConvertible, T : IntegerArithmeticType {
func mod(ind: T) -> T {
let _endIndex = {[=12=] >= 0 ? [=12=] : [=12=] * -1}(endIndex - startIndex)
let i = (ind - startIndex) % _endIndex
return i < 0 ? (startIndex + i + _endIndex) : (startIndex + i)
}
}
哪个会这样工作:
(1...5).mod(1) // 1
(1...5).mod(6) // 1
给你。该函数采用您要映射的数字、范围的低值和高值以及 returns 范围内的值:
func mapNum(n: Int, low lo: Int, high hi: Int) -> Int {
let spread = hi - lo + 1
return ((n - lo) % spread + spread) % spread + lo
}
示例:
mapNum(-9, low: 0, high: 4) // returns "1"
mapNum(-9, low: -3, high: 1) // returns "1"
mapNum(1, low: -11, high: -7) // returns "-9"
mapNum(3, low: -8, high: -4) // returns "-7"
mapNum(-5, low: 4, high: 8) // returns "5"
mapNum(-5, low: -6, high: -2) // returns "-5"
mapNum(-9, low: -7, high: -3) // returns "-4"
extension Int {
var convertedNumber: Int {
if self < 0 {
return self * -4 % 5 + 1
}
return ( self % 5 ) + 1
}
}
let n = -9
let result = n.convertedNumber // 2
println(result) // 2
(-9).convertedNumber // 2
(-8).convertedNumber // 3
(-7).convertedNumber // 4
(-6).convertedNumber // 5
(-5).convertedNumber // 1
(-4).convertedNumber // 2
(-3).convertedNumber // 3
(-2).convertedNumber // 4
(-1).convertedNumber // 5
(0).convertedNumber // 1
(1).convertedNumber // 2
(2).convertedNumber // 3
(3).convertedNumber // 4
(4).convertedNumber // 5
(5).convertedNumber // 1
(6).convertedNumber // 2
(7).convertedNumber // 3
(8).convertedNumber // 4
(9).convertedNumber // 5
(10).convertedNumber // 1