Last active
August 29, 2015 14:19
-
-
Save felix1m/7abc3d820000c3e6a160 to your computer and use it in GitHub Desktop.
haskell 07
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Blueprint where | |
import Prelude | |
import Data.Char hiding (intToDigit) | |
{- | |
- Eine Block-Quersumme fasst jeweils mehrere Ziffern vor Summation | |
- zusammen, bei der letzten Stelle beginnend. Zum Beispiel ist die | |
- 3-Block-Quersumme von 1234567 die Zahl 1 + 234 + 567 = 802. | |
- Eine alternierende Quersumme wechselt Addition und Subtraktion | |
- ab, und zwar so, dass insgesamt keine negative Zahl entsteht. | |
- Zum Beispiel ist die alternierende 3-Block-Quersumme von 1234567 | |
- die Zahl 1 - 234 + 567 = 334, waehrend sich die alternierende | |
- 2-Block-Quersumme von 54321 als -5 + 43 - 21 = 17 ergibt. | |
- | |
- Schreiben Sie eine Funktion, die so generalisierte Quersummen | |
- von natuerlichen Zahlen berechnet. Die Funktion wird gesteuert | |
- ueber Argumente fuer die Blocklaenge und (als Boolescher Wert) | |
- fuer die Angabe, ob oder ob nicht alternierend gerechnet wird. | |
- Also zum Beispiel: | |
- | |
- genQuer 3 False 1234567 = 802 | |
- genQuer 3 True 1234567 = 334 | |
- genQuer 2 True 54321 = 17 | |
-} | |
genQuer :: Integer -> Bool -> Integer -> Integer | |
genQuer size alternate b = do | |
let s = if alternate then alternateSum else sum | |
s (getIntegerGroupings size (show b)) | |
alternateSum :: [Integer] -> Integer | |
alternateSum a = do | |
let fold = foldr (-) 0 | |
let b = fold a | |
if b < 0 then fold (map negate a) else b | |
getIntegerGroupings :: Integer -> String -> [Integer] | |
getIntegerGroupings size b = | |
map ((read::String->Integer) . reverse) (reverse (group (fromIntegral size) (reverse b))) | |
group :: Int -> [a] -> [[a]] | |
group _ [] = [] | |
group n l = take n l : group n (drop n l) | |
main = do | |
print (genQuer 3 False 1234567 == 802) | |
print (genQuer 3 True 1234567 == 334) | |
print (genQuer 2 True 54321 == 17) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Blueprint where | |
import Prelude | |
genQuer :: Integer -> Bool -> Integer -> Integer | |
genQuer size alternate b = | |
s (getGroupings size b) | |
where s = if alternate then alternateSum else sum | |
alternateSum :: [Integer] -> Integer | |
alternateSum a = | |
if b < 0 then f (map negate a) else b | |
where b = f a | |
f = foldr (-) 0 | |
getGroupings :: Integer -> Integer -> [Integer] | |
getGroupings size 0 = [] | |
getGroupings size num = m:getGroupings size n | |
where m = num `mod` 10^size | |
n = num `div` 10^size | |
main = do | |
print (genQuer 3 False 1234567 == 802) | |
print (genQuer 3 True 1234567 == 334) | |
print (genQuer 2 True 54321 == 17) | |
print (genQuer 2 True 54321123123123) | |
print (genQuer 1 True 111111) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment