Lisp sınıfı için, Haskell'de de çözmeyi denediğim basit bir sıraya dönüştürme şifresi ödevi verildi. Temel olarak, biri bir dizeyi n
uzunluğundaki satırlara böler ve sonra sonucu aktarır. Sonuç listesi listelerinin birleştirilmiş listesi şifrelenmiş dizedir. Kod çözme biraz daha zordur, çünkü en son girdi satırında eksik olan elemanlar (sonuçta eksik sütunlar) bulunmalıdır.Basit satır aktarım şifresi
Bu Haskell benim çözümdür:
import Data.List
import Data.Ratio
import Data.List.Split
encode :: String -> Int -> String
encode s n = concat . transpose $ chunk n s
decode :: String -> Int -> String
decode s n = take len $ encode s' rows
where s' = foldr (insertAt " ") s idxs
rows = ceiling (len % n)
idxs = take (n-filled) [n*rows-1,(n-1)*rows-1..]
filled = len - n * (rows - 1)
len = length s
insertAt :: [a] -> Int -> [a] -> [a]
insertAt xs i ys = pre ++ xs ++ post
where (pre,post) = splitAt i ys
İş yok, ama bu benim çok deklaratif hissetmez endeksleri ile işe yaramaz, çünkü deyimsel Haskell olarak kabul edilip, emin değilim. Bu geliştirilebilir mi ve eğer evet ise, nasıl? Bu arada
: Haskell 98 yılında insertAt
benzer bir şey var mı? Yani Verilen bir endekste bir eleman veya listeyi bir listeye ekleyen bir işlev.
Not: Bu arada bugün kaynaklandığını ödev, bir parçası değildir.
Küçük bir açıklama: yazabilirsiniz idxs = [n * satır-1, (n-1) * satır-1 .. (dolu + 1) * satır-1] '. – HaskellElephant
@HaskellElephant: Güzel görünüyor, teşekkürler! – danlei