Был ли это действительно День Канады?


22

1 июля - день Канады (ура, Канада)! Или это? Кажется, что страница Википедии на этот день имеет много контента, связанного с Канадой, но есть ли другой день, который более канадский?

Ваша задача - написать программу или функцию, которая принимает в качестве входных данных дату (месяц и день) и возвращает или выводит количество упоминаний «Канада» на странице Википедии для вводимой даты. Некоторые правила:

  • Даты могут быть введены в любом разумном формате по вашему выбору
  • Ваша заявка должна извлечь данные из URL en.wikipedia.org/wiki/Month_Day.
  • Только "Canada"нужно искать и подсчитывали включены подстроки, и только в названии случае. "Canadian"не считается, однако "Canada's"считается. Пока точный, чувствительный к регистру текст "Canada"существует в строке, он соответствует
  • Содержимое страницы рассматривается как что-либо в соответствующем .htmlфайле (то есть, что появляется, если вы загрузите страницу как a .htmlи откроете ее в блокноте)
  • Результат может быть выведен в STDOUT, возвращен или отображен любым другим разумным способом

Тестовые случаи:

July 1 => 34
May 14 => 1
Oct 31 => 2
July 4 => 2

Это код гольф, поэтому выигрывает самая короткая подача

(В качестве неоплаченного бонуса мне интересно посмотреть, какой день с наибольшим количеством очков)


Можно ли использовать API Википедии?
LegionMammal978

Я мало что знаю об этом, поэтому не решаюсь сказать «да», если в этом есть тривиальная функция. Используйте свое лучшее суждение, и если это делает это слишком легким, пожалуйста, воздержитесь
wnnmaw

9
Так, ссылки на Canadaville , Canadair , Canadarm , Canadaga , Canadarago , Canaday , Canadaspis и др. рассчитывать?
msh210

@ msh210, да, что они делают
wnnmaw

1
1 июля - день с наибольшим количеством! Написал быструю программу для него, хотя это не игра в гольф.
Андрей

Ответы:


4

Pyth, 31 байт

/jk'+"http://enwp.org/"z"Canada

Не работает онлайн-реализация, сервер отключает доступ в интернет. Я хотел использовать http://wki.pe/July_1, но, к сожалению, это перенаправление на стороне клиента, поэтому он выбирает не ту страницу. Формат входного сигнала July_1.

Код в основном просто:

"".join(open("http://enwp.org/"+input())).count("Canada")

24

Баш, 43 42 40 байт

curl -L enwp.org/$@|grep -o Canada|wc -l

Использует curl, grepи wcдля подсчета случаев «Канада» на указанной веб-странице. Как и другие ответы, ввод дается в формате July_1. Это мой первый пост на Code Golf SE, и я не совсем знаком со всеми правилами. Любая обратная связь будет приветствоваться.

Не осознавал, что вывод на STDERR традиционно игнорируется. Спасибо за 3 байта, Деннис !


Но все curl -sLравно не будет короче wget -qO-?
Ник Маттео

1
Вывод в STDERR по умолчанию игнорируется , поэтому вы можете использовать curlбез -s(или wgetбез -q).
Деннис

@ Деннис Спасибо! Я не знал, что STDERRигнорируется. Очень признателен.
Шрирам

@kundor Это хороший момент. Почему-то объединение двух флагов мне никогда не приходило в голову. Тем не менее, поскольку вывод STDERRпо умолчанию игнорируется, было бы короче -sполностью опустить его .
Шрирам

15

Perl 5, 39 байт

38 байт, плюс 1 -peвместо-e

$_=()=`curl -L enwp.org/$_`=~/Canada/g

Принимает участие как July_1.

Спасибо busukxuan за то, что он спас мне семь байтов.


1
Я не знаком с curl, но возможно ли сохранить шесть байтов "http: //"?
Busukxuan

1
@busukxuan, да, большое спасибо.
msh210

7

Python 3.5, 117 111 98 90 байт

( -8 байт ( 98 -> 90) благодаря alexwlchan )

from urllib.request import*
lambda i:urlopen('http://enwp.org/'+i).read().count(b"Canada")

Просто использует встроенную в Python библиотеку «urllib» для извлечения данных HTML, а затем подсчитывает вхождения слов «Canada» в эти данные. Постараюсь и больше играть в гольф, где и когда смогу. Вызовите его, переименовав lambdaфункцию во что угодно, а затем вызвав это имя как обычную функцию, заключенную в оболочку print(). Например, если функция была названа H, вы бы назвали ее так print(H(Month_Day)).


4
Я думаю, что вы можете сохранить восемь символов, заменив .decode().count("Canada")на .count(b"Canada").
alexwlchan

@alexwlchan Да, вы правы. Благодарность! :)
Р. Кап

Конечно, это будет короче в Python 2, так как urllib.urlopenфункция не находится в подпакете (по from urllib import*сравнению с from urllib.request import*), и ее b"Canada"можно заменить на, "Canada"так как строки Python 2 по умолчанию являются байтами. Я считаю 81 байт в Python 2, и он работает в соответствии с моим тестированием.
Мего

5

Mathematica, 60 байт

Import["http://enwp.org/"<>#,"Source"]~StringCount~"Canada"&

Анонимная функция. Аналогично решению Perl 5, принимает входные данные, как July_1.


Просто для того, чтобы замкнуть цикл, такое использование API совершенно нормально
wnnmaw

5

PowerShell, 52 байта

((iwr enwp.org/$($args[0]))-csplit"Canada").length-1
  • Введите как July_1.
  • iwrэто сокращение от Invoke-WebRequest.
  • $($args[0])это первый аргумент командной строки. Запустить скрипт как OhCanada.ps1 July_1.
  • -csplit чувствительно к регистру.

5

C #, 85 байт

return Regex.Matches(new WebClient().DownloadString("http://enwp.org/"+d),"Canada").Count;

Принимает участие dкак July_1.

И July_1 это действительно День Канады, имеющий больше всего упоминаний. С February_1и April_23делят 2-е место с 18 "Canada"с каждый.

Найти "Canada"день (параллельно), 207 байт:

return Enumerable.Range(0,366).Select(i=>new DateTime(8,1,1).AddDays(i).ToString("MMMM_d")).AsParallel().OrderBy(d=>Regex.Matches(new WebClient().DownloadString("http://enwp.org/"+d),"Canada").Count).Last();

(Год 8 - високосный год с самым коротким представлением). Потенциально неэффективно, так как, OrderByвероятно, генерирует> 366 веб-вызовов, но просто уходит короче и, кажется, завершается не намного быстрее.


4

R, 99 96 байт

x = function (d) {p = readLines (paste0 (" http://enwp.org/ ", d)); sum (nchar (p) -nchar (gsub ("Canada", "", p))) / 6}

d=scan(,"");p=readLines(paste0("http://enwp.org/",d));sum(nchar(p)-nchar(gsub("Canada","",p)))/6

Он принимает ввод d в форме "July_1" и возвращает количество Канад. Он подсчитывает слова путем подсчета количества символов на странице, затем удаляет слово «Канада» со страницы и снова подсчитывает количество символов. Количество раз, которое Канада показывает, является разницей в этих подсчетах, деленной на количество букв в Канаде, 6.

редактировать: я ценю совет ниже о замене моей функции сканирования.


Я думаю, что вы можете удалить x=function(d){и заменить его на d=scan(,'')создание программы вместо функции и сохранение некоторых байтов.
pajonk

Благодарность! Это сэкономило три байта. Я не использовал сканирование раньше.
Остин

4

ES6, 89 байт

d=>fetch('http://enwp.org/'+d).then(r=>r.text().then(t=>alert(t.split`Canada`.length-1)))

Печально Развертывание всех обещаний наказывает размер: /


Хороший ответ, добро пожаловать на сайт!
DJMcMayhem

1
Пара комментариев. Вы можете применить тот же July_1трюк «входные данные в формате », что и остальные вопросы, чтобы сохранить несколько байтов. У вас также есть ошибка использования split().length(), которая даст вам ответ больше, чем цель.
Иван Санчес

Согласитесь с @IvanSanchez в отношении формата ввода и необходимости -1после .length, но вы можете сохранить несколько байтов, пропустив https:часть URL, и использовать split'Canada'(но с обратными галочками!) Вместо того, split('Canada')чтобы сохранить еще пару!
Дом Гастингс

Вау понятия не имел о бэктиках! Я сделал упомянутые изменения.
YardGlassOfCode

Firefox позволяет вам бросить //после http.
user2428118

3

Ruby + curl, 44 байта

p`curl -L enwp.org/#$_`.scan(/Canada/).size

ruby -n+ 43 байта. Принимает участие как July_1.


2

Clojure, 71 байт

#(count(re-seq #"Canada"(slurp(str"https://en.wikipedia.org/wiki/"%))))

Да, было бы неплохо использовать, http://enwp.orgно я думаю slurp, не обрабатывает перенаправления (?). Анонимная функция, которая принимает день в формате «July_1».


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.