Примечание 2: я принял @DigitalTrauma
6-байтовый длинный ответ. Если кто-то может победить, я изменю принятый ответ. Спасибо за игру!
Примечание: я приму ответ в 6:00 вечера MST 14.10.15. Спасибо всем, кто участвовал!
Я очень удивлен тем, что об этом еще не спрашивали (или я не достаточно усердно искал). В любом случае, эта задача очень проста:
Ввод: программа в виде строки. Кроме того, входные данные могут содержать или не содержать:
- Ведущие и конечные пробелы
- Замыкающие переводы
- Не-ASCII символы
Вывод: два целых числа, одно из которых представляет количество символов UTF-8, а другое представляет количество байтов, вы можете выбрать, в каком порядке. Конечные переводы строки разрешены. Вывод может быть в STDOUT или возвращен из функции. Это может быть в любом формате, если эти два числа различимы (2327 не является допустимым выводом).
Заметки:
- Вы можете рассматривать перевод строки как
\n
или\r\n
. - Вот хороший счетчик байтов и символов для ваших тестов. Также здесь есть мета-пост с тем же (спасибо @Zereges).
Пример ввода / вывода: (Все выходы в форме {characters} {bytes}
)
Входные данные:
void p(int n){System.out.print(n+5);}
Выход: 37 37
Входные данные: (~R∊R∘.×R)/R←1↓ιR
Выход: 17 27
Входные данные:
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
print "iteration {iteration} is {name}".format(iteration=i, name=name)
Выход: 156 156
Это код гольфа - выигрывает самый короткий код в байтах !
Leaderboards
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
# Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:
# [><>](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>
Ответы:
Shell + coreutils, 6
Этот ответ становится недействительным, если используется кодировка, отличная от UTF-8.
Тестовый вывод:
В случае строгого применения выходного формата (только один пробел, разделяющий два целых числа), мы можем сделать это:
Shell + coreutils, 12
Спасибо @immibis за предложение удалить пробел после
echo
. Мне потребовалось некоторое время, чтобы понять это - оболочка расширит это доecho<tab>n<tab>m
, и вкладки по умолчанию будут включены$IFS
, поэтому в полученной команде совершенно допустимы разделители токенов.источник
GolfScript,
1412 байтПопробуйте это онлайн на Web GolfScript .
идея
GolfScript не знает, что такое Unicode; все строки (входные, выходные, внутренние) состоят из байтов. Хотя это может быть довольно раздражающим, но оно идеально подходит для этой задачи.
UTF-8 по-разному кодирует символы ASCII и не-ASCII:
Все кодовые точки ниже 128 кодируются как
0xxxxxxx
.Все остальные кодовые точки кодируются как
11xxxxxx 10xxxxxx ... 10xxxxxx
.Это означает, что кодировка каждого символа Unicode содержит либо один
0xxxxxxx
байт, либо один11xxxxxx
байт (и от 0 до 510xxxxxx
байтов).Разделив все байты ввода на 64 , мы превращаемся
0xxxxxxx
в 0 или 1 ,11xxxxxx
в 3 и10xxxxxx
в 2 . Осталось только посчитать байты, у которых не 2 .Код
источник
Python,
4240 байтСпасибо Алексу А. за два байта.
Просто, делает то, что говорит. С аргументом
i
печатает длинуi
, затем длинуi
в UTF-8. Обратите внимание , что для того , чтобы принять многострочный ввод, аргумент функции должен быть окружен тройными кавычками:'''
.РЕДАКТИРОВАТЬ: Это не сработало для многострочного ввода, поэтому я просто сделал это вместо функции.
Некоторые тестовые случаи (разделенные пробелами):
источник
lambda i:[len(i),len(i.encode('utf-8'))]
.f=lambda i:[len(i),len(i.encode('utf-8'))]
, но поскольку вы используете анонимную лямбда-функцию, это должно быть просто такlambda i:[len(i),len(i.encode('utf-8'))]
.U8
вместоutf-8
.Юлия, 24 байта
Это создает лямбда-функцию, которая возвращает кортеж целых чисел.
length
Функция, при вызове на строку, возвращает количество символов.sizeof
Функция возвращает число байт во входных данных.Попробуйте онлайн
источник
Ржавчина, 42 байта
источник
Pyth -
129 байтПостараюсь стать короче.
Тестовый пакет .
источник
floor(… / 8) + 1
, должно бытьceil(… / 8)
.B
. ТакжеlQlc.BQ8
исправляет ошибку, о которой упоминает Pietu1998 при сохранении 1 байта, я думаю.Java,
2419089 байтисточник
getBytes("UTF-8")
наgetBytes("utf8")
. А почемуthrows Exception
?UnsupportedEncodingException
когда вы даете ему неверное имя кодировки.PowerShell, 57 байт
источник
C
6867 байтЭто использует ту же идею, что и мой другой ответ .
Попробуйте онлайн на Ideone .
источник
R, 47 байт
Входные данные:
(~R∊R∘.×R)/R←1↓ιR
Выход:
Если печать строк рядом с выводом не разрешена в «любом формате», то
cat
можно решить проблему:R, 52 байта
Входные данные:
(~R∊R∘.×R)/R←1↓ιR
Выход:
17 27
источник
function(s)c(nchar(s,"c"),nchar(s,"b"))
T
вместоTRUE
,=
вместо<-
, и вход может поступать изscan
,readline
илиfunction
, все из которых корочеcommandArgs
.Млечный Путь 1.6.2 , 7 байт (неконкурентный)
объяснение
использование
источник
Perl 6, 33 байта
Основано на этом сообщении в блоге на Perl6Advent.
источник
Brainfuck, 163 байта
С разрывами строки для удобства чтения:
Самая важная часть - первая строка. Это подсчитывает количество введенных символов. Остальное - просто длинный мусор, необходимый для печати числа больше 9.
РЕДАКТИРОВАТЬ: Поскольку BF не может вводить / выводить ничего, кроме ASCII чисел от 1-255, не было бы никакого способа измерить символы UTF-8.
источник
пчелиный воск,
9987 байтБолее компактная версия, на 12 байт короче первой:
Так же, как проще следовать гексагональной раскладке:
Выход , как
characters
, затемbytecount
, разделенные символом новой строки.Пример: маленькая буква
s
в начале строки просто говорит пользователю, что программа хочет вводить строку.Пример пустой строки:
Пчелиный воск выталкивает символы строки, введенной в STDIN, в глобальный стек, закодированный как значения их кодовых точек Unicode.
Для облегчения понимания ниже приведена развернутая версия программы:
В этом примере символ
α
вводится в STDIN (код точкиU+03B1
, десятичном:945
)По сути, эта программа проверяет каждое значение кодовой точки на предмет ограничений на 1-байтовую, 2-байтовую, 3-байтовую и 4-байтовую кодовую точку.
Если
n
это значение кодовой точки, то эти ограничения для правильных строк UTF-8:Вы можете найти номера
7
,4
и5
для команд сдвига в коде выше. Если проверка0
завершается, счетчик lstack увеличивается соответствующим образом, чтобы подсчитать количество байтов введенной строки. В@PP...@
конструкции увеличить счетчик байтов. После каждого подсчета самая верхняя точка Unicode выталкивается из gstack, пока она не станет пустой. Затем счетчик байтов выводится в STDOUT и программа завершается.Нет никаких проверок на неправильное кодирование, такое как слишком длинное кодирование ASCII и недопустимые кодовые точки
0x10FFFF
, но я думаю, это нормально;)источник
Свифт 3, 37
{($0.characters.count,$0.utf8.count)}
// где$0
находитсяString
использование
Тестовое задание
{($0.characters.count,$0.utf8.count)}("Hello, world")
источник