-- | -- Module : Numeracion_de_ternas -- Description : Numeración de las ternas de números naturales. -- Copyright : Exercitium (13-05-14) -- License : GPL-3 -- Maintainer : JoseA.Alonso@gmail.com -- -- Las ternas de números naturales se pueden ordenar como sigue -- -- > (0,0,0), -- > (0,0,1),(0,1,0),(1,0,0), -- > (0,0,2),(0,1,1),(0,2,0),(1,0,1),(1,1,0),(2,0,0), -- > (0,0,3),(0,1,2),(0,2,1),(0,3,0),(1,0,2),(1,1,1),(1,2,0),(2,0,1),(2,1,0),(3,0,0), -- > ... -- -- Definir la función -- -- > posicion :: (Int,Int,Int) -> Int -- -- tal que __(posicion t)__ es la posición de la terna de números -- naturales t en la ordenación anterior. Por ejemplo, -- -- >>> posicion (0,1,0) -- 2 -- >>> posicion (0,0,2) -- 4 -- >>> posicion (0,1,1) -- 5 module Numeracion_de_ternas where -- | Definición. posicion :: (Int,Int,Int) -> Int posicion (x,y,z) = length (takeWhile (/= (x,y,z)) ternas) -- | ternas es la lista ordenada de las ternas de números naturales. Por -- ejemplo, -- -- >>> take 10 ternas -- [(0,0,0),(0,0,1),(0,1,0),(1,0,0),(0,0,2),(0,1,1),(0,2,0),(1,0,1),(1,1,0),(2,0,0)] ternas :: [(Int,Int,Int)] ternas = [(x,y,n-x-y) | n <- [0..], x <- [0..n], y <- [0..n-x]]