Як справи?


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.

Я ніколи навіть не чув про Autolt, але це правильно, що це не спрацює, якщо в назві мови є кома? (Я не знаю, чи є такі мови, тому я не впевнений, чи це має значення)
Стюі Гріффін

@StewieGriffin Так, але я не пригадую жодної мови із комою ;-). Якщо хтось підійде, я його зміню.
mınxomaτ

@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()

Дивлячись добре ... хоча, можливо, зламається, якщо хтось опублікує ще одну 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" (вірно), якщо кількість байтів <= 159, або "" (помилково) в іншому випадку
  • підсумовує результати

Такі послідовності символів як ¶Ø’ßž‘Œˆšß‘Š’šßдійсні постійні імена в 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

Я думаю, вам потрібно надрукувати "Я відповідаю на номер", а не "Я - номер".
lirtosiast

@ThomasKwa Hah! Я знав, що це занадто добре, щоб бути правдою. Дякуємо та фіксуємо. Чи потрібне додавання байтів назад?
n0741337

Він вам не потрібен, як і вам не потрібен прорив, коли ви гольфуєте за байтами.
ліртосіаст

1

GNU Awk, 156 байт

(Натхненний n0741337 's розчином 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.