Problema de la bicicleta de Turing

De Wikipedia, la enciclopedia libre

En ciencias de la computación, la bicicleta de Turing es un problema muy utilizado.

Cuentan que Alan Turing tenía una bicicleta vieja, que tenía una cadena con un eslabón débil y además uno de los radios de la rueda estaba doblado. Cuando el radio doblado coincidía con el eslabón débil, entonces la cadena se rompía.

La bicicleta se identifica por los parámetros (i,d,n) donde:

  • i es el número del eslabón que coincide con el radio doblado al empezar a andar,
  • d es el número de eslabones que se desplaza la cadena en cada vuelta de la rueda y
  • n es el número de eslabones de la cadena (el número n es el débil).

Si i = 2, d = 7 y n = 25, entonces la lista con el número de eslabón que toca el radio doblado en cada vuelta es

[2,9,16,23,5,12,19,1,8,15,22,4,11,18,0,7,14,21,3,10,17,24,6,...

Con lo que la cadena se rompe en la vuelta número 14.

Implementación en Haskell[editar]

Definir la función:

eslabones :: Int -> Int -> Int -> [Int]

tal que (eslabones i d n) es la lista con los números de eslabones que tocan el radio doblado en cada vuelta en una bicicleta de tipo (i,d,n).

Por ejemplo, take 10 (eslabones 2 7 25) == [2,9,16,23,5,12,19,1,8,15]

Solución[editar]

eslabones :: Int -> Int -> Int -> [Int] eslabones i d n = [(i+d*j) `mod` n | j <- [0..]]

Se puede definir usando iterate:

eslabones2 :: Int -> Int -> Int -> [Int] eslabones2 i d n = map (\x-> mod x n) (iterate (+d) i)

Definir la función

numeroVueltas :: Int -> Int -> Int -> Int tal que (numeroVueltas i d n) es el número de vueltas que pasarán hasta que la cadena se rompa en una bicicleta de tipo (i,d,n).

Por ejemplo,

numeroVueltas 2 7 25 == 14

Solución[editar]

numeroVueltas :: Int -> Int -> Int -> Int numeroVueltas i d n = length (takeWhile (/=0) (eslabones i d n))

Bibliografía[editar]

  • A. Alonso Jiménes, José,Piensa en Haskell (2012)Sevilla
  • Lenar Michel TR, (2018) Universidad de Las Tunas, Cuba