Це був справді день Канади?


22

1 липня - день Канади (так, Канада)! Або це? Здається, що сторінка Вікіпедії на цей день має багато вмісту, пов’язаного з Канадою, але чи є ще один день, який є більш канадським?

Ваше завдання - написати програму або функцію, яка приймає дату (місяць і день) як вхід і повертає або виводить кількість згадок про "Канаду" на сторінці Вікіпедії для введеної дати. Деякі правила:

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

Випробування:

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

Це код гольфу, тому виграє найкоротше подання

(Як неоплачений бонус, мені цікаво подивитися, який день з найбільшою кількістю)


Чи можна використовувати API Wikipedia?
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).
Денніс

@Dennis Дякую! Я не знав, що 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")

Просто використовуйте вбудовану бібліотеку "urllib" Python для отримання HTML-даних, а потім підраховує в цих даних слова "Канада". Спробую і більше гольфу з часом де і коли можу. Викличте його, перейменувавши 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

Математика, 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 = функція (d) {p = readLines (paste0 (" http://enwp.org/ ", d)); sum (nchar (p) -nchar (gsub ("Канада", "", p))) / 6}

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

Це приймає вхід d у формі "липень_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.
користувач2428118

3

Рубін + завиток, 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, не обробляє переадресації (?). Анонімні функції, які проходять у форматі "липень_1".


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.