РЕДАКТИРОВАТЬ: Если вы используете Lisp, я дал некоторые рекомендации в подсчет байтов.
Цель: создать самую короткую функцию, которая разбивает строку на нецифровые символы и возвращает массив, состоящий только из цифр в каждой строке, без использования каких-либо регулярных выражений. Ведущие нули должны быть включены в каждую строку.
Текущие результаты (разделены на категории):
- C / C ++ / C # / Java: 68 (C) ....
- GolfScript / APL / J: 13 (APL)
- Все остальные: 17 (Bash, использует
tr
), 24 (Ruby)
Правила:
(Прошу прощения за длительность)
- Формат должен быть как функция с одним строковым аргументом. При необходимости для правильного возврата массива может быть добавлено до двух дополнительных аргументов (например, для sh / csh / DOS Batch требуется дополнительная ссылка на переменную для возврата и т. Д.).
- Объявление первичной функции не учитывается, равно как и импорт других стандартных библиотек. `# include`s,` import`s и `using`s не учитываются. Все остальное делает. Это включает в себя `# define`s и вспомогательные функции. Извините за путаницу. Обратитесь к этому как к полезному руководству относительно того, что учитывается / не учитывается (написано в синтаксисе в стиле C)
// к общему количеству не относится, может быть опущено, если // неочевидно, как половина стандартной библиотеки Java. #include <stdio.h> import some.builtin.Class // не в счет, см. выше #define printf p // рассчитывает на общее количество / * Подсчитать любые другие директивы препроцессора и т. Д. * / int i = 0; // считает SomeFunction (); // считает char [] [] myMainSplitFunction (массив char [] []) {// не считается // Здесь все имеет значение return returnArray; // Даже это считается. } // не считается / * Здесь учитывается все, включая объявление * / char [] [] someHelperFunction (char [] string) { // материал } // даже это считается
- Выходные данные должны быть строковым массивом или аналогичным (допустимы списки массивов в Java и аналогичные). Примеры принятого выхода:
String[]
,char[][]
,Array
,List
, иArray
(объект). - Массив должен содержать только строковые примитивы переменной длины или строковые объекты. В возвращении не должно быть пустых строк, за исключением ниже. Примечание: строки должны содержать строку последовательных совпадений, например, пример ввода и вывода ниже.
- Если совпадений нет, тело функции должно вернуть
null
пустой массив / список или массив / список, содержащий пустую строку. - Внешние библиотеки не допускаются.
- Окончания строки DOS считаются одним байтом, а не двумя (уже включены в мета, но необходимо подчеркнуть)
- И самое главное правило: регулярные выражения запрещены.
Это вопрос игры в гольф , поэтому выигрывает самый маленький размер. Удачи!
И вот несколько примеров входов и выходов (с выходами в стиле C):
Ввод: "abc123def456" Вывод: ["123", "456"] Ввод: "aitew034snk582: 3c" Выход: ["034", "582", "3"] Ввод: «as5493tax54 \\ 430-52@g9.fc» Вывод: ["5493", "54", "430", "52", "9"] Входные данные: "sasprs] tore \" re \\ forz " Вывод: null, [], [""] или аналогичный
Пожалуйста, укажите, сколько байтов используется в ваших ответах, и, как всегда, счастливого гольфа!
Руководство для Лисп
Вот что учитывается и не учитывается на диалектах Лисп:
;;; Опция 1 (defun extract-strings (ab); не считается (вещи) ;;; Все здесь имеет значение ); Не считается ;;; Вариант 2 (defun extract-strings (string & aux (начало 0) (конец 0)); Не считается (вещи) ;;; Все здесь имеет значение ); Не считаетсяВсе остальные лямбды полностью учитываются в счет байтов.
Ответы:
APL, 13 символов
(или 28/30 байт, читайте ниже)
Я вижу, вы запретили GolfScript с вашего вопроса. Я понимаю ваше мнение, но я надеюсь, что это сообщество в конечном итоге не запретит APL, потому что это действительно замечательный язык программирования с длинной историей, не говоря уже о том, что писать код интересно, может быть, он может быть оценен иначе, если люди чувствую, что это несправедливо конкурирует. Я опубликую свои мысли по этому вопросу в той теме, которую вы связали.
На этом же токене я всегда добавлял сноску к своим сообщениям APL, утверждая, что APL может быть оценен как 1 символ = 1 байт. Мое утверждение основано на том факте, что несколько (в основном коммерческих) реализаций APL по-прежнему поддерживают свое собственное устаревшее однобайтовое кодирование, причем символы APL отображаются в верхние 128-байтовые значения. Но, возможно, это слишком много, и в этом случае вы можете оценить эту запись как 28 байтов в UTF-16 или 30 байтов в UTF-8.
объяснение
Примеры
Формат вывода по умолчанию для массива строк не дает понять, сколько строк в массиве или сколько пробелов. Но быстрое манипулирование для добавления кавычек должно прояснить это:
источник
∊⍕¨⍳10
, чтобы вы не могли просто использовать⎕D
? Это должно быть постоянным'0123456789'
. Dyalog APL, по крайней мере, поддерживает его, как и NARS2000.Python 47
Реализация
демонстрация
Алгоритм
Преобразуйте каждый нецифровый символ в пробел, а затем разделите полученную строку. Простой и понятный подход.
И забавное решение с itertools (71 символ)
источник
Руби, 70
Онлайн версия для тестирования
Так как преобразование любого нецифрового символа в int возвращает 0 в Ruby (с to_i), преобразование каждого символа в int и обратно в тип char является не-регулярным способом проверки на наличие цифры ...
источник
bash, 26 (содержимое функции: 22 + накладные расходы на присвоение массива 4)
Это не превзойдет другой
bash
ответ , но это интересно, потому что это может сделать вас двойным дублем:Использование это:
На первый взгляд, это
//+([!0-9])/
выглядит как замена регулярного выражения, но это не так. Это расширение параметра bash , которое следует правилам сопоставления с образцом вместо правил регулярных выражений.Возвращение истинных типов массивов bash из функций bash - это боль, поэтому я решил вместо этого вернуть список, разделенный пробелами, а затем преобразовать его в массив в присваивании массива вне вызова функции. Так что в интересах справедливости я считаю,
(` `)
что вызов функции должен быть включен в мою оценку.источник
Mathematica 32
использование
Эквивалент использования регулярных выражений намного длиннее!
источник
Bash,
21 байт17/21 байт (улучшено DigitalTrauma )Создание разделенного пробелами списка с
tr
заменяет любую не цифру пробелом
использование
редактировать
как указано в комментариях ниже, код может быть сокращен до 17 байт:
и как результат не является строго говоря массив Bash, использование должно быть
и дополнительные
(``)
должны быть учтеныисточник
(blah)
вместо{blah;}
:split()(tr -c 0-9 \ <<<$1)
. Таким образом, ваша функция тела составляет всего 17 символов.a=($(split "12 3a bc123")); echo ${a[@]}
. Можно утверждать, что "($ ())" засчитывается в ваш счетtr
подход, я попытался сделать это с расширением параметра .tr
безусловно, лучший подход для игры в гольф.tr
оператор расширения? Было бы что-то вроде этого($(tr...))
, и если объявление функции не учитывается, внешние скобки не будут учитываться против вас. Это будет только часть подстановки команд.(``)
конструкция на 1 символ лучше, чем та,($())
которая должна быть предпочтительной.Smalltalk (Smalltalk / X), 81
Значение f: 'abc123def456' -> OrderedCollection ('123' '456')
Значение f: 'aitew034snk582: 3c' -> OrderedCollection ('034' '582' '3')
Значение f: 'as5493tax54 \ 430-52@g9.fc' -> OrderedCollection ('5493' '54' '430' '52' '9')
Значение f: 'sasprs] tore \ "re \ forz' -> OrderedCollection ()
sigh - Smalltalk имеет тенденцию использовать очень длинные имена функций ...
источник
asCollectionOfSubCollectionsSeparatedByAnyForWhich
ಠ_ಠ Это имя слишком длинноеР, 81
Функция принимает строку и возвращает список строк.
Примеры:
-
-
-
Примечание:
$x
это имя элемента списка.источник
Perl, 53
Редактировать: при отсутствии совпадений sub теперь возвращает список с пустой строкой (вместо пустого списка), как требуется.
Он также избегает разделения на один пробел, поскольку вызывает поведение «разделить на любое пустое пространство» , что, вероятно, нарушает правила. Я мог бы использовать
/ /
разделитель, который разделил бы на один пробел, но как это ни парадоксально, это выглядело бы как использование шаблона регулярного выражения. Я мог бы использоватьunpack
за счет некоторых дополнительных символов и, таким образом, полностью избавиться отsplit
противоречий, но я думаю, что то, чем я заканчиваю, разделение на буквальный символ (кроме пробела) - это нормально.И, нет, оператор транслитерации Perl не выполняет регулярные выражения. Я могу развернуть диапазон 0-9,
0123456789
если это проблема.источник
C, 68 байт (только тело функции)
Первый аргумент - это входная строка, второй - выходной массив, который является массивом строк с нулевым символом в конце. Достаточная память должна быть зарезервирована для
a
вызова функции (наихудший случай:)sizeof(char*)*((strlen(s)+1)/2)
.Входная строка модифицируется функцией (каждый нецифровый символ заменяется на
'\0'
)Пример использования
Выход
Версия без гольфа:
источник
VBScript, 190 (164 без объявления функции)
Хотя я совсем не конкурентоспособен, я удивлен, что VBScript так коротко об этом говорит, учитывая, насколько он многословен (13 байтов только для CR). Он перебирает строку, заменяя любые нечисловые символы пробелами, затем уменьшает все пробелы до отдельных пробелов, а затем использует разделитель пробелов для его деления.
Контрольные примеры
источник
Common Lisp (1 согласно букве; ≈173 согласно духу)
Вот читабельная версия. Число байтов довольно велико из-за длинных имен в таких вещах, как
digit-char-p
иposition-if
иvector-push-extend
.Понятие «объявление функции» довольно расплывчато. Вот версия, которая имеет только один байт (символ
x
в теле функции); все остальное связывается со вспомогательными переменными списка функций lamba (часть объявления функции):Фактическое число байтов будет зависеть от того, сколько вспомогательных объявлений нужно будет перенести в тело, чтобы это считалось приемлемым. Также может помочь переименование некоторых локальных функций (например, сократить
position-if
поскольку оно появляется дважды, использование однобуквенных переменных и т. Д.).Этот рендеринг программы имеет 220 символов:
Если ничего другого, это должно продвигать переменные Common Aup's & aux .
Это может быть написано более кратко
loop
, конечно:loop
Форма, с дополнительным пространством удалены, имеет 173 символов:источник
(result
последней скобки, чтобы быть телом. Часть, которая определяет имя и параметры, является декларацией.result
здесь объявлен параметр; он просто имеет очень нетривиальную форму инициализации. В принципе, это то же самое, что и необязательный аргумент со значением по умолчанию, которое вычисляется некоторым сложным выражением. (В более простых случаях легко представить что-то похожееchar* substring( char *str, int begin, int end(0) )
на каком-либо языке с C-подобным синтаксисом, чтобы указать, чтоend
это необязательно и что если оно не предоставлено, то его значение равно0
. Я просто подчеркиваю тот факт, что некоторые из этих терминов(defun fn (string &aux (start 0) (end 0)
, не буду считать, но все остальное в лямбде будет).JavaScript, 240 байт
И для тех из вас, кому любопытно, вот мой, вероятно, огромный гольф:
Выше в красивой печати:
Выше в обычном описательном коде
источник
PHP 134
источник
array_filter
. Это автоматически удалит все записи, которые относятсяfalse
к логическим значениям.С, 158
Поскольку в C нет встроенных функций печати массивов, мне пришлось выполнять эту работу самостоятельно, поэтому я приношу извинения за то, что в каждом выводе есть заключительная запятая. По сути, этот код читает строку, если она не является цифрой, заменяет ее на '\ 0', а затем я просто перебираю код и распечатываю все цепочки цифр (EOF = 0).
источник
#define
s, объявления переменных и т. Д. Будут учитываться, но объявление функции не будет.char[][]
который является допустимым. Если вы вернетесь как (илиchar**
), все будет в порядке.C #, 98
Во-первых, он использует
.Select()
метод расширения LINQ, чтобы превратить все нецифровые символы в запятые.string.Replace()
было бы предпочтительнее, так как он возвращаетstring
скорее, чем aIEnumerable<char>
, ноstring.Replace()
может принимать только один символ или строку и не может использовать предикат типаchar.IsDigit()
or47<c&c<58
.Как уже упоминалось,
.Select()
примененный к строке возвращает anIEnumerable<char>
, поэтому нам нужно превратить ее обратно в строку, превратив ее в массив и передав массив вstring
конструктор.Наконец, мы разделяем строку через запятую, используя
string.Split()
.(StringSplitOptions)1
это более короткий способ сказатьStringSplitOptions.RemoveEmptyEntries
, который автоматически заботится о нескольких последовательных запятых и запятых в начале / конце строки.источник
char.IsDigit(c)
вы можете использовать'/'<c&&c<':'
47<c&&c<58
. (Честно говоря, я удивлен, что это работает с числами, но, очевидно, это работает).,
, а затем вручную удалить пустые элементыreturn new string(s.Select(c=>47<c&c<58?c:' ').ToArray()).Split().Where(a=>a!="").ToArray();
JS / Node:
168162147138 символовУкрашенная версия:
источник
console.log(r)
и некоторые другие вещиРуби, 24
Определяет цифры, используя отрицательное пространство в диапазоне для печати ascii.
источник
php , 204
Описательный код:
Это довольно длинный код, и я уверен, что для этого кода будет гораздо более короткая версия php. Это то, что я мог придумать в php.
источник
array()
с[]
,array_push($output[$count], $arr[$i]);
с$output[$count][]=$arr[$i];
, иord()
сверяется сis_numeric()
. и вам даже не нужно разбивать строку, чтобы перебрать ее символы. кроме того, учитывается только внутренний код функции, так что это ваш счетчик символов 204.питон
источник
питон
10483Ответ @Abhijit гораздо умнее, это всего лишь «минимизированная» версия того, что я имел в виду.
Это не приводит к выводу, поэтому код работает, если выполняется один за другим, так как некоторые переменные определены в объявлении.
источник
PHP
9889Как и в ответе bash от DigitalTrauma, здесь не используется регулярное выражение.
Тестовые случаи:
источник
Haskell 31
Он разбивает строку на все нечисловые символы и удаляет пустые строки, сгенерированные последовательными разделителями.
источник
VBA 210, 181 без объявления функции
источник
Реболь (66 символов)
Развернутый и завернутый в объявление функции:
Пример кода в консоли Rebol:
источник
JavaScript
1049789Golfed:
Редактировать: когда циклы выходят из конца массива,
c
этоundefined
, что falsy и завершает цикл.2/27: Использование
?:
сохраняет многословностьif/else
.Возврат каретки в корпусе предназначен для удобства чтения и не является частью решения.
Ungolfed:
Идея состоит в добавлении каждого символа в последнюю запись в массиве, если это цифра, и в противном случае, чтобы последняя запись в массиве была строкой.
источник
Javascript, 72
Ungolfed
Пример ввода / вывода
JSFiddle
источник
if(+a[i]+1)b+=a[i];else if(b)c.push(b),b=""
наb=+a[i]+1?b+a[i]:b?(c.push(b),""):b
.(c.push(b),"")
казалось умным, никогда не видел этого.R 52
Эта функция разбивает строки по классам символов (это не регулярное выражение! :)) класс - это N - числовые символы, а P {N} означает отрицание этого класса. o = T означает пропуск пустых подстрок.
источник
PHP 99
Выход
источник
JavaScript 88
88 символов, если не считать функцию n (x) {}
источник