Кількість символів у вихідному коді


12

Напишіть програму, яка виводить список кількості подій кожного унікального символу у його вихідному коді.

Наприклад, ця гіпотетична програма {Source_Print_1};повинна отримати такий результат:

; 1
P 1
S 1
_ 2
c 1
e 1
i 1
n 1
o 1
p 1
r 2
t 1
u 1
{ 1
} 1

Форматування має відповідати цьому прикладу. Не допускається сторонні пробіли, крім необов'язкового остаточного рядка.

Ваша програма може не читати власний вихідний код із вихідного файлу.

Перераховані символи повинні бути в одному з двох порядків. Або порядок значень символів у кодуванні символів, який використовується вашою мовою (можливо, ASCII), або порядок, який символи відображаються у вашому джерелі.

Це питання надихнув цей коментар по Jan Dvorak .



1
Програма з нульовою довжиною працювала б зовсім декількома мовами. Чи вважається це стандартною лазівкою ?
Цифрова травма

2
Поїдемо з ... так.
Спарр


1
@ user23013 гарне запитання. Я не розглядав нові рядки. Я думаю, якщо ви їх включите, я би прийняв відповідь, яка виводить їх буквально, тож у файлі десь буде один подвійний рядок.
Спарр

Відповіді:


7

CJam, 14 байт

{S2N`/}`{S2N}/

Спробуйте тут .

Вихід є в тому порядку, в якому вони з'являються спочатку:

{ 2
S 2
2 2
N 2
` 2
/ 2
} 2

Він просто додається <SP>2<NL>до кожного персонажа в {S2N`/}.


18

/// , 12 байт

  4
4 4

 4

Велике спасибі тобі користувачеві @ user23013, який запропонував це вдосконалення в порівнянні з моїм кодом CJam, перевершивши свою власну, найкращу відповідь у процесі.

Персонажі сортуються за зовнішнім виглядом. Цей код працює будь-якою мовою, яка просто виводить власний вихідний код за даних обставин (PHP, ASP тощо).


CJam, 20 байт

''S5N'5S5N'NS5N'SS5N

Цей підхід не використовує будь-якого вбудованого підрахунку символів.

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

''S5N e# Push a single quote, a space, the integer 5 and a linefeed.
'5S5N e# Push the character 5, a space, the integer 5 and a linefeed.
'NS5N e# Push the character N, a space, the integer 5 and a linefeed.
'SS5N e# Push the character S, a space, the integer 5 and a linefeed.

5
+1 за те, що не використовуються стандартні методики квіни.
Мартін Ендер

Я дуже сподіваюся, що цей залишається прив'язаним до ведучого. Я із задоволенням віддам його галочкою на його квочку.
Спарр

Тепер дозволені нові рядки. Я думаю, що цю відповідь слід краще об'єднати у вашу.
jimmy23013

@ user23013: Це навіть коротше, ніж ваша відповідь CJam. Дякую!
Денніс

9

CJam, 20 байт

{`"_~"+$e`{)S@N}%}_~

Як це працює

Ми спочатку починаємо з однієї зі стандартних quine в CJam

{`"_~"}_~

який натискає перший блок на стек, копіює його і запускає копію, завдяки чому він остаточно сам надрукує вихідний код.

Потім ми додаємо логіку для обчислення кількості символів з вихідного коду:

{`"_~"+                         e# At this point, we have the full source code with us
       $e`                      e# Sort to get similar characters together and run RLE to
                                e# get count of each character as [count char] array
          {    }%               e# Run each array element through this loop
           )S@N                 e# Pop the character, put a space, rotate the count after
                                e# space and then finally put a newline after the trio
                 }_~            e# Second half of the standard quine explained above

Спробуйте його онлайн тут


4

Python 3.5.0b1 , 107 73 байт

s="t='s=%r;exec(s)'%s;[print(c,t.count(c))for c in sorted({*t})]";exec(s)

Замість звичайної заміни рядка quine, яка вимагає написати все двічі, ось execлайка.


3

Математика, 101 байт

Apply[Print[#1, " ", #2] &, Tally[Characters[StringJoin[ToString[#0, InputForm], "[];"]]], {1}] & [];

На жаль, я не можу використовувати будь-якого зі звичайних трюків в гольфі , як видалення пробілів, <>для StringJoin, #замість того #1, @для викликів функцій префікса або @@@замість Apply[...,{1}], тому що ToString[...,InputForm]думає , що він повинен досить роздрукувати всі ...

Це друкує символи в тому порядку, в якому вони вперше з'являються в коді. Якщо я можу припустити, що це не запускається у середовищі REPL (що досить незвично для Mathematica), я можу зберегти два байти, опустивши два ;.


InputFormдратує ... OutputFormкраще, але в ньому не цитуються рядки.
LegionMammal978

2

Haskell, 178 байт

main=putStr(unlines[s:' ':show t|(s,t)<-zip" \"'(),-0123456789:<=S[\\]aehilmnoprstuwz|"[3,3,3,3,3,41,4,1,6,19,12,5,5,2,2,2,2,3,2,2,2,3,3,3,2,2,2,4,2,2,4,2,3,2,5,5,3,2,2,2]])--178

Нічого фантазійного. Усі символи програми знаходяться в прямому списку (String). Так само і частоти. Зіпсуйте обидва списки та друкуйте. Вихід:

  3
" 3
' 3
( 3
) 3
, 41
- 4
0 1
1 6
2 19
3 12
4 5
5 5
6 2
7 2
8 2
9 2
: 3
< 2
= 2
S 2
[ 3
\ 3
] 3
a 2
e 2
h 2
i 4
l 2
m 2
n 4
o 2
p 3
r 2
s 5
t 5
u 3
w 2
z 2
| 2 

1

Дартс - 214 127

Пряма версія:

main(){print("  22\n\" 3\n( 3\n) 3\n1 3\n2 15\n3 8\n4 1\n5 2\n8 2\n; 2\n\\ 23\na 2\ni 3\nm 2\nn 23\np 2\nr 2\nt 2\n{ 2\n} 2");}

Значення "4" - це просто нескінченний фактор для підрахунку чисел. Побачити / запустити на DartPad .

Оригінал: Стандартна тактика квоти, а назви функцій Дарт трохи занадто довгі для хорошого гольфу.

main({m,v,q:r'''main({m,v,q:r''}'')''{m={};for(v in q.split(''))m[v]=m[v]==null?2:m[v]+2;m.forEach((k,v)=>print("$k $v"));}'''}){m={};for(v in q.split(''))m[v]=m[v]==null?2:m[v]+2;m.forEach((k,v)=>print("$k $v"));}

Подивіться / запустіть його на DartPad .


0

Haskell , 146 байт

main=mapM putStrLn[a:" "++show s|a<-[' '..],s<-[sum[2|b<-show"main=mapM putStrLn[a: ++show s|a<-[' '..],s<-[sum[2|b<-show,a==b]],s>0]",a==b]],s>0]

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

Вихід:

  8
" 4
' 4
+ 4
, 6
- 6
. 4
0 2
2 2
: 2
< 6
= 6
> 2
L 2
M 2
S 2
[ 8
] 8
a 10
b 4
h 4
i 2
m 6
n 4
o 4
p 4
r 2
s 12
t 4
u 4
w 4
| 4

(Плюс додатковий новий рядок)

Пояснення:

Код є

main=mapM putStrLn[a:" "++show s|a<-[' '..],s<-[sum[2|b<-show"<code>",a==b]],s>0]

де "<code>"рядок програмного коду без ".

aпроходить через символи ascii, починаючи з пробілу. sum[2|b<-show"<code>",a==b]підраховує, як часто символ з'являється в рядку, причому кожне виникнення рахується двічі. a:" "++show sбудує рядок поточного символу, пробіл та кількість символів. Нарешті mapM putStrLnдрукує кожну рядок у списку з останнім рядком.

Найважчим було отримати "правильний підрахунок . Використання просто b<-"<code>"підрахувало б нульові лапки, оскільки в рядку немає жодного. Використовуючи show"<code>"додавання a "в передній частині та в кінці рядка, в результаті чого рахується чотири. Тому мені довелося поставити два додаткових лапки в коді, тому замість (коротшого) a:' ':show sя використовував a:" "++show s.

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