Карта читеров!

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

Самый короткий код выигрывает!

К Сплит Х
источник
«Вы должны напечатать это с точки зрения того, как оно появляется в словаре» - я не совсем уверен, что это значит. В противном случае мне нравится вызов.
Джузеппе
3
Могу ли я также предложить использование песочницы перед публикацией на главном сайте? всегда полезно получить поправки к вопросу перед публикацией, вместо того, чтобы получать миллион комментариев для разъяснения по основному :-)
Джузеппе
1
В случае, если найдено несколько групп читеров, существует ли требуемый порядок между группами? Например, в последнем контрольном примере можно ли напечатать «304 имеет ...», прежде чем «303 имеет ...»?
Камиль Дракари
2
Разрешено ли выводить 303 has identical files to [305, 606]вместо 303 has identical files to 305,606?
Кевин Круйссен
1
В языках, где нет словаря, карты или типа hashmap, разрешены ли списки кортежей (или их эквивалентов)?

Ответы:

2

JavaScript (Babel Node) , 113 байт

Принимает ввод в виде массива массивов в [key, value]формате. Go Go Gadget двойной плоский карта!

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)

Попробуйте онлайн!

Arnauld
источник
1
Действительно мило! Довольно большой файл, но опять же я не ожидал, что эта проблема будет такой же легкой, как и другие. Отличная работа! Я посмотрю больше на этоflatMap
K Split X
@KSplitX flatMapпока широко не поддерживается. Я уверен, что есть более короткие пути, но уже поздно, и я не могу больше думать. : p
Арно
2

Python 2 , 127 126 байтов

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
Ведант Кандой
@ Ведант Кандой: Спасибо!
Час Браун
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]),'
')

Попробуйте онлайн!

digEmAll
источник
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 #) , 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)))
Dana
источник
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}

Попробуйте онлайн!

nwellnhof
источник
.[1..*]к.skip
Джо Кинг