Ранее на этой неделе мы узнали о том, как форматировать эзотерические языки для комментариев. Сегодня мы собираемся сделать обратное. Мне нужно, чтобы вы написали программу или функцию, которая анализирует некоторый хорошо прокомментированный эзотерический код и анализирует комментарии, возвращая только код. Используя некоторые примеры из предыдущего вызова, вот как выглядит хорошо прокомментированный код:
a #Explanation of what 'a' does
bc #Bc
d #d
e #Explanation of e
fgh #foobar
ij #hello world
k #etc.
l #so on
mn #and
op #so forth
Вот что вам нужно сделать, чтобы извлечь код. Сначала удалите символ комментария ( #
), пробел перед ним и все после символа комментария.
a
bc
d
e
fgh
ij
k
l
mn
op
Затем сверните каждую строку вверх в одну строку. Например, поскольку он b
находится во втором столбце второй строки, как только мы свернем его, он будет во втором столбце первой строки . Аналогично, c
будет помещен в третий столбец первой строки и d
будет помещен в четвертый. Повторите это для каждого персонажа, и вы получите это:
abcdefghijklmnop
Важное примечание: кажется, что тривиальное решение состоит в том, чтобы просто удалить комментарии, удалить все пробелы и присоединить каждую строку. Это не обоснованный подход! Поскольку в исходном коде могут быть пробелы, при таком подходе они будут удалены. Например, это совершенно правильный ввод:
hello #Line one
#Line two
world! #Line three
И соответствующий вывод должен быть:
hello world!
Соревнование:
Напишите программу или функцию, которая принимает закомментированный код в качестве входных данных и выводит или возвращает код со всеми проанализированными комментариями. Вы должны вывести код без концевых пробелов, хотя допустим один завершающий символ новой строки. Символ комментария всегда будет #
, и перед началом комментариев всегда будет один дополнительный пробел. не#
будет отображаться в разделе комментариев ввода. Чтобы упростить задачу, вот некоторые входные данные, которые вам не нужно обрабатывать:
Можно предположить, что в коде не будет двух символов в одном столбце. Например, это входные данные, которые нарушают это правило:
a #A character in column one bc #Characters in columns one and two
Вы также можете предположить, что все символы комментария появляются в одном столбце. Например, этот вход:
short #this is a short line long #This is a long line
нарушает это правило. Это также означает, что
#
не будет в разделе кода.И, наконец, вам не нужно обрабатывать участки кода с начальными или конечными пробелами. Например,
Hello, # World! #
Вы также можете предположить, что ввод содержит только печатные символы ASCII.
Примеры:
Input:
hello #Line one
#Line two
world! #Line three
Output:
hello world!
Input:
E #This comment intentionally left blank
ac #
h s #
ecti #
on is #
one c #
haracte #
r longer #
than the #
last! #
Output:
Each section is one character longer than the last!
Input:
4 #This number is 7
8 #
15 #That last comment is wrong.
16 #
23 #
42 #
Output:
4815162342
Input:
Hello #Comment 1
world #Comment 2
, #Comment 3
how #Comment 4
are #Comment 5
you? #Comment 6
Output:
Hello world, how are you?
Input:
Prepare #
for... #
extra spaces! #
Output:
Prepare for... extra spaces!
Вы можете вводить данные в любом разумном формате, который вам нравится, например, в виде списка строк, одной строки с символами новой строки, 2-го списка символов и т. Д. Самый короткий ответ в байтах побеждает!
hello world!
показано на рисунке)? Кроме того, вы заявляете: «#
не будет отображаться в разделе комментариев ввода », но может ли это произойти в самом фрагменте кода?do {stuff} while (condition);
с объяснением в порядкеdo while (condition); #Explainything
тогда{stuff} #Explainything
.Ответы:
Желе ,
87 байтПопробуйте онлайн!
Как это работает
источник
Python 2,
4843 байтаСпасибо @xnor за 5 байтов!
Проверьте это на Ideone .
источник
map(max,*x)
потому чтоmax
принимает любое количество аргументов иNone
мало.map
можно так использовать ... Спасибо!`...`[2::5]
трюк?`...`
эквивалентенrepr(...)
, поэтому для списка одноэлементных строк['a', 'b', 'c']
вы получите строку"['a', 'b', 'c']"
. Наконец,[2::5]
отсекает первые два символа ("['"
) и берет каждый пятый символ оставшейся строки.JavaScript (ES6),
977560 байтСпасибо @Neil за помощь гольфу от 22 байтов
Ввод представляет собой массив строк.
a
это массив вводаp
предыдущий элементc
это текущий элементm
это строка соответствияo
смещенисточник
m
флаг регулярного выражения является ненужным (у вас было$
в одной точке?), Как и пространство в(p, c)
. Наконец-то думаюreplace
получится короче[...p].map().join
.length
и из пользовательского сценария, может быть, вы не считали перевод строки, но только потому, что я случайно включил точку с запятой;
что не требуется (JavaScript имеет ASI).replace
что так сильно поможет, это действительно здорово!Perl,
353432 байтаВключает +1 для
-p
Внести вклад в STDIN
eso.pl
Обратите внимание, что после финала есть место
;
. Код работает, как показано, но заменяется\0
литеральным символом, чтобы получить заявленную оценку.источник
$a|=...
довольно хорошо сделано, мне понадобилось время, чтобы понять, что вы делаете! Хотя один вопрос:*_=a
кажется, примерно эквивалентно$_=$a
, почему это так?*_=a
это очень непонятное_
глобальное назначение, которое совмещает глобалы иa
глобалы. Так что это не столько копия$a
с ,$_
но с этого момента (глобальный)$a
и$_
фактически та же переменная. Все, чтобы сохранить 1 байт ...Python 2, 187 байт
Я буду играть в гольф еще завтра у меня будет школа;)
источник
1 for
может быть уменьшен до1for
. Кроме того, если сумма списка (в строке 5) не может быть отрицательной, вы можете просто проверить<1
вместо==0
. Счастливого школьного дня! : D +1.Рубин, 63 байта
В основном порт Дениса Желе ответ . Принимает ввод как массив строк.
Смотрите это на eval.in: https://eval.in/640757
источник
CJam , 12 байт
Спасибо Sp3000 за сохранение 2 байта.
Безымянный блок, который принимает список строк (по одной на каждую строку) и заменяет его одной строкой.
Попробуйте онлайн!
объяснение
источник
J, 30 байт
Принимает список строк в качестве входных данных. В основном использует тот же подход, что и Деннис в своем ответе на желе.
Прокомментировал и объяснил
Промежуточные шаги:
Прецедент
источник
Javascript (ES6), 63 байта
Принимает ввод как массив строк.
источник
Сетчатка , 32 байта
Количество байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
источник
Пайк,
1510 байтПопробуй это здесь!
Порт Желе ответ
источник
C #
157122 байтаГольф 35 байтов благодаря @milk - хотя, клянусь, я пробовал это раньше.
Вводит в виде двумерного массива символов.
157 байтов:
источник
Trim()
работать вместоTrimEnd()
? Более того, я думаю, что вы можете сэкономить много байтов, используя s [0] в качестве выходной переменной и используяreturn new string(s[0],0,i)
wherei
индекс последнего символа кода. Эта идея может потребовать двухfor
циклов вместоforeach
, я подумаю об этом больше и попытаюсь написать реальный код позже сегодня.Trim()
будет урезать с самого начала, что я считаю, не будет действительным. Я также первоначально делал загрузку в s [0], и у меня было inti;
вне цикла (чтобы повторно использовать его в возврате), который, я считаю, в конечном итоге добавил байтыPyth, 11 байт
Программа, которая принимает ввод списка строк в STDIN и печатает строку.
Попробуйте онлайн
Как это работает
источник
sed, 126 байтов
Требуется новая строка в конце ввода.
Я уверен, что могу играть в гольф немного больше, но я просто счастлив, что пока это работает.
источник
Perl 6 , 39 байт
Перевод решения Python Денисом .
Принимает ввод как список строк и возвращает строку.
( попробуйте онлайн )
источник
Желе , 27 байт
Проверьте это в TryItOnline
Использует самую строгую спецификацию - дополнительный пробел перед удалением символа комментария за счет байта.
Ввод представляет собой список строк.
источник
Рубин, 77 байт
источник
TSQL,
216175 байтGolfed:
Ungolfed:
скрипка
источник
Javascript,
5634 байта, не конкурируетКак указал @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, я не готов к дополнительным пробелам
источник
Дьялог АПЛ , 22 байта
Вдохновение .
(
⎕UCS
символьное представление¯2↓
все, кроме двух последних⍳∘35↑
вплоть до позиции первых 35 ("#"), в том, что находится за скобками, взятых из⊢
то, что находится за скобками)
а именно ...⌈⌿
столбчатые максимумы∘
из⎕UCS
значения ЮникодаПопробуй APL онлайн!
источник