Gerçekten Kanada Günü miydi?


22

1 Temmuz Kanada günüdür (yay Kanada)! Yoksa öyle mi? Görünen o ki, Wikipedia sayfasının Kanada ile ilgili çok fazla içeriği var, ancak daha fazla Kanadalı olan başka bir gün var mı?

Göreviniz girdi olarak tarih (ay ve gün) alan ve girilen tarih için Wikipedia sayfasındaki "Kanada" ifadelerinin sayısını döndüren veya çıkaran bir program veya işlev yazmaktır. Bazı kurallar:

  • Tarihler seçtiğiniz herhangi bir makul biçimde girilebilir
  • Gönderiniz, url'den veri almalıdır en.wikipedia.org/wiki/Month_Day.
  • Yalnızca "Canada"içerilen alt dizgiler için aranmalı ve sayılmalıdır, yalnızca başlık durumunda. "Canadian"sayılmaz, ancak "Canada's"sayılır. Kesin olarak, büyük / küçük harf duyarlı metin "Canada"bir dizgede var olduğu sürece, bir eşleşme olur.
  • Sayfanın içeriği, ilgili .htmldosyadaki herhangi bir şey olarak kabul edilir (yani, bir sayfa olarak indirir .htmlve Not Defteri'nde açarsanız ne gösterir )
  • Sonuç, STDOUT'a gönderilebilir, iade edilebilir veya başka herhangi bir makul şekilde gösterilebilir.

Test Durumları:

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

Bu kod golf, yani en kısa gönderim kazanıyor

(Kazanılmamış bir bonus olarak, en yüksek sayıma sahip günün ne olduğunu görmek isterim)


Wikipedia API kullanılabilir mi?
LegionMammal978 17

Bunun hakkında fazla bir şey bilmiyorum, bu yüzden önemsiz bir işlevin olması durumunda evet demekte tereddüt ediyorum. En iyi kararınızı kullanın ve eğer çok kolay hale
getirirse,

9
Bu nedenle, Canadaville , Canadair , Canadarm , Canadaga , Canadarago , Canaday , Canadaspis ve ark. saymak?
msh210

@ msh210, Evet, öyle yaparlar
wnnmaw

1
1 Temmuz, en fazla sayılan gündür! Golf olmasa da bunun için hızlı bir program yazdım.
Andrew,

Yanıtlar:


4

Pyth, 31 bayt

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

Çevrimiçi uygulama üzerinde çalışmaz, sunucu İnternet erişimini devre dışı bırakır. Http://wki.pe/July_1 kullanmak istedim ama ne yazık ki bu bir müşteri tarafı yönlendirmesidir, bu yüzden yanlış sayfayı alır. Giriş formatı July_1.

Kod temelde sadece:

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

24

Bash, 43 42 40 bayt

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

Kullanımları curl, grepve wcbelirtilen web sayfasında "Kanada" yineleme sayısını. Diğer cevaplar gibi girdiler de verilir July_1. Bu benim ilk kez Golf Golf SE'de yayınladığım ve tüm kuralları tam olarak bilmiyorum. Herhangi bir geri bildirim en hoş geldiniz.

Bu çıktının geleneksel olarak görmezden gelindiğinin farkında değildim STDERR . 3 bayt için teşekkürler, Dennis !


Ama curl -sLyine de daha kısa olmaz mıydı wget -qO-?
Nick Matteo,

1
STDERR'ye çıkış varsayılan olarak dikkate alınmaz , bu yüzden curlolmadan -s(veya wgetolmadan -q) kullanabilirsiniz.
Dennis,

@Dennis Teşekkürler! Bunun STDERRgöz ardı edildiğini bilmiyordum . Çok takdir.
Sriram

@kundor Bu iyi bir nokta. Bazı nedenlerden dolayı, iki bayrak birleştirmek bana hiç gelmedi. Yine de, çıktısı STDERRvarsayılan olarak göz ardı edildiğinden -stümüyle atlamak daha kısa olacaktır .
Sriram

15

Perl 5, 39 bayt

38 bayt, artı 1 -peyerine-e

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

Gibi girdi alır July_1.

Beni yedi bayt kurtardığı için busukxuan'a teşekkür ederim .


1
Curl ile aşina değilim, ancak "http: //" nin altı baytını kaydetmek mümkün mü?
busukxuan

1
@ busukxuan, evet, çok teşekkürler.
msh210

7

Python 3.5, 117 111 98 90 bayt

( -8 bytes ( 98 -> 90) alexwlchan sayesinde )

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

HTML verilerini almak için Python'un yerleşik "urllib" kitaplığını kullanır ve ardından bu verilerdeki "Kanada" kelimesini tekrar eder. Nerede ve ne zaman yapabilirim, zamanla daha çok golf oynayacak. İşleve lambdaherhangi bir şeyi yeniden adlandırarak ve sonra bu adı sararak normal bir işlev gibi çağırarak arayın print(). Mesela, eğer işlev isimlendiyse H, buna benzer şekilde çağırırdınız print(H(Month_Day)).


4
Sana değiştirerek sekiz karakter kaydedebilirsiniz düşünüyorum .decode().count("Canada")ile .count(b"Canada").
alexwlchan

@alexwlchan Evet, haklısınız. Teşekkürler! :)
R. Kap

Elbette bu, Python 2'de daha kısa olacaktır, çünkü urllib.urlopenişlev bir alt pakette değildir ( from urllib import*karşı from urllib.request import*) ve Python 2'nin dizeleri varsayılan olarak bayt olduğundan b"Canada", ile değiştirilebilir "Canada". Python 2'de 81 bayt sayıyorum ve testime göre çalışıyor.
Mego

5

Mathematica, 60 bayt

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

Anonim işlev Perl 5 çözümüne benzer şekilde girdi alır July_1.


Sadece döngüyü kapatmak için, API'nin bu kullanımı tamamen iyidir
wnnmaw

5

PowerShell, 52 bayt

((iwr enwp.org/$($args[0]))-csplit"Canada").length-1
  • Olarak giriş yapın July_1.
  • iwriçin kısa Invoke-WebRequest.
  • $($args[0])ilk komut satırı argümanıdır. Komut dosyasını şu şekilde başlat OhCanada.ps1 July_1.
  • -csplit büyük küçük harfe duyarlıdır.

5

C #, 85 bayt

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

dGibi girdi alır July_1.

Ve July_1 olan Kanada Günü çoğu referansları olan, gerçekten. İle February_1ve April_2318 ile 2. sırada yer paylaşan "Canada"her bir s.

"Canada"Günü bul (paralel olarak), 207 bayt:

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

(Yıl 8, en kısa temsili olan artık yıldır). Potansiyel olarak verimsiz, OrderBymuhtemelen> 366 web araması yapıyor, ancak daha kısa sürüyor ve çok daha kısa sürede tamamlanmış gibi görünüyor.


4

R, 99 96 bayt

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

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

Bu, d girdisini "July_1" biçiminde alır ve Kanada sayısını döndürür. Sayfadaki karakter sayısını sayarak kelimeleri sayar, ardından Kanada kelimesini sayfadan kaldırır ve karakterleri tekrar sayar. Kanada’nın gösterme sayısı, bu sayılardaki farkın, Kanada’daki harf sayısına bölünmesiyle, 6.

düzenleme: İşlevimi taramayla değiştirmekle ilgili aşağıdaki ipucunu takdir ediyorum.


İşlev yerine program yaparak ve bazı baytları kaydederek bırakıp x=function(d){değiştirebileceğinizi düşünüyorum d=scan(,'').
pajonk

Teşekkürler! Bu üç bayt kurtardı. Daha önce tarama yapmamıştım.
Austin,

4

ES6, 89 bayt

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

Ne yazık ki tüm vaatlerin açılması, söz konusu bedeli cezalandırır: /


Güzel cevap, siteye hoş geldiniz!
DJMcMayhem

1
Çift yorum. Aynı "giriş biçiminde July_1" hilesini birkaç sorudan tasarruf etmek için geri kalan sorulara uygulayabilirsiniz. Ayrıca, split().length()hedeften daha büyük bir yanıt verecek olan bir hatayı kullanıyorsunuz .
IvanSanchez

Giriş biçimine @IvanSanchez ile Anlaştı ve gerek -1sonra .length, ancak atlanması ile bazı bayt kaydedebilirsiniz https:URL'nin bir kısmını ve kullanılmasını split'Canada'yerine (ama ters tırnakların ile!) split('Canada')Daha birkaç kurtarmak için!
Dom Hastings

Vay be backticks hakkında hiçbir fikri yoktu! Belirtilen değişiklikleri yaptım.
YardGlassOfCode

Firefox //sonradan bırakmanızı sağlar http.
user2428118

3

Ruby + curl, 44 bayt

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

ruby -n+ 43 bayt. Gibi girdi alır July_1.


2

Clojure, 71 bayt

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

Evet, kullanımı iyi olurdu http://enwp.orgama sanırım slurpyönlendirmelerle baş etmiyor (?). "July_1" biçiminde gün alan adsız işlev.


2

PHP, 65 bayt

echo substr_count(file_get_contents('http://enwp.org'),'Canada');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.