Хабр Курсы для бэкендеров
РЕКЛАМА
Большая витрина: от крупнейших школ до частных авторов. Сравнивайте по цене, длительности, формату и выбирайте самый подходящий курс!

Корректное решение -это не использовать c = charAt(s, i) и charLength(s), a сделать i = nextChar(i), который прибавляет к индексу 1 или 2. И не надо никаких отдельных случаев и всегда линия будет вместо квардрата.
Нагородили какие-то кеши ответов. При чем только с двумя слотами, потому что код работает с двумя строками. Так почему-бы тогда в вызывающем коде и не запомнить результат isPlain для каждой строки в локальной переменной?
Слишком переусложненное и накрученное решение тривиальной проблемы.
На js для посимвольного обхода лучше вообще не изобретать что-то, как в статье, а использовать строковый итератор, он из коробки умеет в эмодзи.
Тест проходил за миллисекунды. На настоящем файле тот же код думал минуту