Escreva um programa que terá como entrada 2 matrizes inteiras e retornará um valor verdadeiro se houver um elemento presente em ambas as matrizes ou, caso contrário, um falso. A solução óbvia para esse problema seria iterar cada elemento da primeira matriz e compará-lo com cada elemento da segunda, mas aqui está o problema: seu programa deve ter uma complexidade algorítmica de, no máximo, no pior caso, O ( NlogN), onde N é o comprimento da matriz mais longa,
Casos de teste:
{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
Isso é código-golfe , então o código mais curto em bytes vence.
O(n log n)
é factível, em geral, mas o esclarecimento sobre única manipulação inteiros nativas meios que, em alguns idiomas com número inteiro varia limitado uma solução linear é possível (por exemplo, por uma tabela de pesquisa de tamanho 2 ^ 64)Respostas:
Na verdade , 1 byte
Experimente online!
Esta é apenas a interseção definida incorporada. O valor resultante é a interseção dos dois conjuntos - uma lista não vazia (que é um valor verdadeiro) se houver uma interseção e uma lista vazia (que é um valor de falsey) caso contrário.
Complexidade
De acordo com o Python Wiki , a interseção de conjuntos tem uma complexidade temporal pior
O(N*M)
(de ondeN
eM
são os comprimentos dos dois conjuntos). No entanto, a complexidade do tempo é tão ruim quando os dois conjuntos contêm objetos distintos, todos com o mesmo valor de hash (por exemplo{"some string"} & {hash("some string")}
). Como os elementos do conjunto são apenas números inteiros nesse caso (e não há dois números inteiros com o mesmo valor, a menos que sejam iguais), a complexidade real do pior caso éO(min(N, M))
(linear no comprimento do menor dos dois conjuntos). A construção de cada conjunto éO(N)
(linear no número de elementos); portanto, a complexidade geral éO(max(N, M))
(a complexidade é dominada pela construção do conjunto maior).fonte
TSQL,
403736 bytesO SQL não possui matrizes, está usando tabelas
Retorna -1 para verdadeiro ou 0 para falso
Experimente
fonte
Ruby, 37 bytes:
Como na definição: "programa que terá como entrada 2 matrizes inteiras e retornará um valor verdadeiro se ...", este é um programa, aceita 2 matrizes como cadeias de caracteres na entrada, retorna verdadeiro ou falso.
como uma função - 14 bytes:
Complexidade:
A documentação ruby do operador itnersection (&) diz "Ele compara elementos usando seus métodos hash e eql? Para eficiência.", O que suponho ser exatamente o que estamos procurando.
Empiricamente:
O que parece confirmar isso.
fonte
Perl, 25 + 1 = 26 bytes em colaboração com o Dada
Corra com
-a
(penalidade de 1 byte).Uma versão aprimorada do programa abaixo (que é mantida para ver o histórico da solução e mostrar a solução que eu encontrei por mim; também tem mais explicações). A
-a
opção lê matrizes separadas por espaço como entrada, armazenando-as@F
. Usamos o%a
dicionário (acessado como$a{$_}
) para armazenar uma máscara de bits em que as matrizes de entrada estão inseridas e imprimimos1
toda vez que vemos um elemento nas duas matrizes, ou seja, um valor maior que 2 dentro da máscara de bits resultante (felizmente, uma comparação falha retorna a cadeia nula, paraprint
que não faça nada). Não podemos usarsay
porque uma nova linha é verdadeira no Perl. O desempenho é assintoticamente o mesmo da versão mais antiga do programa (mas mais rápido em termos de fatores constantes).Perl, 44 + 1 = 45 bytes
Corra com
-p
(penalidade de 1 byte). Insira uma matriz por linha, separando os elementos por espaços.Isso funciona através da criação de uma tabela de hash
%a
que armazena uma máscara de bits das matrizes de entrada nas quais um valor foi visto. Se for visto na matriz na linha 1 e na linha 2, a máscara de bits armazenará o valor 3. hash e ver se 3 tem uma chave correspondente nos permite saber se existem valores em comum.A complexidade desse algoritmo é O (n) se você considerar a criação de hash um tempo constante (ou seja, se você tiver números inteiros limitados, como o Perl). Se estiver usando números inteiros bignum (que podem ser inseridos neste programa, pois deixa a entrada como uma string), a complexidade do próprio algoritmo seria nominalmente O (n log n) para cada criação de hash e O (n) para o reversão de hash, que corresponde a O (n log n). No entanto, o algoritmo de hash do Perl sofre desempenho potencial de O (n²) com entrada selecionada com códigos maliciosos; o algoritmo é randomizado, no entanto, para tornar impossível determinar o que é essa entrada (e é possível que não possa ser acionada simplesmente com números inteiros), por isso é discutível com qual classe de complexidade ela "moralmente" conta. Felizmente, isso não importa no caso em que há '
Esse código funcionará para entradas que não sejam números inteiros, mas não funcionará para mais de duas matrizes (porque o código
3
é codificado e porque a entrada na terceira linha não usaria máscaras corretamente, pois não é uma potência de 2). De maneira bastante irritante, o código naturalmente retorna um dos elementos duplicados, que é verdadeiro em quase todos os casos, mas"0"
é falsey no Perl e um elemento duplicado válido na matriz. Como tal, tive que desperdiçar três bytes precedendo+
a à saída, que é a maneira mais barata que encontrei para fornecer uma saída verdadeira no caso de borda das matrizes que se sobrepõem0
. Se eu estou autorizado a usar noções de truthy e Falsey de um idioma diferente do Perl (em que qualquer string não-vazia é truthy), você pode mudar"+$_"
para$_
salvar três bytes.fonte
perl -apE '$\|=($a{$_}|=$.)==3for@F}{'
deve ter o mesmo comportamento para 17 menos bytes ;-)-a
bandeira. Isso parece ajudar aqui, não é? Eu acho que você pode salvar outros dois bytes, no entanto ($\|=}{
eprint
tem o mesmo comprimento, e o último permite evitar a-p
bandeira e, portanto, um byte de penalidades; e==3
pode ser substituído por>2
outro byte). Uma pena que$1
, etc., já sejam variáveis, ou poderíamos salvar outros três bytes usando todo o espaço dos nomes de variáveis como uma tabela de hash.-a
(e-F
) são bastante convenientes no PPCG (mais do que no anagolf, pois lá custa mais)! Como você precisa de um espaço após oprint
, é do mesmo tamanho que-p ... $\=}{
, mas por que não? (sim, é triste que não possamos modificar$1
etc.) #p$\|=}{
(sete caracteres,p
sendo a penalidade); Eu tenhoprint
(seis caracteres, incluindo um espaço). Acho que você perdeu o|
cálculo logo ali.Python2 -
4130 bytesInterseção do conjunto: O (min (N, M)), onde N e M são o comprimento dos conjuntos.
Conversão de uma lista para um conjunto: O (max (N, M))
set(a).intersection(b)
->set(a)&set(b)
f=
fonte
set(a)&set(b)
vez de chamar o método de interseção.{0}
a de 28 bytes:lambda a,b:set(a)&set(b)>{0}
{1}&{1}
é verdade, enquanto{1}&{2}
é falso. Você pode apenas fazerlambda a,b:a&b
.f=
funciona embora.Axioma, 439 bytes
isso converte a primeira lista em uma lista como [[i, 1], [i, 2] ...] a segunda lista em uma lista como [[1, i], [0, i] ...] onde i é a variável imaginária que mescla a lista 2 e faça um tipo que encontraria se houvesse um elemento da lista 1 na lista 2; portanto, é finalmente O (N log N) em que N = lista de comprimento 1 + lista de comprimento 2
destroçado
resultados
Eu não entendo por que ele "limpa" o código para re es ...
fonte
PowerShell,
88787723 bytesGraças à @briantist para raspar um colossal 54 bytes do meu original, mais detalhado resposta pelo encurtamento
-IncludeEqual
,-ExcludeDifferent
e-Not
!Não consigo encontrar a fonte para
Compare-Object
(diff
é um apelido paraCompare-Object
), então não tenho certeza da complexidade do tempo.fonte
!!(diff -inc -ex $A $B)
-i
vez de-inc
, mas em mais de 5 anos-Information*
os parâmetros comuns tornam-se-i
ambíguos.if
declaração; você não precisa disso! Além disso, a v5 vem com o Windows 10 e a v5.1 com o Server 2016. Você também pode baixar e instalar o WMF5 desde o Windows 7 / 2008R2. Já foi lançado há algum tempo!Compare-Object
, sou cético quanto a isso (O) (NlogN). Segundo, receber informações através de variáveis predefinidas é um não-não, então você precisaria de umparam($a,$b)
na frente ou similar.param($A,$B)!!(diff -Inc -Ex $A $B)
- Em seguida, guarde isso como um arquivo .ps1 e chamá-lo a partir da linha de comando com as matrizes como argumentos, comoPS C:\Scripts>.\same-element.ps1 @(1,2) @(2,3)
PHP , 15 bytes
Experimente online!
Um PHP embutido, como uma função que pode ser chamada / lambda. Retorno é um valor PHP
truthy
/falsey
testável. Além disso, de acordo com o outro envio do PHP, essa implementação deve atender aos requisitos de complexidade do desafio ( StackExchange ).fonte
R, 23 bytes
Se assumirmos que sempre haverá um e apenas um elemento correspondente e que
1
é um valor verdadeiro (que está em R ), então podemos escrever:que é 21 bytes.
fonte
PHP,
5551 bytesUso: salve em um arquivo e ligue do navegador:
intersect.php?a[]=1&a[]=2&a[]=3&b[]=0&b[]=4&b[]=5
saídas0
parafalse
.intersect.php?a[]=1&a[]=2&a[]=3&b[]=0&b[]=4&b[]=1
saídas1
paratrue
.Sobre a complexidade, não consegui encontrar referências, mas de acordo com a publicação deste StackOverflow, o script deve estar OK
fonte
GolfScript, 1 byte
Se aceitar a entrada diretamente como matrizes na pilha é permitido, esta solução GolfScript de um byte deve atender às especificações:
Se E / S baseada em texto for necessária, a entrada precisará ser avaliada primeiro, aumentando o comprimento em até dois bytes:
Ambas as soluções usam o operador de interseção do array GolfScript, que é implementado usando o operador correspondente no Ruby . Eles retornam uma matriz vazia (que é falsa) se as matrizes não contiverem elementos correspondentes ou uma matriz não vazia (verdadeira) que contém todos os elementos correspondentes.
Até o momento, não consegui encontrar nenhuma documentação sobre a implementação interna ou a complexidade assintótica do operador de interseção do array Ruby, além da breve declaração de que "ele compara elementos usando seus métodos hash e eql? Para eficiência". No entanto, uma implementação razoável usando tabelas de hash seria executada em O ( n ) tempo (assumindo que hash e comparações são O (1)), e alguns testes rápidos de desempenho sugerem que esse é realmente o caso:
Esses testes foram realizados usando o programa GolfScript
~2?.2*,/&
, que pega um número inteiro k , gera uma sequência aritmética de 2 × 2k elementos, divide-o em duas matrizes de 2k elementos e calcula sua interseção (obviamente vazia). As estrelas vermelhas mostram o tempo de execução medido t em segundos (em uma escala logarítmica) para vários valores de k , enquanto a linha verde representa a função t = c × 2 k , onde a constante de escala c ≈ 2 −17,075 foi escolhida da melhor maneira ajuste os dados medidos.(Note-se que, em um gráfico log-log de como este, qualquer função polinomial da forma t = c × (2 k ) um produziria uma linha recta. No entanto, o declive da linha depende do expoente um , e os dados é certamente consistente com um = 1, como mostrado pela linha verde acima. Fwiw, o expoente de melhor ajuste numérica para este conjunto de dados foi um ≈ 1,00789).
fonte
JavaScript (ES6), 39 bytes
Será pior que O (n + m), mas espero que não seja tão ruim quanto O (n * m).
fonte
Ferrugem, 103 bytes
Pega duas fatias de matriz (ou referências a matrizes completas, elas desreferenciam as fatias automaticamente), agrupa-as em conjuntos e verifica a ausência de disjunção. Não tenho muita certeza de como a união de conjunto é implementada na biblioteca padrão do Rust, mas deve ser O (n + m) na pior das hipóteses.
Sem usar coleções, a alternativa mais fácil que eu vejo é classificar as duas matrizes e passar por cima delas com cuidado para procurar duplicatas. Algo assim
Mas isso exige muita mutação para ser divertido jogar golfe no Rust IMO :)
fonte
Python, 11 bytes
Builtin que leva 2 conjuntos e faz uma interseção neles
fonte
Axioma,
50221 bytesdestroçado
g (a, b) obtém a matriz maior entre be awin; suponha que ele tenha N elementos: classifique essa matriz, faça uma pesquisa binária com elementos dessa outra matriz. Isso seria O (Nlog (N)). Retorna 0 para nenhum elemento de a em b, 1 caso contrário.
resultados
fonte
Geléia , 2 bytes
Experimente online!
Explicação
fonte