Số ký tự trong mã nguồn


12

Viết chương trình đưa ra danh sách số lần xuất hiện của mỗi ký tự duy nhất trong mã nguồn của nó.

Ví dụ, chương trình giả thuyết này {Source_Print_1};sẽ tạo ra kết quả này:

; 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

Các định dạng phải phù hợp với ví dụ này. Không có khoảng trắng bên ngoài được cho phép, ngoại trừ một dòng mới cuối cùng tùy chọn.

Chương trình của bạn có thể không đọc mã nguồn của chính nó từ tệp nguồn.

Các nhân vật được liệt kê phải ở một trong hai đơn đặt hàng. Thứ tự của các giá trị ký tự trong mã hóa ký tự được sử dụng bởi ngôn ngữ của bạn (có thể là ASCII) hoặc thứ tự các ký tự xuất hiện trong nguồn của bạn.

Câu hỏi này lấy cảm hứng từ nhận xét này của Jan Dvorak .



1
Một chương trình có độ dài bằng không sẽ hoạt động với khá nhiều ngôn ngữ. Điều này có được tính là một lỗ hổng tiêu chuẩn ?
Chấn thương kỹ thuật số

2
Hãy đi với ... có.
Sparr


1
@ user23013 câu hỏi hay. Tôi đã không xem xét các dòng mới. Tôi đoán nếu bạn bao gồm chúng, tôi sẽ chấp nhận một câu trả lời in chúng ra theo nghĩa đen, vì vậy sẽ có một dòng mới trong tập tin ở đâu đó.
Sparr

Câu trả lời:



18

/// , 12 byte

  4
4 4

 4

Xin chân thành cảm ơn tới @ user23013, người đã đề xuất cải tiến này qua mã CJam của tôi, vượt xa câu trả lời có điểm cao nhất của chính anh ấy trong quá trình này.

Các nhân vật được sắp xếp theo ngoại hình. Mã này hoạt động trong bất kỳ ngôn ngữ nào chỉ in mã nguồn của chính nó trong các trường hợp cụ thể (PHP, ASP, v.v.).


CJam, 20 byte

''S5N'5S5N'NS5N'SS5N

Cách tiếp cận này không sử dụng bất kỳ tính cách tích hợp nào.

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

''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 vì không sử dụng các kỹ thuật quine tiêu chuẩn.
Martin Ender

Tôi thực sự thực sự hy vọng điều này vẫn còn gắn liền với vai chính. Tôi sẽ vui vẻ cho nó đánh dấu trên bản sao của nó.
Sparr

Bây giờ các dòng mới được cho phép. Tôi nghĩ rằng câu trả lời này nên được sáp nhập tốt hơn vào của bạn.
jimmy23013

@ user23013: Điều đó thậm chí còn ngắn hơn câu trả lời của bạn. Cảm ơn!
Dennis

9

CJam, 20 byte

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

Làm thế nào nó hoạt động

Trước tiên, chúng tôi bắt đầu với một trong những tiêu chuẩn trong CJam

{`"_~"}_~

trong đó đẩy khối đầu tiên lên ngăn xếp, sao chép nó và chạy bản sao, điều này làm cho nó tự in mã nguồn cuối cùng.

Sau đó, chúng tôi thêm logic để tính số ký tự từ mã nguồn:

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

Dùng thử trực tuyến tại đây


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)

Thay vì quine thay thế chuỗi thông thường, yêu cầu viết mọi thứ hai lần, đây là một execquine.


3

Toán học, 101 byte

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

Thật không may, tôi không thể sử dụng bất kỳ thủ đoạn chơi golf bình thường như loại bỏ khoảng trắng, <>cho StringJoin, #thay vì #1, @cho các cuộc gọi chức năng tiền tố hoặc @@@thay vì Apply[...,{1}], bởi vìToString[...,InputForm] nghĩ rằng nó phải khá in tất cả mọi thứ ...

Điều này in các ký tự theo thứ tự chúng xuất hiện đầu tiên trong mã. Nếu tôi có thể cho rằng điều này không chạy trong môi trường REPL (điều này khá bất thường đối với Mathicala), tôi có thể lưu hai byte bằng cách bỏ qua hai byte ;.


InputFormlà khó chịu ... OutputFormlà tốt hơn nhưng nó không trích dẫn chuỗi.
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

Không có gì lạ mắt. Tất cả các ký tự của chương trình nằm trong một danh sách bằng chữ (Chuỗi). Các tần số cũng vậy. Zip cả danh sách và in. Đầu ra:

  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

Phi tiêu - 214 127

Phiên bản trực tiếp:

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" chỉ là một yếu tố khó hiểu để làm cho các số cộng lại. Xem / chạy trên DartPad .

Bản gốc: Chiến thuật quine tiêu chuẩn và tên chức năng của Dart hơi dài để chơi golf tốt.

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

Xem / chạy nó trên DartPad .


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]

Hãy thử trực tuyến!

Đầu ra:

  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

(Cộng với một dòng mới bổ sung)

Giải trình:

Mã là

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

trong đó "<code>"một chuỗi mã chương trình không có ".

ađi qua các ký tự ascii bắt đầu bằng một khoảng trắng. sum[2|b<-show"<code>",a==b]đếm tần suất xuất hiện của ký tự trong chuỗi, với mỗi lần xuất hiện được tính hai lần. a:" "++show sxây dựng một chuỗi ký tự hiện tại, khoảng trắng và số ký tự. Cuối cùng mapM putStrLnin từng chuỗi trong danh sách với một dòng mới.

Phần khó nhất là tính "đúng. Chỉ sử dụng b<-"<code>"sẽ tính không dấu ngoặc kép vì không có dấu ngoặc trong chuỗi. Sử dụng show"<code>"thêm một "vào phía trước và kết thúc chuỗi, dẫn đến số lượng bốn. Vì vậy, tôi đã phải đặt hai dấu ngoặc kép bổ sung trong mã, vì vậy thay vì (ngắn hơn) a:' ':show stôi đã sử dụng a:" "++show s.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.