ขอแสดงความยินดีกับการได้รับ 10,000 ชื่อเสียง!


19

หลังจาก@ MartinBüttnerประสบความสำเร็จตรง 10,000 ชื่อเสียงตอนนี้เรามีสามแถวเต็มรูปแบบของ 10k ผู้ใช้บนหน้าผู้ใช้ ! ตอนนี้เนื่องจากเราเป็นโปรแกรมเมอร์ทั้งหมดที่นี่เราจึงชอบทำสิ่งต่างๆโดยอัตโนมัติแทนที่จะทำด้วยตนเอง ความท้าทายของคุณคือการเขียนโปรแกรมเพื่อแสดงความยินดีกับผู้ใช้ใหม่ 10k โดยอัตโนมัติ

สเปค

อินพุต

อินพุตจะเป็นnบรรทัดของตัวเลขคั่นด้วยช่องว่าง (หากคุณต้องการคุณอาจใช้รายการหมายเลขคั่นด้วยเครื่องหมายจุลภาคหนึ่งรายการหากทำให้รหัสของคุณสั้นลง) ตัวอย่างเช่น:

10 20 30 40 50
15 25 35 45 55
20 30 40 50 60

หรือ:

10 20 30 40 50,15 25 35 45 55,20 30 40 50 60

แต่ละรายการตัวเลขแสดงรายการค่าชื่อเสียงของผู้ใช้ในหนึ่งวัน

เอาท์พุต

ผลลัพธ์จะเป็นจำนวนnบรรทัดเดียวกัน(หรือรายการที่คั่นด้วยเครื่องหมายจุลภาคที่มีความยาวเท่ากัน) แต่ละรายการ / รายการจะเป็น:

  • :D หากมีผู้ใช้ที่มีชื่อเสียงกลายเป็น> = 10,000
    • คั่นด้วยช่องว่างหลายรายการ:Dถ้ามีผู้ใช้หลายคนที่พบหรือผ่านการนับ 10,000 ตัวแทน ตัวอย่างเช่น:D :D :Dสำหรับผู้ใช้ใหม่ 10k 3 ราย
  • :( จากนั้นหยุดเอาต์พุตต่อไปหากอินพุตไม่ชัดเจนหรือเป็นไปไม่ได้ (เพิ่มเติมในหัวข้อถัดไป)
  • ไม่มีอะไรหากเงื่อนไขเหล่านี้ไม่เป็นจริง

ความคลุมเครือ

เป็นไปได้ว่าอินพุตนั้นไม่ชัดเจน สำหรับจุดประสงค์ของการท้าทายนี้เราถือว่า:

  • หมวกชื่อเสียงคือ 200 ต่อวันโดยไม่คำนึงถึงการยอมรับและรางวัลและชอบเพื่อประโยชน์ของความท้าทาย
  • ผู้ใช้ต้องไม่เสียชื่อเสียง (เพื่อความเรียบง่ายและเพื่อความท้าทาย)

การป้อนข้อมูลจะถูกพิจารณาว่าไม่ชัดเจนเมื่อไม่สามารถกำหนดได้ว่าค่าชื่อเสียงใดที่สอดคล้องกับผู้ใช้รายใด ตัวอย่างเช่นในอินพุต10 20,30 40คุณไม่สามารถบอกได้ว่าผู้ใช้ 10-rep กลายเป็นผู้ใช้ 30-rep หรือผู้ใช้ 40-rep

การป้อนข้อมูลนั้นถือว่าเป็นไปไม่ได้เมื่อผู้ใช้จากวันหนึ่งอาจไม่สามารถกลายเป็นผู้ใช้ในวันถัดไปได้ ตัวอย่างเช่นในอินพุต10 20,310 320สถานการณ์นี้เป็นไปไม่ได้อย่างชัดเจนเพราะผู้ใช้ไม่สามารถได้รับ 300 ชื่อเสียงในหนึ่งวัน ผู้ใช้ที่เสียชื่อเสียงก็เป็นไปไม่ได้เช่นกัน

กรณีขอบ

  • ค่าชื่อเสียงเริ่มต้นสามารถเริ่มต้นได้ทุกอย่าง (เช่นผู้ใช้สามารถเริ่มต้นด้วยชื่อเสียง 1337)
  • ไม่มีผลลัพธ์สำหรับรายการบรรทัด / รายการแรก
  • อินพุตจะมีความถูกต้องทางไวยากรณ์เสมอซึ่งหมายความว่าค่าชื่อเสียงจะเป็นจำนวนเต็มบวกเสมอจะมีมูลค่าชื่อเสียงเท่ากันต่อรายการบรรทัด / รายการเป็นต้น
  • ค่าชื่อเสียงจะไม่ถูกจัดเรียง; พวกเขาอาจอยู่ในลำดับใด ๆ

กรณีทดสอบ

อินพุต: 9900,10000
เอาต์พุต::D

อินพุต: 9900 9950 9910,10100 9950 9910,10300 10150 10110
เอาต์พุต::D,:D :D

อินพุต: 10 20 30,42 10 20,10 242 20,442 42 10,0 0 0,442 42 10
เอาต์พุต:,,,:(

อินพุต: 10 20,15 25,15 25
เอาต์พุต:,,

อินพุต: 9999 9998 9997,10000 9998 9997,10000 10000 9997,10300 10000 10000
เอาต์พุต::D,:D,:(

อินพุต: 100,90,80,70
เอาต์พุต::(

อินพุต: 10000 10000 10000 9999,10000 10000 10000 10000,10010 10020 10030 10040
เอาต์พุต::D,:(

อินพุต: 9999 9998 9997 9996,10196 10197 10198 10199,10399 10199 10197 10196
เอาต์พุต::D :D :D :D,


@ MartinBüttnerอ่าไม่ได้สังเกตว่า แก้ไขแล้ว
Doorknob

ขั้นตอนแรกในตัวอย่างนั้นยังคลุมเครือ
Martin Ender

1
ในขณะที่ตัวอย่างที่ 4 ไม่ชัดเจน
Martin Ender

(i.e. a user can start with 1337 reputation).ฉันชอบ coz นี้ที่เป็นตัวแทนของฉัน ... wel 5 นาทีที่ผ่านมาจนกระทั่งมีคน upvoted หนึ่งในคำตอบของฉัน xD
Teun Pronk

ตัวอย่างที่ 5 ขั้นตอนที่ 2 นั้นคลุมเครือเช่นกัน กันไปตัวอย่างเช่น 7 (เว้นแต่คุณเพิ่มกฎบางอย่างที่ผู้ใช้ rep-เท่ากันไม่เกี่ยวข้อง แต่แล้วคุณจะรู้ได้อย่างไรว่าผู้ใช้คนใดเป็นคนไหนในวันแรกถ้าเขาผูกกับคนอื่นในภายหลัง)
Martin Ender

คำตอบ:


12

Ruby, 209 ไบต์

แก้ไข:ฉันเปลี่ยนเป็น Ruby ซึ่งย่อขนาดรายการนี้ประมาณ 30% ดูประวัติการแก้ไขสำหรับเวอร์ชัน Mathematica ต้นฉบับ ฉันคิดว่าเงินออมหลักมาจากรูบี้ที่permutationไม่เพิกเฉยต่อตำแหน่งสลับขององค์ประกอบที่เหมือนกัน

สิ่งนี้ใช้รูปแบบที่คั่นด้วยบรรทัดใหม่

gets.split('
').map{|s|s.split.map &:to_i}.each_cons(2){|a,b|a.permutation.map{|q|q.zip(b).map{|x,y|y-x}}.reject{|d|d.any?{|x|x<0||x>200}}.size!=1?abort(':('):(puts':D '*(a.count{|d|d<1e4}-b.count{|d|d<1e4}))}

ส่วนสำคัญคือ:

  • รับคู่วันติดต่อกันทั้งหมด
  • รับการเรียงสับเปลี่ยนทั้งหมดของวันก่อนหน้าและลบสิ่งเหล่านี้ออกจากวันที่ปัจจุบัน
  • ทิ้งผลลัพธ์ทั้งหมดที่มีความแตกต่างที่เป็นค่าลบหรือมากกว่า 200
  • ถ้าจำนวนพีชคณิตที่เหลือที่ไม่ได้เป็นที่ 1, :(เอาท์พุท
  • มิฉะนั้นส่งออกมาก:Dเท่าที่มีผู้ใช้ใหม่ 10k
  • :(ตอนปลายลดลงทุกวันหลังจากที่ครั้งแรก

หักกอล์ฟ:

gets.split("\n").map{|s|
  s.split.map &:to_i
}.each_cons(2){|a,b|
  a.permutation.map{|q|
    q.zip(b).map{|x,y|
      y-x
    }
  }.reject{|d|
    d.any?{|x|
      x<0||x>200
    }
  }.size!=1 ? abort(':(') : (puts ':D '*(a.count{|d|d<1e4}-b.count{|d|d<1e4}))
}

ฉันคิดว่านั่นเป็นห่วงโซ่ที่สวยงามของผู้แจกแจง :)

PS: แปลกไหมที่ฉันเป็นคนแรกที่ส่งคำตอบถึงเรื่องนี้?


8
ฉันไม่คิดว่ามันแปลก มีบางอย่างบอกฉันว่าคุณมีความได้เปรียบในสนามบ้าน;)
งานอดิเรกของ Calvin

ดังนั้นนี่จะทำให้ตัวอย่างบางส่วนของคำถามล้มเหลวใช่ไหม
Cruncher

@ Cruncher มันจะล้มเหลวที่ฉันคิดว่าผิดตามสเป็ค (ตามที่ฉันได้กล่าวไว้ในความคิดเห็น) ถ้า Doorknob ตัดสินใจเปลี่ยนข้อมูลจำเพาะแทนที่จะแก้ไขตัวอย่างฉันเดาว่าฉันจะต้องทำใหม่
Martin Ender

@ MartinBüttnerนั่นคือสิ่งที่ฉันคิด เพียงยืนยัน :)
Cruncher

6

Haskell, 254 249 244 232 228

import Data.List
t=m(9999<)
p(a:b:r)=(a,b,r)%(filter(all(`elem`[0..200]))$nub$m(zipWith(-)b)$permutations a)
p _=""
(a,b,r)%(_:[])=(concat$m(const":D ")$t b\\t a)++'\n':p(b:r)
_%_=":("
m=map
main=interact$p.m(m read.words).lines

คำอธิบายเล็กน้อย: อัลกอริทึมคล้ายกับที่MartinBüttnerใช้มากยกเว้นnubว่าฉันใช้ความคิดไป ทราบว่ามีความแตกต่างในรายชื่อที่จะใช้สำหรับการทำงานออกวิธีการหลายชื่อเสียงมากขึ้นค่าเป็น 10000 หรือมีขนาดใหญ่ในวันที่ 1 + n t b\\t aเมื่อเทียบกับวันของโรงเรียน:

ฉันยังเห็นด้วยกับMartinBüttnerเกี่ยวกับการตีความรายละเอียดและตัวอย่างบางส่วนข้างต้นนั้นผิดแม้กระทั่งตัวอย่างที่ # 2 ผิด (ควรเป็น:()


คุณไม่ควรฉายาmap?
ภูมิใจ haskeller

1
ที่เหมาะสม (ประหยัด 2 ไบต์) แต่อีก 10 ไบต์จะถูกบันทึกไว้โดยการzมัดและแทนที่ด้วยreplicate (length l) x map (const x) lHaskell นั้นยอดเยี่ยมใช่ไหม
TheSpanishInquisition

แน่ใจ. เล่นกอล์ฟได้ดี! ในบันทึกย่อนั้นเนื่องจากแอปพลิเคชันฟังก์ชั่นมีลำดับความสำคัญสูงสุดคุณควรจะย่อ(t b)\\(t a)ให้สั้นลงt b\\t aและออกไปอีก 4 ไบต์
ภูมิใจ haskeller

มันคงจะดีถ้ามีรหัสบางอย่างที่จะหาสถานที่เหล่านี้ซึ่งรหัสสามารถย่อให้สั้นลงโดยอัตโนมัติ ... ดูเหมือนว่าโครงการจะใหญ่ไปสักหน่อย
ภูมิใจ haskeller

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