プログラムのバイト数を数える


21

注2:@DigitalTrauma6バイトの長い回答を受け入れました。誰かがそれを打つことができるなら、私は受け入れられた答えを変えます。遊んでくれてありがとう!

注:10/14/15の午後6時(MST)に回答を受け付けます。参加したすべての人に感謝します!

これがまだ質問されていないことに非常に驚いています(または、十分に検索しませんでした)。いずれにしても、この課題は非常に簡単です。

入力:文字列形式のプログラム。さらに、入力には以下が含まれる場合と含まれない場合があります。

  • 先頭と末尾のスペース
  • 末尾の改行
  • 非ASCII文字

出力: 2つの整数、1つはUTF-8文字カウントを表し、もう1つはバイトカウントを表します。どの順序を選択してもかまいません。末尾の改行が許可されます。出力は、STDOUTに送信することも、関数から返すこともできます。2つの数値が互いに区別できる限り、ITはどの形式でもかまいません(2327は有効な出力ではありません)。

ノート:

サンプルI / O:( すべての出力はの形式です{characters} {bytes}

入力: void p(int n){System.out.print(n+5);}

出力: 37 37

入力: (~R∊R∘.×R)/R←1↓ιR

出力: 17 27

入力:


friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
    print "iteration {iteration} is {name}".format(iteration=i, name=name)

出力: 156 156

これはコードゴルフです- バイト単位の最短コードが勝ちます!

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=60733,OVERRIDE_USER=36670;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


出力スペースで区切る必要がありますか?
マルティセン

いいえ、数字が互いに区別できる限り、どの形式でも
かまい

解釈に応じて、同じバイト値を生成する2つの他の文字に分割できるUTF-8文字はありませんか?それではそれらをどのように数えますか?
パトリックロバーツ

正直なところ、私はあなたが何を意味するのか分かりません。したがって、必要に応じてカウントしてください。
GamrCorps

@GamrCorps UTF-8文字には非ASCII文字が含まれます。これは基本的に1バイトでは表現できない文字ですが、2バイトまたは4バイトで表現する必要があります。プログラムによる文字の読み取り方法に応じて、バイトストリームの解釈方法を選択するのはプログラム次第です。たとえば、2バイトのUTF-8は、2つの連続したASCII文字として解釈できます。各ASCII文字は、元の目的の文字を構成する2バイトで表されます。
パトリックロバーツ

回答:


32

シェル+ coreutils、6

UTF-8以外のエンコーディングが使用されている場合、この回答は無効になります。

wc -mc

テスト出力:

$ printf '%s' "(~R∊R∘.×R)/R←1↓ιR" | ./count.sh 
     17      27
$ 

出力形式が厳密に適用されている場合(2つの整数を区切るスペースが1つだけ)、これを行うことができます。

シェル+ coreutils、12

echo`wc -mc`

の後にスペースを削除することを提案してくれた@immibisに感謝しechoます。シェルがこれをecho<tab>n<tab>mに展開し、デフォルトではタブがin $IFSになるため、結果のコマンドで完全に有効なトークンセパレーターになります。


13
間違いなく仕事に最適なツール。
アレックスA.

1
「エコー」の後にスペースを削除できますか?
user253751

@immibisはい-いいね-すぐにそれがどのように機能するかわかりませんでした。
デジタル外傷

21

GolfScript、14 12バイト

.,p{64/2^},,

Web GolfScriptでオンラインで試してください。

アイディア

GolfScriptには、Unicodeが何であるかについての手がかりがありません。すべての文字列(入力、出力、内部)はバイトで構成されます。それはかなり面倒ですが、この課題には最適です。

UTF-8は、ASCII文字と非ASCII文字を異なる方法でエンコードします。

  • 128未満のすべてのコードポイントはとしてエンコードされ0xxxxxxxます。

  • 他のすべてのコードポイントはとしてエンコードされ11xxxxxx 10xxxxxx ... 10xxxxxxます。

つまり、各Unicode文字のエンコードには、シングル0xxxxxxxバイトまたはシングル11xxxxxxバイト(および0〜5 10xxxxxxバイト)のいずれかが含まれます。

入力のすべてのバイトを分割することにより64、我々はオン0xxxxxxx0又は111xxxxxx3、及び10xxxxxx2。残っているのは、商が2でないバイトをカウントすることです。

コード

                (implicit) Read all input and push it on the stack.
.               Push a copy of the input.
 ,              Compute its length (in bytes).
  p             Print the length.
   {     },     Filter; for each byte in the original input:
    64/           Divide the byte by 64.
       2^         XOR the quotient with 2.
                If the return is non-zero, keep the byte.
           ,    Count the kept bytes.
                (implicit) Print the integer on the stack.

9

Python、42 40バイト

lambda i:[len(i),len(i.encode('utf-8'))]

Alex A.に2バイトの情報を提供してくれてありがとう。

わかりやすい、それは言うことを行います。引数を指定するとi、の長さを出力しi、次にiUTF-8の長さを出力します。複数行の入力を受け入れるには、関数の引数を三重引用符で囲む必要があることに注意してください'''

編集:複数行入力では機能しなかったので、代わりに関数にしました。

いくつかのテストケース(空白の改行で区切られています):

f("Hello, World!")
13 13

f('''
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
    print "iteration {iteration} is {name}".format(iteration=i, name=name)
''')
156 156

f("(~R∊R∘.×R)/R←1↓ιR")
17 27

そして、ここでずっと、私は吸盤のようにlen()だけを使用しています。これは明らかに優れています。
ステータス

3
関数から出力を返すことができるため、これを作成することで数バイト節約できますlambda i:[len(i),len(i.encode('utf-8'))]
アレックスA.

@AlexA。よし、変わります。前にラムダに触れたことはありません。
The_Basset_Hound

1
ラムダが正しく形成されていません。定義を与えると、になりf=lambda i:[len(i),len(i.encode('utf-8'))]ますが、匿名のラムダ関数を使用しているため、単にである必要がありますlambda i:[len(i),len(i.encode('utf-8'))]
ケード

1
U8代わりにutf-8数バイトを節約できます。
メゴ

5

ジュリア、24バイト

s->(length(s),sizeof(s))

これにより、整数のタプルを返すラムダ関数が作成されます。このlength関数は、文字列で呼び出されると、文字数を返します。このsizeof関数は、入力のバイト数を返します。

オンラインで試す


4

さび、42バイト

let c=|a:&str|(a.chars().count(),a.len());

3

Pyth- 12 9バイト

短くしようとします。

lQh/l.BQ8

テストスイート


これは、UTF-8バイトカウントに対してバイトを与えすぎます。それは現在floor(… / 8) + 1、はずですceil(… / 8)
-PurkkaKoodari

これにより、でバグを発見できました.B。また、lQlc.BQ8 1バイトの保存中に@ Pietu1998が言及したバグを修正します。
isaacg

3

Java、 241 90 89バイト

int[]b(String s)throws Exception{return new int[]{s.length(),s.getBytes("utf8").length};}

Javaを100バイト未満にしたことが大好きです。
GamrCorps

まあ、それは単なる方法です
...-SuperJedi224

1
あなたは、変更される可能性getBytes("UTF-8")getBytes("utf8")。そして、なぜthrows Exceptionですか?
RAnders00

UnsupportedEncodingException無効なエンコーディング名を指定するとgetBytesがスローされるためです。
SuperJedi224



2

R、47バイト

a<-commandArgs(TRUE);nchar(a,"c");nchar(a,"b")

入力: (~R∊R∘.×R)/R←1↓ιR

出力:

[1] 17
[2] 27

出力と一緒に行番号を印刷することが「任意の形式」で許可されない場合、 cat、問題を修正できます。

R、52バイト

a<-commandArgs(TRUE);cat(nchar(a,"c"),nchar(a,"b"))

入力: (~R∊R∘.×R)/R←1↓ιR

出力: 17 27


関数として、39バイト:function(s)c(nchar(s,"c"),nchar(s,"b"))
アレックスA.

1
また、単にいくつかの一般的なRのゴルフのヒント:あなたが使用できるTの代わりにTRUE=の代わりに<-、入力から来ることができるscanreadlineまたはfunctionより短いすべてが、commandArgs
アレックスA.

1

天の川1.6.2、7バイト(非競合)

':y!^P!

説明

'        ` read input from the command line
 :       ` duplicate the TOS
  y      ` push the length of the TOS
   !  !  ` output the TOS
    ^    ` pop the TOS
     P   ` push the length of the TOS in bytes

使用法

./mw <path-to-code> -i <input>

チャレンジが言語に先立っているため、これを非競合とマークしました。
メゴ


1

Brainfuck、163バイト

,[>+<,]>[>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++++[<++++++>-]>[<<+>>-]>[<<+>>-]<<]>]<[->>++++++++[<++++++>-]]<[.[-]<]<

読みやすくするために改行あり:

,[>+<,]>
[>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[
>++++++++++<[->-[>+>>]>[+[-<+>]>.
+>>]<<<<<]>[-]++++++++[<++++++>-
]>[<<+>>-]>[<<+>>-]<<]>]<[->>+++++
+++[<++++++>-]]<[.[-]<]<

最も重要な部分は最初の行です。これは、入力された文字の数をカウントします。残りは、9より大きい数値を印刷するために必要な長いジャンクです。

編集:BFは1から255までのASCII数字以外を入力/出力できないため、UTF-8文字を測定する方法はありません。


これはもっとゴルフができるようです。しかし、おそらくそれはできません。+1。
wizzwizz4

0

beeswax, 99 87バイト

最初のバージョンより12バイト短い、よりコンパクトなバージョン:

p~5~q")~4~p")~7~g?<
>)'qq>@PPq>@Pp>Ag'd@{
     >@PPPq  @dNp"?{gAV_
     >@PPPP>@>?b>N{;

同じ、六角形のレイアウトに従うのが簡単なように:

 p ~ 5 ~ q " ) ~ 4 ~ p " ) ~ 7 ~ g ? <
> ) ' q q > @ P P q > @ P p > A g ' d @ {
         > @ P P P q     @ d N p " ? { g A V _ 
        > @ P P P P > @ > ? b > N { ;

characters次にbytecount、改行で区切って出力します。

例:s行の先頭にある小さな文字は、プログラムが入力として文字列を必要としていることをユーザーに伝えるだけです。

julia> beeswax("utf8bytecount.bswx")
s(~R∊R∘.×R)/R←1↓ιR
17
27
Program finished!

空の文字列の例:

julia> beeswax("utf8bytecount.bswx")
s
0
0
Program finished!

蜜蝋は、STDINで入力された文字列の文字を、Unicodeコードポイントの値としてコード化されたグローバルスタックにプッシュします。

理解を容易にするために、上記のプログラムのラップされていないバージョンを以下に示します。

             >@{;    >@P@p >@PP@p>@P p
_VAg{?"pN>Ag"d?g~7~)"d~4~)"d~5~)"d@PPp
    ;{N< d?              <      < @PP<

この例では、文字は、αSTDIN(コードポイントで入力されU+03B1、小数。945

                                        gstack     lstack

_VA                                     [945,1]•   [0,0,0]•    enter string, push stack length on top of gstack
   g                                               [0,0,1]•    push gstack top value on top of local stack (lstack)
    {                                                          lstack 1st value to STDOUT (num. of characters)
     ?                                  [945]•                 pop gstack top value
      "                                                        skip next if lstack 1st >0
        N>                                                     print newline, redirect to right
          Ag                            [945,1]•   [0,0,1]•    push gstack length on top of gstack, push that value on lstack.
            "                                                  skip if lstack 1st > 0
              ?                         [945]•                 pop gstack top value
               g                                   [0,0,945]•  push gstack top value on lstack
                ~                                  [0,945,0]•  flip lstack 1st and 2nd
                 7                                 [0,945,7]•  lstack 1st=7
                  ~                                [0,7,945]•  flip lstack 1st and 2nd
                   )                               [0,7,7]•    lstack 1st = lstack 1st >>> 2nd  (LSR by 7)
                    "                                          skip next if top >0
                      ~4~)                         [0,0,0]•            flip,1st=4,flip,LSR by 4
                          "d                                   skip next if top >0... redirect to upper right
                           >@                                  redirect to right, flip lstack 1st and 3rd
                             PP@                   [2,0,0]•    increment lstack 1st twice, flip 1st and 3rd
                                p                              redirect to lower left
                                "                              (ignored instruction, not relevant)
         d?              <      <       []•                       redirect to left... pop gstack, redirect to upper right

         >Ag"d                          [0]•       [2,0,0]•    redir. right, push gstack length on gstack
                                                               push gstack top on lstack, skip next if lstack 1st > 0
                                                               redir. to upper right.
         >@                                        [0,0,2]•    redir right, flip lstack 1st/3rd
           {;                                                  output lstack 1st to STDOUT, terminate program

基本的に、このプログラムは、各コードポイント値で1バイト、2バイト、3バイト、および4バイトのコードポイント制限をチェックします。

場合はnコードポイント値があり、その後、適切なUTF-8文字列のこれらの制限は以下のとおりです。

codepoint 0...127         1-byte: n>>>7 = 0
          128...2047      2-byte: n>>>11= 0  → n>>>7>>>4
          2048...65535    3-byte: n>>>16= 0  → n>>>7>>>4>>>5
          65535...1114111 4-byte: the 3 byte check result is >0

上記のコードで、番号74および5シフト命令を見つけることができます。チェックの結果がの0場合、lstackカウンターは適切にインクリメントされ、入力された文字列のバイト数を集計します。@PP...@構築物は、バイトカウンタをインクリメント。各集計の後、一番上のUnicodeポイントが空になるまでgstackからポップされます。次に、バイトカウントがSTDOUTに出力され、プログラムが終了します。

過度に長いASCIIエンコーディングやその先の不正なコードポイントのような不適切なエンコーディングのチェックはありませんが、それで問題0x10FFFFないと思います;)


0

スウィフト3、37

{($0.characters.count,$0.utf8.count)}//ところ$0ですString

使用法

テスト

{($0.characters.count,$0.utf8.count)}("Hello, world")

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