Petakan curang!


10

Setelah semua tugas diserahkan, kamus dibuat yang memetakan nomor siswa ke hash file mereka.

Kamus ini, atau hashmap, atau pemetaan (apa pun bahasa Anda menyebutnya) akan terlihat sebagai berikut:

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

Kuncinya adalah nomor siswa, dan nilainya adalah hash.

Tugas kita adalah untuk memilih curang! Curang adalah orang-orang yang memiliki hash identik.

Diberikan input {100: "aabb", 104: "43a", 52: "00ab", 430: "aabb", 332: "43a"}, fungsi harus mengembalikan (atau mencetak) teks berikut:

100 has identical files to 430

104 has identical files to 332

Perhatikan bagaimana file di mana hash unik tidak disebutkan.

Juga, urutannya penting di sini :

{100: "aabb", 202: "aabb", 303: "ab", 404: "aabb"} harus mengembalikan (mencetak) teks berikut:

100 has identical files to 202,404

Tidak benar untuk mencetak salah satu dari yang berikut:

202 has identical files to 100,404

100 has identical files to 404, 202

Anda harus mencetaknya dalam hal bagaimana itu muncul dalam kamus. Dalam beberapa bahasa, membaca kamus adalah acak, jadi dalam kasus khusus ini, Anda diizinkan untuk mengubah metode input sehingga Anda dapat menjalaninya secara teratur.

Lebih banyak contoh:

{} # 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

Kode terpendek menang!


"Anda harus mencetaknya dengan cara tampilan di kamus" - Saya tidak sepenuhnya yakin apa artinya ini. Kalau tidak, saya suka tantangannya.
Giuseppe

3
Bisakah saya juga menyarankan menggunakan kotak pasir sebelum memposting ke situs utama? selalu membantu untuk mendapatkan revisi atas pertanyaan sebelum mengirim alih-alih mendapatkan sejuta komentar untuk klarifikasi pada utama :-)
Giuseppe

1
Dalam kasus di mana beberapa kelompok penipu ditemukan, apakah ada urutan yang diperlukan antar kelompok? Sebagai contoh, dalam test case terakhir dapatkah "304 memiliki ..." dicetak sebelum "303 memiliki ..."?
Kamil Drakari

2
Apakah kita diizinkan untuk menghasilkan 303 has identical files to [305, 606]bukan 303 has identical files to 305,606?
Kevin Cruijssen

1
Dalam bahasa di mana kamus, peta, atau tipe peta hash tidak ada, apakah daftar tupel (atau yang setara) diizinkan?

Jawaban:


2

JavaScript (Babel Node) , 113 byte

Mengambil input sebagai array array dalam [key, value]format. 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)

Cobalah online!


JavaScript (Babel Node) , 114 byte

Mengambil input sebagai objek JS asli.

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)

Cobalah online!


1
Benar-benar bagus! File yang cukup besar tapi sekali lagi saya tidak berharap masalah ini semudah yang lain. Kerja bagus! Saya akan melihat lebih dalamflatMap
K Split X

@KSplitX flatMapbelum didukung secara luas. Saya yakin ada cara yang lebih pendek, tetapi sudah larut dan saya tidak bisa berpikir lagi. : p
Arnauld

2

Python 2 , 127 126 byte

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)

Cobalah online!

Mengambil daftar pasangan yang dipesan (<studentNumber>,<hash>)sebagai input.


Melewatkan golf kecil:if','in
Vedant Kandoi

@Vedant Kandoi: Thx!
Chas Brown

1

Retina 0.8.2 , 71 byte

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

G`,
%1`,
 has identical files to 

Cobalah online! Mengambil input pada baris yang berbeda tetapi tautan menyertakan test suite yang membagi contoh untuk Anda. Penjelasan:

+

Ulangi pertandingan ini sampai tidak ada lagi penggantian yang dapat dilakukan.

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

Cari pasangan hash yang cocok dan tambahkan kunci dari pertandingan kedua dengan pertandingan pertama dengan pemisah koma.

:.*

Hapus semua hash.

G`,

Hanya simpan garis dengan koma.

%1`,
 has identical files to 

Ganti koma pertama pada setiap baris dengan teks yang diinginkan (termasuk spasi tambahan).


1

R , 145 132 129 126 124 byte

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=','),'
')

Cobalah online!

Dibutuhkan vektor bernama sebagai input (nama adalah kunci)

  • -2 byte terima kasih kepada Giuseppe

Jika ", "pemisah (dengan spasi setelah koma) diizinkan jika ada beberapa duplikat, kita dapat menggunakan kode ini dan menyimpan 10 byte:

R , 114 byte

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

Cobalah online!


124 byte meskipun usus saya mengatakan kepada saya pendekatan yang berbeda mungkin menghasilkan sesuatu dalam kisaran 115 ...
Giuseppe

0

05AB1E , 34 byte

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

Cobalah online atau verifikasi semua kasus uji .

Penjelasan:

Σθ}                   # 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)

Lihat ini jawaban 05AB1E saya (bagian Cara menggunakan kamus? ) Untuk memahami mengapa “ÿ€°Ê¼‡œ€„ “adalah "ÿ has identical files to ".


0

Ruby , 98 96 byte

->h{h.group_by{|k,v|v}.map{|k,v|x,*y=v.to_h.keys;p"#{x} has identical files to #{y*?,}"if y[0]}}

Cobalah online!

Mengambil input sebagai Ruby Hash, kembali dengan mencetak.



0

C # (Visual C # Interactive Compiler) , 130 byte

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

Cobalah online!

Yang aneh tentang pertanyaan ini adalah bahwa contoh-contoh diberikan dalam format JSON sebagai pasangan kunci / nilai yang biasanya menyiratkan bahwa mereka tidak berurutan ... Dalam hal ini, urutan adalah penting. Karena itu, saya menggunakan daftar tupel untuk input dan daftar string sebagai output.

// 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 byte

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

Cobalah online!

Saat ini agak tidak konsisten dalam memesan garis, tetapi dalam garis itu output dengan benar. Jika garis-garis output perlu dalam urutan tertentu, itu akan membutuhkan beberapa byte lagi. Input hanyalah sebuah array[id, hash] berpasangan

Penjelasan:

üÌ                                    :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 byte

-2 byte terima kasih kepada Jo King

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

Cobalah online!

Mengambil daftar Pasangan karena hash tidak tertata. Daftar daftar dua elemen akan menghemat beberapa byte tetapi tampaknya tidak otomatis. Mengembalikan daftar garis.

95 88 byte jika urutan garis dalam hasil tidak masalah:

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

Cobalah online!


.[1..*]ke.skip
Jo King
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.