Конец вкладки против космической войны
Итак, было много споров о том, использовать ли табуляции или пробелы для отступа / форматирования кода. Можете ли вы помочь университету уладить спор, перейдя на невероятно сумасшедший уникальный метод форматирования.
Ваша задача - написать полную программу или функцию, которая расширяет все вкладки на четыре области. И затем заменяет серию из n ведущих пробелов на "/ (n - две звезды здесь) /". Вы получите ввод по нескольким строкам в любом приемлемом формате (однострочный массив строк для каждой новой строки. Массив столбцов и т. Д.)
Образец ввода бесстыдно украден . Обратите внимание, что поскольку в SE вкладки автоматически расширяются до четырех пробелов, я представляю их как символ «^», но вы также должны обрабатывать вкладки (кодовая точка 0x09). Все символы «^» представляют собой табуляцию.
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
Not zero so multiply by 256 again to get 65536
[>++++<-]>[<++++++++>-]<[>++++++++<-]
+>[>
# Print "32"
++++++++++[>+++++<-]>+.-.[-]<
<[-]<->] <[>>
# Print "16"
+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
# Print "8"
++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
^this is preceded by a tab
^^two tabs
^^^three tabs etcetera!
Образец вывода
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
/**/Not zero so multiply by 256 again to get 65536
/**/[>++++<-]>[<++++++++>-]<[>++++++++<-]
/**/+>[>
/******/# Print "32"
/******/++++++++++[>+++++<-]>+.-.[-]<
/**/<[-]<->] <[>>
/******/# Print "16"
/******/+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
/**/# Print "8"
/**/++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
/**/this is preceded by a tab
/******/two tabs
/**********/three tabs etcetera!
Поскольку университету требуется место для загрузки как Vim, так и Emacs, вам достаточно места для хранения вашего кода. Поэтому это код-гольф, и выигрывает самый короткий код. Вы можете предположить, что входные данные правильно сформированы и строки с менее чем четырьмя пробелами (после замены вкладок) могут привести к неопределенному поведению.
отказ
Эта «превосходная» стратегия форматирования была предоставлена Geobits и воспроизводится с его разрешения. Никто из программистов не пострадал во время постановки этой задачи.
источник
/*
, или это можно считать не «правильно сформированным вводом»? Исходный файл C ++ был бы лучшим тестом, потому что его многострочный комментарий/* */
мог бы разбить некоторые ответы, которые заменяют первый и последний из первых пробелов на «а»/
, а затем переходить к заполнению пробелов*
./* */
код C ++, но на этот раз в начале строки. Согласно вашей спецификации его следует оставить как есть. Здесь есть ловушка, и она уже обнаружила неправильные ответы, что регулярное выражение, например, скажем,/\** /
используемое, чтобы заполнить эти пробелы между // звездочками, превратило бы строку в/***/
. Я также видел это преобразование/*//*/
. Я предполагаю, что оба неверны.Ответы:
V ,
21, 20 байтовПопробуйте онлайн!
Это буквально прямой порт моего vim-ответа. Заметные различия:
Команда
Í
(Глобальная замена) автоматически заполняет/g
флаг, который сохраняет два байтаô
идентично\t
Î
Это мнемоника для:%norm
, и она также заполняет необходимое пространство между:%norm
набором нажатий клавиш.Задний возврат каретки в конце добавляется неявно.
источник
Vim,
37, 34, 33,32 байтаПопробуйте онлайн!
Обратите внимание, что для этого требуется возврат каретки (ввод) в vim, но не в онлайн-переводчике.
Это использует интерпретатор V, потому что он обратно совместим. Очень простое решение.
Вот рисунок, который позволяет увидеть решение в режиме реального времени. Здесь используется немного более старая версия, и я добавил несколько дополнительных нажатий клавиш, чтобы она работала медленнее, чтобы вы могли видеть, что происходит:
И вот объяснение того, как это работает:
источник
g
но потом вы отредактировали, чтобы не использовать g: / +1 в любом случае: D:g
потому что она использует менее известную функцию:norm
команда отменяется в случае^F<space>
неудачи. По:%norm ^F<space>foo
сути, это то же самое, что и:g/^ /norm foo
забавные Vim-хаки. : Dnorm
?^F
не<C-f>
обозначение ключа Silly Vim. В данном случае это^
переход к первому непробельному символу иF<space>
поиск первого пробела за курсором.Perl, 41 байт
Запустите с
-p
флагом, вот так:Заменить
␉
на вкладку (в Bash попробуйте набрать Control-V Tab.)источник
perl
заменил эту обратную ссылку на месте, я бы хотел, чтобыsed
это тоже было.Чеддер ,
605756 байтСохранено 3 байта благодаря @Conor O'Brien
Я бы хотел, чтобы у Чеддера было лучшее форматирование строк.
Попробуйте онлайн!
объяснение
Это функция.
@
является функционализированным свойством представляет (например, ruby's&:
), позволяя вам делать такие вещи, как: `ar.map (@. head (-1))Если вы не знакомы с регулярным выражением:
это в основном соответствует одному или нескольким (
+
) пробелам () в начале (
^
) каждой (g
) строки (m
).источник
/^ +/
достаточно в качестве регулярного выражения, поскольку мы можем предположить, что начальные пробелы будут по крайней мере 4 в длину.Mathematica, 97 байт
Анонимная функция. Принимает строку в качестве ввода и возвращает строку в качестве вывода.
источник
Python 3, 124 байта
Использует доброе старое регулярное выражение.
Идео это!
источник
Java
210207 байтЭто эталонное решение, которое реализует его наивно.
источник
for(int j=0;++j<i-1;)
. Кроме того , вы можете удалитьint
до тогоj
, и поместить его после уже присутствующему междунар:int i=s.length()-(x=s.replaceAll("^\\s+", "")).length(),j;
JavaScript ES6, 75 байт
Замените
\t
на буквальную вкладку в вашем коде.источник
Ява,
185184167152 байтаУчитывая очень слабое определение массива строк, данное в первоначальном посте, я использовал его,
Stream<String>
что позволяет сэкономить некоторые байты.Я использовал другие методы, чем RI, чтобы достичь той же цели. Сам алгоритм скорее тот же.
Тестирование и ungolfed :
источник
Сетчатка , 25 байт
Символ
\t
должен быть заменен реальным символом табуляции (0x09).Попробуйте онлайн!
объяснение
Замените каждую вкладку четырьмя пробелами.
Transform каждой строки отдельно (
%
) путем сопоставления2+N
пробелов в начале строки и заменить его ,/.../
где...
этоN
копия*
.источник
Python,
125111 байтhttps://repl.it/DGyh/2
источник
САС (56 + 1 для -r) 57
Где
⇥
находится вкладка1. заменяет вкладки пробелами.
2. заменяет первый и последний начальный пробел на
/
.3. заменяет первый пробел после
/
и 0+*
s на,*
пока не будет совпадения.источник
-f
. Любые дополнительные флаги, используемые как n или r, должны учитываться как один байт каждый. Таким образом, здесь вы экономите 2 байта.;
после t также не нужна. Что касается самого кода, вам нужен ^ в начале третьейs
команды, в противном случае ввод, такой как «3/5», превращается в «3 / * 5». В первойs
команде у вас есть вкладка, но она не отображается правильно и вводит в заблуждение, поэтому либо используйте \ t, либо укажите после, чтобы char был вкладкой.Университет должен рассмотреть возможность предоставления немного больше места для программ в Emacs Lisp (или по умолчанию
tabify
иuntabify
только), поскольку они становятся еще более многословными, чем Java. Следует также обратить пристальное внимание на учеников (или учителей), чей размер инактивации меньше четырех или которые случайно пишут на не-C-подобном языке.Следующее решение имеет 206 байтов
Предполагая, что это
tab-width
не должно быть явно установлено, мы можем сохранить 20 из них.И негольфированная версия будет выглядеть так
Мы сначала
untabify
регион, прежде чем прыгать к его началу. Затем, пока мы видим пробел в начале строки, мы заменяем его комментарием, который равен указанному пробелу. Чтобы быть точным, комментарий для вставки построенчто само по себе занимает 97 байт. Более короткое решение для копирования строки n раз высоко ценится.
источник
Ruby,
5247 + 1 (флаг p) = 48 байтРедактировать : сохранено целых 5 байтов, благодаря Value Ink
источник
p
флаг, чтобы воспользоваться тем, что (g) sub изменяет$_
и, таким образом, изменяет напечатанное значение?ruby -pe 'gsub ?\t," "*4;sub(/^ +/){?/+?**($&.size-2)+?/}'
(g)sub
без взрыва можно изменить$_
здесь.GNU sed,
6664 + 1 (флаг r) = 65 байтИзменить: на 1 байт меньше по предложению Райли .
Запустите: sed -rf formatter.sed input_file
Причина разделения с
\n
ведущими пробелами от остального текста в этой строке заключается в том, что в противном случае строка C ++, начинающаяся с комментария, подобного этому,/* */
превратилась бы в/*****/
более простую строку типа 4s,^(/\**) ,\1*,
или дажеs,^(/\**) ( */),\1*\2,
. Поскольку sed выполняет сценарий для каждой строки ввода,\n
при чтении в пространство шаблона не вводится no .источник
/
пока не замените\n
. Это избавит вас от необходимости сопоставлять его в строке 4.\t
символ табуляции.