Uwaga 2: Przyjąłem @DigitalTrauma
6-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
\n
lub\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 N
jest 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>
Odpowiedzi:
Shell + coreutils, 6
Ta odpowiedź traci ważność, jeśli zostanie użyte kodowanie inne niż UTF-8.
Wyjście testowe:
W przypadku ścisłego przestrzegania formatu wyjściowego (tylko jedna spacja oddzielająca dwie liczby całkowite), możemy to zrobić:
Shell + coreutils, 12
Dzięki @immibis za sugestię usunięcia spacji po
echo
. Zajęło mi to trochę czasu, aby to zrozumieć - powłoka rozwinie to doecho<tab>n<tab>m
, a domyślnie tabulatory są włączone$IFS
, więc są całkowicie legalne separatory tokenów w wynikowym poleceniu.źródło
GolfScript,
1412 bajtówWypró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
0xxxxxxx
bajt, albo jeden11xxxxxx
bajt (i od 0 do 510xxxxxx
bajtów).Dzieląc wszystkie bajty danych wejściowych przez 64 , zamieniamy
0xxxxxxx
na 0 lub 1 ,11xxxxxx
na 3 i10xxxxxx
na 2 . Pozostało tylko policzyć bajty, których iloraz nie jest równy 2 .Kod
źródło
Python,
4240 bajtówDzięki Alex A. za dwa bajty wyłączone.
Prosto, robi to, co mówi. Z argumentem
i
wypisuje długośći
, a następnie długośći
w 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):
źródło
lambda i:[len(i),len(i.encode('utf-8'))]
.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'))]
.U8
zamiastutf-8
.Julia, 24 bajty
Tworzy to funkcję lambda, która zwraca krotkę liczb całkowitych.
length
Funkcja, gdy nazywa się na sznurku, zwraca liczbę znaków.sizeof
Funkcja zwraca liczbę bajtów danych wejściowych.Wypróbuj online
źródło
Rdza, 42 bajty
źródło
Pyth -
129 bajtówSpróbuje się skrócić.
Pakiet testowy .
źródło
floor(… / 8) + 1
powinno byćceil(… / 8)
.B
. PonadtolQlc.BQ8
naprawia błąd, o którym wspomina @ Pietu1998, podczas zapisywania 1 bajtu, tak myślę.Java,
2419089 bajtówźródło
getBytes("UTF-8")
nagetBytes("utf8")
. A dlaczegothrows Exception
?UnsupportedEncodingException
gdy nadasz mu niepoprawną nazwę kodowania.PowerShell, 57 bajtów
źródło
DO,
6867 bajtówWykorzystuje to ten sam pomysł, co moja inna odpowiedź .
Wypróbuj online na Ideone .
źródło
R, 47 bajtów
Wkład:
(~R∊R∘.×R)/R←1↓ιR
Wydajność:
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
Wkład:
(~R∊R∘.×R)/R←1↓ιR
Wydajność:
17 27
źródło
function(s)c(nchar(s,"c"),nchar(s,"b"))
T
w miejscuTRUE
,=
w miejscu<-
, a wejście może pochodzić zscan
,readline
lubfunction
, z których wszystkie są krótsze niżcommandArgs
.Droga Mleczna 1.6.2 , 7 bajtów (niekonkurujących)
Wyjaśnienie
Stosowanie
źródło
Perl 6, 33 bajtów
Na podstawie tego postu na blogu w Perl6Advent.
źródło
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.
źródło
wosk,
9987 bajtówBardziej kompaktowa wersja, 12 bajtów krótsza niż pierwsza:
To samo, ponieważ łatwiej jest śledzić układ heksagonalny:
Dane wyjściowe są
characters
następniebytecount
oddzielone znakiem nowej linii.Przykład: mała litera
s
na początku wiersza informuje użytkownika, że program chce wprowadzić ciąg znaków.Przykład pustego ciągu:
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:
W tym przykładzie, postać
α
jest wpisany na STDIN (punkt kodowyU+03B1
, po przecinku:945
)Zasadniczo ten program sprawdza każdą wartość punktu kodowego dla limitów 1-bajtowego, 2-bajtowego, 3-bajtowego i 4-bajtowego.
Jeśli
n
jest wartością punktu kodowego, wówczas limity dla prawidłowych ciągów UTF-8 wynoszą:Można znaleźć numery
7
,4
a5
dla instrukcji przesunięcia w powyższym kodzie. Jeśli wynikiem0
testu 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;)źródło
Swift 3, 37
{($0.characters.count,$0.utf8.count)}
// gdzie$0
jestString
Stosowanie
Test
{($0.characters.count,$0.utf8.count)}("Hello, world")
źródło