แผนที่ขี้โกง!


10

หลังจากส่งการมอบหมายทั้งหมดพจนานุกรมจะถูกสร้างขึ้นเพื่อจับคู่หมายเลขนักเรียนกับแฮชของไฟล์

พจนานุกรมหรือ hashmap นี้หรือการจับคู่ (สิ่งที่ภาษาของคุณเรียกว่า) จะมีลักษณะดังนี้:

{100: "aabb", 104: "43a", 52: "00ab", 430: "aabb", 332: "43a"}

กุญแจสำคัญคือหมายเลขนักเรียนและค่าคือแฮช

หน้าที่ของเราคือเลือกคนขี้โกง! คนขี้โกงคือคนที่มีแฮชเหมือนกัน

ได้รับการป้อนข้อมูลที่{100: "aabb", 104: "43a", 52: "00ab", 430: "aabb", 332: "43a"}ฟังก์ชั่นควรกลับ (หรือพิมพ์) ข้อความต่อไปนี้:

100 has identical files to 430

104 has identical files to 332

สังเกตว่าไฟล์ที่แฮชนั้นไม่เหมือนใคร

นอกจากนี้คำสั่งซื้อก็มีความสำคัญเช่นกัน:

{100: "aabb", 202: "aabb", 303: "ab", 404: "aabb"} ควรกลับ (พิมพ์) ข้อความต่อไปนี้:

100 has identical files to 202,404

มันเป็นความไม่ถูกต้องในการพิมพ์ใด ๆ ต่อไปนี้:

202 has identical files to 100,404

100 has identical files to 404, 202

คุณควรพิมพ์ในลักษณะที่ปรากฏในพจนานุกรม ในบางภาษาการอ่านพจนานุกรมเป็นแบบสุ่มดังนั้นในกรณีพิเศษนี้คุณได้รับอนุญาตให้เปลี่ยนวิธีการป้อนข้อมูลเพื่อให้คุณสามารถอ่านได้อย่างเป็นระเบียบ

ตัวอย่างเพิ่มเติม:

{} # prints nothing

{100: "ab", 303: "cd"} # prints nothing again

{100: "ab", 303: "cd", 404: "ab"}

100 has identical files to 404

{303: "abc", 304: "dd", 305: "abc", 405: "dd", 606: "abc"}

303 has identical files to 305,606

304 has identical files to 405

รหัสที่สั้นที่สุดชนะ!


"คุณควรพิมพ์ในลักษณะที่ปรากฏในพจนานุกรม" - ฉันไม่แน่ใจว่าสิ่งนี้หมายความว่าอย่างไร ไม่อย่างนั้นฉันก็ชอบความท้าทาย
Giuseppe

3
ฉันขอแนะนำให้ใช้แซนด์บ็อกซ์ก่อนโพสต์ในเว็บไซต์หลักได้หรือไม่ มีประโยชน์เสมอที่จะได้รับการแก้ไขคำถามก่อนโพสต์แทนการรับล้านความคิดเห็นสำหรับการชี้แจงในหลัก :-)
จูเซปเป้

1
ในกรณีที่พบกลุ่มคนขี้โกงหลายกลุ่มจะต้องมีการสั่งซื้อระหว่างกลุ่มหรือไม่? ตัวอย่างเช่นในกรณีทดสอบล่าสุดสามารถพิมพ์ "304 มี ... " ก่อน "303 มี ... " ได้หรือไม่
Kamil Drakari

2
เราได้รับอนุญาตให้ส่งออก303 has identical files to [305, 606]แทน303 has identical files to 305,606?
Kevin Cruijssen

1
ในภาษาที่ไม่มีพจนานุกรมแผนที่หรือประเภทแฮชแมปจะอนุญาตรายการของสิ่งอันดับ (หรือเทียบเท่า) ได้หรือไม่

คำตอบ:


2

JavaScript (โหนดบาเบล) 113 ไบต์

รับอินพุตเป็นอาร์เรย์ของอาร์เรย์ใน[key, value]รูปแบบ Go go gadget double flatMap!

o=>o.flatMap(([x,h],i)=>(a=o.flatMap(([y,H],j)=>j>i&H==h?(o[j]=[,j],[y]):[]))+a?x+' has identical files to '+a:a)

ลองออนไลน์!


JavaScript (โหนดบาเบล) , 114 ไบต์

รับอินพุตเป็นอ็อบเจ็กต์ JS ดั้งเดิม

o=>Object.keys(o).flatMap((x,i,a)=>(a=a.filter(y=>i--<0&o[y]==o[x]&&(o[y]=y)))+a?x+' has identical files to '+a:a)

ลองออนไลน์!


1
ดีจริงๆ! ค่อนข้างไฟล์ใหญ่ แต่แล้วอีกครั้งฉันไม่ได้คาดหวังว่าปัญหานี้จะเป็นเรื่องง่ายเหมือนคนอื่น ๆ การทำงานที่ดี! ฉันจะดูสิ่งนี้เพิ่มเติมflatMap
K Split X

@KSplitX flatMapยังไม่รองรับอย่างกว้างขวาง ฉันแน่ใจว่ามีวิธีที่สั้นกว่านี้ แต่มันก็สายไปแล้วและฉันก็คิดอะไรไม่ออกอีกแล้ว : p
Arnauld

2

Python 2 , 127 126 bytes

def f(x):
 for l in{`[K for K,V in x if v==V]`[1:-1]for k,v in x}:
	if','in l:print l.replace(',',' has identical files to',1)

ลองออนไลน์!

ใช้รายการของคู่ที่เรียงลำดับ(<studentNumber>,<hash>)เป็นอินพุต


พลาดสนามกอล์ฟขนาดเล็ก:if','in
Vedant Kandoi

@Vedant Kandoi: ขอบคุณ!
Chas Brown

1

เรติน่า 0.8.2 , 71 ไบต์

+m`((:.+)$(¶|.)+?)^(.+)\2$
,$4$1
:.*

G`,
%1`,
 has identical files to 

ลองออนไลน์! รับอินพุตเป็นบรรทัดแยกกัน แต่ลิงก์รวมชุดทดสอบที่แยกตัวอย่างให้คุณ คำอธิบาย:

+

ทำซ้ำการแข่งขันนี้จนกว่าจะไม่สามารถทำการเปลี่ยนตัวได้อีก

m`((:.+)$(¶|.)+?)^(.+)\2$
,$4$1

ค้นหาคู่ของแฮชการจับคู่และผนวกคีย์ของการจับคู่ที่สองเข้ากับการจับคู่ครั้งแรกด้วยตัวคั่นจุลภาค

:.*

ลบแฮชทั้งหมด

G`,

เก็บเฉพาะบรรทัดด้วยเครื่องหมายจุลภาค

%1`,
 has identical files to 

แทนที่เครื่องหมายจุลภาคแรกในแต่ละบรรทัดด้วยข้อความที่ต้องการ (รวมถึงช่องว่างต่อท้าย)


1

R , 145 132 129 126 124 ไบต์

function(m,`!`=names)for(e in !(t=table(m))[t>1])cat(el(n<-!m[m==e]),'has identical files to',paste(n[-1],collapse=','),'
')

ลองออนไลน์!

ใช้ชื่อเวกเตอร์เป็นอินพุต (ชื่อคือคีย์)

  • -2 ไบต์ขอบคุณ Giuseppe

หากอนุญาตให้ใช้", "ตัวคั่น (เว้นวรรคหลังจากเครื่องหมายจุลภาค) ในกรณีที่มีหลายรายการซ้ำกันเราสามารถใช้รหัสนี้และบันทึก 10 ไบต์:

R , 114 ไบต์

function(m,`!`=names)for(e in !(t=table(m))[t>1])cat(el(n<-!m[m==e]),'has identical files to',toString(n[-1]),'
')

ลองออนไลน์!


124 ไบต์แม้ว่าความกล้าของฉันบอกฉันว่าวิธีการที่แตกต่างกันอาจให้ผลบางอย่างในช่วง 115 ...
Giuseppe

0

05AB1E , 34 ไบต์

Σθ}.γθ}vyg1›iy€нć“ÿ€°Ê¼‡œ€„ “?',ý,

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Σθ}                   # Sort the (implicit) input by the string
.γθ}                  # Then group it by the string
v                     # Loop `y` over each grouped inner list
 yg1i                #  If the group contains more than 1 key-value pairs:
      y€н             #   Only leave the keys
      ć               #   Pop and push the head and rest of the list separately
                      #   (with the head being at the top of the stack now)
       “ÿ€°Ê¼‡œ€„    #   Compressed string "ÿ has identical files to "
                      #   where the "ÿ" is automatically replaced with the top of the stack
                   ?  #   Print it (without trailing newline)
       ',ý           '#   Join the remaining numbers by a comma
          ,           #   And output it as well (with trailing newline)

เห็นนี้ 05AB1E คำตอบของฉัน (ส่วนวิธีการใช้พจนานุกรม? )จะเข้าใจว่าทำไมเป็น“ÿ€°Ê¼‡œ€„ “"ÿ has identical files to "




0

C # (Visual C # Interactive Compiler) , 130 ไบต์

a=>a.GroupBy(x=>x.Value,x=>x.Key).Where(x=>x.Count()>1).Select(x=>x.First()+" has identical files to "+String.Join(",",x.Skip(1)))

ลองออนไลน์!

สิ่งที่แปลกเกี่ยวกับคำถามนี้คือตัวอย่างที่ให้ไว้ในรูปแบบ JSON เป็นคู่ของคีย์ / ค่าซึ่งมักแสดงว่าไม่ได้สั่ง ... ในกรณีนี้คำสั่งซื้อเป็นสิ่งสำคัญ ด้วยเหตุนี้ฉันจึงใช้รายการของ tuples สำหรับอินพุตและรายการสตริงเป็นเอาต์พุต

// a is a list of tuples
// (student #, hash)
a=>a
  // group by hash
  // grouped items are the student #'s
  .GroupBy(x=>x.Value,x=>x.Key)
  // remove single student groups
  .Where(x=>x.Count()>1)
  // format the output strings
  .Select(x=>x.First()+
    " has identical files to "+
    String.Join(",",x.Skip(1)))


0

Japt , 34 ไบต์

üÌl>1 ®mgîÎ+` •s ÅÁÈól fÅC ‘ `+ZÅ

ลองออนไลน์!

ตอนนี้มันไม่สอดคล้องกันเล็กน้อยในการเรียงลำดับบรรทัด หากบรรทัดของเอาต์พุตต้องอยู่ในลำดับที่ระบุจะใช้เวลาไม่กี่ไบต์ อินพุตเป็นเพียงอาร์เรย์ของ[id, hash]คู่

คำอธิบาย:

üÌ                                    :Group by hash
  l>1                                 :Remove the ones that are unique
      ®mgà                            :Get just the Ids
          ®                           :Generate a string for each hash:
           Î                          : The first Id with that hash
            +` •s ÅÁÈól fÅC ‘ `       : Plus " has identical files to " compressed
                               +ZÅ    : Plus the remaining Ids
                                      : Implicitly comma delimited

0

Perl 6 , 115 110 103 ไบต์

-2 ไบต์ขอบคุณ Jo King

{unique map {.[0]~" has identical files to "~join ',',.skip},grep *>1,.map:{.grep(*{*}eq$^p{*})>>.key}}

ลองออนไลน์!

รับรายการคู่เนื่องจากไม่มีการเรียงลำดับแฮช รายการของรายการองค์ประกอบสองอย่างจะช่วยประหยัดสองสามไบต์ แต่ดูเหมือนจะไม่มีความหมาย ส่งคืนรายการบรรทัด

95 88 ไบต์หากลำดับของบรรทัดในผลลัพธ์ไม่สำคัญ:

*.classify(*{*}){*}>>.key.grep(*>1).map:{.[0]~" has identical files to "~join ',',.skip}

ลองออนไลน์!


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