Задача, конечно, весьма экзотическая, но тем не менее легко решаемая.
В D ее можно решить в несколько строк:
import std.algorithm;
import std.file;
import std.path;
import std.range;
import std.stdio;
import std.string;
void main()
{
dirEntries(<путь к папке>, SpanMode.shallow)
.filter!(a => a.isFile)
.map!(a => (cast(string) std.file.read(a)))
.map!(a => a.splitLines)
.map!(a => a.length)
.sum
.writeln;
}
В этом рецепте используется “точечный стиль” (он же UFCS – Unified Function Call Syntax, унифицированный стиль вызова функций), когда поток данных проходит через ряд преобразований следующих друг за другом.
Сначала с помощью dirEntries получаем список того, что находиться в папке (перечисление SpanMode.shallow указывает на небольшую глубину поиска содержимого), затем выделяем из списка только те имена, которые соотвествуют файлам, считываем каждый файл в строку и разделяем его на строки, после чего считаем длины полученных строк, суммируем и выводим результат.
Что действительно удивительно, так это то, что не потребовалось никаких переменных и при этом решение достаточно аккуратное и очень легко читается.