Некоторые люди настаивают на использовании пробелов для табуляции и отступов.
Для подведения итогов, это бесспорно так. По определению табуляторы должны использоваться для табулирования.
Даже для отступов табуляторы объективно превосходят:
В сообществе Stack Exchange существует явный консенсус .
Использование одного пробела для отступа визуально неприятно; использование более чем одного расточительно.
Как знают все игроки в
гольф, программы должны быть максимально короткими. Это не только экономит место на жестком диске, но также сокращает время компиляции, если нужно обрабатывать меньше байтов.Регулируя ширину вкладки 1 , один и тот же файл выглядит по-разному на каждом компьютере, поэтому каждый может использовать свою любимую ширину отступа, не изменяя фактический файл.
Все хорошие текстовые редакторы используют табуляторы по умолчанию (и определение).
Я так говорю и я всегда прав!
К сожалению, не все слушают разум. Кто - то прислал вам файл , который делает это неправильно TM , и вы должны это исправить. Вы можете просто сделать это вручную, но будут и другие.
Достаточно плохо, что проставки тратят ваше драгоценное время, поэтому вы решаете написать самую короткую из возможных программ для решения проблемы.
задача
Напишите программу или функцию, которая выполняет следующее:
Прочитать одну строку из STDIN или в качестве аргумента командной строки или функции.
Определите все места, где пробелы были использованы для табуляции или отступа.
Пробел - это отступ, если он происходит в начале строки.
Выполнение двух или более пробелов является табуляцией, если это не отступ.
Единое пространство , которое не отступ может или не может быть использовано для подведения итогов. Как и ожидалось, когда вы используете один и тот же символ для разных целей, нет простого способа узнать. Поэтому скажем, что это место было использовано для путаницы .
Определите максимально возможную ширину табуляции 1, для которой все пробелы, используемые для табуляции или отступа, можно заменить табуляторами, не изменяя внешний вид файла.
Если входные данные не содержат ни табуляции, ни отступа, невозможно определить ширину вкладки. В этом случае пропустите следующий шаг.
Используя ранее определенную ширину табуляции, замените все пробелы, используемые для табуляции или отступа, табуляторами.
Кроме того, по возможности, не изменяя внешний вид файла, замените все пробелы, используемые для путаницы, табуляторами. (Если сомневаетесь, избавьтесь от пробелов.)
Верните измененную строку из вашей функции или распечатайте ее в STDOUT.
Примеры
Все пространства
a bc def ghij
Табулирование
Каждый цикл пробелов дополняет предыдущую строку непробельных символов шириной 5, поэтому правильная ширина табуляции равна 5, а правильный вывод 2 равен
a--->bc-->def->ghij
Первые два пространства
ab cde f ghi jk lm
Табулирование, другие путаницы.
Правильная ширина вкладки 4, так что правильный выход 2 является
ab->cde>f ghi>jk lm
Последний пробел остается нетронутым, так как он будет представлен как два пробела, если заменить его табулятором:
ab->cde>f ghi>jk->lm
Все, кроме одного пробела
int main( ) { puts("TABS!"); }
отступы, другая путаница.
Уровни отступов - 0, 4 и 8 пробелов, поэтому правильная ширина табуляции равна 4, а правильный вывод 2 равен
int --->main( ) --->{ --->--->puts("TABS!"); --->}
Пробел в
( )
будет представлен как три пробела, если заменить его табулятором, поэтому он останется нетронутым.Первые два пространства
x yz w
отступы, другие путаница.
Правильная ширина вкладки равна 2, а правильный вывод 2 равен
->x>yz w
Последний пробел будет представлен как два пробела, если он будет заменен табулятором, поэтому он останется нетронутым.
Первые два пространства
xy zw
отступы, остальные три - табуляция.
Только ширина вкладка 1 позволяет устранить все пробелы, поэтому правильный выход 2 является
>>xy>>>zw
Все пространства
a b c d
путаница
Там нет длинной возможной ширины вкладки, так что правильный выход 2 является
a b c d
Дополнительные правила
Ввод будет полностью состоять из печатных символов ASCII и перевода строки.
Вы можете предположить, что текст содержит не более 100 строк и не более 100 символов в каждой строке.
Если вы выберете STDOUT для вывода, вы можете распечатать один завершающий перевод строки.
Применяются стандартные правила игры в гольф .
1 Ширина табуляции определяется как расстояние в символах между двумя последовательными остановками табуляции с использованием моноширинного шрифта.
2 Стрелки ASCII представляют табуляторы, которые Stack Exchange отказывается отрисовывать должным образом, для которых я представил отчет об ошибке. Фактический вывод должен содержать фактические табуляторы.
programs should be as short as possible
Я считаю, что нашел давно потерянного брата Артура Уитни !!