Policz bajty programu

21

Uwaga 2: Przyjąłem @DigitalTrauma6-bajtową odpowiedź. Jeśli ktokolwiek może to pokonać, zmienię przyjętą odpowiedź. Dzięki za grę!

Uwaga: Przyjmę odpowiedź o 18:00 czasu MST w dniu 14.10.2015. Dzięki wszystkim, którzy wzięli udział!

Jestem bardzo zaskoczony, że nie zostało to jeszcze zadane (lub nie szukałem wystarczająco dużo). Tak czy inaczej, to wyzwanie jest bardzo proste:

Wkład: program w postaci ciągu. Ponadto dane wejściowe mogą zawierać lub nie:

  • Wiodące i końcowe spacje
  • Końcowe znaki nowej linii
  • Znaki inne niż ASCII

Wyjście: dwie liczby całkowite, jedna reprezentująca liczbę znaków UTF-8 i jedna reprezentująca liczbę bajtów, możesz wybrać kolejność. Końcowe znaki nowej linii są dozwolone. Wyjściem może być STDOUT lub zwracane z funkcji. IT może być w dowolnym formacie, pod warunkiem, że dwie liczby można od siebie odróżnić (2327 nie jest prawidłowym wyjściem).

Uwagi:

  • Możesz rozważyć nowy wiersz jako \nlub \r\n.
  • Oto ładny licznik bajtów i znaków dla twoich testów. Również tutaj jest meta post z tą samą rzeczą (Dzięki @Zereges).

Przykładowe We / Wy: (Wszystkie wyjścia są w formie {characters} {bytes})

Wkład: void p(int n){System.out.print(n+5);}

Wydajność: 37 37

Wkład: (~R∊R∘.×R)/R←1↓ιR

Wydajność: 17 27

Wkład:


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

Wydajność: 156 156

To jest golfowy kod - wygrywa najkrótszy kod w bajtach !

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

GamrCorps
źródło
czy dane wyjściowe muszą być rozdzielone spacjami?
Maltysen
nie, może być w dowolnym formacie, pod warunkiem, że liczby można od siebie odróżnić (2327 nie jest prawidłowym wyjściem)
GamrCorps
Czy nie ma niektórych znaków UTF-8, które w zależności od interpretacji można podzielić na dwa inne znaki generujące te same wartości bajtów? Jak zatem je liczymy?
Patrick Roberts
Szczerze mówiąc, nie wiem o co ci chodzi. Dlatego licz, jak chcesz.
GamrCorps
@GamrCorps Znaki UTF-8 obejmują znaki spoza ASCII, które są w zasadzie znakami, które nie mogą być reprezentowane przez jeden bajt, ale muszą być reprezentowane przez dwa lub nawet cztery bajty. W zależności od sposobu, w jaki znaki są odczytywane przez program, od programu zależy wybór interpretacji strumienia bajtów. Na przykład 2-bajtowy kod UTF-8 można interpretować jako 2 kolejne znaki ASCII, z których każdy jest reprezentowany przez dwa bajty tworzące pierwotnie zamierzony znak.
Patrick Roberts

Odpowiedzi:

32

Shell + coreutils, 6

Ta odpowiedź traci ważność, jeśli zostanie użyte kodowanie inne niż UTF-8.

wc -mc

Wyjście testowe:

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

W przypadku ścisłego przestrzegania formatu wyjściowego (tylko jedna spacja oddzielająca dwie liczby całkowite), możemy to zrobić:

Shell + coreutils, 12

echo`wc -mc`

Dzięki @immibis za sugestię usunięcia spacji po echo. Zajęło mi to trochę czasu, aby to zrozumieć - powłoka rozwinie to do echo<tab>n<tab>m, a domyślnie tabulatory są włączone $IFS, więc są całkowicie legalne separatory tokenów w wynikowym poleceniu.

Cyfrowa trauma
źródło
13
Zdecydowanie właściwe narzędzie do pracy.
Alex A.,
1
Czy potrafisz usunąć spację po „echu”?
user253751,
@immibis Tak - fajnie - nie widziałem od razu, jak to działa.
Digital Trauma
21

GolfScript, 14 12 bajtów

.,p{64/2^},,

Wypróbuj online na Web GolfScript .

Pomysł

GolfScript nie ma pojęcia, czym jest Unicode; wszystkie ciągi (wejściowe, wyjściowe, wewnętrzne) składają się z bajtów. Chociaż może to być dość denerwujące, jest idealne do tego wyzwania.

UTF-8 inaczej koduje znaki ASCII i inne niż ASCII:

  • Wszystkie punkty kodowe poniżej 128 są zakodowane jako 0xxxxxxx.

  • Wszystkie pozostałe punkty kodowe są zakodowane jako 11xxxxxx 10xxxxxx ... 10xxxxxx.

Oznacza to, że kodowanie każdego znaku Unicode zawiera albo jeden 0xxxxxxxbajt, albo jeden 11xxxxxxbajt (i od 0 do 510xxxxxx bajtów).

Dzieląc wszystkie bajty danych wejściowych przez 64 , zamieniamy 0xxxxxxxna 0 lub 1 , 11xxxxxxna 3 i 10xxxxxxna 2 . Pozostało tylko policzyć bajty, których iloraz nie jest równy 2 .

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.
Dennis
źródło
9

Python, 42 40 bajtów

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

Dzięki Alex A. za dwa bajty wyłączone.

Prosto, robi to, co mówi. Z argumentem iwypisuje długość i, a następnie długość iw UTF-8. Zauważ, że aby zaakceptować wejście wielowierszowe, argument funkcji powinien być otoczony potrójnymi cudzysłowami:''' .

EDYCJA: To nie działało dla wejścia wielowierszowego, więc właśnie zamiast tego stworzyłem funkcję.

Niektóre przypadki testowe (oddzielone pustymi znakami nowej linii):

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
The_Basset_Hound
źródło
I tutaj przez cały ten czas używałem tylko len () jak frajera. To jest wyraźnie lepsze.
Status
3
Ponieważ dane wyjściowe można zwrócić z funkcji, można zaoszczędzić kilka bajtów, wykonując to lambda i:[len(i),len(i.encode('utf-8'))].
Alex A.,
@AlexA. W porządku, zmieniam się. Nigdy wcześniej nie dotykałem lambda.
The_Basset_Hound
1
Twoja lambda nie jest uformowana całkiem poprawnie. Jeśli podasz jej definicję, to będzie f=lambda i:[len(i),len(i.encode('utf-8'))], ale skoro używasz anonimowej funkcji lambda, tak powinno być lambda i:[len(i),len(i.encode('utf-8'))].
Kade
1
Możesz zapisać kilka bajtów U8zamiastutf-8 .
Mego
5

Julia, 24 bajty

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

Tworzy to funkcję lambda, która zwraca krotkę liczb całkowitych. lengthFunkcja, gdy nazywa się na sznurku, zwraca liczbę znaków. sizeofFunkcja zwraca liczbę bajtów danych wejściowych.

Wypróbuj online

Alex A.
źródło
4

Rdza, 42 bajty

let c=|a:&str|(a.chars().count(),a.len());
jus1in
źródło
3

Pyth - 12 9 bajtów

Spróbuje się skrócić.

lQh/l.BQ8

Pakiet testowy .

Maltysen
źródło
Daje to za dużo bajtu dla liczby bajtów UTF-8. Obecnie floor(… / 8) + 1powinno byćceil(… / 8)
PurkkaKoodari
Pomogło mi to złapać błąd .B. Ponadto lQlc.BQ8naprawia błąd, o którym wspomina @ Pietu1998, podczas zapisywania 1 bajtu, tak myślę.
isaacg
3

Java, 241 90 89 bajtów

int[]b(String s)throws Exception{return new int[]{s.length(),s.getBytes("utf8").length};}
SuperJedi224
źródło
Uwielbiam, że Java ma mniej niż 100 bajtów.
GamrCorps
To tylko metoda ...
SuperJedi224,
1
Możesz zmienić getBytes("UTF-8")na getBytes("utf8"). A dlaczego throws Exception?
RAnders00
Ponieważ getBytes wyrzuca, UnsupportedEncodingExceptiongdy nadasz mu niepoprawną nazwę kodowania.
SuperJedi224
2

PowerShell, 57 bajtów

$args|%{$_.Length;[Text.Encoding]::UTF8.GetByteCount($_)}
Andrzej
źródło
2

DO, 68 67 bajtów

b,c;main(t){for(;t=~getchar();b++)c+=2!=~t/64;printf("%d %d",c,b);}

Wykorzystuje to ten sam pomysł, co moja inna odpowiedź .

Wypróbuj online na Ideone .

Dennis
źródło
2

R, 47 bajtów

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

Wkład: (~R∊R∘.×R)/R←1↓ιR

Wydajność:

[1] 17
[2] 27

Jeśli drukowanie numerów wierszy obok wyjścia nie jest dozwolone w „dowolnym formacie”, to cat można rozwiązać problem:

R, 52 bajty

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

Wkład: (~R∊R∘.×R)/R←1↓ιR

Wydajność: 17 27

SnoringFrog
źródło
W funkcji 39 bajtów:function(s)c(nchar(s,"c"),nchar(s,"b"))
Alex A.
1
Również tylko kilka wskazówek golfa ogólna R: Można używać Tw miejscu TRUE, =w miejscu <-, a wejście może pochodzić z scan, readlinelub function, z których wszystkie są krótsze niż commandArgs.
Alex A.
1

Droga Mleczna 1.6.2 , 7 bajtów (niekonkurujących)

':y!^P!

Wyjaśnienie

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

Stosowanie

./mw <path-to-code> -i <input>
Zach Gates
źródło
Zaznaczyłem to jako niekonkurencyjne, ponieważ wyzwanie poprzedza język.
Mego
1

Perl 6, 33 bajtów

$x=get;say $x.chars," ",$x.codes;

Na podstawie tego postu na blogu w Perl6Advent.

kot
źródło
1

Brainfuck, 163 bajty

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

Z podziałem linii dla czytelności:

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

Najważniejsza jest pierwsza linia. Zlicza liczbę wprowadzonych znaków. Reszta to tylko długie śmieci potrzebne do wydrukowania liczby większej niż 9.

EDYCJA: Ponieważ BF nie może wprowadzać / wyprowadzać niczego poza liczbami ASCII od 1-255, nie byłoby sposobu na zmierzenie znaków UTF-8.

vasilescur
źródło
Wygląda na to, że można by w niego grać bardziej. Ale prawdopodobnie nie może. +1.
wizzwizz4
0

wosk, 99 87 bajtów

Bardziej kompaktowa wersja, 12 bajtów krótsza niż pierwsza:

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

To samo, ponieważ łatwiej jest śledzić układ heksagonalny:

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

Dane wyjściowe są charactersnastępnie bytecountoddzielone znakiem nowej linii.

Przykład: mała litera sna początku wiersza informuje użytkownika, że ​​program chce wprowadzić ciąg znaków.

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

Przykład pustego ciągu:

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

Wosk pszczeli wypycha znaki ciągu wprowadzonego w STDIN na stos globalny, kodowane jako wartości ich punktów kodowych Unicode.

Dla łatwiejszego zrozumienia, oto nieopakowana wersja programu powyżej:

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

W tym przykładzie, postać αjest wpisany na STDIN (punkt kodowy U+03B1, po przecinku: 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

Zasadniczo ten program sprawdza każdą wartość punktu kodowego dla limitów 1-bajtowego, 2-bajtowego, 3-bajtowego i 4-bajtowego.

Jeśli njest wartością punktu kodowego, wówczas limity dla prawidłowych ciągów UTF-8 wynoszą:

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

Można znaleźć numery 7, 4a 5dla instrukcji przesunięcia w powyższym kodzie. Jeśli wynikiem 0testu jest licznik lstack, jest on odpowiednio zwiększany, aby zliczyć liczbę bajtów wprowadzonego ciągu. Te @PP...@konstrukty zwiększyć licznik bajtów. Po każdym liczeniu najwyższy punkt Unicode jest wyskakujący z gstacka, aż jest pusty. Następnie liczba bajtów jest wysyłana do STDOUT i program zostaje zakończony.

Nie ma żadnych kontroli pod kątem niewłaściwego kodowania, takiego jak zbyt długie kodowanie ASCII i nielegalne punkty kodowe poza nimi 0x10FFFF , ale myślę, że to w porządku;)

ML
źródło
0

Swift 3, 37

{($0.characters.count,$0.utf8.count)} // gdzie $0 jestString

Stosowanie

Test

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

Apolloński
źródło