Я слышал, что ваш код может работать быстрее, если вы сделаете отступ в обратном порядке, так что компилятор может обработать его как шаблон проектирования дерева с самого верха «ветвей» вниз. Это помогает, потому что гравитация ускорит время, необходимое для компиляции вашего кода, и эффективность структуры данных улучшится. Вот пример в сценариях Java:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Но по какой-то причине в Notepad нет настройки, позволяющей делать это автоматически, поэтому мне нужна программа, которая сделает это за меня.
Описание
Представления должны принимать фрагмент кода в качестве входных данных, изменять отступ и выводить полученный код.
Это делается с помощью следующей процедуры:
Разделите код на строки. Каждая строка будет начинаться с нуля или более пробелов (вкладок не будет).
Найти все уникальные уровни отступа в коде. Например, для приведенного выше примера это будет
0 4 8 12
Измените порядок в этом списке уровней отступов и сопоставьте перевернутый список с исходным списком. Это сложно объяснить словами, но для примера это будет выглядеть
0 — 12 4 — 8 8 — 4 12 — 0
Примените это сопоставление к исходному коду. В этом примере строка с 0-пробелом будет иметь отступ в 12 пробелов, 4 пробела станут 8 пробелами и т. Д.
Ввод, вывод
Вход и выход могут быть предоставлены по вашему усмотрению (STDIN / STDOUT, параметр функции / возвращаемое значение и т. Д.); если ваш язык не поддерживает многострочный ввод (или вы просто не хотите), |
вместо этого вы можете использовать символ для разделения строк.
Ввод будет состоять только из печатных ASCII + новых строк, и он не будет содержать пустых строк.
Контрольные примеры
Входные данные:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Вывод: пример кода выше.
Входные данные:
a
b
c
d
e
f
g
h
Выход:
a
b
c
d
e
f
g
h
Входные данные:
1
2
3
2
1
Выход:
1
2
3
2
1
Входные данные:
foo
Выход:
foo
источник
Ответы:
CJam,
43 39 3635 байтЭто выглядит слишком долго. Я уверен, что недостаточно оптимизирую !Как это устроено:
Основная идея состоит в том, чтобы разделить ввод по новой строке, вычислить количество начальных пробелов в каждой строке, отсортировать и получить уникальные числа, скопировать этот массив и повернуть копию, транслитерировать исходные порядковые числа с этими двумя массивами и затем, наконец, сформировать Последняя строка с использованием этой информации.
Самая длинная часть - выяснить, сколько лидирующих пробелов в каждой строке, поскольку у CJam нет простого способа сделать это.
Расширение кода:
И в духе вопроса. Реальное расширение кода:
7 байтов сэкономлено благодаря Мартину и 1 байт благодаря Деннису
Попробуйте это онлайн здесь
источник
{}#
имеет ошибку: возвращает целое число, но должно возвращать длинное. Как ни странно,i
(приведение к целому числу) исправляет это. 2. Так""#
как не имеет ту же ошибку,_Sm0=#
на один байт короче.Python 2 -
137131 байтПринимает ввод с
|
вместо\n
.объяснение
Первые три строки довольно просты. Составьте список всех строк на входе, определите функцию, которая скажет вам, сколько начальных пробелов имеет строка, и составьте отсортированный список значений, которые функция выплевывает для каждой строки ввода.
Последняя строка намного веселее.
источник
()
сохранение 4 заraw_
)f(s)for s in i
должно бытьmap(f,i)
.d=[];d+=set(L)
это более короткая версияd=sorted(set(L))
.JavaScript, ES6,
113 103101 байтЯ почти уверен, что это можно сыграть в гольф, по крайней мере, немного дальше, но здесь идет.Никогда бы не подумал, что будет 101-байтовое решение JS, превосходящее Python!
Это создает метод с именем,
f
который можно вызвать с помощью входной строки. Если вы используете последнюю версию Firefox, у вас есть шаблоны строк, и вы можете вызвать метод, какВ противном случае вы также можете назвать это как
или попробуйте фрагмент ниже:
источник
\s
символ пробела) и удалив скобкиx
в функции замены.(x)
: /b
иc
вы? В любом случае они просто ссылаются на один и тот же массив.Рубин, 63 байта
Это определяет безымянную функцию, которая принимает и возвращает строку. Вы можете вызвать его, добавив
["string here"]
или присвоив его переменной, а затем вызвав эту переменную.Как это работает:
s.scan(r=/^ */)
дает список всех ведущих пробелов и магазинов, которые регулярно используютсяr
для последующего использования.uniq
устраняет дубликаты.sort
... сортируетТеперь перейдите к концу, чтобы
l.zip(l.reverse)
получить массив пар, которые мы хотим заменить.to_h
превращает это в хеш, интерпретируя пары как пары ключ-значение.Теперь
s.gsub
заменил все совпадения регулярного выражения (все начальные пробелы), используя этот хэш в качестве справочной таблицы для поиска замены.источник
Pyth 39
Попробуйте онлайн.
Использует
|
опцию разделителя.источник
Japt
-R
, 27 байтПопробуйте онлайн!
Распаковано и как это работает
Как это действительно работает
источник
Скала,
176171Это добавит дополнительный перевод строки в конце. Если мне не нужно было сохранять пробелы в конце строки, я могу получить его до 167:
Ungolfed:
источник
PowerShell , 112 байт
Попробуйте онлайн!
Менее гольф:
источник
Хаскелл, 116
источник
PHP - 173 байта
Неоптимизированный код должен храниться в
$v
переменной:Вот версия без комментариев и комментариев:
Я, наверное, никогда не писал что-то такое грязное. Мне стыдно.
источник
JavaScript, 351
Безголовая версия:
тестирование
Показать фрагмент кода
Показать фрагмент кода
Показать фрагмент кода
Показать фрагмент кода
источник
Perl 5, 112
111 + 1 за
-n
(-E
бесплатно)Я уверен, что это может быть сделано за меньшее количество ударов, но я не вижу, как в данный момент.
источник