Anmerkung 2: Ich habe die @DigitalTrauma
6 Byte lange Antwort akzeptiert . Wenn jemand das schlagen kann, werde ich die akzeptierte Antwort ändern. Danke fürs Spielen!
Hinweis: Ich werde eine Antwort um 18:00 Uhr MEZ am 14.10.15 annehmen. Vielen Dank an alle, die teilgenommen haben!
Ich bin sehr überrascht, dass dies noch nicht abgefragt wurde (oder ich nicht hart genug gesucht habe). In jedem Fall ist diese Herausforderung sehr einfach:
Eingabe: Ein Programm in Form eines Strings. Darüber hinaus kann die Eingabe Folgendes enthalten oder nicht:
- Führende und nachfolgende Leerzeichen
- Zeilenumbruch
- Nicht-ASCII-Zeichen
Ausgabe: Zwei Ganzzahlen, eine für die Anzahl der UTF-8- Zeichen und eine für die Anzahl der Bytes. Sie können die Reihenfolge auswählen. Nachgestellte Zeilenumbrüche sind zulässig. Die Ausgabe kann an STDOUT erfolgen oder von einer Funktion zurückgegeben werden. IT kann in einem beliebigen Format vorliegen, solange die beiden Zahlen voneinander unterscheidbar sind (2327 ist keine gültige Ausgabe).
Anmerkungen:
- Sie können Newline als
\n
oder betrachten\r\n
. - Hier ist ein netter Byte- und Zeichenzähler für Ihre Tests. Auch hier ist ein Meta-Post mit der gleichen Sache (Danke an @Zereges).
Beispiel-E / A: (Alle Ausgaben sind in der Form {characters} {bytes}
)
Eingang:
void p(int n){System.out.print(n+5);}
Ausgabe: 37 37
Eingang: (~R∊R∘.×R)/R←1↓ιR
Ausgabe: 17 27
Eingang:
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
print "iteration {iteration} is {name}".format(iteration=i, name=name)
Ausgabe: 156 156
Dies ist Code Golf - der kürzeste Code in Bytes gewinnt!
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu erstellen.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](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>
Antworten:
Shell + Coreutils, 6
Diese Antwort wird ungültig, wenn eine andere Codierung als UTF-8 verwendet wird.
Testausgang:
Wenn das Ausgabeformat streng erzwungen wird (nur ein Leerzeichen zwischen den beiden Ganzzahlen), können wir dies tun:
Shell + Coreutils, 12
Vielen Dank an @immibis für den Vorschlag, das Leerzeichen nach dem zu entfernen
echo
. Ich habe eine Weile gebraucht, um das herauszufinden - die Shell wird dies erweiternecho<tab>n<tab>m
, und Tabulatoren sind standardmäßig aktiviert$IFS
, so dass Token-Trennzeichen im resultierenden Befehl völlig legal sind.quelle
GolfScript,
1412 BytesProbieren Sie es online im Web GolfScript aus .
Idee
GolfScript hat keine Ahnung, was Unicode ist. Alle Zeichenfolgen (Eingabe, Ausgabe, intern) bestehen aus Bytes. Das kann zwar ziemlich ärgerlich sein, ist aber perfekt für diese Herausforderung.
UTF-8 codiert ASCII- und Nicht-ASCII-Zeichen unterschiedlich:
Alle Codepunkte unter 128 werden als codiert
0xxxxxxx
.Alle anderen Codepunkte werden als codiert
11xxxxxx 10xxxxxx ... 10xxxxxx
.Dies bedeutet, dass die Codierung jedes Unicode-Zeichens entweder ein einzelnes
0xxxxxxx
Byte oder ein einzelnes11xxxxxx
Byte (und 0 bis 510xxxxxx
Byte) enthält.Indem wir alle Bytes der Eingabe durch 64 teilen , werden wir
0xxxxxxx
zu 0 oder 1 ,11xxxxxx
zu 3 und10xxxxxx
zu 2 . Jetzt müssen nur noch die Bytes gezählt werden, deren Quotient nicht 2 ist .Code
quelle
Python,
4240 BytesVielen Dank an Alex A. für die zwei Bytes.
Einfach, macht was es sagt. Gibt mit dem Argument
i
die Länge voni
und dann die Länge voni
in UTF-8 aus. Beachten Sie, dass , um mehrzeilige Eingaben zu akzeptieren, sollte die Funktion Argument durch dreifache Anführungszeichen gesetzt werden:'''
.EDIT: Es funktionierte nicht für mehrzeilige Eingabe, also habe ich es stattdessen zu einer Funktion gemacht.
Einige Testfälle (durch leere Zeilenumbrüche getrennt):
quelle
lambda i:[len(i),len(i.encode('utf-8'))]
.f=lambda i:[len(i),len(i.encode('utf-8'))]
, aber da Sie eine anonyme Lambda-Funktion verwenden, sollte dies der Fall seinlambda i:[len(i),len(i.encode('utf-8'))]
.U8
stattutf-8
.Julia, 24 Bytes
Dadurch wird eine Lambda-Funktion erstellt, die ein Tupel ganzer Zahlen zurückgibt. Die
length
Funktion gibt die Anzahl der Zeichen zurück, wenn sie für eine Zeichenfolge aufgerufen wird. Diesizeof
Funktion gibt die Anzahl der Bytes in der Eingabe zurück.Probieren Sie es online aus
quelle
Rust, 42 Bytes
quelle
Pyth -
129 BytesWerde versuchen kürzer zu werden.
Test Suite .
quelle
floor(… / 8) + 1
sollteceil(… / 8)
.B
. AußerdemlQlc.BQ8
behebt der Bug @ Pietu1998 Erwähnungen beim Speichern von 1 Byte, denke ich.Java,
2419089 Bytesquelle
getBytes("UTF-8")
zugetBytes("utf8")
. Und warumthrows Exception
?UnsupportedEncodingException
wenn Sie ihm einen ungültigen Codierungsnamen geben.PowerShell, 57 Byte
quelle
C
6867 BytesDies verwendet die gleiche Idee wie meine andere Antwort .
Probieren Sie es online auf Ideone .
quelle
R, 47 Bytes
Eingang:
(~R∊R∘.×R)/R←1↓ιR
Ausgabe:
Wenn das Drucken von Zeilennummern neben der Ausgabe unter "Beliebiges Format" nicht zulässig ist,
cat
kann das Problem behoben werden:R, 52 Bytes
Eingang:
(~R∊R∘.×R)/R←1↓ιR
Ausgabe:
17 27
quelle
function(s)c(nchar(s,"c"),nchar(s,"b"))
T
anstelle vonTRUE
,=
anstelle von<-
und Eingabe kann ausscan
,readline
oderfunction
, alle sind kürzer alscommandArgs
.Milchstraße 1.6.2 , 7 Bytes (nicht konkurrierend)
Erläuterung
Verwendung
quelle
Perl 6, 33 Bytes
Gestützt auf diesen Blogeintrag bei Perl6Advent.
quelle
Brainfuck, 163 Bytes
Mit Zeilenumbrüchen zur besseren Lesbarkeit:
Der wichtigste Teil ist die erste Zeile. Dies zählt die Anzahl der eingegebenen Zeichen. Der Rest ist nur der lange Müll, der benötigt wird, um eine Zahl größer als 9 zu drucken.
BEARBEITEN: Da BF nur ASCII-Zahlen von 1 bis 255 eingeben / ausgeben kann, gibt es keine Möglichkeit, die UTF-8-Zeichen zu messen.
quelle
Bienenwachs,
9987 BytesEine kompaktere Version, 12 Bytes kürzer als die erste:
Das gleiche gilt, da das sechseckige Layout einfacher zu befolgen ist:
Die Ausgabe
characters
erfolgt dannbytecount
durch einen Zeilenumbruch getrennt.Beispiel: Der kleine Buchstabe
s
am Anfang der Zeile teilt dem Benutzer lediglich mit, dass das Programm eine Zeichenfolge als Eingabe wünscht.Beispiel für eine leere Zeichenfolge:
Beeswax überträgt die Zeichen einer Zeichenfolge, die bei STDIN eingegeben wurde, auf den globalen Stapel, codiert als die Werte ihrer Unicode-Codepunkte.
Zum leichteren Verständnis ist hier die entpackte Version des obigen Programms:
Für dieses Beispiel wird das Zeichen
α
bei STDIN eingegeben (CodepunktU+03B1
, dezimal:945
)Grundsätzlich überprüft dieses Programm jeden Codepunktwert auf die Codepunktgrenzen 1 Byte, 2 Byte, 3 Byte und 4 Byte.
Wenn
n
es sich um den Codepunktwert handelt, lauten die folgenden Grenzwerte für ordnungsgemäße UTF-8-Zeichenfolgen:Sie können die Nummern finden
7
,4
und5
oben für die Schichtanweisungen im Code. Wenn sich eine Prüfung ergibt0
, wird der Stapelzähler entsprechend erhöht, um die Anzahl der Bytes der eingegebenen Zeichenfolge zu ermitteln. Die@PP...@
Konstrukte erhöhen den Bytezähler. Nach jeder Zählung wird der oberste Unicode-Punkt aus dem Stapel entfernt, bis er leer ist. Dann wird die Byteanzahl an STDOUT ausgegeben und das Programm beendet.Es gibt keine Überprüfungen auf fehlerhafte Codierung wie überlange ASCII-Codierung und unzulässige Codepunkte darüber hinaus
0x10FFFF
, aber ich denke, das ist in Ordnung;)quelle
Swift 3, 37
{($0.characters.count,$0.utf8.count)}
// wo$0
istString
Verwendung
Prüfung
{($0.characters.count,$0.utf8.count)}("Hello, world")
quelle