Mapa de los tramposos!

10

Después de enviar todas las tareas, se crea un diccionario que asigna el número de estudiante al hash de su archivo.

Este diccionario, o hashmap, o mapeo (como lo llame su idioma) se verá de la siguiente manera:

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

La clave es el número de estudiante y el valor es el hash.

¡Nuestra tarea es elegir a los tramposos! Los tramposos son los que tienen hashes idénticos.

Dada la entrada {100: "aabb", 104: "43a", 52: "00ab", 430: "aabb", 332: "43a"}, la función debería devolver (o imprimir) el siguiente texto:

100 has identical files to 430

104 has identical files to 332

Observe cómo no se mencionan los archivos donde los hashes son únicos.

Además, el orden es importante aquí :

{100: "aabb", 202: "aabb", 303: "ab", 404: "aabb"} debe devolver (imprimir) el siguiente texto:

100 has identical files to 202,404

Es incorrecto imprimir cualquiera de los siguientes:

202 has identical files to 100,404

100 has identical files to 404, 202

Debe imprimirlo en términos de cómo aparece en el diccionario. En algunos idiomas, pasar por un diccionario es aleatorio, por lo que en este caso especial, se le permite cambiar el método de entrada de modo que pueda pasarlo de manera ordenada.

Más ejemplos:

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

¡El código más corto gana!

K Split X
fuente
"Debería imprimirlo en términos de cómo aparece en el diccionario". No estoy completamente seguro de lo que esto significa. De lo contrario, me gusta el desafío.
Giuseppe
3
¿Puedo sugerir también usar el sandbox antes de publicar en el sitio principal? siempre es útil obtener revisiones a una pregunta antes de publicarla en lugar de recibir un millón de comentarios para aclarar sobre main :-)
Giuseppe
1
En el caso de que se encuentren múltiples grupos de tramposos, ¿hay un orden requerido entre los grupos? Por ejemplo, en el último caso de prueba, ¿se puede imprimir "304 tiene ..." antes de "303 tiene ..."?
Kamil Drakari
2
¿Se nos permite producir en 303 has identical files to [305, 606]lugar de 303 has identical files to 305,606?
Kevin Cruijssen
1
En los idiomas donde no existe un diccionario, mapa o tipo de mapa hash, ¿se permiten listas de tuplas (o equivalentes)?

Respuestas:

2

JavaScript (nodo de Babel) , 113 bytes

Toma la entrada como una matriz de matrices en [key, value]formato. 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)

Pruébalo en línea!


JavaScript (nodo de Babel) , 114 bytes

Toma entrada como un objeto JS nativo.

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)

Pruébalo en línea!

Arnauld
fuente
1
¡Muy agradable! Un archivo bastante grande pero, una vez más, no esperaba que este problema fuera tan fácil como los otros. ¡Buen trabajo! Voy a ver más sobre estoflatMap
K Split X
@KSplitX flatMapaún no es ampliamente compatible. Estoy seguro de que hay formas más cortas, pero se está haciendo tarde y no puedo pensar más. : p
Arnauld
2

Python 2 , 127 126 bytes

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)

Pruébalo en línea!

Toma una lista de pares ordenados (<studentNumber>,<hash>)como entrada.

Chas Brown
fuente
Perdió un pequeño golf:if','in
Vedant Kandoi
@Vedant Kandoi: ¡Gracias!
Chas Brown
1

Retina 0.8.2 , 71 bytes

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

G`,
%1`,
 has identical files to 

Pruébalo en línea! Toma datos en líneas separadas pero el enlace incluye un conjunto de pruebas que divide los ejemplos por usted. Explicación:

+

Repita este partido hasta que no se puedan hacer más reemplazos.

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

Busque pares de hashes coincidentes y agregue la clave de la segunda coincidencia a la de la primera coincidencia con un separador de coma.

:.*

Eliminar todos los hashes.

G`,

Mantenga solo las líneas con comas.

%1`,
 has identical files to 

Reemplace la primera coma en cada línea con el texto deseado (incluido el espacio final).

Neil
fuente
1

R , 145 132 129 126 124 bytes

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

Pruébalo en línea!

Toma un vector con nombre como entrada (los nombres son las claves)

  • -2 bytes gracias a Giuseppe

Si ", "se permite el separador (con un espacio después de la coma) en caso de múltiples duplicados, podemos usar este código y guardar 10 bytes:

R , 114 bytes

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

Pruébalo en línea!

digEmAll
fuente
124 bytes, aunque mi instinto me dice que un enfoque diferente podría producir algo en el rango de 115 ...
Giuseppe
0

05AB1E , 34 bytes

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

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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

Ver esta respuesta 05AB1E mío (sección Cómo usar el diccionario? ) Para entender por qué “ÿ€°Ê¼‡œ€„ “es "ÿ has identical files to ".

Kevin Cruijssen
fuente
0

Ruby , 98 96 bytes

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

Pruébalo en línea!

Toma datos como Ruby Hash, regresa imprimiendo.

Kirill L.
fuente
0

C # (compilador interactivo de Visual C #) , 130 bytes

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

Pruébalo en línea!

Lo extraño de esta pregunta es que los ejemplos se dan en formato JSON como pares clave / valor, lo que generalmente implica que no están ordenados ... En este caso, sin embargo, el orden es importante. Como tal, estoy usando una lista de tuplas para entrada y una lista de cadenas como salida.

// 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
fuente
0

Perl 5, 100 +1 (-n) bytes

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

Pruébalo en línea!

Nahuel Fouilleul
fuente
0

Japt , 34 bytes

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

Pruébalo en línea!

En este momento es un poco inconsistente en el orden de las líneas, pero dentro de una línea sale correctamente. Si las líneas de la salida necesitan estar en un orden específico, tomará unos pocos bytes más. La entrada es solo un conjunto de [id, hash]pares

Explicación:

üÌ                                    :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
fuente
0

Perl 6 , 115 , 110, 103 bytes

-2 bytes gracias a Jo King

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

Pruébalo en línea!

Toma una lista de pares ya que los hashes no están ordenados. Una lista de listas de dos elementos ahorraría unos pocos bytes pero parece unidiomática. Devuelve una lista de líneas.

95 88 bytes si el orden de las líneas en el resultado no importa:

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

Pruébalo en línea!

nwellnhof
fuente
.[1..*]a.skip
Jo King