Вот немного обработанный вариант. Код отформатирован. Огромный метод main который делал все и сразу разбил на части. Кода стало немного больше, зато понимать его легче. В нем еще очень много копипасты (дублирования участков кода с минимальными отличиями).