Разве вам не нравятся те диаграммы с разбивкой по видам, на которых машина или объект разбиты на мелкие части?
Давайте сделаем это со строкой!
Соревнование
Напишите программу или функцию, которая
- вводит строку, содержащую только печатаемые символы ASCII ;
- разбивает строку на группы непробельных одинаковых символов («кусочки» строки);
- выводит эти группы в любом удобном формате с некоторым разделителем между группами .
Например, учитывая строку
Ah, abracadabra!
на выходе будут следующие группы:
! , ааааа бб с d час р-р
Каждая группа в выходных данных содержит одинаковые символы с удаленными пробелами. Новая строка была использована в качестве разделителя между группами. Подробнее о разрешенных форматах ниже.
правила
Вход должен быть строкой или массивом символов. Он будет содержать только печатные символы ASCII (включающий диапазон от пробела до тильды). Если ваш язык не поддерживает это, вы можете принять ввод в виде чисел, представляющих коды ASCII.
Вы можете предположить, что ввод содержит хотя бы один непробельный символ .
Выход должен состоять из символов (даже если вход с помощью ASCII - кодов). Между группами должен быть однозначный разделитель , отличный от любого непробельного символа, который может появиться во входных данных.
Если выходные данные выполняются через функцию return, это может быть также массив или строки, или массив массивов символов или аналогичная структура. В этом случае структура обеспечивает необходимое разделение.
Разделитель между символами каждой группы является необязательным . Если он есть, применяется то же правило: это не может быть символ без пробела, который может появиться на входе. Кроме того, это не может быть тот же разделитель, который используется между группами.
Помимо этого, формат гибкий. Вот некоторые примеры:
Группы могут быть строками, разделенными символами новой строки, как показано выше.
Группы могут быть разделены любым не-ASCII символом, таким как
¬
. Выход для указанного выше ввода будет строкой:!¬,¬A¬aaaaa¬bb¬c¬d¬h¬rr
Группы могут быть разделены n > 1 пробелами (даже если n переменная), с символами между каждой группой, разделенными одним пробелом:
! , A a a a a a b b c d h r r
Вывод также может быть массивом или списком строк, возвращаемых функцией:
['!', 'A', 'aaaaa', 'bb', 'c', 'd', 'h', 'rr']
Или массив массивов символов:
[['!'], ['A'], ['a', 'a', 'a', 'a', 'a'], ['b', 'b'], ['c'], ['d'], ['h'], ['r', 'r']]
Примеры форматов, которые не разрешены, согласно правилам:
- Запятую нельзя использовать в качестве разделителя (
!,,,A,a,a,a,a,a,b,b,c,d,h,r,r
), потому что ввод может содержать запятые. - Не допускается удалять разделитель между группами (
!,Aaaaaabbcdhrr
) или использовать один и тот же разделитель между группами и внутри групп (! , A a a a a a b b c d h r r
).
Группы могут появляться в любом порядке в выходных данных. Например: алфавитный порядок (как в примерах выше), порядок первого появления в строке, ... Порядок не должен быть последовательным или даже детерминированным.
Обратите внимание , что ввод не может содержать символы новой строки, а A
и a
различные символы (группировка случай-sentitive ).
Самый короткий код в байтах побеждает.
Контрольные примеры
В каждом тестовом примере первая строка является входной, а остальные строки - выходными, причем каждая группа находится в отдельной строке.
Тестовый пример 1:
Ах, абракадабра! ! , ааааа бб с d час р-р
Контрольный пример 2:
\ О / \ о / \ о / /// \\\ ооо
Тестовый пример 3:
Человек, план, канал: Панама! ! ,, : п ааааааааа с Л.Л. мм нннн п
Контрольный пример 4:
«Покажите мне, как вы делаете этот трюк, тот, который заставляет меня кричать», сказала она «» , S ааааа куб.см дд eeeeeee HHHHHH б кк мммм N ооооо р-р ГССО TTTTTT U WW Y
Ответы:
Желе , 5 байт
Попробуйте онлайн!
Он возвращает массив, только когда он печатается в STDOUT, разделитель исчезает.
Это действительно функция, которая может быть вызвана как таковая (в Jelly каждая строка является функцией).
источник
Python 3.5+,
77464441 байтДовольно просто Проходит через уникальные символы в строке, преобразовывая ее в набор (используя расширенную итеративную распаковку в Python 3.5), затем использует понимание списка для построения разнесенных диаграмм, подсчитывая количество раз, когда каждый символ встречается в строке с
str.count
. Мы отфильтровываем пробелы, удаляя их из набора.Порядок вывода может варьироваться от запуска к запуску; множества неупорядочены, поэтому порядок, в котором обрабатываются их элементы, и, следовательно, этот ответ, не может быть гарантирован.
Это лямбда-выражение; чтобы использовать его, префикс
lambda
сf=
.Попробуйте это на Ideone!Ideone использует Python 3.4, которого недостаточно.Пример использования:
Сохранено 3 байта благодаря @shooqie!
источник
{*s}
дляset(s)
.Сетчатка, 13 байт
Сортировка очень проста (встроена), она разделяет буквы, которые занимают 9 байтов. Попробуйте онлайн!
Первая строка
O
содержит все совпадения регулярного выражения.
(каждый символ), давая нам!,Aaaaaabbcdhrr
.Соответствие является этапом по умолчанию для последней строки программы, и
!
она выводит список совпадений регулярного выражения, разделенный переводом строки. Регулярное выражение ищет один или несколько экземпляров непробельного символа в строке.источник
Perl 6 , 28 байт
Обратите внимание, что Bag как Hash или Set неупорядочен, поэтому порядок результатов не гарантируется.
Объяснение:
источник
Vim,
50, 46 байтовОбъяснение / GIF придет позже.
источник
Пиф, 6
Попробуйте здесь или запустите Test Suite .
Довольно просто,
-zd
удаляет пробелы из входных данных и.gk
группирует каждый оставшийся элемент по его значению. К сожалению, я не нашел способа использовать переменные автозаполнения. Обратите внимание, что выходные данные отображаются в виде строк Python, поэтому определенные символы (читай: обратная косая черта) экранируются. Если вы хотите, чтобы он был более читабельным, добавьтеj
в начало кода.источник
Haskell, 38 байт
В основном решение Ними , но явно проверяет только буквы, появляющиеся в строке.
источник
2sable , 7 байтов
Код:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
JavaScript (ES6), 41 байт
источник
" "
к существованию записи в возвращаемом массиве? Не уверен, что это разрешеноjoin()
называется с этими двойными бэктиксами?.join([''])
.join
затем преобразует это в (пустую) строку и использует это для соединения элементов массива. Не все методы преобразуют свои параметры в строку, но этот метод удобен для тех, кто это делает.Брахилог ,
147 байт7 байтов благодаря Fatalize.
Попробуйте онлайн!
источник
x
для удаления@S
(пробел). Я считаю, что этот выходной формат (список строк) является действительнымHaskell, 40 байт
Пример использования:
f "Ah, abracadabra!"
->["!",",","A","aaaaa","bb","c","d","h","rr"]
.Шаблон
v:w
соответствует только списку хотя бы с одним элементом, поэтому все символы, отсутствующие во входных данных, игнорируются.Также 40 байтов:
источник
group
этоData.List
тоже из. Во всяком случае, я думаю, что этот синтаксисghci
только и нуждается в REPL, так что это собственный язык . Я хочу придерживаться стандартного Haskell.Рубин, 41 + 1 = 42 байта
+1 байт за
-n
флаг.Принимает ввод на стандартный ввод, например:
источник
C #
12598 байтобъяснение
ToArray
вызов и просто неявно вернуть IEnumerable, который в совокупности экономит 27 байтовисточник
Func<string, string[]>
естьs=>s.GroupBy....
R,
1981899695 байтUngolfed:
Это решение в настоящее время не совсем работает, когда\
участвуют.Теперь это !
Спасибо намного вам @JDL для игры в гольф из 102 байт!
источник
for(i in unique(a=strsplit(gsub(" ","",readline()),"")[[1]]))cat(rep(i,sum(a==i)),"\n",sep="")
- сохраняет 2 байта.<-
сэкономит 1 байт!Swift,
10591 байтСпасибо @NobodyNada за 14 байтов :)
Да, я довольно новичок в Swift ...
Символы в группе разделены одной новой строкой. Группы разделены двумя новыми строками.
источник
[Character]
вместо aString
, поскольку правила гласят: «Ввод должен быть строкой или массивом символов». Такжеprint("")
можно заменить на простоprint()
.print
без аргументов не работал по какой-то причине, но[Character]
предложение было твердым. Благодарность!Октава , 61 байт
Это аномальная функция, которая принимает строку в качестве входных данных и выводит массив ячеек строк.
Попробуйте в Ideone .
Как это работает
sort
сортирует входную строку. В частности, пробелы будут в начале.strtrim
удаляет ведущие пробелыdiff(+y)
вычисляет последовательные различия между символами (чтобы определить границы группы) ...diff(find([1 diff(+y) 1])
дает вектор размеров группы.mat2cell
затем разбивает отсортированную строку на куски с этими размерами.источник
Mathematica, 36 байт
Встроенные функции
Gather
иCharacters
большая часть работы здесь.источник
> <> , 49 байтов
Очень пространно расточительно в выводе, но я предполагаю, что все еще разрешено, учитывая снисходительность правил
Объяснение:
совмещать некоторые вещи довольно плотно, даже используя прыжки, чтобы обойти некоторые функции, чтобы я мог выполнять указатель по вертикали.
В основном это помещает каждый символ ASCII на собственную новую строку, и если ни один из этих символов не существует, строка будет пустой
Попробуйте онлайн
Редактировать: я был не прав, в коде произошла ошибка, из-за которой он никогда не завершился, если во входе был пробел
источник
Pyth, 5 байт
Попробуй это здесь!
Принимает ввод в виде строки Python (то есть, заключенный в кавычки, экранированные кавычки и косые черты при необходимости).
Объяснение:
Если вы гарантируете хотя бы один пробел во вводе, есть 4-байтовое решение:
Попробуй это здесь!
Объяснение:
источник
PowerShell v2 +, 44 байта
Принимает ввод
$args[0]
как аргумент командной строки.char
Приводит его как -array и использует оператор-n
ote
qual для выделения пробелов (ASCII32
). Это работает, потому что приведение имеет приоритет более высокого порядка, и когда массив используется в качестве левого оператора со скаляром в качестве правого, он действует как фильтр.Мы передаем этот массив символов
Group-Object
, который делает именно то, что говорит. Обратите внимание, что, поскольку мы передаем символы , а не строки, это правильно группирует с учетом регистра.Теперь у нас есть пользовательский объект (ы) с именами групп, количеством и т. Д. Если мы просто напечатаем, у нас будет множество посторонних выводов. Таким образом, мы должны трубы те в петлю ,
|%{...}
и каждая итерация вместе в одну строку. Эти результирующие строки остаются в конвейере, и вывод завершается неявно при завершении программы.-join
.Group
пример
источник
Дьялог АПЛ , 11 байт
Функция, возвращающая список строк.
(⊂∩¨∪)
пересечение целостности и ее уникальных персонажей~∘' '
кроме пробеловПопробуй APL онлайн!
источник
Обработка, 109 байт
Это метод грубой силы, сортировка массива, затем цикл по нему. Если он не совпадает с последним напечатанным символом, сначала выведите новую строку. Если это пробел, пропустите шаг печати.
источник
Javascript (с использованием внешней библиотеки - перечисляемый) (
7867 байт)Ссылка на lib: https://github.com/mvegh1/Enumerable
Объяснение кода: это то, что Enumerable был создан, чтобы сделать! Загрузите строку в библиотеку, которая преобразует ее в массив символов. Отфильтруйте записи пробелов. Группировать по символу Запишите каждую группу в строку в соответствии с указанным предикатом. Этот предикат говорит, что все элементы текущей группы должны быть объединены в строку без разделителя.
источник
MATL, 7 байт
MATL Online Демо
источник
Perl6,
484745Спасибо manatwork за улучшения.
источник
$a.trim
кажется, делает это для состояния.$^a.trim&&say $a x$^b
работает. (Извините за добавление подсказок побайтно, но это моя первая попытка на Perl6.){
.Рубин, 46 байт
Попробуйте онлайн!
Моя оригинальная полная версия программы, 48 байтов после добавления
n
флага:источник
.count(c)
на.count c
?*
рядом есть оператор, поэтому парсер будет жаловаться.map
ему нужны дополнительные парены, и((s.chars-[' '])|[]).map
количество символов в них равно(s.chars-[' ']).uniq.map
. И другой, более короткий способ проверки уникальных символов (с помощью регулярных выражений) уже описан @Jordan в другом ответеPython, 107
Может быть сокращено лямбда, но позже
источник
CJam, 10 байтов
Безымянный блок, который ожидает строку в верхней части стека и заменяет ее списком строк.
Попробуйте онлайн!
объяснение
источник
Common Lisp, 123
Ungolfed:
Не самый дружелюбный язык для гольфа. Вероятно, это можно изменить, чтобы он возвращал список списков вместо строки печати.
источник
Emacs, 36 нажатий клавиш
C-SPACE C-EM-x
sort-r
TABRETURN.RETURN.RETURNC-AC-M-S-%\(\(.\)\2*\)
RETURN\1
C-QC-JRETURN!Результат
A man, a plan, a canal: Panama!
->объяснение
sort-r
TAB RETURN .RETURN .RETURN\(\(.\)\2*\)
RETURN\1
C-Q C-JRETURN !sort-regexp-fields
с аргументами.
и.
;\(\(.\)\2*\)
->\1\n
на все совпадения.источник