How to resolve the algorithm Align columns step by step in the Picat programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Align columns step by step in the Picat programming language

Table of Contents

Problem Statement

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. Use the following text to test your programs:

Note that:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Align columns step by step in the Picat programming language

Source code in the picat programming language

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,"").

  

You may also check:How to resolve the algorithm Boolean values step by step in the Oberon-2 programming language
You may also check:How to resolve the algorithm HTTPS/Client-authenticated step by step in the Python programming language
You may also check:How to resolve the algorithm MD4 step by step in the Clojure programming language
You may also check:How to resolve the algorithm Currency step by step in the REXX programming language
You may also check:How to resolve the algorithm Write to Windows event log step by step in the Phix programming language