Как дела?

20

Мартин создал хороший фрагмент, который можно использовать для отслеживания результатов при ответах на вызовы. Это здорово и все, но не лучше ли было бы следить за этим самостоятельно?

Создайте программу, которая сравнивает количество байтов само по себе с остальными ответами на этот вопрос и возвращает «Я отвечаю с номером n».

Правила:

  • Счетчик байтов в вашем собственном ответе может быть жестко задан в коде

  • Функция может принимать URL в качестве входных данных или может быть жестко закодирована. Символы для URL не будут учитываться в счетчике байтов, поэтому нет необходимости использовать сокращатель URL.

  • URL-адреса к ответам не могут быть жестко закодированы

  • Баллы за ответы можно найти в заголовке (так же, как и фрагмент Мартина).

  • Заголовок ответа должен иметь правильный формат (описан ниже).

  • Если есть возможность запустить программу онлайн, поделитесь ссылкой на онлайн-компилятор (или фрагмент кода, который можно выполнить из ответа). Если это невозможно, пожалуйста, покажите, как вызывать функцию, и покажите вывод вашего собственного компилятора (во время публикации ответа. Вам не нужно обновлять его, если, конечно, вы этого не хотите).

  • Вы должны фактически сравнить ответ с другими ответами на этот вопрос. Просто написание скрипта I'm answer number 1.на каком-то языке не законно.

  • Если у других ответов такое же количество байтов, как у вас, вы можете выбрать, хотите ли вы быть лучшим или худшим из них.

Заголовок должен быть отформатирован:

# Language Name, N bytes

Зачеркнутые и т. Д. Использовать нельзя, поэтому, если размер кода изменился, покажите его жирным шрифтом под заголовком или укажите его каким-либо другим способом.

Выход должен быть I'm answer number n., где число n- позиция (завершающий символ новой строки / пробелы в порядке). Таким образом, самый короткий ответ будет выводить: «Я отвечаю № 1», второй будет «Я отвечаю № 2». и т.п.

Это код гольф, поэтому самый короткий ответ в байтах победит.

Стьюи Гриффин
источник
Если у других ответов такое же количество байтов, как у вас, вы можете выбрать, хотите ли вы быть лучшим или худшим из них. Возможно, дата публикации должна быть тай-брейком, чтобы у вас не было двух ответов, утверждающих, что они совпадают. Или вы можете использовать стандарт: если они связаны, они оба привязаны к более высокому месту.
mbomb007
2
Я не уверен, что это сработает. Большинство (хороших) онлайн-переводчиков не разрешают скручивать другие веб-страницы, но в задании говорится, что код должен работать на онлайн-переводчике.
спагетто
Давайте поговорим об этом в чате.
спагетто
Нужно ли подсчитывать кавычки вокруг URL? Некоторые ответы в настоящее время исключают их из подсчета, другие включают их.
HVd

Ответы:

2

Perl, 107 байт

use LWP;print"I'm answer number ",1+grep($_<107,LWP::UserAgent->new->get('http://codegolf.stackexchange.com/q/60204')->content=~/<h1>.+, (\d+)/g),'.';

Немного меньше в гольф:

use LWP;
$agent = new LWP::UserAgent();
$response = $agent->get('http://codegolf.stackexchange.com/q/60204');
@answers = $response->content =~ m/<h1>.+, (\d+)/g;
print "I'm answer number ", 1+grep($_<107, @answers), '.';

Образец использования

$ perl my_rank.pl
I'm answer number 1.
Примо
источник
7

Python 2, 145 байт

from requests import*
print"I'm answer number %s."%(sorted([int(a["body"].split(",")[1].split()[0])for a in get('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=activity&site=codegolf&filter=!SWJ_BpAceOT6L*G2Qa').json()["items"]]).index(145)+1)

Выходной с 2015-10-10 17:30:00 UTC:

I'm answer number 1.

Я не учел ни одного URL-адреса своей оценки, пожалуйста, прокомментируйте, сколько я должен добавить к нему. Имеет собственный счет в жестком коде, предполагает, что он уже опубликован. Сломается, если будет опубликовано более 99 ответов.

синий
источник
6

AutoIt, 175 байт

(202 байта - 27 для URL)

#include<String.au3>
$0=_StringBetween
$1=1
For $2 In $0(BinaryToString(InetRead("http://q.codegolf.xyz/60204")),'<h1>',' b')
$1+=$0($2,', ','')[0]<175?1:0
Next
ConsoleWrite("I'm answer number "&$1&".")

Выходной от 2015-10-09 17:47:00 UTC:

I'm answer number 1.
mınxomaτ
источник
Я никогда даже не слышал об Autolt, но правильно ли, что это не сработает, если в имени языка есть запятая? (Я не знаю, есть ли такие языки, поэтому я не уверен, имеет ли это значение)
Стьюи Гриффин
@StewieGriffin Да, но я не помню ни одного языка с запятой в нем ;-). Если кто-нибудь придет, я его поменяю.
mnxomaτ
@minxomat Имя выглядит так, как будто lвместо него есть « а» I, поэтому я неправильно его прочитал. Единственная причина, по которой я это понял, это просмотр статьи в Википедии с засечками.
mbomb007
Просто ждал, чтобы кто-то изобрел язык с запятой в нем, чтобы саботировать этот ответ ...
Даррел Хоффман
@DarrelHoffman Ну, это должно было бы иметь запятую и пробел в названии ^^
mınxomaτ
4

JavaScript (ES7), 149 байт

283 байта - 134 для URL. Я никогда не использовал HTTP-запросы раньше, но здесь идет ...

x=z=>alert(`I'm answer number ${[for(y of z.items)y.body.match(/, (\d+)/)[1]].sort().indexOf("149")+1}.`);document.write('<script src="//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T&callback=x">\x3C/script>')

Успешно протестировано в Firefox 41.

Сначала он просматривает заголовки всех ответов, чтобы найти их количество байтов, затем он находит первую позицию с числом байтов 243 149. В настоящее время он настроен на проверку только первых 100 ответов, и прекратит работу, если кто-то получит меньше 100. байт, но пока работает. ;)

Спасибо @GeorgeReith за гораздо более короткую технику. Старая версия с использованием AJAX (243 байта):

x=new XMLHttpRequest,x.onreadystatechange=_=>{if(x.readyState==4&&x.status==200)alert(`I'm answer number ${[for(y of JSON.parse(x.responseText).items)y.body.match(/, (\d+)/)[1]].sort((a,b)=>a-b).indexOf("243")+1}.`)},x.open("GET","//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T",!0),x.send()
ETHproductions
источник
Выглядит хорошо ... хотя, возможно, сломается, если кто-то отправит другой 151-байтовый ответ
Джордж Райт
@ GeorgeReith Нет, не должно. ОП говорит, что связи могут быть разорваны в любом случае, и это просто поставит себя впереди других.
ETHproductions
Ах, он отредактировал это. Тем не менее, вероятно, лучше отсортировать по дате создания, чтобы повысить вероятность того, что он найдет вашу, а не одного из немногих, кто писал ранее и редактировал свой ответ.
Джордж Райт
@GeorgeReith If other answers have the same number of bytes as your own, you can choose if you want to be best or worse of them.Это все еще в основном посте; я что-то неправильно понимаю?
ETHproductions
Никаких извинений я читал историю редактирования и запутался.
Джордж Райт
4

PHP, 158 159 164 байтов

I'm answer number <?for(;$h[]=json_decode(fread(gzopen('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r),1e4),1)[items][+$i++][body];);echo array_sum(preg_filter(~„ÑÕß×£›ÔÖ߆‹šŒÃЗÎÑÕ‚Œš,~ÛÎÃÎÊÇ,$h)),~Ñ;

127 байтов из 'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T'не подсчитанных

Отформатированная версия с негольфированными строками:

<?
for(;
    $h[]=json_decode(
        fread(
            gzopen(
                'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r
            ), 1e4
        ), 1
    )[items][+$i++][body];
);
echo"I'm answer number ",
    array_sum(
        preg_filter('{.* (\d+) bytes</h1.*}se','$1<159', $h)
    ),
    ".";
  • Загружает ответ JSON (фактически один раз на ответ, чтобы сэкономить 5 байтов, благодаря @Blackhole)
  • Собирает ответы тел в $h
  • заменяет весь текст на «1» (true), если число байтов <= 159, или «» (false) в противном случае
  • подводит итоги

Последовательности символов, подобные ¶Ø’ßž‘Œˆšß‘Š’šßдействительным именам констант в PHP, но поскольку константы не существуют, рассматриваются как строковые литералы. ~инвертирует их, в этот "I'm answer number "(сохраняя байт для одной кавычки каждый)

использование

php -derror_reporting=0 howareyou.php

Я отвечаю № 1.

Фабиан Шменглер
источник
Действительно ли $aпеременная необходима? Почему бы тебе просто не сделать $h[]=json_decode(…)[items][+$i++][body]? Что это за странные персонажи, кстати?
Blackhole
Хорошая точка зрения. Это будет делать новый запрос для каждого ответа, но кого это волнует :) Странные символы - это побитовые инвертированные строки. Это допустимые имена констант в PHP, которые используются в качестве строковых литералов, если они не существуют, поэтому я могу сохранить кавычки. Например " "(3 байта) может быть уменьшено до (2 байта)
Фабиан Шменглер
Действительно, я нашел ваше объяснение по этому ответу . Поскольку это необычный метод, я думаю, что было бы неплохо объяснить это еще раз здесь, в вашем посте :).
Blackhole
Я думаю, что вы можете сделать намного лучше, если пропустите json_decodeи только splitна ':'что-то, например: codepad.org/7rZg06by
primo
Хорошая идея, но я боюсь, что это может быть ненадежно, так как в исходных кодах будет много двоеточий. Помещение «Я номер ответа» перед открывающим тегом PHP экономит как минимум два байта, спасибо за это!
Фабиан Шменглер
3

Javascript (ES6), 186 байт

(335 - 149 байт для URL)

a=d=>alert(`I'm answer number ${d.items.map(q=>(y=[q.body.match(/, (\d+)/)[1],(x=q.owner.user_id==11182)])&&x?z=y:y).sort().indexOf(z)+1}.`)
document.write(`<script src="https://api.stackexchange.com/questions/60204/answers?pagesize=100&order=desc&sort=activity&site=codegolf&filter=!)Q2B_A19OPkd2j8JforD00f5&callback=a">\x3C/script>`)

Джордж Райт
источник
Я понятия не имел, что ты можешь сделать это таким образом! Могу ли я спросить, почему вы использовали \x3Cвместо <?
ETHproductions
@ETHproductions Поскольку браузер сразу ищет закрывающий тег сценария и не будет запускать сценарий в противном случае, это откладывает закрытие тега сценария до пост-вставки. Он использует JSONP с обратным вызовом и зависит от API, поддерживает ли он его, но, к счастью, работает stackexchange. Честно говоря, я не до конца понимаю причины этого, но это законный вопрос.
Джордж Райт
1

Awk, 153 байта

BEGIN{if(u){print"I\047m answer number "system("curl -s "u"|awk -f a")".";exit}FS="1>.*,|es<\/h"}NF==3{r+=($2+0)<153?1:0}END{exit(r<1?1:r)}

Это должно быть сохранено в файл aи работать так:

awk -v u=http://codegolf.stackexchange.com/questions/60204/how-are-you-doing -f a

Я вычитаю 68 байтов для http://codegolf.stackexchange.com/questions/60204/how-are-you-doingи добавляю 13 к коду для начальной загрузки awk -v u=и -f a.

Менее гольф, это может быть еще короче:

curl -s http://codegolf.stackexchange.com/questions/60204/how-are-you-doing | awk -F"1>.*,|es<\/h" 'NF==3{r+=(0+$2)<103?1:0}END{print"I\047m answer number "(r<1?1:0)"."}'

Он всегда предпочитает себя в связи. Количество байтов жестко закодировано в каждом.

Более гольф-версия имеет скрипт, вызывающий себя и выводящий значение выхода через систему. В каждом случае только значения ниже жестко заданного приращения значения r, которое затем должно быть откорректировано, 1если оно является ведущим.

Это не правильно найти байт , если есть пробелы между bytesи </h1>и , возможно , ряд других случаев , я не учел.

По состоянию на Sun Oct 11 05:17:51 UTC 2015это дает:

I'm answer number 3.
n0741337
источник
Поскольку я впервые играю в гольф, пожалуйста, дайте мне знать, если я нарушил какие-либо правила, лазейки, счет и т. Д. Или какие улучшения я мог бы внести.
n0741337
Я думаю, что вам нужно напечатать «Я номер ответа», а не «Я номер».
lirtosiast
@ThomasKwa Ха! Я знал, что это было слишком хорошо, чтобы быть правдой. Спасибо и исправил. Требуется ли обратное добавление байтов назад?
n0741337
Он вам не нужен, точно так же, как вам не нужен зачеркивание, когда вы играете в гольф с байтов.
Lirtosiast
1

GNU Awk, 156 байт

(Вдохновленный n0741337 «с раствором Awk .)

Этот делает все сам, без запуска внешней команды.

BEGIN{d="/inet/tcp/0/"h"/80"
print"GET "p" HTTP/1.1\nHost:"h"\n"|&d
while(d|&getline)n+=match($0,/1>.*, ([0-9]+)/,m)&&m[1]<156
print"I'm answer number",n+1}

Ожидает имя хоста и путь как отдельные значения. Учитывая, что они доступны бесплатно, надеюсь, это не нарушает правила.

Образец прогона:

bash-4.3$ awk -v h=codegolf.stackexchange.com -v p=/questions/60204/how-are-you-doing -f number.awk 
I'm answer number 4
manatwork
источник