2015-11-18 19 views
6

Toplam dakika sayısını temsil eden negatif olmayan bir Int değeri alan ve bunun karşılık geldiği (gün, saat, dakika) bir üçlü döndüren bir algoritma oluşturdum. programlamanın daha basit bir yolu bu fonksiyon yoktur, sadece temel Haskell işlemleri (vb korumalar, div'ler, modlar) kullanarakHaskell - Algoritmayı tamamlamak için daha etkili bir yol?

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) 

: Burada

benim kodudur?

DÜZENLEME:

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

gibi somethink ama algoritma normalde böyle gider: 'girdi almak 60 bölerek, geri kalan dakika parçasıdır, sonuç daha sonra 24'e bölünmüş, kalan kısım saat kısmıdır, sonuç günlerin parçasıdır. Bu yüzden, hesaplamaları yalıtımda yürütmek yerine zincirlemeniz gerekir. – biziclop

+0

Evet, ancak Haskell'de değişkenleri ayarlayamazsınız, dolayısıyla bunu nasıl başaracağımı bilmiyorum. –

+1

Değişkenleri ayarlamanıza gerek yok, sadece sonucu bir sonraki adıma hemen verin. Yine de sözdizimi konusunda emin değilim. – biziclop

cevap

12

ben Haskell bilmeyen bu

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

Benden Büyük +1 - bu doğru yol. Hatta "quotRem" ve "divMod" hakkında olağan bir kelime hazinesi yapacaktım, ama sanırım bu durumda "quotRem" aslında negatif sayılarda beklediğim şeyi yapıyor! –

+0

Haskell'de bir dilenci olarak, “quotRem” in farkında değildim. Bu harika, çok daha kolay, teşekkürler. –

+1

Div bulmak için [hoogle] (https://www.haskell.org/hoogle/) kullandım. Benzer işlevler genellikle birlikte listelenir ve [prelude] (http://hackage.haskell.org/package/base-4.8.1.0/docs/Prelude.html#v:div) aynı bölümde 'quotRem 'listelenir. –

3

Sen

kullanabilirsiniz: qoutRem çözümü kadar basit değil, ben bunu yayınlamak düşündüm ederken, bu kod daha basit hale getirmek için altındaki bir öneriye kullandık

Geri kalanını doğrudan almak için

.

Ve bir alt ifadeyi hesaplamak için let or where'u kullanabilirsiniz. Bence

İlgili konular