เป็นวันแคนาดาจริงๆเหรอ?


22

วันที่ 1 กรกฎาคมเป็นวันแคนาดา (yay Canada)! หรือมันคืออะไร? ดูเหมือนว่าหน้าWikipediaสำหรับวันนี้มีเนื้อหาเกี่ยวกับประเทศแคนาดาจำนวนมาก แต่มีอีกวันไหนที่เป็นชาวแคนาดามากกว่า

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นซึ่งใช้วันที่ (เดือนและวัน) เป็นข้อมูลป้อนเข้าและส่งคืนหรือส่งออกจำนวนการกล่าวถึง "แคนาดา" บนหน้า Wikipedia สำหรับวันที่ป้อน กฎบางอย่าง:

  • วันที่อาจถูกป้อนในรูปแบบที่เหมาะสมตามที่คุณเลือก
  • การส่งของคุณจะต้องดึงข้อมูลจาก en.wikipedia.org/wiki/Month_DayURL
  • เพียง แต่"Canada"จะต้องมีการค้นหาและนับสตริงรวมและเฉพาะในกรณีที่ชื่อ "Canadian"ไม่นับ แต่"Canada's"จะนับ ตราบใดที่ข้อความที่ตรงตามตัวพิมพ์ใหญ่ - เล็ก"Canada"อยู่ในสตริงมันคือการจับคู่
  • เนื้อหาของหน้าจะถูกพิจารณาว่าเป็น.htmlไฟล์ใด ๆ ภายในไฟล์ที่เกี่ยวข้อง(เช่นสิ่งที่ปรากฏขึ้นหากคุณดาวน์โหลดเป็นหน้า.htmlและเปิดใน Notepad)
  • ผลลัพธ์อาจถูกส่งออกไปยัง STDOUT ส่งคืนหรือแสดงในลักษณะอื่นใดที่สมเหตุสมผล

กรณีทดสอบ:

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

นี่คือรหัสกอล์ฟดังนั้นการส่งที่สั้นที่สุดจึงชนะ

(ในฐานะที่เป็นโบนัสที่ไม่มีการส่งต่อฉันสนใจที่จะดูว่าวันใดที่มีจำนวนมากที่สุด)


Wikipedia API สามารถใช้งานได้หรือไม่
LegionMammal978

ฉันไม่ค่อยรู้อะไรเกี่ยวกับมันดังนั้นฉันลังเลที่จะพูดว่าใช่ในกรณีที่มีฟังก์ชั่นเล็กน้อย ใช้วิจารณญาณที่ดีที่สุดของคุณและถ้ามันง่ายเกินไปโปรดงด
wnnmaw

9
ดังนั้นการอ้างอิงถึงCanadaville , Canadair , Canadarm , Canadaga , Canadarago , Canaday , Canadaspis , et al. นับ?
msh210

@ msh210, ใช่แล้วพวกเขาทำ
wnnmaw

1
วันที่ 1 กรกฎาคมเป็นวันที่มีจำนวนสูงสุด! เขียนโปรแกรมด่วนสำหรับมันแม้ว่ามันจะไม่ได้กอล์ฟ
Andrew

คำตอบ:


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

Bash, 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-หรือ
Nick Matteo

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
ฉันไม่คุ้นเคยกับการม้วน แต่เป็นไปได้หรือไม่ที่จะบันทึกหกไบต์ของ "http: //"
busukxuan

1
@ busukxuan อ๋อขอบคุณมาก
msh210

7

Python 3.5, 117 111 98 90 ไบต์

( -8 bytes ( 98 -> 90) ขอบคุณalexwlchan )

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

เพียงใช้ห้องสมุด "urllib" ในตัว Python เพื่อดึงข้อมูล HTML แล้วนับจำนวนคำว่า "แคนาดา" ในข้อมูลนั้น จะลองและเล่นกอล์ฟมากขึ้นเมื่อเวลาผ่านไปที่ไหนและเมื่อไหร่ เรียกว่าโดยการเปลี่ยนชื่อฟังก์ชั่นเพื่ออะไรแล้วเรียกชื่อเหมือนการทำงานตามปกติในห่อที่lambda print()ตัวอย่างเช่นถ้าฟังก์ชั่นได้รับการตั้งชื่อแล้วคุณจะเรียกมันเหมือนHprint(H(Month_Day))


4
ฉันคิดว่าคุณสามารถบันทึกแปดตัวอักษรโดยการแทนที่ด้วย.decode().count("Canada") .count(b"Canada")
alexwlchan

@alexwlchan ใช่คุณพูดถูก ขอบคุณ! :)
R. Kap

แน่นอนว่าสิ่งนี้จะสั้นกว่าใน Python 2 เนื่องจากurllib.urlopenฟังก์ชั่นไม่ได้อยู่ในแพ็คเกจย่อย ( from urllib import*เทียบกับfrom urllib.request import*) และb"Canada"สามารถแทนที่ด้วย"Canada"เนื่องจากสตริงของ Python 2 เป็นไบต์ตามค่าเริ่มต้น ฉันนับ 81 ไบต์ใน Python 2 และทำงานได้ตามการทดสอบของฉัน
Mego

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การป้อนข้อมูลเป็น
  • iwrInvoke-WebRequestสั้นสำหรับ
  • $($args[0])เป็นอาร์กิวเมนต์บรรทัดคำสั่งแรก OhCanada.ps1 July_1สคริปต์เริ่มต้นเป็น
  • -csplit แยกตัวพิมพ์เล็กและใหญ่

5

C #, 85 ไบต์

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

จะเข้าเช่นdJuly_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 ("แคนาดา", "", p))) / 6}

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

ซึ่งจะป้อนข้อมูลในรูปแบบ "July_1" และส่งกลับจำนวนของแคนาดา มันนับคำโดยนับจำนวนตัวอักษรในหน้าจากนั้นลบคำแคนาดาออกจากหน้าและนับจำนวนตัวอักษรอีกครั้ง จำนวนครั้งที่แคนาดาปรากฏขึ้นคือความแตกต่างในการนับเหล่านี้หารด้วยจำนวนตัวอักษรในแคนาดา 6

แก้ไข: ฉันขอขอบคุณเคล็ดลับด้านล่างเกี่ยวกับการแทนที่ฟังก์ชั่นของฉันด้วยการสแกน


ฉันคิดว่าคุณสามารถวางx=function(d){และแทนที่ด้วยd=scan(,'')การทำโปรแกรมแทนฟังก์ชั่นและบันทึกบางไบต์
pajonk

ขอบคุณ! ที่บันทึกไว้สามไบต์ ฉันไม่เคยใช้การสแกนมาก่อน
Austin

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

เห็นด้วยกับ @IvanSanchez ในรูปแบบอินพุตและต้องการ a -1หลัง.lengthแต่คุณสามารถบันทึกไบต์บางส่วนได้โดยละเว้นhttps:ส่วนของ URL และใช้split'Canada'(แต่มี backticks!) แทนที่จะsplit('Canada')บันทึกอีกสองสามอย่าง!
Dom Hastings

ว้าวไม่มีความคิดเกี่ยวกับ backticks! ฉันได้ทำการเปลี่ยนแปลงที่กล่าวถึง
YardGlassOfCode

Firefox ช่วยให้คุณลดลงหลังจาก// http
2428118


2

Clojure, 71 ไบต์

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

ใช่มันน่าใช้http://enwp.orgแต่ฉันเดาslurpว่าไม่ได้จัดการกับการเปลี่ยนเส้นทาง (?) ฟังก์ชั่นไม่ระบุชื่อซึ่งใช้เวลาทั้งวันในรูปแบบ "July_1"


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.