Мы определяем пробел как любой из трех символов: tab (0x09), символ новой строки (0x0A) или пробел (0x20).
Для этого вам нужно написать две программы или функции на одном языке программирования, которые выполняют следующие задачи:
Подсчитайте пробельные символы в заданной строке. Например, вход
123 -_- abc def
вернул бы 7 (при условии, что нет завершающего символа новой строки).
Разбить заданную строку при последовательных пробелах. Если строка начинается или заканчивается пробелом, пустые строки не должны возвращаться на концах. Например, тот же вход
123 -_- abc def
вернется
["123", "-_-", "abc", "def"]
.
В любом случае вы можете получить ввод через STDIN, аргумент командной строки или аргумент функции, чтобы вернуть результат или распечатать его как STDOUT. Для второй программы, если вы решите печатать в STDOUT, напечатайте каждую строку в отдельной строке без кавычек.
Для обеих программ вы можете предположить, что вход содержит только печатные ASCII (от 0x20 до 0x7E) и пробелы.
Теперь вот подвох:
- Если все пробелы удалены из обеих программ / функций, результирующие строки должны быть идентичными. То есть ваши два представления могут отличаться только количеством и расположением пробельных символов.
- Ни одна из программ / функций не может содержать строковые или регулярные литералы (символьные литералы в порядке, если у вашего языка есть обозначенный тип символов).
- Ни одна из программ / функций не может содержать никаких комментариев.
- Вы не должны читать исходный код программы, прямо или косвенно.
Это код гольф. Ваша оценка - это сумма размеров обоих решений (в байтах). Самый низкий балл побеждает.
Leaderboards
Следующий фрагмент стека генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам. Поэтому, даже если ваш предпочтительный язык не позволяет вам выиграть весь вызов, почему бы не попытаться занять место во втором списке? Мне было бы очень интересно посмотреть, как люди решают эту проблему на разных языках!
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
есть общий размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Вы также можете включить отдельные подсчеты до общего подсчета, например,
# Python 2, 35 + 41 = 76 bytes
Последний номер, который не вычеркнут, будет использоваться фрагментом.
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 42253;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
источник
Ответы:
Pyth, 16 + 15 = 31 байт
Попробуй это здесь .
Счетчик:
Splitter:
Каждый из них определяет функцию,
y
которая принимает строковый ввод для решения желаемой задачи.Спасибо @FryAmTheEggman за идею использования функции модульной индексации в списках в Pyth для бритья персонажа.
Тестовые случаи:
Объяснение:
источник
Python, 54 + 56 = 110 байт
Счетчик:
Splitter:
Для счетчика мы используем тот факт, что в Python все нормально, когда в строке есть только выражение. Это необходимо , чтобы разделить
+1
и ,0<9or x.split()
чтобы остановитьNameError
от броска, так как0<9
времяTrue
предотвращаетx.split()
от оцениваемого из - за короткого замыкания.Для разделителя, поскольку количество пробелов всегда неотрицательно,
sum(y.isspace()for y in x)+10<9
всегдаFalse
и функция разделения вступает в игру.Альтернатива 1, 59 + 60 = 119 байт
Счетчик:
Splitter:
Результаты как подсчета, так и разбиения сохраняются в двухэлементном списке. Список индексируется либо
min([1])
, возвращая минимум содержащего один элемент списка1
, либоm in([1])
, который возвращаетFalse
(эквивалентно0
) то, чтоm
не содержится в[1]
.Альтернатива 2, 67 + 69 = 136 байт
Счетчик:
Splitter:
Как и выше, результаты подсчета и разделения сохраняются в двухэлементном списке.
sorted
является встроенной функцией, которая является истинным значением, поэтомуnot sorted
возвращаетFalse
(эквивалентно0
). Ибоnot s or ted
, посколькуs
это функция, а также правда,not s
естьFalse
иted = 1
возвращается.Альтернатива 3, 59 + 60 = 119 байт
Счетчик:
Splitter:
Это функция, в которой результат сплиттера сохраняется в переменной
a
, а результат счетчика сохраняется в переменнойa1
. Как и раньше, в этом случае Python прекрасно работает только с выражением в строке1
. Разделениеa1
определяет, что нужно вернуть из функции.источник
not sorted
.+1
и0<9or x.split()
необходимо?m=lambda x:sum(y.isspace()for y in x)+00and x.split()
иm=lambda x:sum(y.isspace()for y in x)+0;0and x.split()
(делая эту точку с запятой новойЯва 8, 239 + 240 = 479
Подсчет пробелов (возвращает целое число)
Разделить на пустое пространство (возвращает Stream <String>)
Объяснение:
источник
Пробел, 75 + 153 = 228
Пробелы, табуляции и переводы строк заменены на STL соответственно и свернуты для удобства чтения. Преобразовать в правильный файл пробела с
tr -d \\n | sed 'y/STL/ \t\n/'
.счетчик
Разветвитель
источник
Марбелоус, 103 + 92 = 195
Счетчик:
Splitter:
Проверьте эти программы здесь. Цилиндрические доски, включаемые библиотеки и места для пустых ячеек должны быть проверены.
Вход и выход через STDIN / STDOUT.
объяснение
Счетчик:
Синий путь получает вход. Если символ является символом пробела (значение ascii меньше 0x21), берется черный путь, который синхронизируется с фиолетовым путем.
Фиолетовый путь просто увеличивает мрамор, хранящийся в
&1
синхронизаторе, каждый раз, когда берется черный путь.Когда больше нет ввода, берется красный путь, печатается количество пробельных символов и завершается.
Splitter:
Программа начинается с синего пути, который повторяется, пока не будет найден непробельный символ.
Когда извлекается непробельный символ, берется черный путь, который печатает этот символ и перемещает выполнение к зеленому пути, который зацикливается и печатается до получения пробельного символа. Затем выполнение продолжается до фиолетового пути, который содержит
3W
или трехсторонний разделитель.Левая ветвь перемещает выполнение в синий путь (и пробелы отбрасываются до тех пор, пока не будет найден непробельный символ).
Средняя ветвь устанавливает копию входного значения в 0 с помощью
?0
(генерирует случайное число между0
и0
) и добавляет 10 (0x0A
= перевод строки), который затем выводится.Правильный путь отбрасывается.
источник
CJam, 26 + 27 = 53
59 61 73 77байтсчетчик
Разветвитель
Как это устроено
Идея проста: рассчитать количество пробелов и разбить строку на последовательные пробелы. Затем выберите один из них основан на следующем факте , что
' !
средство ,not of space character
которое является falsy, в то время как'!
это!
символ, который truthy.Расширенный код:
Вход от STDIN и выход для STDOUT
Попробуйте онлайн здесь
источник
Mathematica, 44 + 43 = 87
97байтЯ думал, что добавлю еще один язык в микс.
Счетчик:
Splitter:
Это использует функцию Mathematica, заключающуюся в том, что разделение пространства такое же, как умножение. И умножение чего-либо на 0 всегда равно 0, а добавление 0 к чему-либо всегда идемпотентно.
Для счетчика мы сначала подсчитываем пробел и добавляем
0*1*StringSpli*t@#
.StringSpli
иt
не определены, но Mathematica использует символьные вычисления, поэтому он просто обрабатывает их как неизвестную переменную и функцию.1*
Идемпотентна (как0+
), то0*
превращает его в ноль. Необходимо разделить ихStringSplit
на две переменные, потому что0
иногда список обрабатывается как умножение на скалярный вектор, что приводит к вектору (списку) нулей.Для сплиттера я использую тот факт, что он
Count
также существует, но не просматривает строки. Он пытается подсчитать все подвыражения, соответствующие шаблону, ноWhitespace
это шаблон, который применяется только к строковому содержимому. ТакCount
всегда будет возвращаться0
, что делаетString
исчезновение. Умножение расщепленного массива01 = 1
снова идемпотентно.источник
Рубин,
10791 байтСплиттер (46 байт)
Счетчик (45 байт)
p
это предопределенный метод, который без аргументов просто возвращаетnil
. Мы используем это несколькими способами. В сплиттере инициалp
ничего не делает.gets(p)
читает все из стандартного ввода, так как разделитель равен нулю. Мы вызываем для этого встроенный метод split и присваиваем результатp
, поэтому теперь, когда ему не заданы аргументы, он будет проанализирован как переменная.puts p||...
закорачивает и печатает каждый элементp
переменной в отдельной строке.В счетчике мы удаляем первую новую строку, чтобы
pp
вместо нее был назначен разделенный массив . Поскольку мы не присваиваемp
, это все еще метод с нулевым возвратом, поэтому вторая часть||
получает и оцениваетсяputs
.$_
является магической переменной, содержащей результатgets
, поэтому общее количество пробелов - это размер минус непробельные символы, которыеpp
содержат. Я чувствую, что должен быть более короткий способ подсчета, но я не могу его найти, и, во всяком случае, использование разделенного массива в счетчике - это весело.источник
Питон, 169
Это почти слишком легко сделать в Python!
Счетчик:
Splitter:
Они отличаются только одним пробелом, и я не делаю никаких хитростей, таких как деление числа или имени переменной пополам :)
источник
С 138 + 136 = 274
В каждом случае код - это программа, которая принимает ровно один аргумент командной строки и выводит результат в стандартный вывод.
\t
должен быть заменен символом табуляции. Если вы хотите передать аргумент, содержащий вкладки и символы новой строки, то ваша задача - выяснить, как;).Counting
расщепляющий
источник
JavaScript, 95 + 96 = 191 байт
Счетчик:
Splitter:
Ungolfed:
RegExp(String.fromCharCode(92,115)
Строка создает пробельные сопоставления регулярных выражений/\s/
без регулярных выражений или строковых литералов.В каждой программе мы используем переменную
v
илиvv
. Мы сохраняем разделенный массив в эту переменную (v
илиvv
), а затем разветвляем наше поведение по значениюv
(между тем,vv
игнорируется). В прилавкеv
имеет истинное значение; в разделителе он имеет ложное значение (потомуvv
что вместо этого получил значение).Альтернатива: JavaScript, 250 байт
У меня есть другое решение, которое не приносит выигрышей за краткость, но я подумал, что было бы интересным испытать злоупотребление поведением автоматической вставки точек с запятой в JavaScript.
Счетчик:
Splitter:
Неуправляемый счетчик:
Сплиттер точно такой же, за исключением строки:
сейчас
Автоматическая вставка точек с запятой в JavaScript обычно не прекращает заявления многострочных рано , если они могут быть поняты без разрыва строки, но он не терпит разрывы строк после
return
,continue
илиbreak
. Следовательно, строка читается просто какbreak
, которая разрывается только из внутреннего цикла, а не из внешнего цикла.o = a.filter(j=>j)
Затем выполняется поведение «второго прохода» (вместо пропуска в счетчике), поскольку внешнему циклу дается второй проход.источник
!!x
автоматическоеBool
преобразование?filter
авто-bools его обратный вызов возвращается по тем же правилам, что и!!
. Спасибо!Python,
228198182166146145 байтСчетчик ( 72 байта ):
Разделитель ( 73 байта ):
ior1
переменная Фальси, ноi or 1
это правда. Это главный трюк.источник
i
пустая строка для сплиттера? Может быть исправлено путем измененияiorb
наior1
, что также позволяет сохранить символ между1
иelse
.Befunge 98, 61 + 59 = 120
Счетчик:
Splitter:
источник
Баш, 75 + 79 = 154 байта
Это основано на том, что bash может продолжать выполнение, даже если некоторые строки или части строки скрипта искажены (в некоторых случаях). Пробелы используются для деактивации escape-кодов для некоторых закрывающих скобок и для разрыва канала, помещая его в новую строку.
Splitter:
Счетчик:
Ввод через аргумент командной строки, выход через stdout.
Поскольку это зависит от поведения ошибок bash, пользователь, как ожидается, будет игнорировать stderr.
Пример выполнения (показывает ввод с новой строкой и несколькими смежными пробелами):
источник
Ruby,
114 + 116,107 + 109 = 216 байт.Это не может конкурировать с рубиновым решением гистократа, но я подумал, что в любом случае стоило бы мириться.
Я использовал
$z
дляnil
иnil.to_s
дляString.new
Дополнительный символ пробела, который я добавляю в конец ввода, - это принудительное добавление последнего слова в массив (
r
) - слово добавляется только в конец массива, когда символ пробела следует за непробельным символом. Альтернативой было добавление еще одногоr<<w if w
послеeach_byte
блока.Counting
расщепляющий
источник
Haskell ,
53 + 55 = 10836 + 38 = 74 байтасчетчик
Разветвитель
Это решение использует тот факт, что в Haskell функции являются экземпляром класса типа Monad и, следовательно, могут использоваться как монадические действия в do-нотации.
В первом случае результирующая функция do-блока является первым аргументом
pure
(который по существу относитсяconst
к типу функции), что делает счетчик конечным результатом, а сплиттер отбрасывается.Во втором случае
pure
применяется только один аргумент, что делает его функцией, возвращающей другую функцию (счетчик). Тем не менее, результат никогда не используется и, следовательно, отбрасывается. Окончательный результат - вторая строка do-block, разделитель.источник
[' ','\t','\n']
можно сократить до" \t\n"
.(<'!')
для проверки пробелов.Ява 8, 187 + 188 = 375
Прежде всего, я хотел бы сказать, что этот ответ в значительной степени основан на @ Ypnypn's. Я в основном заменил некоторые части более короткими (включая часть, зависящую от пробелов, которая IMO является наиболее важной в этой задаче), но функциональный код в основном такой же.
Посчитайте пробел , 187 (возвращает
int
):Разделить пробел , 188 (возвращается
Stream<String>
):источник
J, 48 + 49 = 97 символов
Две функции, принимающие и возвращающие один аргумент. Использовал самый дурацкий способ, который я мог придумать, чтобы превзойти то же правило, но с пробелами, так что, вероятно, есть символы, которые нужно сохранить, найдя более умный путь вокруг этого.
Мы определяем глагол,
a
чтобы иметь два разных действия, в зависимости от того, используется ли он с одним аргументом или с двумя. С одним аргументом,(e.u:)&9 10 32
который проверяет, является ли каждый символ пробелом или нет. С двумя аргументами это такa:-.~(<;._1~1,}.)
, который берет логический вектор справа и обрезает левый аргумент в этих позициях, отбрасывая любые пустые сокращения с помощьюa:-.~
.Затем мы определяем
aa
число значений True в результатеa
, что имеет смысл только с одним аргументом. Наконец, мы используемaa
или вa a
зависимости от того, хотим ли мы посчитать или разделить пробел строки.aa
работает как положено.Причина в
a a
том, что когда J видит(f g)y
, он рассматривает(f g)
хук и оценивает его следующим образомy f (g y)
. В этом случаеf
- это диадическийa
выше, который выполняет резку, иg
которыйa[aa
, который вычисляет сумму изaa
, выбрасывает ее и вычисляет (монадический)a
снова.На REPL:
источник
Bash, 54 + 50 = 104 байта
счетчик
Разветвитель
источник
Perl, 37 + 38 = 75
Счетчик :
Сплиттер :
источник
Perl 6, 31 + 32 = 63 байта
счетчик
Попробуйте онлайн!
?^1
разбирается так,?^ 1
что применяет логический оператор отрицания к 1, в результате чегоFalse
.Разветвитель
Попробуйте онлайн!
? ^1
преобразует диапазон 0..0 в Bool, в результате чегоTrue
.источник
Python 2, 98
Расщепление (49)
Возвращает токены в списке.
Подсчет (49)
Возвращает список длиной один, содержащий количество пробелов. Скорее всего, это приведет к ошибке времени выполнения, но функцию
f
можно использовать после выполнения кода.источник
C (gcc) , 88 + 89 = 177 байт
Разветвитель
Разветвитель
счетчик
счетчик
Наезжать
Принимает ввод как аргумент функции. Функция подсчета возвращает количество пробелов. Функция расщепления использует STDOUT для своего вывода (но, кстати, также возвращает количество пробелов минус один).
источник
Zsh , 35 + 35 = 70 байт
Я не уверен, соответствует ли это
[^$IFS]
требованиям, так как он используется в сопоставлении с образцом. Вот 45 + 45 решение в случае, если оно заблокировано.Трещина:
Количество:
:
Встроенная команда equivilent кtrue
, мы используем его как нечто среднее между комментарием и / Dev / нуль (так как комментарии запрещенную) по конвейеру нежелательного расширения к нему.Zsh имеет встроенную функцию для разбиения на пробелы, это существо
${=var}
. Это затрудняет создание какой-либо логической комбинации, кроме выполнения обоих и отбрасывания того, который нам не нужен.Попробуйте онлайн!
источник