Java решение практических задач. Решаем задачи с Codewars

🖥 Здача Java с Codewars

Продолжаем рубрику решения практических задач на Java

Ваша задача  — эмулировать выравнивание текста в моноширинном шрифте. Вам будет предоставлен однострочный текст и ожидаемая ширина выравнивания. Самое длинное слово никогда не будет больше этой ширины.

@javatg – много практики java в нашем канале.

 Вот правила:

 * Используйте пробелы, чтобы заполнить пробелы между словами.

 * Каждая строка должна содержать как можно больше слов.

 * Используйте ‘\n’ для разделения строк.

 * Расстояние между словами не может отличаться более чем на один пробел.

 * Строки должны заканчиваться словом, а не пробелом.

 * ‘\n’ не включается в длину строки.

 * Сначала идут большие пробелы, затем меньшие (“Lorem–ipsum–dolor–sit-amet” (2, 2, 2, 1 пробел)).

 * Последняя строка не должна быть выравнена по ширине, используйте только один пробел между словами.

 * Последняя строка не должна содержать ‘\n’

 * В строках с одним словом пробелы не нужны (‘somelongword\n’).

Решение:

public class TextJustificatory {
    public static String justify(String text, int width) {
        final String[] source = text.split(" ");

        StringBuilder result = new StringBuilder();
        StringBuilder string = new StringBuilder();
        for (String word : source) {
            if (word.length() + string.length() + 1 > width) {
                result.append(
                    addJustified(string, width)
                )
                    .append("\n");
                string
                    .delete(0, string.length());
            }

            if (string.length() != 0) string.append(" ");
            
            string.append(word);
        }
        
        result.append(
            string
        );
        
        return result.toString();
    }
    
    private static String addJustified(StringBuilder raw, int width) {
        final String[] words = raw.toString().split(" ");
        if (words.length == 0) return "";
        if (words.length == 1) return words[0];

        final int freeSpaces = width - raw.length();
        final int additionalSpacesPerWord = freeSpaces / (words.length - 1);
        final int additionalSpacesForFirstWords = freeSpaces % (words.length - 1);

        StringBuilder result = new StringBuilder(words[0]);
        for (int i = 1; i < words.length; i++) {
            result.append(" ");
            if (i <= additionalSpacesForFirstWords) result.append(" ");

            for (int i1 = 0; i1 < additionalSpacesPerWord; i1++) {
                result.append(" ");
            }
            
            if (i != words.length - 1) result.append(words[i]);
        }
        
        result.append(words[words.length - 1]);

        return result.toString();
    }
}

Пишите ваши варианты решений в комментариях

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *