В языке программирования C массивы определяются следующим образом:
int foo[] = {4, 8, 15, 16, 23, 42}; //Foo implicitly has a size of 6
Размер массива определяется из инициализирующих элементов, который в данном случае равен 6. Вы также можете написать массив C таким образом, явно определив его размер, затем определив каждый элемент по порядку:
int foo[6]; //Give the array an explicit size of 6
foo[0] = 4;
foo[1] = 8;
foo[2] = 15;
foo[3] = 16;
foo[4] = 23;
foo[5] = 42;
Соревнование
Вы должны написать программу или функцию, которая расширяет массивы с первого пути на второй. Поскольку вы пишете программу, которая делает код длиннее, и вы любите иронию, вы должны сделать свой код максимально коротким.
На входе будет строка, представляющая исходный массив, а на выходе будет расширенное определение массива. Вы можете смело предположить, что входные данные всегда будут выглядеть так:
<type> <array_name>[] = {<int>, <int>, <int> ... };
«Type» и «array_name» будут полностью состоять из букв алфавита и подчеркивания _
. Элементами списка всегда будут числа в диапазоне от -2 147 483 648 до 2 147 483 647. Входные данные в любом другом формате не требуют обработки.
Пробелы в выходных данных должны точно совпадать с пробелами в выходных данных теста, хотя завершающий перевод строки разрешен.
Тест IO:
#in
short array[] = {4, 3, 2, 1};
#out
short array[4];
array[0] = 4;
array[1] = 3;
array[2] = 2;
array[3] = 1;
#in
spam EGGS[] = {42};
#out
spam EGGS[1];
EGGS[0] = 42;
#in
terrible_long_type_name awful_array_name[] = {7, -8, 1337, 0, 13};
#out
terrible_long_type_name awful_array_name[5];
awful_array_name[0] = 7;
awful_array_name[1] = -8;
awful_array_name[2] = 1337;
awful_array_name[3] = 0;
awful_array_name[4] = 13;
Материалы на любом языке приветствуются, но бонусные баллы, если вы можете сделать это на C.
Leaderboard:
Вот таблица лидеров, показывающая лучшие ответы:
foo[0]=1;
бы приемлемо?Ответы:
Pyth, 44 байта
Тестирование
Регулярное выражение и обрезка строк. Не особо умный.
Объяснение:
источник
Vim,
54, 52, 4947 нажатий клавишОбъяснение:
Теперь наш буфер выглядит так:
и наш курсор находится на последней строке.
Вторая половина:
Теперь все выглядит хорошо, нам просто нужно добавить оригинальное объявление массива. Итак, мы делаем:
источник
int foo[6] = {
и заканчиваяint foo[12
(курсор на «2»)df<space>
на,dW
чтобы сохранить байт, но я забыл, чтоdf<space>
он выйдет из макроса в строке 6, ноdW
это не так. Я откат ревизии. Спасибо что подметил это!Сетчатка,
10810410069 байтЧисло байтов предполагает кодировку ISO 8859-1.
Бить это, PowerShell ...
Объяснение кода
Первая строка:
].+{((\S+ ?)+)
Во-первых, нам нужно сохранить тип, имя массива и открывающую скобку (это сохраняет байт), чтобы мы не соответствовали им. Таким образом , мы сопоставляем закрывающую скобку, любое количество символов, и открывающую фигурную скобку:
].+{
. Затем мы сопоставляем список номеров. Кратчайший я смог найти до сих пор это:((\S+ ?)+)
. Мы сопрягать любое количество символов без пробелов (это включает в себя номера, возможный отрицательный знак, и возможную запятую), затем пробел, который может или не может быть там:\S+ ?
. Затем эту группу символов повторяют столько раз, сколько необходимо:(\S+ ?)+
и помещают в большую группу захвата. Обратите внимание, что мы не сопоставляем закрывающую фигурную скобку или точку с запятой. Объяснение третьей строки говорит почему.Вторая линия:
$#2];$1
Так как мы сопоставили только часть ввода, непревзойденные части все еще будут там. Таким образом , мы помещаем длину списка после несогласованной открывающей скобки:
$#2
. В этом#
нам помогает модификатор replace , поскольку он дает нам количество совпадений, сделанных конкретной группой захвата. В этом случае группа захвата2
. Затем мы ставим закрывающую скобку и точку с запятой, и, наконец, весь наш список.При вводе
short array[] = {4, 3, 2, 1};
внутреннее представление после этой замены:(обратите внимание на закрывающую фигурную скобку и точку с запятой)
Третья строка:
+`((\w+[).+;(\S+ )*)(-?\d+).+
Это зацикленный раздел. Это означает, что он работает до тех пор, пока ни одна стадия в цикле не изменит входные данные. Сначала мы сопоставляем имя массива, а затем открывающей скобки:
(\w+\[)
. Тогда произвольное количество любых символов и точка с запятой:.+;
. Затем мы сопоставляем список снова, но на этот раз только цифры и запятая после каждого номера, которые имеют место следующие их:(\S+ )*
. Тогда мы фиксируем последний номер в списке:(-?\d+)
и все остальные символы за ним:.+
.Четвертая строка:
$1¶$2$#3] = $4;
Затем мы заменим его с именем массива и списка с последующим переводом строки:
$1¶
. Затем мы помещаем имя массива, а затем по длине ранее согласованного списка, без последнего элемента ( по существуlist.length - 1
)$2$#3
. Далее следует закрывающая скобка и оператор присвоения с пробелами, за которым следует последний элемент нашего списка номеров:] = $4;
После первой замены внутреннее представление выглядит так:
Обратите внимание, что закрывающая фигурная скобка и точка с запятой исчезли, благодаря
.+
значку в конце третьей строки. После еще трех замен внутреннее представление выглядит так:Так как по третьей строке больше нечего сопоставлять, четвертая ничего не заменяет, и строка возвращается.
TL; DR: Сначала мы немного изменим формат списка int. Затем мы берем последний элемент списка и имя и помещаем их после инициализации массива. Мы делаем это, пока список int не будет пустым. Затем мы возвращаем измененный код.
Попробуйте онлайн!
источник
M!`
иG`
похожи, но не совсем так. Быть осторожен.V, 37 байт
V - это двумерный язык игры в гольф, основанный на струнах, который я написал с использованием vim. Это работает с коммита 17 .
Объяснение:
Это почти прямой перевод моего vim-ответа , хотя и значительно короче.
Тогда у нас просто есть:
Поскольку это безумие с юникодом может быть трудно ввести, вы можете создать файл с помощью этой обратимой hexdump:
Это можно запустить, установив V и набрав:
источник
Designed off of vim.
2 примечания: 1. большинство людей говоритfrom
нетoff of
, и 2. почему этого не было. +1C,
215 байтов, 196 байтов19 байтов сэкономлено благодаря @tucuxi!
Golfed:
Ungolfed:
Ссылка:
http://ideone.com/h81XbI
Объяснение:
Для того, чтобы получить
<type> <array_name>
, тоsscanf()
строка формата заключается в следующем:Чтобы извлечь значения int из строки
int foo[] = {4, 8, 15, 16, 23, 42};
, я по существу токенизирую строку с помощью этой функции:где:
i
это строка ввода (аchar*
)t
смещение расположения указателяi
x
является фактическимint
разбором из строкиn
общее количество использованных символов, включая найденную цифруsscanf()
Строка формата означает следующее:Если вы визуализируете входную строку как массив символов:
с
int
4
расположением в индексе 13,8
в индексе 16 и т. д. вот как выглядит результат каждого цикла в цикле:источник
o
внутри sprintf через%s
. Это должно побрить около 7 символов.C
195180 байт195-байтовый оригинал:
golfed:
ungolfed:
Два ярлыка используют
m
модификатор для получения scanf%s
выделять свою собственную память (сохраняет объявление массивов символов), и используютstrtok
(который также доступен по умолчанию, без включений) для выполнения части с анализом чисел.180-байтовое обновление:
ungolfed:
Использует идею bnf679 о добавлении в строку, чтобы избежать необходимости считать запятые.
источник
Python 3.6 (предварительная версия), 133
Сильно использует f-струны .
Безголовая версия:
источник
Рубин,
1271101089988 байтАнонимная функция с одним аргументом в качестве входных данных.Полная программа, читает входные данные из STDIN. (Если вы передаете файл в файл, завершающий символ новой строки является необязательным.)ВозвращаетПечать выходной строки.Мы взяли @TimmyD, хвастаясь своим решением, обойдя все другие не-esolang как вызов, и наконец преодолели (на момент написания) 114-байтовое решение Powershell, которое они опубликовали.
Трюк Cᴏɴᴏʀ O'Bʀɪᴇɴ с разделением]
и объединением второй половины, чтобы получить числа, помог.Мне нужно больше использовать оператор splat. Это так полезно!
Заимствовал уловку из ответа @ Neil's JavaScript ES6, чтобы сэкономить больше байтов, сканируя слова вместо использования
gsub
иsplit
..источник
05AB1E ,
525047 байтовКод:
Использует кодировку CP-1252 . Попробуйте онлайн!,
источник
JavaScript (ES6), 100 байт
Поскольку важны только слова, это работает, просто сопоставляя все слова в исходной строке, плюс ведущие знаки минуса, а затем формируя результат. (Первоначально я думал, что собираюсь использовать,
replace
но это оказалось красная сельдь.)источник
[t,n,...m]
почти мистическое видениеПиф -
5350464544 байта2 байта сохранены благодаря @FryAmTheEggman.
Тестовый пакет .
источник
Пип ,
4847 байтПринимает ввод из стандартного ввода и печатает в стандартный вывод.
объяснение
Tl; др: выполняет замену регулярного выражения, используя группы захвата и функцию обратного вызова для построения результата.
q
Специальная переменная считывает строку ввода. Регулярное выражение(\S+)(. = ).(.+)}
, которое соответствует всему, кроме типа (включая завершающий пробел) и конечной точки с запятой. Используя первый пример из вопроса, группы захвата получаютfoo[
,] =
и4, 8, 15, 16, 23, 42
.Замена - это возвращаемое значение безымянной функции
{[b#Yd^k']';.n.b.,#y.c.y]}
, которая вызывается с полным соответствием плюс группы захвата в качестве аргументов. Таким образом, внутри функцииb
получает группу захвата 1,c
получает группу 2 иd
получает группу 3.Построим список, первые три пункта , которые будут
"foo["
,6
и"]"
. Чтобы получить6
, мы разбиваемd
встроенную переменнуюk
=", "
,Y
добавляем результирующий список целых чисел вy
переменную для будущего использования и принимаем length (#
).']
это буквальный символ.Осталось построить ряд строк вида
";\nfoo[i] = x"
. Для этого мы сцепить следующее:';
,n
(встроенный для перевода строки),b
(первый захват группы),,#y
(эквивалент Pythonrange(len(y))
),c
(вторая группа) захвата, иy
. Конкатенация работает поэлементно в списках и диапазонах, поэтому в результате получается список строк. Собрав все это вместе, возвращаемое значение функции будет выглядеть следующим образом:Поскольку этот список используется в
R
замещении строк , он неявно приводится к строке. Преобразование списка в строку по умолчанию в Pip объединяет все элементы:Наконец, результат (включая тип и конечную точку с запятой, которые не были сопоставлены регулярным выражением и, следовательно, остаются неизменными), автоматически печатается.
источник
Perl 5.10,
73726866 + 1 (для ключа -n) = 67 байтЭто хороший вызов для Perl и самый короткий среди языков общего назначения. Эквивалентно
источник
PowerShell v2 +,
114105 байтПринимает входную строку
$args
и-replace
заключает в квадратную скобку ничего, затем выполняет-split
пробел. Мы сохраняем первый бит в$a
, второй бит в$b
,=
в$c
, и элементы массива в$d
. Для примера ниже, это сохраняетfoo
в$a
иbar
в$b
, а весь массив в$d
.Затем мы выводим нашу первую строку с
"$a ..."
и в середине преобразования$d
из массива строк формы{1,
,2,
...100};
в обычный массив int,-join
объединяя его в одну строку, а затем пропуская егоiex
дважды (аналогичноeval
). Мы сохраняем этот результирующий массив обратно$d
перед вызовом.length
метода для заполнения соответствующего числа между[]
строкой в выходной строке.Затем мы отправляем
$d
через цикл с|%{...}
. Каждую итерацию мы выводим"$b..."
с переменной счетчика,$i
заключенной в скобки, и текущим значением$_
.$i
Переменная начинает неинициализированным (эквивалент$null
) , но++
будет отбрасывать его наint
перед выходом, поэтому он начнет выход на0
все перед увеличением$i
для следующей итерации цикла.Все выходные строки остаются в конвейере, и вывод на терминал неявен при завершении программы.
пример
источник
C
278280 байтgolfed:
ungolfed:
Во время работы над этим кто-то выложил более короткую версию, используя sscanf для анализа, а не указатели данных ... хороший вариант!
ОБНОВЛЕНИЕ: Обнаружены пропущенные пробелы вокруг равных в элементной печати, интерактивная ссылка IDE: http://ideone.com/KrgRt0 . Обратите внимание, что эта реализация поддерживает отрицательные числа ...
источник
Awk, 101 байт
Более читабельно:
-
. Итак, полями будут имя типа, имя переменной и числа.};
). Итак, размер массиваNF - 3
.FS
либо при вызове awk (использование-F
) или вBEGIN
блоке. В интересах краткости, ...источник
FS
должен быть назначен либо в,BEGIN
либо с использованием,-F
иначе он не будет использоваться для разбиения первой строки, и так как есть только 1 строка ввода ...awk '-F[^[:alnum:]_-]+' '{printf"%s %s[%d];\n",$1,$2,NF-3;for(i=3;i<NF;i++)printf$2"[%d] = %d;\n",i-3,$i}'
, что составляет 102 байта, не считаяawk
себя. Хммм. Могу ли я исключить кавычки?C+O bytes
гдеC
иO
представляете байты из кода и опций соответственно. Конечно, я обычно просто используюBEGIN
блок, поэтому мне не нужно об этом думать. : pJavaScript ES6,
134132130129 байтСохранено 1 байт благодаря Нейлу.
источник
`[${i}] = `+t+";"
быть`[${i}] = ${t};`
?Баш,
133129 байтПервая попытка, убедитесь, что это возможно, чтобы сделать его короче.
источник
D,
197, 188 байтили без золота
источник
Юлия,
154134101 байтЭто функция, которая принимает строку и возвращает строку с одним завершающим переводом строки.
Ungolfed:
Мы определяем
c
как массив совпадений ввода для регулярного выражения-?\w+
. Он определяет тип, имя массива, а затем каждое значение. Мы хранимn
как длинаc
- 2, которая является числом значений. Выходные данные построены как интерполированные строки типа, имени и длины, объединенные с каждой строкой определения, разделенной символами новой строки. По какой-то причине, такc[]
же, какc[1]
.Сохранено 32 байта с помощью Дениса!
источник
Python 2, 159 байт
Попробуйте онлайн
Спасибо Кевину Лау за некоторые предложения по игре в гольф
источник
Python 3, 116 байт
Разбивает ввод на тип, имя и список чисел. После печати объявления массива печатает элементы, вручную перечисляя числа, удаляя лишнюю пунктуацию, которая прикреплена к первой и последней.
Другой подход в Python 2 вышел с 122 байтами:
Идея состоит в
eval
том, чтобы список чисел представлял собой кортеж с запятой в конце, чтобы одно число распознавалось как тип. Перечисляемый список чисел предоставляет кортежи для строкового формата в.источник
PHP, 143 байта
Golfed
Ungolfed
Ввод осуществляется через аргумент командной строки. Образец:
Выход:
источник
MATL ,
686458 байтЭто не C,
но он использует C-подобнуюNah, которая тратит 4 байта.sprintf
функциюПопробуйте онлайн!
источник
Clojure, 115 байт
Я не смог красиво объединить
awful_array_name[5];
иawful_array_name[0] = 7;
разделить так, чтобы они повторно использовали код: /источник