Порахуйте символів - потроху!


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

Перетворивши це у бінарне, ми отримаємо масив нижче. Перше число (у представництві [є 0 1-е місце, так що одне є ОК. Друге число (яке fмає 1в першій позиції, так що і одне ОК). Продовжуйте так, і ви побачите що код вище дійсний.

C 76543210 Бітове число
- -------- ----------
[0101101 1   0 - Гаразд
f 011001 1 0 1 - Гаразд
] 01011 1 01 2 - Гаразд
- 0010 1 101 3 - Гаразд
x 011 1 1000 4 - ОК
i 01 1 01001 5 - Гаразд
f 0 1 100110 6 - Гаразд
) 0010100 1   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в 2-й позиції (нульове індексування), і цей код не є дійсним.

Тестові приклади:

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.


Це , тому найкоротший код у байтах виграє ref .


6
Щоб допомогти вам трохи, ось символи, яких ви можете використовувати на другомуn%7 місці> pastie.org/pastes/10985263/text
TidB

@TidB веб-сайт офлайн ??
Прут

1
@Rod Так, у Пасті, здається, є деякі проблеми. Спробуйте замість 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 Це не так, як Pyke зазвичай обробляє струни. Якщо це не в порядку, я можу побачити зміну формату введення, але оскільки список символів знаходиться під прийнятим списком за замовчуванням, хоча це може вважатися обманом під цим
Синій

5
Вибачте за те, що ви зламали свій виклик за допомогою 1-байтової вбудованої системи. Я не думаю, що ви насправді вибачте, і виклик не вирішений цим :-)
Луїс Мендо

2
Це не список символів; це список рядків. У той час як списки символів знаходяться на рівні + 17 / -0 , списки рядків знаходяться на + 2 / -2 , тому навряд чи прийнятий за замовчуванням. @StewieGriffin повинен вирішити, чи дійсний він чи ні.
Денніс

1
@StewieGriffin краще?
Блакитний

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

Але тут вихід не настільки чітко упорядкований.


Стек неявно друкується в кінці програми, а вихідний формат є гнучким відповідно до виклику, тому я не бачу жодних проблем із другим підходом
Луїс Мендо

@LuisMendo Я не впевнений. Якщо у вас є 90 різних вхідних символів, то важко буде сказати, який ключ належить до якого символу, тому я думаю, що я повинен сказати "ні" цьому Санчізу. - Стіві Гріффін 2 години тому була відповіддю на запропонований гібрид (рахується індивідуально D'd, Guв кінці програми), і я не впевнений, чи 15-байтна версія є досить різною.
Санчіз

@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 байт . Так, скорочений код все ще буде відповідати вимозі бітового шаблону.

Пс. Я також написав просту перевірку вихідного коду для цього завдання. Давши рядок коду як вхідний, він спочатку повторюватиме цей рядок, а потім надрукує один і той же рядок із кожним символом, заміненим його ( n % 7) -тим ASCII бітом. Якщо другий рядок є всіма, вхід правильний.


1

Желе , 6 байт у кодовій сторінці Jelly

ṢZṢṀŒr

Спробуйте в Інтернеті!

Це функція, яка повертає список пар (символів, лічильників). (Jelly представляє такі списки, як текст, наприклад, якщо вони надсилаються до стандартного виводу шляхом об'єднання елементів, через що ви повинні ставитися до цього як до функції, а не до повної програми. ( Ось та сама програма з деяким кодом, доданим до зателефонуйте на функцію та потім надрукуйте внутрішню структуру на стандартний висновок, довівши, що вихід у однозначному форматі.)

Бінарне представлення та пояснення:

  76543210 

1011011 1    Сортуйте символи вводу
Z 010110 1 0 список (це 1D, тому це ефективно зафіксує його у списку)
Ṣ 10110 1 11 Сортування списку ( , оскільки він містить лише один елемент)
Ṁ 1100 1 000 Візьміть найбільший (тобто єдиний) елемент
Œ 000 1 0011 Перший байт двобайтової команди
r 01 1 10010 Код довжини пробігу

Видно, що другий, третій та четвертий символи скасовують один одного і є лише там, щоб підтримувати потрібний нам біт. ŒrЦе занадто зручно, однак, і прокладка програми, щоб ми могли її використовувати, ймовірно, дає нам коротшу програму, ніж намагання вирішити проблему без вбудованого.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.