Tengo dos, soluciones Scala simples recursivo para usted. La idea básica es que el camino no debe exceder de una media caña, que pasa a ser 3 en nuestro caso, pero por supuesto puede ser parametrizada:
def fromAtoBClockwise (a: Int, b: Int) : Boolean = {
if (a > b) ! fromAtoBClockwise (b, a)
else b - a <= 3 }
la distancia no debe ser superior a 3, pero para evitar restando 1 - 5, giramos los parámetros e invertimos el resultado, si a> b.
def fromAtoBClockwise (a: Int, b: Int) : Boolean = {
if (a > b) fromAtoBClockwise (a, b + 6)
else b - a <= 3 }
Una forma alternativa es, simplemente agregar 6, el tamaño del círculo, a b, si es menor.
Ambas funcionan, pero a veces difieren en el resultado, si ambas formas son de la misma longitud.
Con el parámetro para el tamaño, y un tamaño impar, se obtiene el mismo resultado para los dos:
def fromAtoBClockwise (a: Int, b: Int, size: Int) : Boolean = {
if (a > b) ! fromAtoBClockwise (b, a, size)
else b - a <= size/2 }
def fromAtoBClockwise (a: Int, b: Int, size: Int) : Boolean = {
if (a > b) fromAtoBClockwise (a, b + size, size)
else b - a <= size/2 }
prueba (salida de condensado):
(1 to 5).map (a => (1 to 5).map (b => { if (a != b) println (a + " " + b + " " + fromAtoBClockwise (a, b, 5))}))
1 2 true 1 3 true 1 4 false 1 5 false
2 1 false 2 3 true 2 4 true 2 5 false
3 1 false 3 2 false 3 4 true 3 5 true
4 1 true 4 2 false 4 3 false 4 5 true
5 1 true 5 2 true 5 3 false 5 4 false
son los números siempre en orden? ¿Cuál es su "rango" de visibilidad? – Nicholas
Sí, los números están siempre en orden y usted "ve" (sabe) todos los números. –
Realiza una resta modular (base n) y usa un umbral en n/2. – ElKamina