ソースコードの文字数


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

書式はこの例と一致する必要があります。オプションの最終改行を除き、無関係な空白は許可されません。

プログラムは、ソースファイルから独自のソースコードを読み取らない場合があります。

リストされている文字は、2つの順序のいずれかでなければなりません。言語で使用されている文字エンコードの文字値の順序(おそらくASCII)、またはソースに表示される文字の順序。

この質問は触発され、このコメント月ドヴォルザーク



1
長さゼロのプログラムは、かなりの数の言語で機能します。これは標準の抜け穴としてカウントされますか?
デジタル外傷

2
一緒に行きましょう...はい。
スパー


1
@ user23013良い質問です。私は改行を考慮しませんでした。あなたがそれらを含めると、文字通りそれらを印刷する答えを受け入れると思うので、ファイルのどこかに二重改行が1つあるでしょう。
スパー

回答:



18

///、12バイト

  4
4 4

 4

@ user23013に感謝します。@ 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}%}_~

使い方

まず、CJamの標準的なクインの1つから始めます

{`"_~"}_~

最初のブロックをスタックにプッシュしてコピーし、コピーを実行します。これにより、最終的にソースコード自体が出力されます。

次に、ソースコードから文字数を計算するロジックを追加します。

{`"_~"+                         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.0b1107の 73バイト

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

すべてを2回書き込む必要がある通常の文字列置換クインではなく、ここにexecクインがあります。


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

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

派手なものは何もありません。プログラムのすべての文字はリテラルリスト(文字列)にあります。周波数も同様です。両方のリストを圧縮して印刷します。出力:

  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で見る/実行する

オリジナル:標準的なクインの戦術であり、Dartの関数名はゴルフをするにはあまりにも長すぎます。

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]文字が文字列に現れる頻度をカウントします。各出現は2回カウントされます。a:" "++show s現在の文字、スペース、文字カウントの文字列を作成します。最後にmapM putStrLnに、リスト内の各文字列を末尾の改行で出力します。

最も困難な部分は、"適切なカウントを取得することでした。just b<-"<code>"を使用すると、文字列に何もないのでゼロ引用符がカウントされます。を使用show"<code>"する"と、文字列の先頭と末尾にa が追加され、カウントが4になります。そのため、コードに2つの追加の引用符を追加する必要があったため、(短い)の代わりにa:' ':show sを使用しましたa:" "++show s

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.