2015-11-18 18 views
6

Ho creato un algoritmo che accetta un valore Int non negativo, che rappresenta un numero totale di minuti, e restituisce una tripla che fornisce (giorni, ore, minuti) a cui questo corrisponde.Haskell - Modo più efficiente per completare l'algoritmo?

Ecco il mio codice:

calcdays :: Int -> Int 
calcdays x = x `div` (24*60) 

calchours :: Int -> Int 
calchours x = (x - ((calcdays x)*24*60)) `div` 60 

calcmins :: Int -> Int 
calcmins x = (x - ((calcdays x)*24*60) - ((calchours x)*60)) 

dayshoursmins :: Int -> (Int,Int,Int) 
dayshoursmins x = (calcdays x, calchours x, calcmins x) 

Usando solo operazioni di base Haskell (guardie, div, mods, ecc), c'è un modo più semplice di programmazione di questa funzione?

EDIT:

ho usato un suggerimento di seguito per rendere questo codice più semplice, mentre non è così semplice come la soluzione qoutRem, ho pensato che avrei potuto pubblicarlo:

calcdays :: Int -> Int 
calcdays x = x `div` (24*60) 

calchours :: Int -> Int 
calchours x = (x `mod` (24*60)) `div` 60 

calcmins :: Int -> Int 
calcmins x = (x `mod` (24*60)) `mod` 60 

dayshoursmins :: Int -> (Int,Int,Int) 
dayshoursmins x = (calcdays x, calchours x, calcmins x) 
+4

non parlo Haskell ma l'algoritmo va normalmente in questo modo: 'prendere l'input, dividerlo per 60, il resto è la parte minuto, il risultato è quindi diviso per 24, il resto è la parte delle ore, il risultato è la parte dei giorni'. Quindi avresti bisogno di concatenare i calcoli piuttosto che eseguirli in isolamento. – biziclop

+0

Sì, tuttavia, in Haskell, non è possibile impostare variabili, quindi non sono sicuro su come ottenere ciò. –

+1

Non è necessario impostare le variabili, è sufficiente inserire immediatamente il risultato nel passaggio successivo. Comunque non sono sicuro della sintassi. – biziclop

risposta

12

Penso somethink come questo

dayshoursmins x = (d,hr,mr) where 
(h,mr) = quotRem x 60 
(d,hr) = quotRem h 24 
+0

Un grande +1 da parte mia: questa è la strada giusta. Stavo anche facendo il solito cavillo su "quotRem' vs' divMod', ma penso che in questo caso "quotRem" faccia effettivamente quello che mi aspetto sui numeri negativi! –

+0

Come un mendicante in Haskell, non ero a conoscenza di 'quotRem'. Questo è fantastico, molto più semplice, grazie. –

+1

Ho usato [hoogle] (https://www.haskell.org/hoogle/) per trovare div. Le funzioni simili sono generalmente elencate insieme e [prelude] (http://hackage.haskell.org/package/base-4.8.1.0/docs/Prelude.html#v:div) elenca 'quotRem' nella stessa sezione. –

3

È possibile utilizzare

a `mod` b 

per ottenere direttamente il resto.

E è possibile utilizzare let or where per calcolare una sottoespressione.

Problemi correlati