Я носитель языка Swift и изо всех сил пытаюсь понять, почему мой алгоритм не работает при переводе на Python.
При запуске в Python он никогда не сбрасывает значение x или y на ноль. Например, ввод 4 должен дать (2, 0), но в версии Python он возвращает (2, 1).
Вот это в Свифте:
func position(from index: Int, gridSize: Int = 32) -> (x: Int, y: Int) {
if index < 0 {
return (-1, -1)
}
if gridSize < 1 {
return (0, 0)
}
let localIndex = Int((Float(index) / Float(gridSize * gridSize)) * 4)
let qx = localIndex % 2
let qy = localIndex / 2
let halfGrid = gridSize / 2
var x = qx * halfGrid
var y = qy * halfGrid
let nextIndex = Int(index - localIndex * halfGrid * halfGrid)
let (nextX, nextY) = position(from: nextIndex, gridSize: gridSize / 2)
x += nextX
y += nextY
return (x, y)
}
А вот на Питоне:
def posFromIndex(index, grid):
if index < 0:
return -1, -1
if grid < 1:
return 0, 0
localIndex = int((index / float(grid * grid)) * 4)
qx = localIndex % 2
qy = localIndex / 2
hg = grid / 2
x = qx * hg
y = qy * hg
nextIndex = int(index - localIndex * hg * hg)
nextX, nextY = posFromIndex(nextIndex, grid / 2)
x += nextX
y += nextY
print(x, y)
return int(x), int(y)
Целочисленное деление //
в python 3. Не уверен, что это связано, хотя
Обратите внимание, что вы можете использовать qy, qx = divmod(localIndex, 2)
; это будет правильно выполнять целочисленное деление (например, //
).
Причина в том, что такие целочисленные деления gridSize / 2
в Swift возвращают целые числа, а в Python grid / 2
возвращает число с плавающей запятой, хотя grid
является целым числом.
Если вы хотите использовать аналогичный тип целочисленного деления в Python, вам нужно использовать оператор //
.
Если вы исправите эту ошибку (и добавите значение по умолчанию для параметра grid
, вы правильно получите вывод (2, 0)
для ввода 4
:
def posFromIndex(index, grid = 32):
if index < 0:
return -1, -1
if grid < 1:
return 0, 0
localIndex = int(index / (grid * grid) * 4)
qx = localIndex % 2
qy = localIndex // 2
hg = grid // 2
x = qx * hg
y = qy * hg
nextIndex = index - localIndex * hg * hg
nextX, nextY = posFromIndex(nextIndex, grid // 2)
x += nextX
y += nextY
return x, y
print(posFromIndex(4))
Выход:
(2, 0)
Обратите внимание, что вы также можете упростить функцию, удалив из нее кучу ненужного приведения.
Бежать с какими аргументами? Можете ли вы привести полный пример?