Escriba un programa que tome como entrada 2 matrices enteras y devuelva un valor verdadero si existe un elemento que esté presente en ambas matrices, o uno falso de lo contrario. La solución obvia a este problema sería iterar a través de cada elemento en el primer conjunto y compararlo con cada elemento en el segundo, pero aquí está el truco: su programa debe tener una complejidad algorítmica como máximo, en el peor de los casos, O ( NlogN), donde N es la longitud de la matriz más larga,
Casos de prueba:
{1,2,3,4,-5},{5,7,6,8} -> false
{},{0} -> false
{},{} -> false
{1,2},{3,3} -> false
{3,2,1},{-4,3,5,6} -> true
{2,3},{2,2} -> true
Este es el código de golf , por lo que gana el código más corto en bytes.
O(n log n)
es factible en general, pero la aclaración sobre el manejo solo de enteros nativos significa que en algunos idiomas con rangos de enteros limitados es posible una solución lineal (por ejemplo, mediante una tabla de búsqueda de tamaño 2 ^ 64)Respuestas:
En realidad , 1 byte
Pruébalo en línea!
Esto es simplemente la intersección establecida incorporada. El valor resultante es la intersección de los dos conjuntos: una lista no vacía (que es un valor verdadero) si hay una intersección, y una lista vacía (que es un valor falso) de lo contrario.
Complejidad
De acuerdo con Python Wiki , la intersección de conjuntos tiene una complejidad de tiempo en el peor de los casos
O(N*M)
(dóndeN
yM
son las longitudes de los dos conjuntos). Sin embargo, la complejidad del tiempo es tan mala cuando los dos conjuntos contienen objetos distintos que tienen el mismo valor hash (por ejemplo{"some string"} & {hash("some string")}
). Dado que los elementos del conjunto son solo enteros en este caso (y no hay dos enteros hash al mismo valor a menos que sean iguales), la complejidad real del peor de los casos esO(min(N, M))
(lineal en la longitud del menor de los dos conjuntos). La construcción de cada conjunto esO(N)
(lineal en el número de elementos), por lo que la complejidad general esO(max(N, M))
(la complejidad está dominada por la construcción del conjunto más grande).fuente
TSQL,
403736 bytesSQL no tiene matrices, en su lugar utiliza tablas
Devuelve -1 para verdadero o 0 para falso
Pruébalo
fuente
Ruby, 37 bytes:
Como en la definición: "programa que tomará como entrada 2 matrices enteras y devolverá un valor verdadero si ...", este es un programa, acepta 2 matrices como cadenas en la entrada, devuelve verdadero o falso.
como una función - 14 bytes:
Complejidad:
La documentación de ruby del operador itnersection (&) dice "Compara elementos usando sus métodos hash y eql? Para eficiencia", lo que supongo que es exactamente lo que estamos buscando.
Empíricamente:
Lo que parece confirmarlo.
fuente
Perl, 25 + 1 = 26 bytes en colaboración con Dada
Ejecutar con
-a
(1 byte de penalización).Una versión mejorada del programa a continuación (que se mantiene para ver el historial de la solución y para mostrar la solución que encontré yo mismo; también tiene más explicaciones). La
-a
opción lee las matrices separadas por espacios como la entrada y las almacena@F
. Usamos el%a
diccionario (al que se accede como$a{$_}
) para almacenar una máscara de bits de las matrices de entrada en las que se encuentra la entrada, e imprimimos1
cada vez que vemos un elemento en ambas matrices, es decir, un valor superior a 2 dentro de la máscara de bits resultante (afortunadamente, una comparación fallida devuelve la cadena nula, por loprint
que no hace nada). No podemos usarsay
porque una nueva línea es verdadera en Perl. El rendimiento es asintóticamente igual que la versión anterior del programa (pero más rápido en términos de factores constantes).Perl, 44 + 1 = 45 bytes
Ejecutar con
-p
(1 byte de penalización). Ingrese una matriz por línea, separando los elementos por espacios.Esto funciona mediante la creación de una tabla hash
%a
que almacena una máscara de bits de las matrices de entrada en las que se ha visto un valor. Si se ha visto tanto en la matriz en la línea 1 como en la línea 2, la máscara de bits almacenará el valor 3. Invertir el hash y ver si 3 tiene una clave correspondiente nos permite saber si hay valores en común.La complejidad de este algoritmo es O (n) si considera que la creación de hash es un tiempo constante (es decir, si tiene enteros acotados, como lo hace Perl). Si se usan enteros bignum (que podrían ingresarse en este programa, ya que dejan la entrada como una cadena), la complejidad del algoritmo en sí sería nominalmente O (n log n) para cada creación de hash, y O (n) para inversión de hash, que se suma a O (n log n). Sin embargo, el algoritmo de hash de Perl adolece de un rendimiento potencial de O (n²) con entrada seleccionada de forma maliciosa; Sin embargo, el algoritmo es aleatorio, para que sea imposible determinar cuál es esa entrada (y es posible que no pueda activarse simplemente con enteros), por lo que es discutible con qué clase de complejidad cuenta "moralmente". Afortunadamente, esto no importa en el caso de que haya
Este código funcionará para entradas que no sean enteros, pero no funcionará para más de dos matrices (porque
3
está codificado y porque la entrada en la tercera línea no enmascararía correctamente, ya que no es una potencia de 2). Bastante molesto, el código devuelve naturalmente uno de los elementos duplicados, lo cual es cierto en casi todos los casos, pero"0"
es falso en Perl y un elemento duplicado válido en la matriz. Como tal, tuve que desperdiciar tres bytes anteponiendo a+
a la salida, que es la forma más barata que encontré para dar una salida verdadera en el caso de borde de las matrices superpuestas0
. Si se me permite usar nociones de veracidad y falsedad de un lenguaje que no sea Perl (en el que cualquier cadena no vacía es veraz), puede cambiar"+$_"
a$_
para guardar tres bytes.fuente
perl -apE '$\|=($a{$_}|=$.)==3for@F}{'
debería tener el mismo comportamiento para 17 bytes menos ;-)-a
bandera. Eso parece ayudar aquí, ¿no? Sin embargo, creo que puede guardar otros dos bytes ($\|=}{
yprint
son de la misma longitud, y este último le permite evitar la-p
bandera y, por lo tanto, un byte de penalizaciones; y==3
puede ser reemplazado por>2
otro byte). Es una pena que$1
, etc., ya sean variables, o podríamos guardar otros tres bytes utilizando el espacio completo de nombres de variables como una tabla hash.-a
(y-F
) son bastante convenientes en PPCG (más que en anagolf ya que allá cuesta más). Como necesita un espacio después delprint
, tiene la misma longitud que-p ... $\=}{
, pero ¿por qué no? (sí, es triste que no podamos modificar,$1
etc.)p$\|=}{
(siete caracteres,p
siendo el castigo); Tengoprint
(seis caracteres, incluido un espacio). Creo que te perdiste el|
cálculo justo allí.Python2 -
4130 bytesIntersección de conjuntos: O (min (N, M)) donde N y M son la longitud de los conjuntos.
Conversión de una lista a un conjunto: O (max (N, M))
set(a).intersection(b)
->set(a)&set(b)
f=
fuente
set(a)&set(b)
lugar de llamar al método de intersección.{0}
entonces puede reducirla a 28 bytes:lambda a,b:set(a)&set(b)>{0}
{1}&{1}
es verdad, mientras que{1}&{2}
es falso. Solo puedes hacerlambda a,b:a&b
.f=
Sin embargo, la eliminación funciona.Axioma, 439 bytes
esto convierte la primera lista en una lista como [[i, 1], [i, 2] ...] la segunda lista en una lista como [[1, i], [0, i] ...] donde i es la variable imaginaria que fusiona la lista 2, y hace un tipo que encontraría si hay un elemento de la lista 1 en la lista 2, por lo que es al final O (N log N) donde N = longitud lista 1 + longitud lista 2
sin golf
resultados
no entiendo por qué "borra" el código para r y s ...
fuente
PowerShell,
88787723 bytesGracias a @briantist para el afeitado de la friolera de 54 bytes de mi original, más prolija respuesta acortando
-IncludeEqual
,-ExcludeDifferent
y-Not
!No puedo encontrar la fuente de
Compare-Object
(diff
es un alias paraCompare-Object
), por lo que no estoy seguro de la complejidad del tiempo.fuente
!!(diff -inc -ex $A $B)
-i
lugar de-inc
, pero en 5+ los-Information*
parámetros comunes hacen-i
ambiguo.if
declaración; ¡no lo necesitas en absoluto! También v5 viene con Windows 10, y v5.1 viene con Server 2016. También puedes descargar e instalar WMF5 desde, creo, Windows 7 / 2008R2. ¡Ha sido lanzado por algún tiempo ahora!Compare-Object
, soy escéptico de que esto sea O (NlogN). En segundo lugar, tomar la entrada a través de variables predefinidas es un no-no, por lo que necesitaría unparam($a,$b)
frente o similar.param($A,$B)!!(diff -Inc -Ex $A $B)
... Luego, guárdalo como un archivo .ps1 y llámalo desde la línea de comandos con los arreglos como argumentos, comoPS C:\Scripts>.\same-element.ps1 @(1,2) @(2,3)
PHP , 15 bytes
Pruébalo en línea!
Un PHP incorporado, como una función invocable / lambda. El retorno es un valor PHP
truthy
/falsey
comprobable. Además, según el otro envío de PHP, esta implementación debe cumplir con los requisitos de complejidad del desafío ( StackExchange ).fuente
R, 23 bytes
Si suponemos que siempre habrá una coincidencia de un solo elemento y que ese
1
es un valor verdadero (que está en R ), entonces podemos escribir:que es de 21 bytes.
fuente
PHP,
5551 bytesUso: guardar en un archivo y llamar desde el navegador:
intersect.php?a[]=1&a[]=2&a[]=3&b[]=0&b[]=4&b[]=5
salidas0
parafalse
.intersect.php?a[]=1&a[]=2&a[]=3&b[]=0&b[]=4&b[]=1
salidas1
paratrue
.Sobre la complejidad, no pude encontrar referencias, pero de acuerdo con esta publicación de StackOverflow, el script debería estar bien
fuente
GolfScript, 1 byte
Si se permite tomar la entrada directamente como matrices en la pila, esta solución GolfScript de un byte debe cumplir con las especificaciones:
Si se requiere E / S basada en texto, primero se debe evaluar la entrada, empujando la longitud hasta dos bytes:
Ambas soluciones utilizan el operador de intersección de matriz GolfScript, que se implementa utilizando el operador correspondiente en Ruby . Devuelven una matriz vacía (que es falsa) si las matrices no contienen elementos coincidentes, o una matriz no vacía (que es verdad) que contiene todos los elementos coincidentes de lo contrario.
Hasta ahora no he podido encontrar ninguna documentación sobre la implementación interna o la complejidad asintótica del operador de intersección de la matriz de Ruby, más allá de la breve afirmación de que "compara elementos usando sus métodos hash y eql? Para mayor eficiencia". Sin embargo, una implementación razonable utilizando tablas hash se ejecutaría en tiempo O ( n ) (suponiendo que el hashing y las comparaciones sean O (1)), y algunas pruebas de rendimiento rápidas sugieren que este es el caso:
Estas pruebas se llevaron a cabo utilizando el programa GolfScript
~2?.2*,/&
, que toma un número entero k , genera una secuencia aritmética de 2 × 2 k elementos, la divide en dos conjuntos de 2 k elementos y calcula su intersección (obviamente vacía). Las estrellas rojas muestran el tiempo de ejecución medido t en segundos (en una escala logarítmica) para varios valores de k , mientras que la línea verde representa la función t = c × 2 k , donde la constante de escala c ≈ 2 −17.075 se eligió mejor ajusta los datos medidos.(Tenga en cuenta que, en un diagrama log-log como este, cualquier función polinómica de la forma t = c × (2 k ) a produciría una línea recta. Sin embargo, la pendiente de la línea depende del exponente a , y los datos es ciertamente consistente con a = 1 como se muestra en la línea verde de arriba. FWIW, el exponente numérico de mejor ajuste para este conjunto de datos fue un ≈ 1.00789.)
fuente
JavaScript (ES6), 39 bytes
Será peor que O (n + m) pero con suerte no tan malo como O (n * m).
fuente
Óxido, 103 bytes
Toma dos rebanadas de matriz (o referencias a matrices completas, desreferencian a las rebanadas automáticamente), las agrupa en conjuntos y verifica la no disyunción. No estoy muy seguro de cómo se implementa set union en la biblioteca estándar Rust, pero debería ser O (n + m) en el peor de los casos.
Sin usar colecciones, la alternativa más fácil que veo es ordenar ambas matrices, luego pasarlas cuidadosamente para buscar duplicados. Algo como esto
Pero eso requiere demasiada mutación para ser divertido al golf en Rust IMO :)
fuente
Python, 11 bytes
Construido que toma 2 series y hace una intersección en ellas
fuente
Axioma,
50221 bytessin golf
g (a, b) obtiene la matriz más grande beetwin ayb; supongamos que tiene N elementos: clasifique esa matriz, haga una búsqueda binaria con elementos que otra matriz. Esto sería O (Nlog (N)). Devuelve 0 para ningún elemento de a en b, 1 de lo contrario.
resultados
fuente
Jalea , 2 bytes
Pruébalo en línea!
Explicación
fuente