Картуйте шахраїв!


10

Після подання всіх завдань створюється словник, який відображає номер студента до хеша їхнього файлу.

Цей словник, або хешмап, або відображення (незалежно від вашої мови називається) виглядатиме так:

{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

Найкоротший код виграє!


"Ви повинні надрукувати його з точки зору того, як це відображається у словнику" - я не зовсім впевнений, що це означає. Інакше мені подобається виклик.
Джузеппе

3
Можна також запропонувати використовувати пісочницю перед публікацією на головному сайті? завжди корисно переглядати питання перед публікацією, замість того, щоб отримувати мільйон коментарів для роз'яснень щодо основного :-)
Джузеппе

1
У випадку, коли виявлено кілька груп шахраїв, чи потрібний порядок між групами? Наприклад, чи в останньому тестовому випадку може бути надруковано "304 має ..." перед "303 має ..."?
Каміль Дракарі

2
Чи дозволяється нам виводити 303 has identical files to [305, 606]замість 303 has identical files to 305,606?
Кевін Круїссен

1
Мови, де тип словника, карти чи хешмапу не існує, дозволені списки кортежів (або їх аналогів)?

Відповіді:


2

JavaScript (Babel Node) , 113 байт

Приймає введення як масив масивів у [key, value]форматі. Ідіть гаджет подвійний 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 (Babel Node) , 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 Спліт X

@KSplitX flatMapще не підтримується широко. Я впевнений, що існують більш короткі шляхи, але вже пізно, і я не можу більше думати. : p
Арнольд


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 байти завдяки Джузеппе

Якщо ", "роздільник (з пробілом після коми) дозволений у випадку декількох дублікатів, ми можемо використовувати цей код і зберегти 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 ...
Джузеппе

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 як пари ключів / значень, що зазвичай означає, що вони не мають упорядкованості ... Однак у цьому випадку важливий порядок. Як такий, я використовую список кортежів для введення та список рядків як вихід.

// 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 байти завдяки Джо Кінгу

{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
Джо Кінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.