Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open System
- open FsUnit
- open NUnit.Framework
- module aln =
- //Описание типов
- type LineElement =
- |Word of string
- |Space of int
- type NewLineElement = Line of (LineElement list)*int*int
- //Функция рисующая n пробелов
- let nspace n =
- let rec nspace' n str =
- match n with
- |0->str
- |_->nspace' (n-1) (str+" ")
- nspace' n ""
- //Функция делящая слова на отдельные строчки и вставляющая по одному пробелу между словами
- 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)
- |[]->[]
- //Функция пещатающая линию
- 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 "";
- [<TestFixture>]
- module test =
- [<Test>]
- let ``Test`` () =
- let src = [aln.Word("jgxzczx") ; aln.Word ("svyaza"); aln.Word ("korova"); aln.Word ("at"); aln.Word("let"); aln.Word("kok"); aln.Word("s"); aln.Word("ere"); aln.Word("oblom"); aln.Word("Kirovreporting")]
- let temp = aln.divide src 20
- let out = aln.alignwidth temp
- out |> should equal [aln.Line ([aln.Word "svyaza"; aln.Space 7; aln.Word "jgxzczx"],14,2);
- aln.Line([aln.Word "s"; aln.Space 2; aln.Word "kok"; aln.Space 1; aln.Word "let"; aln.Space 1; aln.Word "at"; aln.Space 1; aln.Word "korova"],19,5);
- aln.Line ([aln.Word "oblom"; aln.Space 12; aln.Word "ere"],9,2);
- aln.Line ([aln.Word "Kirovreporting"],14,1)]
- [<EntryPoint>]
- let main argv =
- let list = [aln.Word("jgxzczx") ; aln.Word ("svyaza"); aln.Word ("korova"); aln.Word ("at"); aln.Word("let"); aln.Word("kok"); aln.Word("s"); aln.Word("ere"); aln.Word("oblom"); aln.Word("Kirovreporting")]
- let sc = aln.divide list 20
- let m = aln.alignright sc 20
- let r = aln.printtext m
- printfn "%A" argv
- 0 // возвращение целочисленного кода выхода
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement