Đếm số byte của chương trình


21

Lưu ý 2: Tôi chấp nhận @DigitalTraumacâu trả lời dài 6 byte. Nếu ai có thể đánh bại tôi sẽ thay đổi câu trả lời được chấp nhận. Cảm ơn đã chơi cùng!

Lưu ý: Tôi sẽ chấp nhận câu trả lời vào lúc 6:00 tối MST ngày 14/10/15. Cảm ơn tất cả những người tham gia!

Tôi rất ngạc nhiên vì điều này chưa được hỏi (hoặc tôi đã không tìm kiếm đủ mạnh). Dù bằng cách nào, thử thách này rất đơn giản:

Đầu vào: Một chương trình ở dạng chuỗi. Ngoài ra, đầu vào có thể có hoặc không chứa:

  • Không gian hàng đầu và dấu
  • Trailing newlines
  • Các ký tự không phải ASCII

Đầu ra: Hai số nguyên, một số đại diện cho số ký tự UTF-8 và một số đại diện cho số byte, bạn có thể chọn thứ tự nào. Trailing newlines được cho phép. Đầu ra có thể là STDOUT hoặc được trả về từ một hàm. CNTT có thể ở bất kỳ định dạng nào miễn là hai số có thể phân biệt được với nhau (2327 không phải là đầu ra hợp lệ).

Ghi chú:

  • Bạn có thể xem xét dòng mới là \nhoặc \r\n.
  • Đây là một bộ đếm byte và ký tự đẹp cho các thử nghiệm của bạn. Ngoài ra, đây là một bài đăng meta với điều tương tự (Cảm ơn @Zereges).

I / O mẫu: (Tất cả các kết quả đầu ra đều ở dạng {characters} {bytes})

Đầu vào: void p(int n){System.out.print(n+5);}

Đầu ra: 37 37

Đầu vào: (~R∊R∘.×R)/R←1↓ιR

Đầu ra: 17 27

Đầu vào:


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

Đầu ra: 156 156

Đây là mã golf - mã ngắn nhất tính bằng byte thắng!

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

# [><>](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>


đầu ra phải được phân tách không gian?
Maltysen

không, nó có thể ở bất kỳ định dạng nào miễn là các số có thể phân biệt được với nhau (2327 không phải là đầu ra hợp lệ)
GamrCorps

Không có một số ký tự UTF-8 mà tùy theo cách hiểu có thể được chia thành hai ký tự khác tạo ra cùng một giá trị byte? Làm thế nào để chúng ta đếm những sau đó?
Patrick Roberts

Thành thật mà nói, tôi không biết ý của bạn là gì. Do đó, tính như bạn muốn.
GamrCorps

@GamrCorps Các ký tự UTF-8 bao gồm các ký tự không phải ASCII, về cơ bản là các ký tự không thể được biểu thị bằng một byte nhưng phải được biểu thị bằng hai hoặc thậm chí bốn byte. Tùy thuộc vào cách các ký tự được đọc bởi một chương trình, tùy thuộc vào chương trình để chọn cách diễn giải luồng byte. Ví dụ, UTF-8 2 byte có thể được hiểu là 2 ký tự ASCII tuần tự, mỗi ký tự được biểu thị bằng hai byte tạo thành ký tự dự định ban đầu.
Patrick Roberts

Câu trả lời:


32

Vỏ + lõi, 6

Câu trả lời này trở nên không hợp lệ nếu sử dụng mã hóa khác UTF-8.

wc -mc

Đầu ra thử nghiệm:

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

Trong trường hợp định dạng đầu ra được thực thi nghiêm ngặt (chỉ cần một khoảng trắng phân tách hai số nguyên), thì chúng ta có thể thực hiện việc này:

Vỏ + lõi, 12

echo`wc -mc`

Cảm ơn @immibis đã đề xuất xóa khoảng trống sau echo. Tôi phải mất một thời gian để tìm ra điều đó - trình bao sẽ mở rộng điều này sang echo<tab>n<tab>mvà các tab theo mặc định được đặt vào $IFS, do đó, các dấu tách mã thông báo hoàn toàn hợp pháp trong lệnh kết quả.


13
Chắc chắn là công cụ phù hợp cho công việc.
Alex A.

1
Bạn có thể loại bỏ không gian sau khi "echo"?
dùng253751

@immibis Có - tốt - Tôi không thể thấy cách nó hoạt động ngay lập tức.
Chấn thương kỹ thuật số

21

GolfScript, 14 12 byte

.,p{64/2^},,

Dùng thử trực tuyến trên Web GolfScript .

Ý kiến

GolfScript không biết Unicode là gì; tất cả các chuỗi (đầu vào, đầu ra, bên trong) được tạo thành từ các byte. Mặc dù điều đó có thể khá khó chịu, nhưng nó hoàn hảo cho thử thách này.

UTF-8 mã hóa các ký tự ASCII và không phải ASCII khác nhau:

  • Tất cả các điểm mã dưới 128 được mã hóa thành 0xxxxxxx.

  • Tất cả các điểm mã khác được mã hóa thành 11xxxxxx 10xxxxxx ... 10xxxxxx.

Điều này có nghĩa là mã hóa của mỗi ký tự Unicode chứa một 0xxxxxxxbyte đơn hoặc một 11xxxxxxbyte đơn (và 0 đến 5 10xxxxxxbyte).

Bằng cách chia tất cả các byte của đầu vào cho 64 , chúng ta biến 0xxxxxxxthành 0 hoặc 1 , 11xxxxxxthành 310xxxxxxthành 2 . Tất cả những gì còn lại là đếm các byte có thương số không bằng 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 byte

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

Cảm ơn Alex A. cho hai byte tắt.

Nói thẳng, làm những gì nó nói. Với đối số i, in độ dài i, sau đó là độ dài ibằng UTF-8. Lưu ý rằng để chấp nhận đầu vào đa dòng, đối số hàm phải được bao quanh bởi ba dấu ngoặc kép : '''.

EDIT: Nó không hoạt động cho đầu vào đa dòng, vì vậy tôi chỉ biến nó thành một chức năng.

Một số trường hợp thử nghiệm (được phân tách bằng dòng mới trống):

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

Và ở đây tất cả thời gian này tôi đã sử dụng chỉ len () như một kẻ hút. Điều này rõ ràng là vượt trội.
Trạng thái

3
Vì đầu ra có thể được trả về từ một hàm, bạn có thể lưu một vài byte bằng cách thực hiện điều này lambda i:[len(i),len(i.encode('utf-8'))].
Alex A.

@AlexA. Được rồi, thay đổi. Chưa bao giờ chạm vào lambda trước đây.
The_Basset_Hound

1
Lambda của bạn không được hình thành khá chính xác. Nếu bạn cho nó một định nghĩa, nó sẽ như vậy f=lambda i:[len(i),len(i.encode('utf-8'))], nhưng vì bạn đang sử dụng một hàm lambda ẩn danh, nên nó sẽ như vậy lambda i:[len(i),len(i.encode('utf-8'))].
Kade

1
Bạn có thể lưu một vài byte U8thay vìutf-8 .
Mego

5

Julia, 24 byte

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

Điều này tạo ra một hàm lambda trả về một bộ số nguyên. Các lengthchức năng, khi kêu gọi một chuỗi, trả về số ký tự. Các sizeofchức năng trả về số byte trong đầu vào.

Dùng thử trực tuyến


4

Rust, 42 byte

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

3

Pyth - 12 9 byte

Sẽ cố gắng để có được ngắn hơn.

lQh/l.BQ8

Phòng thử nghiệm .


Điều này cung cấp một byte quá nhiều cho số byte UTF-8. Hiện tại floor(… / 8) + 1, nên làceil(… / 8)
PurkkaKoodari

Điều này giúp tôi bắt một lỗi trong .B. Ngoài ra, tôi lQlc.BQ8sửa lỗi @ Pietu1998 đề cập đến trong khi tiết kiệm 1 byte, tôi nghĩ vậy.
isaacg

3

Java, 241 90 89 byte

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

Tình yêu mà bạn có Java dưới 100 byte.
GamrCorps

Chà, nó chỉ là một phương pháp ...
SuperJedi224

1
Bạn có thể thay đổi getBytes("UTF-8")thành getBytes("utf8"). Và tại sao throws Exception?
RAnders00

Bởi vì getBytes ném một UnsupportedEncodingExceptionkhi bạn đặt cho nó một tên mã hóa không hợp lệ.
SuperJedi224

2

PowerShell, 57 byte

$args|%{$_.Length;[Text.Encoding]::UTF8.GetByteCount($_)}


2

R, 47 byte

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

Đầu vào: (~R∊R∘.×R)/R←1↓ιR

Đầu ra:

[1] 17
[2] 27

Nếu việc in số dòng cùng với đầu ra không được phép theo "định dạng bất kỳ" thì catcó thể khắc phục sự cố:

R, 52 byte

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

Đầu vào: (~R∊R∘.×R)/R←1↓ιR

Đầu ra: 17 27


Là một hàm, 39 byte:function(s)c(nchar(s,"c"),nchar(s,"b"))
Alex A.

1
Cũng chỉ là một số lời khuyên chung R chơi golf: Bạn có thể sử dụng Tthay cho TRUE, =thay cho <-, và đầu vào có thể xuất phát từ scan, readlinehoặc function, tất cả trong số đó là ngắn hơn commandArgs.
Alex A.

1

Dải ngân hà 1.6.2 , 7 byte (không cạnh tranh)

':y!^P!

Giải trình

'        ` 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

Sử dụng

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

Tôi đánh dấu điều này là không cạnh tranh vì thử thách trước ngôn ngữ.
Mego


1

Brainfuck, 163 byte

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

Với ngắt dòng cho dễ đọc:

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

Phần quan trọng nhất là dòng đầu tiên. Điều này đếm số lượng ký tự được nhập. Phần còn lại chỉ là rác dài cần thiết để in một số lớn hơn 9.

EDIT: Vì BF không thể nhập / xuất bất cứ thứ gì ngoại trừ các số ASCII từ 1-255, nên sẽ không có cách nào để đo các ký tự UTF-8.


Điều này có vẻ như nó có thể được chơi golf nhiều hơn. Nhưng nó có lẽ không thể. +1.
wizzwizz4

0

sáp ong, 99 87 byte

Một phiên bản nhỏ gọn hơn, ngắn hơn 12 byte so với phiên bản đầu tiên:

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

Tương tự, như cách dễ dàng hơn để làm theo bố cục lục giác:

 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 { ;

Đầu ra là characters, sau đó bytecount, được phân tách bằng một dòng mới.

Ví dụ: chữ nhỏ sở đầu dòng chỉ cho người dùng biết rằng chương trình muốn một chuỗi làm đầu vào.

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

Ví dụ chuỗi rỗng:

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

Sáp ong đẩy các ký tự của một chuỗi được nhập tại STDIN lên ngăn xếp toàn cục, được mã hóa thành các giá trị của các điểm mã Unicode của chúng.

Để dễ hiểu hơn, đây là phiên bản chưa mở của chương trình trên:

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

Trong ví dụ này, ký tự αđược nhập tại STDIN (điểm mã U+03B1, thập phân 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

Về cơ bản, chương trình này kiểm tra từng giá trị điểm mã cho các giới hạn mã hóa 1 byte, 2 byte, 3 byte và 4 byte.

Nếu nlà giá trị điểm mã, thì các giới hạn này cho các chuỗi UTF-8 thích hợp là:

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

Bạn có thể tìm thấy những con số 7, 45cho các hướng dẫn thay đổi trong đoạn code trên. Nếu kiểm tra kết quả 0, bộ đếm lstack được tăng một cách thích hợp để kiểm đếm số byte của chuỗi đã nhập. Các @PP...@cấu trúc tăng bộ đếm byte. Sau mỗi lần kiểm đếm, điểm Unicode trên cùng được bật từ gstack cho đến khi nó trống. Sau đó, số byte được xuất ra STDOUT và chương trình kết thúc.

Không có kiểm tra mã hóa không phù hợp như mã hóa ASCII quá dài và các điểm mã bất hợp pháp vượt quá 0x10FFFF, nhưng tôi nghĩ điều đó tốt;)


0

Swift 3, 37

{($0.characters.count,$0.utf8.count)}// nơi $0String

Sử dụng

Kiểm tra

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

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.