41 lines
1.3 KiB
Plaintext
41 lines
1.3 KiB
Plaintext
txt = """Given\$a\$txt\$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."""
|
|
|
|
# left/right/center justification of strings:
|
|
ljust(s, width) = s * " "^max(0, width - length(s))
|
|
rjust(s, width) = " "^max(0, width - length(s)) * s
|
|
function center(s, width)
|
|
pad = width - length(s)
|
|
if pad <= 0
|
|
return s
|
|
else
|
|
pad2 = div(pad, 2)
|
|
return " "^pad2 * s * " "^(pad - pad2)
|
|
end
|
|
end
|
|
|
|
parts = [split(rstrip(line, '$'), '$') for line in split(txt, '\n')]
|
|
|
|
max_widths = zeros(Int, maximum(length, parts))
|
|
for line in parts
|
|
for (i, word) in enumerate(line)
|
|
max_widths[i] = max(max_widths[i], length(word))
|
|
end
|
|
end
|
|
max_widths += 1 # separate cols by at least one space
|
|
|
|
for (label, justify) in (("Left", ljust), ("Right",rjust), ("Center",center))
|
|
println(label, " column-aligned output:")
|
|
for line in parts
|
|
for (j, word) in enumerate(line)
|
|
print(justify(word, max_widths[j]))
|
|
end
|
|
println()
|
|
end
|
|
println("-"^sum(max_widths))
|
|
end
|