소스 코드의 문자 수


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
길이가 0 인 프로그램은 몇 가지 언어로 작동합니다. 이것은 표준 허점으로 간주됩니까 ?
Digital Trauma

2
같이 갑시다 ... 그렇습니다.
Sparr


1
@ user23013 좋은 질문입니다. 나는 줄 바꿈을 고려하지 않았습니다. 당신이 그것들을 포함 시키면 문자 그대로 출력하는 대답을 받아 들일 것입니다. 그래서 파일에 이중 줄 바꿈이 하나 있습니다.
Sparr

답변:


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
표준 quine 기술을 사용하지 않는 경우 +1
Martin Ender

정말이 리드에 묶여 남아 있기를 정말로 바랍니다. 기쁜 대응에 체크 표시를 드리겠습니다.
Sparr

이제 개행이 허용됩니다. 이 답변 이 귀하의 답변에 더 잘 통합되어야 한다고 생각 합니다.
jimmy23013 2016 년

@ user23013 : CJam 답변보다 짧습니다. 감사!
Dennis

9

CJam, 20 바이트

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

작동 원리

우리는 먼저 CJam의 표준 quine 중 하나부터 시작합니다.

{`"_~"}_~

스택의 첫 번째 블록을 푸시하고 복사 한 다음 사본을 실행하여 소스 코드 자체를 최종적으로 인쇄합니다.

그런 다음 소스 코드에서 문자 수를 계산하는 논리를 추가합니다.

{`"_~"+                         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 대신 execquine이 있습니다.


3

Mathematica, 101 바이트

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

불행히도, 난, 공백을 제거 같은 일반 골프 트릭 중 하나를 사용할 수없는 <>위해 StringJoin, #대신 #1, @접두사 함수 호출 또는 @@@대신 Apply[...,{1}]하기 때문에, ToString[...,InputForm]꽤 인쇄 모든 것을 가지고 생각 ...

코드에 처음 나타나는 순서대로 문자를 인쇄합니다. 이것이 REPL 환경에서 실행 되지 않는다고 가정 할 수 있다면 (Mathematica에게는 다소 드문 경우) 2를 생략하여 2 바이트를 절약 할 수 있습니다 ;.


InputForm성가신 ... OutputForm더 나은하지만 문자열을 인용하지 않습니다.
LegionMammal978

2

하스켈, 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

멋진 것은 없습니다. 프로그램의 모든 문자는 리터럴 목록 (문자열)에 있습니다. 주파수도 마찬가지입니다. 목록을 모두 압축하여 인쇄하십시오. 산출:

  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

하스켈 , 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공백으로 시작하는 아스키 문자를 통과합니다. sum[2|b<-show"<code>",a==b]문자열에 문자가 나타나는 빈도를 계산하고 각 항목은 두 번 계산됩니다. a:" "++show s현재 문자, 공백 및 문자 수의 문자열을 작성합니다. 마지막으로 mapM putStrLn후행 줄 바꿈으로 목록의 각 문자열을 인쇄합니다.

가장 어려운 부분은 "권리 의 수를 얻는 것이 었 습니다. b<-"<code>"문자열에 아무것도 없기 때문에 그냥 사용하면 따옴표가 없습니다. 사용 show"<code>"를 더해 "4 인 계산의 결과로, 스트링의 앞 끝. 그래서 코드에 두 개의 따옴표를 추가해야했기 때문에 (짧은) 대신 a:' ':show s사용했습니다 a:" "++show s.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.