Mapuj oszustów!

10

Po przesłaniu wszystkich zadań tworzony jest słownik, który odwzorowuje liczbę studentów na skrót ich pliku.

Ten słownik, mapa skrótów lub mapowanie (niezależnie od tego, jak nazywa się Twój język) będzie wyglądać następująco:

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

Kluczem jest numer studenta, a wartością jest skrót.

Naszym zadaniem jest wybranie oszustów! Oszuści to ci, którzy mają identyczne hasze.

Biorąc pod uwagę dane wejściowe {100: "aabb", 104: "43a", 52: "00ab", 430: "aabb", 332: "43a"}, funkcja powinna zwrócić (lub wydrukować) następujący tekst:

100 has identical files to 430

104 has identical files to 332

Zauważ, że pliki, dla których skróty są unikalne, nie są wymieniane.

Ważna jest również kolejność :

{100: "aabb", 202: "aabb", 303: "ab", 404: "aabb"} powinien zwrócić (wydrukować) następujący tekst:

100 has identical files to 202,404

Jest to błędne wydrukować dowolny z poniższych sytuacji:

202 has identical files to 100,404

100 has identical files to 404, 202

Powinieneś wydrukować go pod kątem wyglądu w słowniku. W niektórych językach przeglądanie słownika jest losowe, więc w tym szczególnym przypadku możesz zmienić metodę wprowadzania, tak abyś mógł przeglądać go w uporządkowany sposób.

Więcej przykładów:

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

Najkrótszy kod wygrywa!

K Split X
źródło
„Powinieneś wydrukować go pod kątem wyglądu w słowniku” - nie jestem do końca pewien, co to oznacza. W przeciwnym razie podoba mi się wyzwanie.
Giuseppe,
3
Czy mogę również polecić korzystanie z piaskownicy przed opublikowaniem na głównej stronie? zawsze pomocne, aby uzyskać poprawki do pytania przed opublikowaniem zamiast miliona komentarzy w celu wyjaśnienia na temat głównego :-)
Giuseppe
1
Czy w przypadku znalezienia wielu grup oszustów wymagana jest kolejność między grupami? Na przykład w ostatnim przypadku testowym można wydrukować „304 ma ...” przed „303 ma ...”?
Kamil Drakari,
2
Czy wolno nam wyprowadzać dane 303 has identical files to [305, 606]zamiast 303 has identical files to 305,606?
Kevin Cruijssen,
1
Czy w językach, w których nie istnieje typ słownika, mapy lub mapy skrótów, dozwolone są listy krotek (lub odpowiedniki)?

Odpowiedzi:

2

JavaScript (węzeł Babel) , 113 bajtów

Pobiera dane wejściowe jako tablicę tablic w [key, value]formacie. Go Go gadżet podwójnie płaski

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)

Wypróbuj online!


JavaScript (węzeł Babel) , 114 bajtów

Pobiera dane wejściowe jako rodzimy obiekt 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)

Wypróbuj online!

Arnauld
źródło
1
Bardzo miłe! Całkiem duży plik, ale z drugiej strony nie spodziewałem się, że ten problem będzie tak łatwy jak inne. Świetna robota! Przyjrzę się temu więcejflatMap
K Split X
@KSplitX flatMapnie jest jeszcze powszechnie obsługiwany. Jestem pewien, że są krótsze drogi, ale robi się późno i nie mogę już myśleć. : p
Arnauld,
2

Python 2 , 127 126 bajtów

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)

Wypróbuj online!

Pobiera na (<studentNumber>,<hash>)wejściu listę uporządkowanych par .

Chas Brown
źródło
Brakowało małego golfa:if','in
Vedant Kandoi
@Vedant Kandoi: Dzięki!
Chas Brown,
1

Retina 0.8.2 , 71 bajtów

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

G`,
%1`,
 has identical files to 

Wypróbuj online! Pobiera dane w osobnych wierszach, ale link zawiera zestaw testów, który dzieli dla ciebie przykłady. Wyjaśnienie:

+

Powtarzaj ten mecz, dopóki nie będzie można dokonać żadnej wymiany.

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

Wyszukaj pary pasujących skrótów i dołącz klucz drugiego dopasowania do klucza pierwszego dopasowania za pomocą separatora przecinków.

:.*

Usuń wszystkie skróty.

G`,

Zachowaj tylko linie z przecinkami.

%1`,
 has identical files to 

Zastąp pierwszy przecinek w każdym wierszu żądanym tekstem (w tym spacją końcową).

Neil
źródło
1

R , 145 132 129 126 124 bajtów

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

Wypróbuj online!

Jako dane wejściowe przyjmuje nazwany wektor (nazwy to klucze)

  • -2 bajty dzięki Giuseppe

Jeśli ", "separator (ze spacją po przecinku) jest dozwolony w przypadku wielu duplikatów, możemy użyć tego kodu i zapisać 10 bajtów:

R , 114 bajtów

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

Wypróbuj online!

digEmAll
źródło
124 bajty, chociaż moje jelita mówią, że inne podejście może dać coś w zakresie 115 ...
Giuseppe,
0

05AB1E , 34 bajty

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

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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

Zobacz moją odpowiedź 05AB1E (sekcja Jak korzystać ze słownika? ), Aby zrozumieć, dlaczego tak “ÿ€°Ê¼‡œ€„ “jest "ÿ has identical files to ".

Kevin Cruijssen
źródło
0

Rubin , 98 96 bajtów

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

Wypróbuj online!

Pobiera dane jako Ruby Hash, zwraca przez drukowanie.

Kirill L.
źródło
0

C # (interaktywny kompilator Visual C #) , 130 bajtów

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

Wypróbuj online!

Dziwną rzeczą w tym pytaniu jest to, że przykłady podano w formacie JSON jako pary klucz / wartość, co zwykle implikuje, że są nieuporządkowane ... W tym przypadku jednak kolejność jest ważna. Jako taki używam listy krotek dla danych wejściowych i listy ciągów jako danych wyjściowych.

// 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)))
dana
źródło
0

Perl 5, 100 +1 (-n) bajtów

for$x(/[a-z]+/g){($t,@a)=${h{$x}}++?():/\d+(?= $x)/g;@a&&say"$t has identical files to ",join",",@a}

Wypróbuj online!

Nahuel Fouilleul
źródło
0

Japt , 34 bajty

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

Wypróbuj online!

W tej chwili jest to trochę niespójne w porządkowaniu linii, ale w linii wyświetla się poprawnie. Jeśli wiersze danych wyjściowych muszą być w określonej kolejności, zajmie to jeszcze kilka bajtów. Dane wejściowe to tylko tablica [id, hash]par

Wyjaśnienie:

üÌ                                    :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
Kamil Drakari
źródło
0

Perl 6 , 115 110 103 bajtów

-2 bajty dzięki Jo King

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

Wypróbuj online!

Pobiera listę par, ponieważ skróty są nieuporządkowane. Lista dwuelementowych list zaoszczędziłaby kilka bajtów, ale wydaje się jednoznaczna. Zwraca listę wierszy.

95 88 bajtów, jeśli kolejność linii w wyniku nie ma znaczenia:

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

Wypróbuj online!

nwellnhof
źródło
.[1..*]do.skip
Jo King,