Skip to content

Instantly share code, notes, and snippets.

@felix1m
Last active August 29, 2015 14:19
Show Gist options
  • Save felix1m/7abc3d820000c3e6a160 to your computer and use it in GitHub Desktop.
Save felix1m/7abc3d820000c3e6a160 to your computer and use it in GitHub Desktop.
haskell 07
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)
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