Hile yapanlar harita!


10

Tüm ödevler gönderildikten sonra, öğrenci numarasını dosyalarının karmasıyla eşleyen bir sözlük oluşturulur.

Bu sözlük veya hashmap veya haritalama (diliniz ne olursa olsun) aşağıdaki gibi görünecektir:

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

Anahtar öğrenci numarasıdır ve değer hash değeridir.

Bizim görevimiz dolandırıcıları seçmek! Hile yapanların özleri aynıdır.

Giriş verildiğinde, {100: "aabb", 104: "43a", 52: "00ab", 430: "aabb", 332: "43a"}işlev aşağıdaki metni döndürmeli (veya yazdırmalıdır):

100 has identical files to 430

104 has identical files to 332

Karmaların benzersiz olduğu dosyaların nasıl belirtilmediğine dikkat edin.

Ayrıca, sipariş burada önemlidir :

{100: "aabb", 202: "aabb", 303: "ab", 404: "aabb"} aşağıdaki metni döndürmeli (yazdırmalı):

100 has identical files to 202,404

Öyle yanlış aşağıdakilerden herhangi yazdırmak için:

202 has identical files to 100,404

100 has identical files to 404, 202

Sözlükte nasıl göründüğüne göre yazdırmalısınız. Bazı dillerde, bir sözlükten geçmek rastgeledir, bu nedenle bu özel durumda, giriş yöntemini düzenli bir şekilde geçebileceğiniz şekilde değiştirmenize izin verilir.

Daha fazla örnek:

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

En kısa kod kazanır!


"Bunu sözlükte nasıl göründüğüne göre yazdırmalısınız" - Bunun ne anlama geldiğinden tam olarak emin değilim. Aksi takdirde meydan okumayı sevdim.
Giuseppe

3
Ana siteye göndermeden önce korumalı alanı kullanmanızı da önerebilir miyim ? ana açıklama için bir milyon yorum almak yerine yayınlamadan önce bir soru için revizyonlar almak her zaman yararlı :-)
Giuseppe

1
Birden fazla dolandırıcı grubunun bulunduğu durumda, gruplar arasında gerekli bir düzen var mı? Örneğin, son test durumunda "304 var ...", "303 var ..." dan önce yazdırılabilir mi?
Kamil Drakari

2
303 has identical files to [305, 606]Bunun yerine çıktı almamıza izin var 303 has identical files to 305,606mı?
Kevin Cruijssen

1
Sözlük, harita veya hashmap türünün bulunmadığı dillerde tuples (veya eşdeğeri) listelerine izin veriliyor mu?

Yanıtlar:


2

JavaScript (Babel Düğümü) , 113 bayt

Girdiyi [key, value]formattaki diziler dizisi olarak alır . Git gadget çift flatMap gidin!

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)

Çevrimiçi deneyin!


JavaScript (Babel Düğümü) , 114 bayt

Girdiyi yerel JS nesnesi olarak alır.

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)

Çevrimiçi deneyin!


1
Gerçekten hoş! Oldukça büyük bir dosya ama yine de bu sorunun diğerleri kadar kolay olmasını beklemiyordum. Harika iş! Buna daha fazla bakacağımflatMap
K Split X

@KSplitX flatMaphenüz geniş çapta desteklenmemektedir. Eminim daha kısa yollar vardır, ama geç oluyor ve artık düşünemiyorum. : p
Arnauld

2

Python 2 , 127126 bayt

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)

Çevrimiçi deneyin!

(<studentNumber>,<hash>)Girdi olarak sıralı çiftlerin bir listesini alır .


Küçük bir golf if','in
kaçırdı

@Vedant Kandoi: Teşekkürler!
Chas Brown

1

Retina 0.8.2 , 71 bayt

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

G`,
%1`,
 has identical files to 

Çevrimiçi deneyin! Ayrı satırlarda girdi alır, ancak bağlantı sizin için örnekleri ayıran test paketini içerir. Açıklama:

+

Başka değişiklik yapılamayacak kadar bu maçı tekrarlayın.

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

Eşleşen karma çiftlerini arayın ve ikinci eşleşmenin anahtarını virgül ayırıcıyla ilk eşleşmenin anahtarına ekleyin.

:.*

Tüm karmaları silin.

G`,

Yalnızca virgül içeren satırları saklayın.

%1`,
 has identical files to 

Her satırdaki ilk virgül ile istenen metni değiştirin (sondaki boşluk dahil).


1

R , 145 132 129 126 124 bayt

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

Çevrimiçi deneyin!

Adlandırılmış bir vektörü girdi olarak alır (adlar anahtarlardır)

  • Giuseppe sayesinde -2 bayt

Birden ", "çok kopya olması durumunda ayırıcıya (virgülden sonra boşluk bırakarak) izin verilirse, bu kodu kullanabilir ve 10 bayt kaydedebiliriz:

R , 114 bayt

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

Çevrimiçi deneyin!


Bağırsaklar bana farklı bir yaklaşımın 115 aralığında bir şey getirebileceğini
Giuseppe

0

05AB1E , 34 bayt

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

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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

Neden “ÿ€°Ê¼‡œ€„ “olduğunu anlamak için bu 05AB1E cevabım bölümüne ( Sözlük nasıl kullanılır? ) Bakın"ÿ has identical files to " .


0

Yakut , 98 96 bayt

->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]}}

Çevrimiçi deneyin!

Girişi Ruby Hash olarak alır, yazdırarak geri döner.



0

C # (Görsel C # Etkileşimli Derleyici) , 130 bayt

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

Çevrimiçi deneyin!

Bu sorudaki garip şey, örneklerin JSON biçiminde anahtar / değer çiftleri olarak verilmesi ve genellikle sıralanmamış olduklarını gösterir ... Ancak bu durumda düzen önemlidir. Bu nedenle, girdi için tuples listesini ve çıktı olarak dizelerin listesini kullanıyorum.

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

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

Çevrimiçi deneyin!

Şu anda satırların sıralamasında biraz tutarsız, ancak bir satırda doğru çıktı. Çıktı satırlarının belirli bir sırada olması gerekiyorsa, birkaç bayt daha alacaktır. Giriş yalnızca bir [id, hash]çift dizidir

Açıklama:

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

Jo King sayesinde -2 bayt

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

Çevrimiçi deneyin!

Karmalar sıra dışı olduğundan, Çiftlerin bir listesini alır. İki elemanlı listelerin listesi birkaç bayt tasarruf eder, ancak tekdüze olmayan görünür. Bir satır listesi döndürür.

95 88 bayt sonuçtaki satırların sırası önemli değilse:

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

Çevrimiçi deneyin!


.[1..*]için.skip
Jo Kral
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.