fork(12) download
  1. import System.Random
  2. import qualified Data.List as L
  3. import qualified Data.Map as Map
  4.  
  5. randIO :: Int -> Int -> IO Int
  6. randIO x y = randomRIO (x, y) :: IO Int
  7.  
  8. fact 0 = 1
  9. fact n = fact(n-1) * n
  10.  
  11. --母音表
  12. vowels :: Int -> [String] -> [String] -> IO [String]
  13. vowels kinds vows void = do --母音の種類と母音表と空のリスト
  14. select <- randIO 1 (length vows)
  15. select2 <- randIO 1 (length vows)
  16. vowslength <- randIO 1 2 --二重母音までにしました。疲れたので三重母音とか言わないで、てか日本語話者は使えないよ
  17. if kinds == length void
  18. then return void
  19. else if kinds > length void && vowslength == 1 && notElem (vows!!(select-1)) void
  20. then vowels kinds vows ((vows!!(select-1)):void)
  21. else if kinds > length void && vowslength == 2 && notElem ((vows!!(select-1))++(vows!!(select2-1))) void && (vows!!(select-1)) /= (vows!!(select2-1))
  22. then vowels kinds vows (((vows!!(select-1))++(vows!!(select2-1))):void)
  23. else vowels kinds vows void
  24.  
  25. --子音表
  26. consonants :: Int -> [String] -> [String] -> IO [String]
  27. consonants kinds con void = do
  28. select <- randIO 1 (length con)
  29. if kinds == length void
  30. then return void
  31. else if kinds > length void && notElem (con!!(select-1)) void
  32. then consonants kinds con ((con!!(select-1)):void)
  33. else consonants kinds con void
  34.  
  35. --音節構造自動生成器(ランダム)
  36. sylgen :: Int -> [String] -> IO [String]
  37. sylgen maxsyllable void = do
  38. let symbol = ["C", "V"]
  39. select <- randIO 0 1
  40. if length void == 0
  41. then do
  42. max <- randIO 1 maxsyllable --音節構造の大きさの範囲を指定するとこ
  43. sylgen max ((symbol!!select):void)
  44. else if (length (head void)) == maxsyllable then syl maxsyllable void
  45. else if (head void)!!0 == 'V' then sylgen maxsyllable ((init (head (((symbol!!0) ++ head void):(init void)))):(init void))
  46. else case select of
  47. 0 -> sylgen maxsyllable (((symbol!!0) ++ head void):(init void))
  48. 1 -> sylgen maxsyllable (((symbol!!1) ++ head void):(init void))
  49.  
  50. syl :: Int -> [String] -> IO [String]
  51. syl maxsyllable input = if (elem 'V' (input!!(length input - 1)) && elem 'C' (input!!(length input - 1))) || elem 'V' (input!!(length input -1)) then return input else sylgen maxsyllable []
  52.  
  53. sylsets :: Int -> Int -> [String] -> IO [String]
  54. sylsets kinds maxsyllable void = do
  55. sylgen <- sylgen maxsyllable []
  56. if length void == kinds then return void
  57. else if notElem (head sylgen) void then sylsets kinds maxsyllable (sylgen ++ void)
  58. else sylsets kinds (maxsyllable+1) void
  59.  
  60. --単語の雛形
  61.  
  62. prewordgen :: Int -> [String] -> [String] -> IO [String]
  63. prewordgen syllableculster syllable void = do
  64. select <- randIO 1 (length syllable)
  65. if length void == 0 then prewordgen syllableculster syllable (syllable!!(select-1):void)
  66. else if length void == syllableculster then preword void []
  67. else prewordgen syllableculster syllable (syllable!!(select-1):void)
  68.  
  69. preword :: [String] -> [String] -> IO [String]
  70. preword input output = if length input == 0 then return output
  71. else if length output == 0 then preword (tail input) ((head input):output) else preword (tail input) ((head output ++ head input):(init output))
  72.  
  73. prewordsets :: Int -> Int -> [String] -> [String] -> IO [String]
  74. prewordsets kinds syllablerange syllable void = do
  75. syllableculster <- randIO 1 syllablerange
  76. prewordgen <- prewordgen syllableculster syllable []
  77. if length void == kinds then return void
  78. else prewordsets kinds syllablerange syllable (prewordgen ++ void)
  79.  
  80. --単語生成
  81.  
  82. wordgen :: [String] -> [String] -> [String] -> [String] -> IO [String]
  83. wordgen preword vowel consonant void = do
  84. selectcon <- randIO 0 (length consonant-1)
  85. selectvow <- randIO 0 (length vowel-1)
  86. let con = (consonant!!selectcon)
  87. let vow = (vowel!!selectvow)
  88. if length void == length (head preword) then word void []
  89. else case length void of
  90. 0 -> case (head preword)!!0 of
  91. 'V' -> wordgen preword vowel consonant (vow:void)
  92. 'C' -> wordgen preword vowel consonant (con:void)
  93. _ -> case (head preword)!!(length void) of
  94. 'V' -> wordgen preword vowel consonant (void ++ (vow:[]))
  95. 'C' -> if (last void) == con then wordgen preword vowel consonant void else wordgen preword vowel consonant (void ++ (con:[]))
  96.  
  97. word :: [String] -> [String] -> IO [String]
  98. word input output = if length input == 0 then return output
  99. else if length output == 0 then word (tail input) ((head input):output) else word (tail input) ((head output ++ head input):(init output))
  100.  
  101. wordsets :: [String] -> [String] -> [String] -> [String] -> IO [String]
  102. wordsets prewords vowel consonant void =
  103. if length void == length prewords then return void
  104. else do
  105. let preword = (prewords!!(length void)):[]
  106. wordgen <- wordgen preword vowel consonant []
  107. wordsets prewords vowel consonant (void ++ wordgen)
  108.  
  109. --文の生成
  110. sentgen :: [String] -> [String] -> String
  111. sentgen wordlist void
  112. | length wordlist == 0 = head void
  113. | length void == 0 = sentgen (tail wordlist) ((head wordlist):void)
  114. | otherwise = sentgen (tail wordlist) ((head wordlist ++ " " ++ head void):init void)
  115.  
  116. --ユーフォニー指数
  117. euphony :: Double -> Double -> Double -> Double -> Int -> Double
  118. euphony alpha beta gamma delta epsilon
  119. | epsilon == 2 = -0.04*(e0**2) + 1.4*e0
  120. | otherwise = e0
  121. where
  122. e0 = euphony0 alpha beta gamma delta epsilon
  123.  
  124. euphony0 :: Double -> Double -> Double -> Double -> Int -> Double
  125. euphony0 alpha beta gamma delta epsilon = 0.5 * (1 + (1 / (1 + exp (0.5*alpha - 7)))) * (100 / (1 + exp (-2.26*alpha - 0.08693*beta + 0.0112*gamma + 0.388*delta - 11.9)))
  126.  
  127. wordsize :: [String] -> [Int] -> [Int]
  128. wordsize wordlist void
  129. | length wordlist == 0 = void
  130. | otherwise = wordsize (tail wordlist) (void ++ (length (head wordlist)):[])
  131.  
  132. mean :: [Double] -> Double --算術平均
  133. mean ns = (sum ns) / (fromIntegral $ length ns)
  134.  
  135. mode :: [Int] -> [Int] --最頻値
  136. mode [] = []
  137. mode ns =
  138. let l = Map.fromListWith (\n m -> n + m) $ map (\x -> (x, (1::Double))) ns
  139. a = foldr1 (\x acc -> if x > acc then x else acc) $ Map.elems l
  140. in Map.keys $ Map.filter (==a) l
  141.  
  142. alpha :: [String] -> Double
  143. alpha wordlist = mean (map fromIntegral $ wordsize wordlist [])
  144.  
  145. beta0 :: [String] -> [String] -> [String] -> Int
  146. beta0 wordlist consonants void
  147. | length wordlist == 0 = length void
  148. | elem (((head wordlist)!!0):[]) consonants && elem (((head wordlist)!!1):[]) consonants = beta0 (tail wordlist) consonants ((head wordlist):void)
  149. | otherwise = beta0 (tail wordlist) consonants void
  150.  
  151. beta :: [String] -> [String] -> Double
  152. beta wordlist consonants = (fromIntegral $ beta0 wordlist consonants []) / (fromIntegral $ length wordlist)
  153.  
  154. gamma0 :: [String] -> [String] -> [String] -> Int -> Int -> Int
  155. gamma0 wordlist consonants void1 void2 void3
  156. | length wordlist == 0 = length void1
  157. | length (head wordlist) < 3 = gamma0 (tail wordlist) consonants void1 void2 void3
  158. | elem (head wordlist) ("s":[]) == False = gamma0 (tail wordlist) consonants (void1 ++ ((head wordlist):[])) void2 void3
  159. | otherwise = if ((head wordlist)!!void2) == 's'
  160. then
  161. if ((head wordlist)!!(void2+1)) /= (head (consonants!!void3)) then gamma0 (tail wordlist) consonants void1 void2 (void3+1)
  162. else if ((head wordlist)!!(void2+2)) == 'r' || ((head wordlist)!!(void2+2)) == 'l' || ((head wordlist)!!(void2+2)) == 'h' then gamma0 (tail wordlist) consonants void1 0 0
  163. else gamma0 (tail wordlist) consonants (void1 ++ (head wordlist):[]) 0 0
  164. else gamma0 wordlist consonants void1 (void2+1) void3
  165.  
  166. gamma :: [String] -> [String] -> Double
  167. gamma wordlist consonants = (((fromIntegral (gamma0 wordlist consonants [] 0 0)) / (fromIntegral $ length wordlist)) * (beta wordlist consonants))
  168.  
  169. delta0 :: [String] -> [String] -> String
  170. delta0 wordlist void
  171. | length wordlist == 0 = head void
  172. | length void == 0 = delta0 (tail wordlist) ((head wordlist):void)
  173. | otherwise = delta0 (tail wordlist) ((head wordlist ++ head void):init void)
  174.  
  175. delta1 :: String -> Int -> Int
  176. delta1 word void
  177. | length word == 0 = void
  178. | head word == 'C' = delta1 (tail word) void+1
  179. | otherwise = delta1 (tail word) void
  180.  
  181. delta :: [String] -> Double
  182. delta syllablelist = (fromIntegral (delta1 (delta0 syllablelist []) 0)) / (fromIntegral (length (delta0 syllablelist [])))
  183.  
  184. epsilon0 :: String -> Int -> [Int] -> Int
  185. epsilon0 word void1 void2
  186. | length word == 0 = head (mode void2)
  187. | head word == 'C' = epsilon0 (tail word) (void1+1) void2
  188. | otherwise = epsilon0 (tail word) 0 (void1:void2)
  189.  
  190. epsilon :: [String] -> Int
  191. epsilon word = epsilon0 (delta0 word []) 0 []
  192.  
  193. main :: IO()
  194. main = do
  195. putStrLn "母音一覧"
  196. let vowel = ["a", "i", "u", "e", "o"]
  197. vows <- randIO 1 (length vowel)
  198. vowels <- vowels vows vowel []
  199. print $ vowels
  200. putStrLn "子音一覧"
  201. let consonant = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]
  202. cons <- randIO 2 (length consonant)
  203. consonants <- consonants cons consonant []
  204. print $ consonants
  205. putStrLn "音節構造一覧"
  206. kind <- randIO 1 50
  207. max <- randIO 1 3
  208. sylsets <- sylsets kind max []
  209. print $ sylsets
  210. putStrLn "単語の雛形(語の音節構造)"
  211. prewordgen <- prewordgen 3 sylsets []
  212. print $ prewordgen
  213. putStrLn "単語の雛形(語の音節構造)一覧"
  214. syllablerange <- randIO 1 6
  215. prewordsets <- prewordsets 30 syllablerange sylsets []
  216. print $ prewordsets
  217. putStrLn "単語"
  218. wordgen <- wordgen prewordgen vowels consonants []
  219. print $ wordgen
  220. putStrLn "単語一覧"
  221. wordsets <- wordsets prewordsets vowels consonants []
  222. print $ wordsets
  223. putStrLn "文の生成"
  224. let sentence = sentgen wordsets []
  225. print $ sentence
  226. putStrLn "ユーフォニー指数(Euphony Index;)"
  227. putStr "alpha:"
  228. let alph = alpha wordsets
  229. print $ alph
  230. putStr "beta:"
  231. let bet = 100 * (beta wordsets consonants)
  232. print $ bet
  233. putStr "gamma:"
  234. let gam = 100 * (gamma wordsets consonants)
  235. print $ gam
  236. putStr "delta:"
  237. let del = 100 * (delta prewordsets)
  238. print $ del
  239. putStr "epsilon:"
  240. let ep = epsilon prewordsets
  241. print $ ep
  242. putStr "E = "
  243. let euphonyindex = euphony alph bet gam del ep
  244. print $ euphonyindex
Success #stdin #stdout 0s 4980KB
stdin
Standard input is empty
stdout
母音一覧
["ae","iu","ao","a","e"]
子音一覧
["v","n","d","k","t","l","b","f","j","s","g","y","z","r","x","p","c","w","q"]
音節構造一覧
["VCCV","VC","CCV","V"]
単語の雛形(語の音節構造)
["VCVVCCV"]
単語の雛形(語の音節構造)一覧
["VCCVV","VCCVCCV","VCCV","VC","CCVCCV","VC","VCCV","V","VV","VCV","VCCVVCCV","VCCV","VCCVCCV","VCCV","VCCVVCCV","V","VCV","VC","CCVVC","VC","VVCCV","VCCV","CCV","V","VC","CCV","VCCV","VCVCCV","VCVC","VC"]
単語
["aesaeaozbiu"]
単語一覧
["aewfaoa","agnaebriu","aoywiu","ed","qkertae","es","avtao","e","iuiu","apao","iulciuaekviu","abwa","azkeyjae","aevrae","iusbaeanpiu","a","abae","ac","zpiueg","iuw","eekdae","iupce","lse","e","aeb","kniu","etxa","eqaorxao","iupev","ay"]
文の生成
"ay iupev eqaorxao etxa kniu aeb e lse iupce eekdae iuw zpiueg ac abae a iusbaeanpiu aevrae azkeyjae abwa iulciuaekviu apao iuiu e avtao es qkertae ed aoywiu agnaebriu aewfaoa"
ユーフォニー指数(Euphony Index;)
alpha:4.833333333333333
beta:13.333333333333334
gamma:10.222222222222223
delta:49.122807017543856
epsilon:0
E = 98.68863197185318