Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //open System
- //module aln =
- //Описание типов
- type LineElement =
- |Word of string
- |Space of int
- type NewLineElement = Line of (LineElement list)*int*int
- module aln =
- //Функция делящая слова на отдельные строчки и вставляющая по одному пробелу между словами
- let divide list num =
- let rec divide' list num acc list' list'' numwd =
- match list with
- |hd::tl ->
- match hd with
- |Word a when (list''=[]) -> divide' tl num (String.length a) (list') ([Word(a)]) (numwd+1)
- |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)
- |Word a when ((acc+String.length a+1)>num)-> divide' (hd::tl) num (0) (list'@ [Line(list'', acc, numwd)]) ([]) (0)
- |[]->list'@[Line(list'',acc, numwd)]
- divide' list num 0 [] [] 0
- //Функции выравнивания по различным краям
- let rec alignleft list num =
- match list with
- |hd::tl->
- match hd with
- |Line(list',a, numwd)->[Line(list'@[Space(num-a)], a, numwd)] @ alignleft tl num
- |[]->[]
- let rec aligncenter list num =
- match list with
- |hd::tl->
- match hd with
- |Line(list',a, numwd)->[Line([Space((num-a)%2 + (num-a)/2)]@list'@[Space((num-a)/2)], a, numwd)] @ aligncenter tl num
- |[]->[]
- let rec alignright list num =
- match list with
- |Line(list',a, numwd)::tl->[Line([Space(num-a)]@list', a, numwd)] @ alignright tl num
- |[]->[]
- //Функция вставляющая нужное количество пробелов при выравнивании по ширине
- let newline list numwd numlet num =
- let rec newline' list numwd numlet num listnak =
- match list with
- |(Space k)::tl-> newline' tl (numwd-1) numlet num (Space (k+int(floor(float(num-numlet)/float(numwd-1))))::listnak)
- |(Word k)::tl -> newline' tl numwd numlet num (Word k::listnak)
- |[]->listnak
- Line(newline' list numwd numlet num [], numlet, numwd)
- //функция выравнивания по ширине
- let rec alignwidth list num =
- match list with
- |Line(list',a, numwd)::tl->(newline list' numwd a num)::(alignwidth tl num)
- |[]->[]
- //Функция рисующая n пробелов
- let nspace n =
- let rec nspace' n str =
- match n with
- |0->str
- |_->nspace' (n-1) (str+" ")
- nspace' n ""
- //Функция пещатающая линию
- let rec printline line str=
- match line with
- |Space(k)::tl-> printline tl (str + nspace ( k ))
- |Word(k)::tl-> printline tl (str+k)
- |[]->printfn "%A" str
- //Функция печатающая текст
- let rec printtext list =
- match list with
- |Line(list', a, b)::tl->printline list' ""; printtext tl
- |[]->printfn "";
- let src = [Word("jgxzczx") ; Word ("svyaza"); Word ("korova"); Word ("at"); Word("let"); Word("kok"); Word("s");
- Word("ere"); Word("oblom"); Word("Kirovreporting")]
- let temp = aln.divide src 20
- let out = alignwidth temp
- let main argv =
- let list = [Word("jgxzczx") ; Word ("svyaza"); Word ("korova"); Word ("at"); Word("let");
- Word("kok"); Word("s"); Word("ere"); Word("oblom"); Word("Kirovreporting")]
- let sc = aln.divide list 20
- let m = alignright sc 20
- let r = printtext m
- printfn "%A" argv
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement