Karakter diperhitungkan dalam kode sumber

12

Tulis program yang menampilkan daftar jumlah kemunculan setiap karakter unik dalam kode sumbernya.

Misalnya, program hipotetis ini {Source_Print_1};harus menghasilkan keluaran ini:

; 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

Format harus sesuai dengan contoh ini. Tidak ada spasi kosong yang diizinkan, kecuali baris akhir final opsional.

Program Anda mungkin tidak membaca kode sumbernya sendiri dari file sumber.

Karakter yang tercantum harus dalam salah satu dari dua pesanan. Entah urutan nilai karakter dalam pengkodean karakter yang digunakan oleh bahasa Anda (mungkin ASCII), atau urutan karakter muncul di sumber Anda.

Pertanyaan ini terinspirasi oleh komentar ini oleh Jan Dvorak .

Sparr
sumber
1
Program nol panjang akan berfungsi dalam beberapa bahasa. Apakah ini dianggap sebagai celah standar ?
Trauma Digital
2
Ayo pergi dengan ... ya.
Sparr
@DigitalTrauma: Ditambahkan ke daftar.
Dennis
1
@ user23013 pertanyaan bagus. Saya tidak mempertimbangkan baris baru. Saya kira jika Anda memasukkannya, saya akan menerima jawaban yang mencetaknya secara literal, sehingga akan ada satu baris baru dalam file di suatu tempat.
Sparr

Jawaban:

7

CJam, 14 byte

{S2N`/}`{S2N}/

Coba di sini .

Output dalam urutan pertama kali muncul:

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

Ini hanya ditambahkan <SP>2<NL>ke setiap karakter dalam {S2N`/}.

jimmy23013
sumber
18

/// , 12 byte

  4
4 4

 4

Terima kasih banyak kepada @ user23013, yang menyarankan perbaikan ini atas kode CJam saya, mengungguli jawabannya sendiri, skor tertinggi dalam proses.

Karakter diurutkan berdasarkan penampilan. Kode ini berfungsi dalam bahasa apa pun yang hanya mencetak kode sumbernya sendiri dalam keadaan tertentu (PHP, ASP, dll.).


CJam, 20 byte

''S5N'5S5N'NS5N'SS5N

Pendekatan ini tidak menggunakan penghitungan karakter bawaan.

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

''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.
Dennis
sumber
5
+1 karena tidak menggunakan teknik quine standar.
Martin Ender
Saya benar-benar berharap yang satu ini tetap terikat untuk memimpin. Saya akan dengan senang hati memberikannya tanda centang di atas mitra quine-nya.
Sparr
Sekarang baris baru diizinkan. Saya pikir jawaban ini harus lebih baik digabungkan menjadi milik Anda.
jimmy23013
@ user23013: Itu bahkan lebih pendek dari jawaban CJam Anda. Terima kasih!
Dennis
9

CJam, 20 byte

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

Bagaimana itu bekerja

Kami pertama kali memulai dengan salah satu quine standar di CJam

{`"_~"}_~

yang mendorong blok pertama pada tumpukan, menyalinnya, dan menjalankan salinan, yang membuatnya mencetak kode sumber itu sendiri akhirnya.

Kemudian kami menambahkan logika untuk menghitung jumlah karakter dari kode sumber:

{`"_~"+                         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

Cobalah online di sini

Pengoptimal
sumber
4

Python 3.5.0b1 , 107 73 byte

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

Alih-alih quine pengganti string biasa, yang membutuhkan penulisan semuanya dua kali, inilah execquine.

Sp3000
sumber
3

Mathematica, 101 byte

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

Sayangnya, saya tidak dapat menggunakan salah satu trik golf normal seperti menghapus spasi, <>untuk StringJoin, #alih-alih #1, @untuk panggilan fungsi awalan atau @@@alih-alih Apply[...,{1}], karena ToString[...,InputForm]berpikir itu harus cukup mencetak semuanya ...

Ini mencetak karakter dalam urutan pertama kali muncul dalam kode. Jika saya dapat berasumsi bahwa ini tidak berjalan di lingkungan REPL (yang agak tidak biasa untuk Mathematica) saya dapat menyimpan dua byte dengan menghilangkan keduanya ;.

Martin Ender
sumber
InputFormmenjengkelkan ... OutputFormlebih baik tetapi tidak mengutip string.
LegionMammal978
2

Haskell, 178 byte

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

Tidak ada yang mewah. Semua karakter program ada dalam daftar literal (String). Begitu juga frekuensinya. Zip kedua daftar dan cetak. Keluaran:

  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 
nimi
sumber
1

Dart - 214 127

Versi langsung:

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" hanyalah faktor biola untuk membuat angka bertambah. Lihat / jalankan di DartPad .

Asli: Taktik quine standar, dan nama fungsi Dart agak terlalu panjang untuk bermain golf yang baik.

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"));}

Lihat / jalankan di DartPad .

Tuan
sumber
0

Haskell , 146 byte

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]

Cobalah online!

Keluaran:

  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

(Ditambah baris baru tambahan)

Penjelasan:

Kodenya adalah

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

di mana "<code>"string dari kode program tanpa ".

amelewati karakter ascii dimulai dengan spasi. sum[2|b<-show"<code>",a==b]menghitung seberapa sering karakter muncul dalam string, dengan setiap kemunculan dihitung dua kali. a:" "++show smembangun string karakter saat ini, spasi dan jumlah karakter. Akhirnya mapM putStrLnmencetak setiap string dalam daftar dengan baris baru.

Bagian tersulit adalah menghitung dengan "benar. Hanya menggunakan b<-"<code>"akan menghitung tanda kutip nol karena tidak ada dalam string. Menggunakan show"<code>"menambahkan a "ke depan dan mengakhiri ke string, menghasilkan hitungan empat. Jadi saya harus meletakkan dua tanda kutip tambahan dalam kode, jadi alih-alih (lebih pendek) a:' ':show ssaya gunakan a:" "++show s.

Laikoni
sumber