Мой коллега, Джимми , немного новичок в C / C ++. Он также немного медленный ученик. Теперь, чтобы быть справедливым, его код всегда компилируется, но у него есть некоторые действительно небрежные привычки. Например, все знают, что вы можете определить массив следующим образом:
int spam[] = {4, 8, 15, 16, 23, 42};
Все, кроме Джимми. Он убежден, что единственный способ создать массив - это так:
int spam[6];
spam[0] = 4;
spam[1] = 8;
spam[2] = 15;
spam[3] = 16;
spam[4] = 23;
spam[5] = 42;
Я продолжаю исправлять это для него в обзоре кода, но он не научится. Поэтому мне нужно, чтобы вы написали инструмент, который автоматически делает это для него, когда он совершает коммит ».
Соревнование
Я хочу, чтобы вы написали либо полную программу, либо функцию, которая принимает многострочную строку в качестве входных данных и выводит более компактную версию массива C. Ввод всегда будет следовать этому формату, включая пробелы:
identifier_one identifier_two[some_length];
identifier_two[0] = some_number;
identifier_two[1] = some_number;
identifier_two[2] = some_number;
...
identifier_two[some_length - 1] = some_number;
Короче говоря, ввод всегда будет действительным и четко определенным C. Более подробно:
Все идентификаторы будут состоять только из букв и подчеркиваний. Длина всегда будет по крайней мере одна, и никогда не будет отсутствующих или выходящих за пределы индексов. Вы также можете предположить, что индексы в порядке. Например:
foo bar[3];
bar[0] = 1
bar[2] = 9;
foo bar[1];
bar[0] = 1;
bar[1] = 3;
а также
foo bar[3];
bar[2] = 9;
bar[0] = 1
bar[1] = 3
все недопустимые данные и могут привести к неопределенному поведению в вашей заявке. Вы также можете предположить, что все числа будут действительными десятичными числами, отрицательными или положительными. На входе не будет посторонних пробелов. Вывод должен всегда следовать этому формату, включая пробелы:
identifier_one identifier_two[] = {n1, n2, n3, ...};
Вот некоторые примеры данных:
Input:
spam eggs[10];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;
eggs[4] = 3;
eggs[5] = 7;
eggs[6] = 888;
eggs[7] = 555;
eggs[8] = 0;
eggs[9] = -2;
Output:
spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};
Input:
char ans[2];
ans[0] = 52;
ans[1] = 50;
Output:
char ans[] = {52, 50};
Input:
blah_blah quux[1];
quux[0] = 105;
Output:
blah_blah quux[] = {105};
Вы можете осуществлять ввод и вывод в любом приемлемом формате, таком как STDIN / STDOUT, аргументы функций и возвращаемое значение, чтение и запись файлов и т. Д. Применяются стандартные лазейки. Самый короткий ответ в байтах побеждает!
«Это пассивно-агрессивная и ужасная идея. Вы не получили эту идею от меня.
Ответы:
Вим,
4336 байтВам не нужно давать Джимми сценарий, просто научите его пользоваться подходящим текстовым редактором. (буквальное возвращение для ясности)
источник
<C-a>
он корочеt]
, что является забавным небольшим взломом. Кроме того, я думаю, что вам технически нужно 2,<cr>
так как он запрашивает подтверждение.norm df=
корочеs/.*=//g
3wC] = {<esc>
короче чем<C-a>di]$s = {<esc>
.CJam,
4336 байтПример в Интернете
Объяснение:
Большое спасибо Martin Ender за улучшения моего первого ответа CJam.
источник
JavaScript (ES6),
656463 байтаисточник
Сетчатка ,
3028 байтЧисло байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
объяснение
Мы будем использовать следующий вход в качестве примера:
Этап 1
Обратите внимание, что в первой строке есть пробел.
Мы начинаем с сопоставления числа, следующего за
];
и перевода строки, а затем всего до последнего пробела на следующей строке. Это совпадение можно найти только в конце первой строки (из-за];
). Все это заменено на] = {
. То есть он преобразует входные данные нашего примера в:Этап 2
Теперь мы сопоставляем все от a
;
до до=
на следующей строке и заменяем на a,
. Это преобразует строку в:Этап 3
Все, что осталось, это исправить конец, и мы сделаем это, заменив оставшееся
;
на};
:источник
Юлия,
112108105 Байтобъяснение
Сохраненные байты, заменяя метод collect (eachmatch ()) на [eachmatch () ...] и с более коротким регулярным выражением
источник
eachmatch
вызове функции для менее привлекательного вывода и -1 байта. Я никогда не программировал на Джулию, но вам может быть интересно прочитать этот пост: Советы по игре в гольф в Джулии . Снова добро пожаловать, и приятного пребывания. :)matchall
, вероятно, будет короче, чем брызгиeachmatch
.Луа, 121 байт.
Разъяснения
источник
Пакетный, 160 байт
Примечание: строка
set s=,
заканчивается пробелом. Принимает участие в STDIN. Эта странная строка 3 принимает входные данные (например,int spam[6];
и изменяет[
на[] = {&rem
результат, вset s=int spam[] = {&rem 6];
результате чего интерпретируется как два оператора,set s=int spam[] = {
аrem 6];
последний из них является комментарием. Затем для каждой строки мы удаляем текст до первого пробела (потому что вы можете не использовать=
в шаблоне и сопоставление не является жадным) и извлечь значение.источник
C, 121 байт
источник
Питон
112111Очень просто для меня, пожалуйста, предложите любое улучшение, которое приходит на ум.
источник
[:-1] for
.05AB1E ,
313028 байтовобъяснение
Попробуйте онлайн!
Сохранил байт благодаря Аднану
источник
žuDÀÀ
вместо того, чтобы„[]„{}
сохранить байт :).Ява 7,
159158149154 байтаНесколько байтов сохранены благодаря @cliffroot .
Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
String c(String[]a){a[0]=a[0].split("\\d")[0]+"]={ \b";for(String i:a)a[0]+=i.split("=[{]*")[1];return a[0].replace(';',',').replaceFirst(".$","};");}
String
in и замена последнего символа"};");
вместо вместо"")+"};";
.Perl, 42 + 2 (
-0p
) = 44 байтаНеобходимо
-p
и-0
флаги для запуска. Например :источник
Желе , 27 байт
Попробуйте онлайн!
объяснение
источник
седьмой 51
источник
Java, 106 байт
Манипулирование строками в Java - это ад, как всегда.
Это чистый регулярный ответ. Сделайте один сцепленный
String
, затем выполните,replaceXxx
пока это не хорошо.Тестирование и разгула
источник
Желе , 33 байта
TryItOnline
Как?
источник
Рубин, 64 байта
источник
JavaScript, 125 байт
Я знаю, что это дольше, чем другие, но я действительно хотел использовать
eval
. Просто для удовольствия.Чтобы запустить, вставьте сюда следующее :
источник
Haxe, 234 байта
Длинные имена функций убили это: D
Попробуйте тестовые примеры здесь !
источник
V ,
25, 24 байтаПопробуйте онлайн! Это содержит непечатаемый
<esc>
символ, поэтому вот hexdump:Объяснение:
источник