Rosetta Code Challenges - Align columns

Tell us what’s happening:

I’m very puzzled here because I tried each and every way. And I still could not complete the second also the third and fourth examples in this code. It says that I need to align the columns to the right also the left, and center but the code still doesn’t pass I think there might be a bug or glitch in the system.

Your code so far

function formatText(text, alignment = 'left') {
    // Split each line into fields
    const lines = text.map(line => line.split('$'));

    // Determine the maximum width of each column
    const maxWidths = lines[0].map((_, colIndex) => 
        Math.max(...lines.map(line => (line[colIndex] || '').length))
    );

    // Define alignment functions
    const leftJustify = (field, width) => field.padEnd(width);
    const rightJustify = (field, width) => field.padStart(width);
    const centerJustify = (field, width) => {
        const totalPadding = width - field.length;
        const leftPadding = Math.floor(totalPadding / 2);
        const rightPadding = totalPadding - leftPadding;
        return ' '.repeat(leftPadding) + field + ' '.repeat(rightPadding);
    };

    // Choose the appropriate alignment function
    let justify;
    if (alignment === 'left') {
        justify = leftJustify;
    } else if (alignment === 'right') {
        justify = rightJustify;
    } else if (alignment === 'center') {
        justify = centerJustify;
    } else {
        throw new Error("Invalid alignment. Choose from 'left', 'right', or 'center'.");
    }

    // Align each field in the columns
    const alignedLines = lines.map(line => 
        line.map((field, colIndex) => justify(field, maxWidths[colIndex])).join(' ')
    );

    return alignedLines.join('\n');
}

// Test the function
const testText = [
    '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.'
];

console.log("Left Justified:\n");
console.log(formatText(testText, 'left'));
console.log("\nRight Justified:\n");
console.log(formatText(testText, 'right'));
console.log("\nCenter Justified:\n");
console.log(formatText(testText, 'center'));

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0

Challenge Information:

Rosetta Code Challenges - Align columns

Tell us what’s happening:

I’m trying to display the aligned text properly for different alignments focusing on displaying columns to the right also the left and center. I formatted the console to the correct alignments but my code still doesn’t pass. Is it possible if you can explain to me where I went wrong so I can figured out how I can correct this issue. Thanks and have a blessed day.

Your code so far

function formatText(text, alignment = 'left') {
    // Step 1: Split each line into fields
    const lines = text.map(line => line.split('$'));

    // Step 2: Determine the maximum width of each column
    const maxWidths = lines[0].map((_, colIndex) => 
        Math.max(...lines.map(line => (line[colIndex] || '').length))
    );

    // Step 3: Define alignment functions
    // Left justification: pad spaces to the right of the field
    const leftJustify = (field, width) => field.padEnd(width, ' ');
    
    // Right justification: pad spaces to the left of the field
    const rightJustify = (field, width) => field.padStart(width, ' ');
    
    // Center justification: calculate and pad spaces on both left and right
    const centerJustify = (field, width) => {
        const totalPadding = width - field.length;
        const leftPadding = Math.floor(totalPadding / 2);
        const rightPadding = totalPadding - leftPadding;
        return ' '.repeat(leftPadding) + field + ' '.repeat(rightPadding);
    };

    // Step 4: Choose the appropriate alignment function
    let justify;
    if (alignment === 'left') {
        justify = leftJustify;
    } else if (alignment === 'right') {
        justify = rightJustify;
    } else if (alignment === 'center') {
        justify = centerJustify;
    } else {
        throw new Error("Invalid alignment. Choose from 'left', 'right', or 'center'.");
    }

    // Step 5: Align each field in the columns for every line
    const alignedLines = lines.map(line => 
        line.map((field, colIndex) => justify(field || '', maxWidths[colIndex])).join(' ')
    );

    // Step 6: Reassemble the text by joining lines with newline characters
    return alignedLines.join('\n');
}

// Test the function with the given text
const testText = [
    '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.'
];

console.log("Left Justified:\n");
console.log(formatText(testText, 'left'));
console.log("\nRight Justified:\n");
console.log(formatText(testText, 'right'));
console.log("\nCenter Justified:\n");
console.log(formatText(testText, 'center'));

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0

Challenge Information:

Rosetta Code Challenges - Align columns

From this forum:

It seems to me that:

  1. Shorter sentences do NOT need to add extra columns to match longer sentences.
  2. Sentence that finishes with $ should include an empty column as if there were a word.

Couldnt pass it yet either.

I still can’t pass it, and I still don’t see the problem, for visibility I changed word space to _ and between words spaces to -
Below are several results I tried with “left” alignment only. But they all fail and I cant figure out the expected outcome.

option 1

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._

option 2

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.

option 3

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._

I am confusded on wha is the amount of spaces expected at the end of each line, but this is the expected string for left aligned:
"Given a text file of many lines \nwhere fields within a line \nare delineated by a single \"dollar\" character\nwrite a program \nthat aligns each column of fields \nby ensuring that words in each \ncolumn are separated by at least one space.\nFurther, allow for each word in a column to be either left \njustified, right justified\nor center justified within its column. "

1 Like

Hi @ILM

Thank you for your reply, I managed to PASS the left case thanks to your reply.
So it’s great.