Посчитайте персонажей - по крупицам!

19

Простая часть: учитывая входную строку, содержащую только печатаемые символы ASCII (пробел - тильда), подсчитайте количество вхождений каждого символа и верните результат в любом удобном формате. Результат для строки a%hda7aдолжно быть что - то вроде: a:3, %:1, h:1, 7:1, d:1. Сортировка не нужна, разделители и форматы являются необязательными, но необходимо легко понять, какое число соответствует какому символу. Вы не должны включать символы, которых нет во входной строке ( a:3, b:0, c:0, d:1, ...это не ОК).

Настоящий вызов:

Преобразуйте каждый символ в вашем коде в 8-битное двоичное число (или 16-битное, если вы используете UTF-16 или аналогичный) и перечислите каждый символ, начиная с 0.

Для каждого символа ( iявляется перечислителем), i%7-бит 1 должен быть 1. Биты пронумерованы справа. Все остальные биты могут быть любыми.

Давайте использовать следующий код в качестве примера:

[f]-xif)#f

Преобразовав это в двоичный файл, мы получим массив ниже. Первый номер (представляющий [есть 1в положении 0'th, так что один КИ. Второй номер (представляющий fесть 1в положении 1'st, так что один КИ тоже. Продолжить как это, и вы увидите , что приведенный выше код действителен.

C 76543210 Бит номер
-------- ----------
[0101101 1   0 - OK
f 011001 1 0 1 - ОК
] 01011 1 01 2 - ОК
- 0010 1 101 3 - ОК
х 011 1 1000 4 - ОК
я 01 1 01001 5 - ОК
f 0 1 100110 6 - ОК
) 0010100 10   0 - ОК
# 001000 1 1 1 - ОК
f 01100 1 10 2 - ОК

Если мы изменим код на: ]f[-xif)#fмы получим следующее начало последовательности:

C  76543210  Bit number
-  --------  ----------
]  01011101  0   <- OK
f  01100110  1   <- OK
[  01011011  2   <- Not OK
-  00101101  3   <- OK

Как мы видим, третий символ [не имеет 1второй позиции (с нулевым индексом), и поэтому этот код недействителен.

Тестовые случаи:

Input:
This is a string containing some symbols: ".#!".#&/#

Output:
   !  "  #  &  /  :  T  a  b  c  e  g  h  i  l  m  n  o  r  s  t  y  .
7  1  2  3  1  1  1  1  2  1  1  1  2  1  5  1  2  4  3  1  6  2  1  2

Любой разумный формат вывода в порядке (все, что вам удобнее). Вы можете, например, иметь: :7, !:1, ":2, #:3, &:1, /:1, T:1, a:2 ...или [ ,7][!,1][",2][#,3][&,1].... Вывод осуществляется любым стандартным способом (возврат из функции, вывод на STDOUT и т. Д.)

1i модуль 7.


Это , поэтому самый короткий код в байтах выиграет реф .

Стьюи Гриффин
источник
6
Чтобы помочь вам, вот символы, которые вы можете использовать в этом n%7месте> pastie.org/pastes/10985263/text
TidB
@ TidB сайт не в сети ??
Род
1
@ Род Да, у Пасти, кажется, есть некоторые проблемы. Вместо этого попробуйте pastebin
TidB
1
Помните, что новая строка есть 00001010. Это тоже может быть полезно! :)
Стьюи Гриффин
1
Чтобы получить дополнительную помощь, вот скрипт проверки, который вы можете использовать для кодировок UTF-8. Просто инкапсулируйте ввод в строку, как в примере.
AdmBorkBork

Ответы:

6

Пайк, 1 6 байт

1cn;1c

Попробуй это здесь!

1c     - chunk(size=1, input)
  n;1  - noop. 
     c - count(^)

Половина этого кода просто бездействует ...

00110001 - 1
01100011 - c
01101110 - n
00111011 - ;
00110001 - 1
01100011 - c
синий
источник
@EriktheOutgolfer имеет правильную точку. Я не думаю, что этот формат ввода действителен, если только это не обычная строка в Pyke. Это будет правильная входная строка в MATLAB / Octave 'abc'==['a','b','c'], так как она может быть и в Pyke ...?
Стьюи Гриффин
@StewieGriffin Это не то, как Пайк обычно обрабатывает строки. Если это не в порядке, я могу видеть о переключении формата ввода, но как список символов находится под принятым списком значений по умолчанию, хотя это может считаться обманом при этом
Blue
5
Извините, что сломал ваш вызов с помощью 1-байтового встроенного, я не думаю, что вы на самом деле сожалеете, и вызов не будет нарушен этим :-)
Луис Мендо
2
Это не список персонажей; это список строк. В то время как списки символов находятся в + 17 / -0 , списки строк в + 2 / -2 , так что это вряд ли является принятым по умолчанию. @StewieGriffin должен решить, действительно ли это или нет.
Деннис
1
@StewieGriffin лучше?
Blue
6

Pyth, 12 8 7 байт

-1 байт благодаря @Loovjo

m+d/Qd{
      { # remove all duplicated elements from the (implicit) input
m       # map each element (d) of the parameter (the set from previous operation)
   /Qd  # count the occurrences of d in Q
 +d     # concatenate with d

двоичное представление

0110110 1 м
001010 1 1 +
01100 1 00 д
0010 1 111 /
010 1 0001 Q
01 1 00100 д
0 1 111011 {

Попробуй здесь

прут
источник
Ницца! :) Вывод 13для 111выглядит странно, но его нельзя понять неправильно (не может быть ни одного символа, 13который используется 1 раз), так что это совершенно правильно!
Стьюи Гриффин
4

Befunge-93, 150 байт

={<{p+}3/}*77\%*7{7:\+{}{1g}+3/*77\%*7{7:}=:_{}{}={}{}{v#{}{}`x1:~
}-}=*}{2*}97}:<$}={$_v#}!:-*84g+3/*77\%*7{7:}=:}:}+}1{}<_{@#
}{}{}={}{}{}={^.},\={<

Попробуйте онлайн!

Я начал с того, что написал это как обычную программу Befunge, в которую играл как можно больше. Затем я добавил отступы, чтобы различные символы в программе появлялись только в разрешенных местах. Это заполнение основывалось на том факте, что неподдерживаемые команды игнорируются в Befunge-93, поэтому мне просто нужна была последовательность неиспользуемых символов, биты которых выровнены с требуемыми позициями (последовательность, которую я использовал, была ={}{}{}).

Сложным было то, что различные ветви между строками должны были правильно выстраиваться (например, vстрелка в одной строке должна была бы совпадать со <стрелкой под ней). Это еще более осложнялось тем фактом, что команду bridge ( #) нельзя отделить от соседней стрелки перехода . Первоначально я попытался сгенерировать заполнение программно, но в конце концов это был в основном ручной процесс.

Из-за размера программы я не собираюсь перечислять полный анализ символов, но это пример из начала и конца:

= 00111101 0
{ 01111011 1
< 00111100 2
{ 01111011 3
p 01110000 4
+ 00101011 5
} 01111101 6
3 00110011 0
/ 00101111 1
...
{ 01111011 1
^ 01011110 2
. 00101110 3
} 01111101 4
, 00101100 5
\ 01011100 6
= 00111101 0
{ 01111011 1
< 00111100 2

Разрывы строки обрабатываются как символы новой строки, поэтому они будут либо в положении 1, либо в 3.

Джеймс Холдернесс
источник
3

MATL , 17 байт

u"G91x@=zD91x@uRD

Отображает счетчик, а затем соответствующий символ, разделенный новой строкой. Самая большая трудность - это то, @что есть 0b01000000; Я надеюсь, что смогу найти способ обойтись без него.

Попробуйте онлайн!

Объяснение:

u"  % Implicit input. Take (u)nique characters and loop (") over them.
G   % Take the input a(G)ain
91x % Filler: push 91, delete immediately.
@   % Push current character of loop
=   % Check for equality with earlier G
z   % Count number of equal characters
D   % Display
91x % More filler!
@   % Get loop character again
uR  % Filler: two NOPs for the single-character @
D   % Display. Implicitly end loop.

MATL, 15 байт (сомнительный вывод)

Если разрешено просто оставлять два вектора строк в стеке (поведение, подобное функциональному, как в этом посте Meta), мы можем перейти к

u"G91x@=zv]v!Gu

Но здесь вывод не совсем аккуратно упорядочен.

Sanchises
источник
Стек печатается неявно в конце программы, и выходной формат является гибким в соответствии с задачей, поэтому я не вижу никаких проблем со вторым подходом
Луис Мендо
@ LuisMendo Я не уверен. Если у вас есть 90 различных вводимых символов, то будет трудно определить, какая клавиша принадлежит какому символу, поэтому я думаю, что должен сказать «нет» этому Sanchises. - Стьюи Гриффин 2 часа назад был ответом на предложенный гибрид (считается в отдельности Dd Guв конце программы), и я не уверен, достаточно ли отличается 15-байтовая версия.
Sanchises
@StewieGriffin Не могли бы вы увидеть, если 15-байтовая версия ( попробуйте онлайн! ) В порядке или нет?
Санчизес
Не уверен, что Стьюи получит пинг на этом посте, лучше используйте контрольный пост
Луис Мендо,
Не знаю как вы, но я не думаю, что это легко понять здесь :) Я предпочитаю 17-байтовое решение, но не стесняйтесь оставить 15-байтовое в ответе! Хороший ответ кстати :)
Стьюи Гриффин
1

CJam, 14 байтов

q__|_ @sfe=]zp

Попробуй это здесь.

Пробел перед @и sпосле него вставляются символы-заполнители, чтобы коды ASCII соответствовали требуемому шаблону: пробел ничего не делает, а метод sпросто преобразует строку в строку. Кроме этого, это довольно простая и понятная реализация задачи:

q_ "прочитать ввод и скопировать его";
  _ | «свернуть повторяющиеся символы в копии»;
    _ "сохранить копию свернутой строки";
      @ "вытянуть исходную строку ввода на вершину стека";
       s "(здесь ничего не делает)";
        fe = "для каждого символа в свернутой строке считать ...";
                 "... сколько раз встречается в исходной строке";
           ] z "объединить счет с сохраненной копией свернутой строки";
             p «вывести строковое представление результата»;

Для ввода foobar123этот код выводит [['f 1] ['o 2] ['b 1] ['a 1] ['r 1] ['1 2] ['2 2] ['3 1]]. Если просто печатать счетчики в одной строке и соответствующие символы в другой, как в:

[1 2 1 1 1 2 2 1]
fobar123

считается приемлемым выходным форматом, тогда он ]zможет быть опущен, чтобы сохранить два байта, всего 12 байтов . Да, сокращенный код все равно будет соответствовать требованию битового шаблона.

Ps. Я также написал простую программу проверки исходного кода для этой задачи. Учитывая строку кода в качестве входных данных, он сначала отобразит эту строку, а затем напечатает ту же строку с каждым символом, замененным его ( n % 7) -ым битом ASCII. Если вторая строка - все единицы, ввод действителен.

Илмари Каронен
источник
1

Желе , 6 байтов в кодовой странице желе

ṢZṢṀŒr

Попробуйте онлайн!

Это функция, которая возвращает список пар (символ, количество). (Jelly представляет такие списки в виде текста, например, если они отправляются на стандартный вывод, объединяя элементы, поэтому вы должны рассматривать это как функцию, а не как целую программу. ( Вот та же программа с некоторым кодом, добавленным к вызовите функцию, а затем напечатайте внутреннюю структуру в стандартный вывод, доказав, что вывод в однозначном формате.)

Двоичное представление и объяснение:

  76543210 

Ṣ 1011011 1    Сортировка символов ввода
Z 010110 1 0 Транспонировать список (это 1D, так что это эффективно оборачивает его в список)
10 10110 1 11 Сортировать список (нет, так как в нем только один элемент)
00 1100 1 000 Возьмите самый большой (т.е. единственный) элемент1 
000 1 0011 Первый байт двухбайтовой команды
r 01 1 10010 Кодирование длин серий

Можно видеть, что второй, третий и четвертый символы взаимно компенсируют друг друга и присутствуют только для поддержания необходимого нам набора битов. Œrэто слишком удобно, и заполнение программы, чтобы мы могли ее использовать, вероятно, дает нам более короткую программу, чем попытка решить проблему без встроенной функции.


источник