46 lines
1.5 KiB
Text
46 lines
1.5 KiB
Text
import util.
|
|
|
|
main =>
|
|
Text =
|
|
"Given$a$text$file$of$many$lines,$where$fields$within$a$line$
|
|
are$delineated$by$a$single$'dollar'$character,$write$a$program
|
|
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
|
|
column$are$separated$by$at$least$one$space.
|
|
Further,$allow$for$each$word$in$a$column$to$be$either$left$
|
|
justified,$right$justified,$or$center$justified$within$its$column.",
|
|
Lines = split(Text,"\n"),
|
|
Lines = [Line1|_],
|
|
N = len(split(strip(Line1,"$ "), "$")), % number of columns
|
|
WidthArr = {0 : _ in 1..N},
|
|
foreach (Line in Lines)
|
|
Words = split(strip(Line,"$ "), "$"),
|
|
foreach ({I,Word} in zip(1..N, Words))
|
|
WidthArr[I] := max(WidthArr[I], len(Word))
|
|
end
|
|
end,
|
|
foreach (I in 1..N)
|
|
WidthArr[I] := WidthArr[I]+1 % separate cols by at least one space
|
|
end,
|
|
foreach (Align in [left, right, center])
|
|
output_lines(Lines,N,WidthArr,Align),
|
|
nl,nl
|
|
end.
|
|
|
|
output_lines(Lines,N,WidthArr,Align) =>
|
|
foreach (Line in Lines)
|
|
Words = split(strip(Line,"$ "), "$"),
|
|
foreach ({I,Word} in zip(1..N, Words))
|
|
output_word(Word,WidthArr[I],Align)
|
|
end,
|
|
nl
|
|
end.
|
|
|
|
output_word(Word,Width,left) =>
|
|
printf("%-*s",Width,Word).
|
|
output_word(Word,Width,right) =>
|
|
printf("%*s",Width,Word).
|
|
output_word(Word,Width,_) =>
|
|
Pad = len(Word)-Width,
|
|
Pad1 is Pad div 2,
|
|
Pad2 is Pad-Pad1,
|
|
printf("%*s%s%*s",Pad1,"",Word,Pad2,"").
|