Note 2: J'ai accepté @DigitalTrauma
la longue réponse de 6 octets. Si quelqu'un peut battre cela, je changerai la réponse acceptée. Merci d'avoir joué!
Remarque: J'accepterai une réponse à 18h00 HNT le 14/10/15. Merci à tous ceux qui ont participé!
Je suis très surpris que cela n'ait pas encore été demandé (ou je n'ai pas cherché assez fort). Quoi qu'il en soit, ce défi est très simple:
Entrée: programme sous forme de chaîne. De plus, l'entrée peut contenir ou non:
- Espaces de tête et de fuite
- Traversées de nouvelles lignes
- Caractères non ASCII
Sortie: Deux entiers, un représentant le nombre de caractères UTF-8 et l'autre représentant le nombre d'octets, vous pouvez choisir l'ordre. Les sauts de ligne sont autorisés. La sortie peut être vers STDOUT ou renvoyée par une fonction. IL peut être dans n'importe quel format tant que les deux nombres peuvent être distingués l'un de l'autre (2327 n'est pas une sortie valide).
Remarques:
- Vous pouvez considérer la nouvelle ligne comme
\n
ou\r\n
. - Voici un joli compteur d'octets et de caractères pour vos tests. En outre, voici un meta post avec la même chose (Merci à @Zereges).
Exemple d'E / S: (Toutes les sorties sont sous la forme {characters} {bytes}
)
Contribution:
void p(int n){System.out.print(n+5);}
Sortie: 37 37
Contribution: (~R∊R∘.×R)/R←1↓ιR
Sortie: 17 27
Contribution:
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
print "iteration {iteration} is {name}".format(iteration=i, name=name)
Sortie: 156 156
C'est le code golf - le code le plus court en octets gagne!
Classements
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
# [><>](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>
Réponses:
Coquille + coreutils, 6
Cette réponse devient invalide si un codage autre que UTF-8 est utilisé.
Sortie de test:
Dans le cas où le format de sortie est strictement appliqué (un seul espace séparant les deux entiers), alors nous pouvons le faire:
Coquille + coreutils, 12
Merci à @immibis d'avoir suggéré de supprimer l'espace après le
echo
. Il m'a fallu un certain temps pour comprendre cela - le shell va développer celaecho<tab>n<tab>m
et les onglets par défaut sont dedans$IFS
, tout comme les séparateurs de jetons parfaitement légaux dans la commande résultante.la source
GolfScript,
1412 octetsEssayez-le en ligne sur Web GolfScript .
Idée
GolfScript n'a aucune idée de ce qu'est Unicode; toutes les chaînes (entrée, sortie, interne) sont composées d'octets. Bien que cela puisse être assez ennuyeux, il est parfait pour ce défi.
UTF-8 code différemment les caractères ASCII et non ASCII:
Tous les points de code inférieurs à 128 sont codés comme
0xxxxxxx
.Tous les autres points de code sont codés comme
11xxxxxx 10xxxxxx ... 10xxxxxx
.Cela signifie que le codage de chaque caractère Unicode contient soit un seul
0xxxxxxx
octet, soit un seul11xxxxxx
octet (et 0 à 510xxxxxx
octets).En divisant tous les octets de l'entrée par 64 , nous transformons
0xxxxxxx
en 0 ou 1 ,11xxxxxx
en 3 et10xxxxxx
en 2 . Il ne reste plus qu'à compter les octets dont le quotient n'est pas 2 .Code
la source
Python,
4240 octetsMerci à Alex A. pour les deux octets off.
Simple, fait ce qu'il dit. Avec argument
i
, affiche la longueur dei
, puis la longueur dei
UTF-8. Notez que pour accepter l' entrée multiligne, l'argument de fonction doit être entouré de triples guillemets:'''
.EDIT: Cela ne fonctionnait pas pour l'entrée multiligne, donc je viens d'en faire une fonction à la place.
Quelques cas de test (séparés par des sauts de ligne vides):
la source
lambda i:[len(i),len(i.encode('utf-8'))]
.f=lambda i:[len(i),len(i.encode('utf-8'))]
, mais comme vous utilisez une fonction lambda anonyme, elle devrait l'êtrelambda i:[len(i),len(i.encode('utf-8'))]
.U8
au lieu deutf-8
.Julia, 24 octets
Cela crée une fonction lambda qui renvoie un tuple d'entiers. La
length
fonction, lorsqu'elle est appelée sur une chaîne, renvoie le nombre de caractères. Lasizeof
fonction renvoie le nombre d'octets dans l'entrée.Essayez-le en ligne
la source
Rouille, 42 octets
la source
Pyth -
129 octetsVa essayer de raccourcir.
Suite de tests .
la source
floor(… / 8) + 1
, devrait êtreceil(… / 8)
.B
. En outre,lQlc.BQ8
corrige le bug mentionné @ Pietu1998 tout en enregistrant 1 octet, je pense.Java,
2419089 octetsla source
getBytes("UTF-8")
pourgetBytes("utf8")
. Et pourquoithrows Exception
?UnsupportedEncodingException
lorsque vous lui donnez un nom de codage non valide.PowerShell, 57 octets
la source
C,
6867 octetsCela utilise la même idée que mon autre réponse .
Essayez-le en ligne sur Ideone .
la source
R, 47 octets
Contribution:
(~R∊R∘.×R)/R←1↓ιR
Sortie:
Si l'impression de numéros de ligne à côté de la sortie n'est pas autorisée sous "n'importe quel format", vous
cat
pouvez résoudre le problème:R, 52 octets
Contribution:
(~R∊R∘.×R)/R←1↓ιR
Sortie:
17 27
la source
function(s)c(nchar(s,"c"),nchar(s,"b"))
T
à la placeTRUE
,=
à la place de<-
, et l' entrée peuvent provenirscan
,readline
oufunction
, tous sont plus courtes quecommandArgs
.Voie lactée 1.6.2 , 7 octets (non concurrent)
Explication
Usage
la source
Perl 6, 33 octets
Basé sur cet article de blog sur Perl6Advent.
la source
Brainfuck, 163 octets
Avec des sauts de ligne pour la lisibilité:
La partie la plus importante est la première ligne. Cela compte le nombre de caractères saisis. Le reste n'est que la longue jonque requise pour imprimer un nombre supérieur à 9.
EDIT: Puisque BF ne peut pas entrer / sortir autre chose que des nombres ASCII de 1-255, il n'y aurait aucun moyen de mesurer les caractères UTF-8.
la source
cire d'abeille,
9987 octetsUne version plus compacte, 12 octets de moins que la première:
De même, car il est plus facile de suivre la disposition hexagonale:
Sortie en tant que
characters
, puisbytecount
, séparée par une nouvelle ligne.Exemple: la petite lettre
s
au début de la ligne indique simplement à l'utilisateur que le programme veut une chaîne en entrée.Exemple de chaîne vide:
La cire d'abeille pousse les caractères d'une chaîne qui est entrée à STDIN sur la pile globale, codée comme les valeurs de leurs points de code Unicode.
Pour une meilleure compréhension, voici la version non emballée du programme ci-dessus:
Pour cet exemple, le caractère
α
est entré à STDIN (point de codeU+03B1
, décimal:945
)Fondamentalement, ce programme vérifie chaque valeur de point de code pour les limites de codet 1 octet, 2 octets, 3 octets et 4 octets.
Si
n
est la valeur du point de code, ces limites pour les chaînes UTF-8 appropriées sont:Vous pouvez trouver les numéros
7
,4
et5
pour les instructions de décalage dans le code ci - dessus. Si une vérification aboutit0
, le compteur lstack est incrémenté de manière appropriée pour comptabiliser le nombre d'octets de la chaîne entrée. le@PP...@
constructions incrémentent le compteur d'octets. Après chaque décompte, le point Unicode le plus haut est extrait de la gstack jusqu'à ce qu'il soit vide. Ensuite, le nombre d'octets est émis vers STDOUT et le programme est terminé.Il n'y a pas de vérification pour un encodage incorrect comme un encodage ASCII trop long et des points de code illégaux au
0x10FFFF
- delà , mais je pense que ça va;)la source
Swift 3, 37
{($0.characters.count,$0.utf8.count)}
// où$0
estString
Usage
Tester
{($0.characters.count,$0.utf8.count)}("Hello, world")
la source