Учитывая входное предложение, состоящее из одного или нескольких слов [a-z]+
и нуля или нескольких пробелов , выведите гистограмму (гистограмму) в стиле ASCII распределения букв входного предложения.
Гистограмма должна быть расположена горизонтально, то есть с буквенным ключом вдоль основания в алфавитном порядке слева направо, с осью Y, помеченной 1-
и каждые 5 единиц. Ось Y должна быть наименьшим кратным пяти, которая, по крайней мере, такая же высокая, как самая высокая полоса, и должна быть выровнена по правому краю. Ось X помечена входными буквами без пробелов между ними. Например, вход a bb dd
должен иметь метку, abd
а не ab d
пропускать c
. Сами столбцы могут быть сделаны из любого согласованного символа ASCII - я буду использовать X
здесь в своих примерах.
test example
5-
X
X X
1-XXXXXXXX
aelmpstx
Так как есть три e
, два t
и один из almsx
.
Больше примеров:
the quick brown fox jumped over the lazy dogs
5-
X X
X X
XX X X X XX
1-XXXXXXXXXXXXXXXXXXXXXXXXXX
abcdefghijklmnopqrstuvwxyz
now is the time for all good men to come to the aid of their country
10-
X
X
X X
X X X
5- X X X
X X X X
X XX XXXX X
XXXXX XXXXXXX X
1-XXXXXXXXXXXXXXXXXX
acdefghilmnorstuwy
a bb ccc dddddddddddd
15-
X
X
10- X
X
X
X
X
5- X
X
XX
XXX
1-XXXX
abcd
a bb ccccc
5- X
X
X
XX
1-XXX
abc
I / O и правила
- Входные данные могут быть приняты в любом разумном формате и любым удобным способом . Это также означает, что вы можете вводить данные в верхнем регистре, если это имеет больше смысла для вашего кода.
- Лидирующие / завершающие символы новой строки или другие пробелы являются необязательными, при условии, что символы выстраиваются соответствующим образом.
- Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
- Вывод может быть на консоль, возвращен в виде списка строк, возвращен в виде одной строки и т. Д.
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
Ответы:
Stax , 37 байт
Запустите и отладьте его
источник
R ,
239230 байтПопробуйте онлайн!
table
выполняет тяжелую работу здесь, унифицируя персонажей, сортируя их и возвращая их счета.Все остальное просто обеспечивает правильные смещения для печати, что является «настоящей» работой для ascii-art.
Спасибо @dylnan за указание на ошибку.
Спасибо @rturnbull за
scan
подход, сбрасывающий 2 байта.источник
gnu sed -r,
516490278249 + 1 байтПопробуйте онлайн!
Я уверен, что это можно улучшить
, но на данный момент, это должно быть хорошо, учитывая, что это сделано в sed, где у вас нет нативной арифметики или сортировки.Так что я солгал, этого было недостаточно, поэтому я улучшил (переписал) его еще на 212 байт, с подсказкой относительно алгоритма сортировки из кряка Корова , что дало мне идею сделать унарное преобразование в десятичное также более коротким.Описание внутренней работы:
Это сортирует входные данные и разделяет группы пробелами. Это работает, сначала добавляя прописные буквы алфавита плюс пробел, разделенный двоеточием в конце. Затем он перемещает каждый символ перед двоеточием на соответствующий символ за двоеточием, используя в цикле замену без учета регистра. Затем заглавные буквы заменяются пробелами, а строка копируется в пробел.
Этот цикл работает, уменьшая размер каждой группы символов по одному, добавляя отсортированную исходную строку и увеличивая унарные счетчики после двоеточия, оставшегося от сортировки. Он зацикливается до тех пор, пока не будет достигнута пустая строка с номером 5 * n + 1 (поскольку последняя строка в конечном итоге приводит к пробелам). Пространство шаблона выглядит примерно так после цикла:
Затем следует форматирование:
И, наконец, остается одинарный в десятичном виде:
Это в основном добавляет строку, где знание преобразования. Вы можете интерпретировать это как: пробел: -> 1 и 0-> 1-> 2-> 3-> 4-> 5-> 6-> 7-> 8-> 9-> I0. Выражение подстановки
s/(.)I(.*\1(I?.))|;.*/\3\2/
работает подобно сортировке, заменяя символы перед символом I [(.)I
] символом, который находится рядом с символом перед символом I в строке преобразования [(.*\1(I?.))
], и если я не оставил I, он удаляет добавленная строка [|;.*
]. Подстановка [/\nI/s/^/ /Mg
] добавляет заполнение, если это необходимо.Спасибо Корову кряку за уменьшение размера на 26 байт и за более короткий алгоритм сортировки.
источник
\w
(соответствует символам слова) в нескольких местах, чтобы сохранить несколько байтов. И:b ... tb
может просто статьs/\B\w/X/g
. Вы можете удалить строку, которая следует за ней,s/:/:,/g
изменив предыдущие замены. Вы можете посмотреть на goo.gl/JvD7Rs (сокращенная ссылка TIO на программу sed), чтобы понять, что я имею в виду.zyx...cba
к входу.Dyalog APL ,
1099796959388 байтПопробуйте онлайн!
требует
⎕IO←0
Путь слишком много байт сохранены благодаря адаму и Корове кри !
источник
⍵[⍋⍵]~' '
(сортирует и удаляет пробелы, прежде чем проходить⌸
)'X'/⍨≢
→∊⍕¨×
⍵>0
→×⍵
2⌷⍴
→≢⍉
дважды05AB1E ,
5847 байтовПопробуйте онлайн!
-11 байт благодаря @Emigna
источник
Python 2 , 192 байта
Попробуйте онлайн!
объяснение
Строка 2 вычисляет значения гистограммы довольно простым способом, отбрасывая
' '
.Строка 3 использует хитрость вычислений
ceil(x/5)
как-(-x/5)
: мы округляем максимальную частоту до следующего кратного 5, используя формулу-x/5*-5
. Этоh
.Строка 4 - это цикл, который отсчитывает от
h
нуля до0
включающего, печатая каждую строку:Если
y%5==2>>y
мы напечатаем этикетку. Это когдаy
∈ {1, 5, 10, 15, 20,…}(Эта формула может быть короче. Нам просто нужно что-то 1 или True для {1, 5, 10,…} и 0 или False или даже отрицательное целое число для всех других значений
y
.)Мы выравниваем по правому краю метку (или пробел) в
len(`-h`)
пробелах: это аккуратное однобайтовое сохранениеlen(`h`)+1
!Затем мы печатаем либо
X
пробелы для этой строки (еслиy
≥ 1), либо буквы (еслиy
= 0), пропуская пары ключ-значениеd
в порядке возрастания.источник
'%d-'%y*(y%5==2>>y)
. Вы не возражаете, если я воспользуюсь этим в своем ответе?-~-(y%5*~-y)
тоже работает, но, к сожалению, на один байт длиннее.Древесный уголь , 62 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Создайте список из 27 списков.
Вставьте каждый входной символ в список, соответствующий его позиции в строчном алфавите. Не строчные символы попадают в 27-й список.
Откажитесь от 27-го элемента списка.
Возьмите длины всех элементов списка.
Выведите строчные буквы, соответствующие ненулевым элементам списка.
Выведите ненулевые элементы списка вверх. Поскольку это массив целых чисел, каждое целое число печатается как (теперь вертикальная) строка, каждая в отдельном столбце.
Подсчитайте количество отметок на оси Y и зациклите их.
Рассчитайте положение следующей отметки.
Перейти к следующей отметке.
Напечатайте метку в обратном направлении и обратно, эффективно выровняв ее по правому краю.
источник
Желе , 48 байт
Какое минное поле пройти!
Полная программа распечатывает результат (в виде монадической ссылки она возвращает список, содержащий символы и целые числа из
[0,9]
)Попробуйте онлайн! Или посмотрите набор тестов
Как?
источник
APL (Dyalog Classic) , 56 байт
Попробуйте онлайн!
источник
Рубин ,
250248234188173157153 байтаПопробуйте онлайн!
Благодаря:
-x/5*-5
|[]
источник
Java (JDK 10) , 296 байт
Попробуйте онлайн!
кредиты
источник
--m%5==0
может быть--m%5<1
, потому что у вас также есть&m>0
чек. Аm<=d[a]?"x":" "
может бытьm>d[a]?" ":"x"
.(--m%5<1|m==1)&m>0
на--m%5<1|m==1&&m>0
Pyth, 65 байт
Попробуй здесь
объяснение
источник
JavaScript (Node.js) ,
262256 байт* Спасибо @Shaggy за сокращение на 2 байта
Попробуйте онлайн!
источник
1.
примите ввод как массив отдельных символов,2.
заменитеx!=" "
наx>" "
.3.
Заменитьm=0
наi=m=0
иmap((x,i)=>
сmap(x=>
.Python 2 ,
249224219215205197187188182176 байтПопробуйте онлайн!
Возвращает список списков символов, представляющих строки.
map(list,yticks)
там.y==1
заменено наy<2
.'%d-'%y*(y%5==2>>y)
вместо(`y`+'-')*(not y%5or y<2)
.Слегка разгульный
источник
C # (.NET Core) ,
344340338 + 18 байтВключает 18 байтов для
using System.Linq;
Сохранено 6 байтов благодаря @KevinCruijssen.
Попробуйте онлайн!
источник
j< m;
которое можно удалить. Иint i=0,j
может быть размещен как,i=0,j
после других целых для всего -4 байта. Вы должны будете включить 18 байтов дляusing System.Linq;
однако ..for(;i<t;){string p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(o);for(j=o;j<m;){...}a[i++]=q;}
наfor(string p,q;i<t;)for(p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(j=o);j<m;a[i++]=q){...}
. Попробуйте онлайн.Bash + coreutils,
332324323318312302298296293291 байтПопробуйте онлайн!
Аннотированный:
Спасибо @IanM_Matrix за сохранение 3 байтов.
источник
cat b
может быть<b
сохранение 3 символовC, 201 байт
Ввод берется из командной строки (первый аргумент). Использует восклицательные знаки вместо X для дальнейшего уменьшения размера кода. Счетчик слева всегда состоит из трех символов.
Протестировано с GCC и Clang.
источник
for(p=b[1];*p;p++)
Скорее всего, возможноfor(p=b[1]-1;*++p;)
,main(int a,char **b)
может быть в гольфm(a,b)char**b;
.a!=1
будет логическим,a%5&&a!=1?
должно быть эквивалентноa%5&a!=1?
илиa%5&&~-a
.Excel VBA, 316 байт
Функция анонимного непосредственного окна VBE, которая принимает данные из ячейки
[A1]
и выводит их в непосредственное окно VBE.Безголовая версия
источник
Perl 5
-n
,198168 байтПопробуйте онлайн!
источник
Python 3 , 177 байт
Попробуйте онлайн!
Возможно, это не самый эффективный байтовый подход в Python, но я действительно хотел решить эту проблему с помощью «истинной однострочной» лямбды.
Выводит список списков символов. Злоупотребляет несколькими ведущими символами новой строки и пробелами, как и все остальные. Фактически он может быть дополнительно уменьшен до 174 байтов, если допустимо перенести результат в другой список, чтобы мы могли перенести окончательную
[0]
индексацию в нижний колонтитул.источник
JavaScript (ES8), 200 байт
Принимает ввод как массив символов. Возвращает строку.
Попробуйте онлайн!
комментарии
источник