Advertisement
Guest User

ру

a guest
May 30th, 2014
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 3.86 KB | None | 0 0
  1. //open System
  2. //module aln =
  3.     //Описание типов
  4. type LineElement =
  5.         |Word of string
  6.         |Space of int
  7.      
  8. type NewLineElement = Line of (LineElement list)*int*int
  9. module aln =
  10.     //Функция делящая слова на отдельные строчки и вставляющая по одному пробелу между словами
  11.     let divide list num =
  12.         let rec divide' list num acc list' list'' numwd =
  13.             match list with
  14.                  |hd::tl ->
  15.                     match hd with
  16.                         |Word a when (list''=[]) -> divide' tl num (String.length a) (list') ([Word(a)]) (numwd+1)
  17.                         |Word a when ((acc+String.length a+1<=num)) -> divide' tl num (acc+String.length a+1) (list') (list''@[Space(1)]@[Word(a)]) (numwd+1)
  18.                         |Word a when ((acc+String.length a+1)>num)-> divide' (hd::tl) num (0) (list'@ [Line(list'', acc, numwd)]) ([]) (0)
  19.                  |[]->list'@[Line(list'',acc, numwd)]
  20.        divide' list num 0 [] [] 0
  21.  
  22.     //Функции выравнивания по различным краям
  23.    let rec alignleft list num =
  24.        match list with
  25.            |hd::tl->
  26.                match hd with
  27.                    |Line(list',a, numwd)->[Line(list'@[Space(num-a)], a, numwd)] @ alignleft tl num
  28.            |[]->[]
  29.  
  30.     let rec aligncenter list num =
  31.        match list with
  32.            |hd::tl->
  33.                match hd with
  34.                    |Line(list',a, numwd)->[Line([Space((num-a)%2 + (num-a)/2)]@list'@[Space((num-a)/2)], a, numwd)] @ aligncenter tl num
  35.            |[]->[]
  36.  
  37.     let rec alignright list num =
  38.        match list with
  39.            |Line(list',a, numwd)::tl->[Line([Space(num-a)]@list', a, numwd)] @ alignright tl num
  40.            |[]->[]
  41.  
  42.     //Функция вставляющая нужное количество пробелов при выравнивании по ширине
  43.     let newline list numwd numlet num =
  44.         let rec newline' list numwd numlet num listnak =
  45.            match list with
  46.                |(Space k)::tl-> newline' tl (numwd-1) numlet num (Space (k+int(floor(float(num-numlet)/float(numwd-1))))::listnak)
  47.                 |(Word k)::tl -> newline' tl numwd numlet num (Word k::listnak)
  48.                |[]->listnak
  49.        Line(newline' list numwd numlet num [], numlet, numwd)
  50.  
  51.     //функция выравнивания по ширине
  52.     let rec alignwidth list num =
  53.          match list with
  54.            |Line(list',a, numwd)::tl->(newline list' numwd a num)::(alignwidth tl num)
  55.            |[]->[]
  56.  
  57.     //Функция рисующая n пробелов
  58.     let nspace n =
  59.         let rec nspace' n str =
  60.            match n with
  61.            |0->str
  62.            |_->nspace' (n-1) (str+" ")
  63.         nspace' n ""
  64.  
  65.    //Функция пещатающая линию
  66.   let rec printline line str=
  67.       match line with
  68.           |Space(k)::tl-> printline tl (str + nspace ( k ))
  69.           |Word(k)::tl->  printline tl (str+k)
  70.           |[]->printfn "%A" str
  71.  
  72.    //Функция печатающая текст
  73.   let rec printtext list =
  74.       match list with
  75.           |Line(list', a, b)::tl->printline list' ""; printtext tl
  76.           |[]->printfn  "";
  77.  
  78.   let src = [Word("jgxzczx") ; Word ("svyaza"); Word ("korova"); Word ("at"); Word("let"); Word("kok"); Word("s");
  79.        Word("ere"); Word("oblom"); Word("Kirovreporting")]  
  80.   let temp = aln.divide src 20
  81.   let out = alignwidth temp
  82.  
  83. let main argv =
  84.  
  85.       let list = [Word("jgxzczx") ; Word ("svyaza"); Word ("korova"); Word ("at"); Word("let");
  86.            Word("kok"); Word("s"); Word("ere"); Word("oblom"); Word("Kirovreporting")]                
  87.  
  88.       let sc = aln.divide list 20
  89.  
  90.       let m = alignright sc 20
  91.  
  92.       let r = printtext m
  93.       printfn "%A" argv
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement