Catatan 2: Saya menerima @DigitalTrauma
jawaban panjang 6-byte. Kalau ada yang bisa mengalahkan itu saya akan mengubah jawaban yang diterima. Terima kasih sudah bermain!
Catatan: Saya akan menerima jawaban pada pukul 18:00 MST pada 10/14/15. Terima kasih untuk semua yang berpartisipasi!
Saya sangat terkejut bahwa ini belum ditanyakan (atau saya tidak mencari cukup keras). Bagaimanapun, tantangan ini sangat sederhana:
Input: Program dalam bentuk string. Selain itu, input mungkin mengandung atau tidak:
- Ruang depan dan belakang
- Mengejar baris baru
- Karakter non-ASCII
Output: Dua bilangan bulat, satu mewakili jumlah karakter UTF-8 dan satu mewakili jumlah byte, Anda dapat memilih urutan mana. Trailing newlines diizinkan. Output dapat berupa STDOUT atau dikembalikan dari suatu fungsi. TI dapat dalam format apa pun asalkan kedua angka tersebut dapat dibedakan satu sama lain (2327 bukan keluaran yang valid).
Catatan:
- Anda dapat menganggap baris baru sebagai
\n
atau\r\n
. - Ini adalah penghitung byte & karakter yang bagus untuk pengujian Anda. Juga, di sini ada posting meta dengan hal yang sama (Terima kasih kepada @Zegeges).
Contoh I / O: (Semua output dalam bentuk {characters} {bytes}
)
Memasukkan:
void p(int n){System.out.print(n+5);}
Keluaran: 37 37
Memasukkan: (~R∊R∘.×R)/R←1↓ιR
Keluaran: 17 27
Memasukkan:
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
print "iteration {iteration} is {name}".format(iteration=i, name=name)
Keluaran: 156 156
Ini adalah kode golf - kode terpendek dalam byte menang!
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
# Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:
# [><>](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>
Jawaban:
Shell + coreutils, 6
Jawaban ini menjadi tidak valid jika digunakan penyandian selain UTF-8.
Output tes:
Jika format output benar-benar diberlakukan (hanya satu ruang yang memisahkan kedua bilangan bulat), maka kita dapat melakukan ini:
Shell + coreutils, 12
Terima kasih kepada @immibis karena menyarankan untuk menghapus spasi setelah
echo
. Butuh beberapa saat untuk mencari tahu - shell akan memperluas ini keecho<tab>n<tab>m
, dan tab secara default di$IFS
, jadi pemisah token hukum yang sempurna dalam perintah yang dihasilkan.sumber
GolfScript,
1412 byteCobalah online di Web GolfScript .
Ide
GolfScript tidak memiliki petunjuk apa itu Unicode; semua string (input, output, internal) terdiri dari byte. Meskipun itu bisa sangat menjengkelkan, itu sempurna untuk tantangan ini.
UTF-8 menyandikan karakter ASCII dan non-ASCII secara berbeda:
Semua poin kode di bawah 128 dikodekan sebagai
0xxxxxxx
.Semua titik kode lainnya dikodekan sebagai
11xxxxxx 10xxxxxx ... 10xxxxxx
.Ini berarti bahwa pengkodean setiap karakter Unicode berisi
0xxxxxxx
byte tunggal atau11xxxxxx
byte tunggal (dan 0 hingga 510xxxxxx
byte).Dengan membagi semua byte input dengan 64 , kita berubah
0xxxxxxx
menjadi 0 atau 1 ,11xxxxxx
menjadi 3 , dan10xxxxxx
menjadi 2 . Yang tersisa adalah menghitung byte yang hasil bagi bukan 2 .Kode
sumber
Python,
4240 byteTerima kasih kepada Alex A. untuk dua byte mati.
Terus terang, lakukan apa yang dikatakannya. Dengan argumen
i
, mencetak panjangi
, lalu panjangi
dalam UTF-8. Perhatikan bahwa dalam rangka untuk menerima masukan multiline, argumen fungsi harus dikelilingi oleh tiga tanda kutip:'''
.EDIT: Ini tidak berfungsi untuk input multiline, jadi saya hanya membuatnya menjadi fungsi saja.
Beberapa kasus uji (dipisahkan oleh baris baru yang kosong):
sumber
lambda i:[len(i),len(i.encode('utf-8'))]
.f=lambda i:[len(i),len(i.encode('utf-8'))]
, tetapi karena Anda menggunakan fungsi lambda anonim, seharusnya begitulambda i:[len(i),len(i.encode('utf-8'))]
.U8
bukanutf-8
.Julia, 24 byte
Ini menciptakan fungsi lambda yang mengembalikan tupel bilangan bulat. The
length
fungsi, saat dipanggil pada string, mengembalikan jumlah karakter. Thesizeof
fungsi mengembalikan jumlah byte dalam input.Cobalah online
sumber
Karat, 42 byte
sumber
Pyth -
129 byteAkan mencoba menjadi lebih pendek.
Test Suite .
sumber
floor(… / 8) + 1
, seharusnyaceil(… / 8)
.B
. Juga,lQlc.BQ8
memperbaiki bug @ Pietu1998 menyebutkan sambil menyimpan 1 byte, saya pikir.Java,
2419089 bytesumber
getBytes("UTF-8")
menjadigetBytes("utf8")
. Dan mengapathrows Exception
?UnsupportedEncodingException
ketika Anda memberinya nama penyandian yang tidak valid.PowerShell, 57 byte
sumber
C,
6867 byteIni menggunakan ide yang sama dengan jawaban saya yang lain .
Cobalah online di Ideone .
sumber
R, 47 byte
Memasukkan:
(~R∊R∘.×R)/R←1↓ιR
Keluaran:
Jika mencetak nomor baris di samping keluaran tidak diizinkan di bawah "format apa pun" maka
cat
dapat memperbaiki masalah:R, 52 byte
Memasukkan:
(~R∊R∘.×R)/R←1↓ιR
Keluaran:
17 27
sumber
function(s)c(nchar(s,"c"),nchar(s,"b"))
T
di tempatTRUE
,=
di tempat<-
, dan masukan bisa berasal dariscan
,readline
ataufunction
, yang semuanya lebih pendek daricommandArgs
.Milky Way 1.6.2 , 7 byte (tidak bersaing)
Penjelasan
Pemakaian
sumber
Perl 6, 33 byte
Berdasarkan posting blog ini di Perl6Advent.
sumber
Brainfuck, 163 byte
Dengan linebreak untuk keterbacaan:
Bagian terpenting adalah baris pertama. Ini menghitung jumlah karakter yang dimasukkan. Sisanya hanyalah sampah panjang yang diperlukan untuk mencetak angka lebih dari 9.
EDIT: Karena BF tidak dapat memasukkan / mengeluarkan apa pun selain nomor ASCII dari 1-255, tidak akan ada cara untuk mengukur karakter UTF-8.
sumber
lilin lebah,
9987 byteVersi yang lebih ringkas, 12 byte lebih pendek dari yang pertama:
Sama, karena lebih mudah untuk mengikuti tata letak heksagonal:
Keluaran sebagai
characters
, kemudianbytecount
, dipisahkan oleh baris baru.Contoh: huruf kecil
s
di awal baris hanya memberi tahu pengguna bahwa program menginginkan string sebagai input.Contoh string kosong:
Beeswax mendorong karakter string yang dimasukkan di STDIN ke tumpukan global, dikodekan sebagai nilai poin kode Unicode mereka.
Untuk pemahaman yang lebih mudah, berikut adalah versi yang belum dibuka dari program di atas:
Untuk contoh ini, karakter
α
dimasukkan di STDIN (titik kodeU+03B1
, desimal:945
)Pada dasarnya, program ini memeriksa setiap nilai codepoint untuk batas codepoint 1-byte, 2-byte, 3-byte, dan 4-byte.
Jika
n
nilai codepoint, maka batas-batas ini untuk string UTF-8 yang tepat adalah:Anda dapat menemukan nomornya
7
,4
dan5
untuk instruksi shift dalam kode di atas. Jika hasil cek di0
, penghitung lstack bertambah tepat untuk menghitung jumlah byte dari string yang dimasukkan. The@PP...@
konstruksi kenaikan byte counter. Setelah setiap penghitungan, titik Unicode paling atas muncul dari gstack sampai kosong. Kemudian jumlah byte adalah output ke STDOUT dan program diakhiri.Tidak ada pemeriksaan untuk pengkodean yang tidak benar seperti terlalu lama pengkodean ASCII dan poin kode ilegal di luar
0x10FFFF
, tapi saya pikir itu bagus;)sumber
Swift 3, 37
{($0.characters.count,$0.utf8.count)}
// dimana$0
adalahString
Pemakaian
Uji
{($0.characters.count,$0.utf8.count)}("Hello, world")
sumber