Bir programın baytını say


21

Not 2: @DigitalTrauma6 baytlık uzun cevapları kabul ettim . Eğer kimse onu yenebilirse kabul edilen cevabı değiştireceğim. Oynadığınız için teşekkürler!

Not: 10/14/15 tarihinde MST 18:00 'de bir cevap kabul edeceğim. Katılan herkese teşekkürler!

Bunun henüz sorulmadığına çok şaşırdım (ya da yeterince aramadım). Her iki durumda da, bu zorluk çok basittir:

Giriş: Bir dizge biçiminde bir program. Ek olarak, giriş aşağıdakileri içerebilir veya içermeyebilir:

  • Lider ve takip alanları
  • Son satırlar
  • ASCII olmayan karakterler

Çıktı: Biri UTF-8 karakter sayısını, biri de bayt sayısını temsil eden iki tam sayı, hangi sırayı seçebilirsiniz. İzleyen yeni satırlara izin verilir. Çıkış STDOUT olabilir veya bir fonksiyondan döndürülebilir. BT, iki sayı birbirinden ayırt edilebilir olduğu sürece herhangi bir biçimde olabilir (2327 geçerli çıktı değildir).

Notlar:

  • Newline'ı \nveya olarak düşünebilirsiniz \r\n.
  • İşte testleriniz için hoş bir bayt ve karakter sayacı . Ayrıca, aynı şey ile bir meta yazıdır (@Zereges'e teşekkürler).

Örnek G / Ç: (Tüm çıkışlar formdadır {characters} {bytes})

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

Çıktı: 37 37

Giriş: (~R∊R∘.×R)/R←1↓ιR

Çıktı: 17 27

Giriş:


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

Çıktı: 156 156

Bu kod golf - bayt cinsinden en kısa kod kazanır!

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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


çıkış etmez sahip boşlukla ayrılmış olduğu?
Maltysen

hayır, (değil geçerli çıkış 2327) sürece sayılar birbirinden ayırt edilebilir olarak herhangi bir biçimde olabilir
GamrCorps

Yorumlamaya bağlı olarak aynı bayt değerlerini üreten diğer iki karaktere bölünebilecek bazı UTF-8 karakterleri yok mu? Onları nasıl sayarız o zaman?
Patrick Roberts

Açıkçası, ne demek istediğini anlamadım. Bu nedenle, istediğiniz kadar sayın.
GamrCorps

@GamrCorps UTF-8 karakterleri, temel olarak bir bayt ile temsil edilemeyen ancak iki veya dört bayt ile temsil edilmesi gereken karakterler olan ASCII olmayan karakterleri içerir. Karakterlerin bir program tarafından nasıl okunduğuna bağlı olarak, bayt akışının nasıl yorumlanacağını seçmek programa bağlıdır. Örneğin, bir 2 bayt UTF-8, her biri başlangıçta amaçlanan karakteri oluşturan iki bayt ile temsil edilen 2 sıralı ASCII karakter olarak yorumlanabilir.
Patrick Roberts

Yanıtlar:


32

Shell + coreutils, 6

UTF-8 dışında bir kodlama kullanılırsa bu cevap geçersiz hale gelir.

wc -mc

Test çıkışı:

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

Çıktı formatının tam olarak uygulanması durumunda (iki tam sayıyı ayıran yalnızca bir boşluk), o zaman bunu yapabiliriz:

Shell + coreutils, 12

echo`wc -mc`

@ İmmibis 'e sonra boşluk bırakmayı önerdiğiniz için teşekkürler echo. Bunu anlamak biraz zaman aldı - kabuk bunu genişletecek echo<tab>n<tab>mve varsayılan olarak sekmeler var $IFS, bu yüzden sonuçtaki komutta tamamen yasal belirteç ayırıcıları var.


13
Kesinlikle iş için doğru araç.
Alex A.

1
"Echo" dan sonra boşluğu kaldırabilir misin?
user253751 14:15

@ immibis Evet - güzel - Bunun nasıl çalıştığını hemen göremedim.
Dijital Travma

21

GolfScript, 14 12 bayt

.,p{64/2^},,

Çevrimiçi olarak Web GolfScript'te deneyin .

Fikir

GolfScript, Unicode'un ne olduğu hakkında hiçbir ipucu yoktur; tüm dizeler (giriş, çıkış, iç) bayttan oluşur. Bu oldukça can sıkıcı olabilir, ancak bu meydan okuma için mükemmel.

UTF-8 ASCII ve ASCII olmayan karakterleri farklı şekilde kodlar:

  • 128'in altındaki tüm kod noktaları olarak kodlanmıştır 0xxxxxxx.

  • Diğer tüm kod noktaları olarak kodlanmıştır 11xxxxxx 10xxxxxx ... 10xxxxxx.

Bu, her Unicode karakterinin kodlamasının, tek bir 0xxxxxxxbayt veya bir tek 11xxxxxxbayt (ve 0 ila 5 10xxxxxxbayt) içerdiği anlamına gelir .

Tarafından girilecek tüm bayt bölerek 64 , ki bu 0xxxxxxxiçine 0 ya da 1 , 11xxxxxxiçine 3 ve 10xxxxxxiçine 2 . Geriye kalan tek şey, bölümü 2 olmayan baytları saymak .

kod

                (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 bayt

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

İki bayt için Alex A.'ye teşekkür ederiz.

Basit, ne diyorsa onu yapıyor. Argümanla UTF-8'in uzunluğunu ve ardından iuzunluğunu yazdırır . Çok satırlı girişi kabul etmek için, işlev argümanının üçlü tırnaklarla çevrelenmesi gerektiğini unutmayın:ii''' .

EDIT: Çok satırlı giriş için işe yaramadı, ben de bunun yerine bir işlev yaptım.

Bazı test durumları (boş yeni satırlarla ayrılmış):

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

Ve tüm bu zaman boyunca enayi gibi sadece len () kullanıyorum. Bu açıkça üstündür.
Durum

3
Çıktı bir işlevden döndürülebildiğinden, bunu yaparak birkaç bayttan tasarruf edebilirsiniz lambda i:[len(i),len(i.encode('utf-8'))].
Alex A.

@AlexA. Tamam, değişiyorum. Daha önce hiç lambdaya dokunmadım.
The_Basset_Hound

1
Lambda'nız tam olarak oluşturulmamış. Bir tanım verirseniz, olacaktır f=lambda i:[len(i),len(i.encode('utf-8'))], ancak anonim bir lambda işlevi kullandığınızdan, sadece olması gerekir lambda i:[len(i),len(i.encode('utf-8'))].
Kade

1
Bunun U8yerineutf-8 birkaç bayt kaydedebilirsiniz .
Mego

5

Julia, 24 bayt

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

Bu, bir tamsayı dizisi döndüren bir lambda işlevi yaratır. lengthFonksiyon, bir ipe aradığında, karakter sayısını döndürür. sizeofFonksiyon girişi bayt sayısını verir.

Çevrimiçi deneyin


4

Pas, 42 bayt

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

3

Pyth - 12 9 bayt

Kısaltmaya çalışacağım.

lQh/l.BQ8

Test Takımı .


Bu UTF-8 bayt sayısı için çok fazla bir bayt verir. Şu anda floor(… / 8) + 1olmalı,ceil(… / 8)
PurkkaKoodari 14:15

Bu bana bir böcek yakalamamda yardımcı oldu .B. Ayrıca, lQlc.BQ8@ Pietu1998 1 byte tasarruf ederken bahseder, hatayı düzeltir bence.
isaacg,

3

Java, 241 90 89 bayt

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

Java'yı 100 baytın altına aldığına sevindim.
GamrCorps

Evet, bu ... Sadece bir yöntemdir
SuperJedi224

1
Sen değişebilir getBytes("UTF-8")için getBytes("utf8"). Ve neden throws Exception?
RAnders00

Çünkü getBytes UnsupportedEncodingException, geçersiz bir kodlama adı verdiğinizde bir zaman atar .
SuperJedi224

2

PowerShell, 57 bayt

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


2

R, 47 bayt

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

Giriş: (~R∊R∘.×R)/R←1↓ιR

Çıktı:

[1] 17
[2] 27

Çıktı ile birlikte satır numaralarının yazdırılması "herhangi bir format" altında izin verilemezse cat verilemezse, sorunu çözebilirsiniz:

R, 52 bayt

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

Giriş: (~R∊R∘.×R)/R←1↓ιR

Çıktı: 17 27


Bir fonksiyon olarak, 39 bayt:function(s)c(nchar(s,"c"),nchar(s,"b"))
Alex A.

1
Ayrıca sadece bazı genel R golf ipuçları: Sen kullanabilirsiniz Tyerine TRUE, =yerine <-ve giriş gelebilir scan, readlineya da function, hepsi de daha kısadır commandArgs.
Alex A.

1

Samanyolu 1.6.2 , 7 bayt (yarışmaz)

':y!^P!

açıklama

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

kullanım

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

Bu meydan okuma dili yitirdiği için bunu rakipsiz olarak işaretledim.
Mego


1

Brainfuck, 163 bayt

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

Okunabilirlik için çizgi çubuklarıyla:

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

En önemli kısım ilk satırdır. Bu, girilen karakter sayısını sayar. Gerisi 9'dan daha büyük bir sayı yazdırmak için gereken uzun süredir gereksiz.

EDIT: BF, 1-255 arasındaki ASCII numaralarından başka bir şey giremez / çıkartamazsa, UTF-8 karakterlerini ölçmenin bir yolu olmazdı.


Bu daha çok golf oynayabilecek gibi görünüyor. Ama muhtemelen olamaz. +1.
wizzwizz4 23.03.2016

0

balmumu, 99 87 bayt

Daha kompakt bir sürüm, ilkinden 12 byte daha kısa:

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

Aynı, altıgen düzeni takip etmek daha kolay:

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

Çıkış olarak characters, daha sonra bytecount, bir satır ile ayrılmıştır.

Örnek: sSatırın başındaki küçük harf , kullanıcıya programın girdi olarak bir dize istediğini söyler.

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

Boş dize örneği:

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

Balmumu STDIN'de girilen bir dizgenin karakterlerini Unicode kod noktalarının değerleri olarak kodlanan global yığının üzerine iter.

Daha kolay anlaşılması için yukarıdaki programın paketlenmemiş versiyonu:

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

Bu örnek için, karakter αSTDIN'den de girilir (kod noktası U+03B1, ondalık: 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

Temel olarak, bu program 1 bayt, 2 bayt, 3 bayt ve 4 bayt kod noktası limitleri için her kod noktası değerini kontrol eder.

Eğer nkod noktası değeridir sonra düzgün UTF-8 dizeleri için bu sınırlar şunlardır:

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

Rakamları bulabilirsiniz 7, 4ve 5yukarıdaki kodda vardiya talimatları için. Bir kontrol 0oluşursa, lstack sayacı girilen dizginin bayt sayısını taklit etmek için uygun şekilde artırılır. @PP...@Yapılar bayt sayacı artar. Her taksitten sonra, en üstteki Unicode noktası gstack'tan boşalana kadar atılır. Ardından bayt sayısı STDOUT'a çıkar ve program sonlandırılır.

Uzun süreli ASCII kodlaması ve ötesindeki yasadışı kod noktaları gibi hatalı kodlamalar için kontrol yok 0x10FFFF, ancak bunun iyi olduğunu düşünüyorum;)


0

Hızlı 3, 37

{($0.characters.count,$0.utf8.count)}// nerede $0olduğunuString

kullanım

Ölçek

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.