Как стать автором
Обновить

Комментарии 10

//словарь для цифр, так как они у нас используются, как служебные символы
private val dictionary = mutableListOf('⌂', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'È','É')

Я правильно понимаю, что если вдруг в тесте окажется À, то кодирование/декодирование нормально работать не будет? Вы уверены, что это именно то, что хотел ваш преподаватель?

Выдь стоит попытаться скормить вашему алгоритму бинарник, то почти гарантировано он сломается.
Да, всё сломается. Но я исходил из расчёта, что эти символы всё-таки очень редкие и встречаться не будут. Ничего легче и быстрее в реализации не придумал на тот момент. Можно было бы экранировать цифры, но опять же какими символами. Да и выходные строки с кучей цифр идущих в разнобой получались бы длиннее исходных.
Если есть какие-то идеи, то готов выслушать.
И ещё. Готов проверить любой ваш бинарник.
Например сделать RLE для байтовой последовательности [0..255], а для служебных символов использовать отрицательные значения. После этого задача свелась бы к переводу строки в байты и обратно. На мой взгляд статья откровенно слабовата, решение выбрано самое простое, по сути залита домашка. Вот если бы вы это же в 14 лет сделали… Однако ставлю плюс статье и в карму, ибо на хабре в последнее время не хватает программистов, на мой взгляд :)
Например сделать RLE для байтовой последовательности [0..255], а для служебных символов использовать отрицательные значения.

Отрицательные значения у вас начинаются с единицы? Вот байтовое представление строки из двух букв: Пs
11010000 10011111 01110011
Это если расширить задачу до поддержки русского языка.
Тогда просто используем 0
new String(new byte[]{0})

Суть в том чтобы брать действительно служебные символы, которые точно нельзя ввести с клавиатуры в консоль, чего автор к сожалению не стал делать (а ведь гуглится).

Сжимает ли утилита повторы цифр?

Да, сжимает

Для "красоты" можно так:


private fun assertFileContent(expectedFile: String, actualFile: String): Boolean {
    val expectedList = File(expectedFile).readLines()
    val actualList = File(actualFile).readLines()
    if (expectedList.size != actualList.size) return false
    return expectedList.asSequence().zip(actualList.asSequence()).all { (expected, actual) ->
        expected == actual || expected.length < actual.length
    }
}

(И мне кажется у вас там в оригинале ошибка, надо && вместо ||)

Да, думаю можно и так.

(И мне кажется у вас там в оригинале ошибка, надо && вместо ||)
Не помню, зачем я вообще второе условие вставил. Оно явно лишнее, так как разные по длине строки не могут быть равными.
Поэтому тут можно так оставить
if (expected[i] != actual[i]) return false

А в последней строке моего кода сделать так
return expected.size == actual.size

P.S. Код в статье обновил

Для консольных утилит попробуйте Spring Boot + picocli.
Эта комбинация даёт много возможностей и позволяет писать чистый код.
Вместо Spring можно взять Guice — на вкус и цвет…

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории