Tarefa
Você receberá um número inteiro positivo e deverá gerar um " gráfico auto-complementar " com muitos nós. Se você não sabe o que é um gráfico auto-complementar, o artigo da wikipedia não o ajudará muito, então abaixo estão duas explicações, uma técnica e uma não técnica.
Não técnico
Um gráfico é um conjunto de nós conectados por linhas. Cada par de pontos pode ser conectado por uma linha ou nenhuma. O "complemento" de um gráfico é o resultado de pegar um gráfico e conectar todos os nós que não estão conectados e desconectar todos os nós que estão.
Um gráfico auto-complementar é um gráfico cujo complemento pode ser reorganizado na forma do original. Abaixo está um exemplo de um gráfico auto-complementar e uma demonstração de como.
Aqui está um gráfico com 5 nós:
Destacaremos todos os lugares em que as conexões podem ir com linhas pontilhadas em vermelho:
Agora vamos encontrar o complemento do gráfico trocando as bordas vermelha e preta:
Isso não se parece com o gráfico original, mas se movermos os nós da seguinte maneira (cada etapa alterna dois nós):
Temos o gráfico original! O gráfico e seu complemento são o mesmo gráfico
Técnico
Um gráfico auto-complementar é um gráfico isomórfico ao seu complemento.
Especificações
Você receberá um número inteiro positivo através do método que melhor lhe convier. E você saída um gráfico em qualquer método que você considerem adequadas, o que inclui, mas não se limita a Matriz de Adjacência Form , Adjacência Lista de Formulários , e, claro, fotografias! O gráfico gerado deve ser seu próprio complemento e ter tantos nós quanto a entrada inteira. Se esse gráfico não existir, você deve gerar um valor falso.
Isso é código-golfe e você deve tentar minimizar sua contagem de bytes.
Casos de teste
Abaixo estão fotos de possíveis saídas para vários n
4
5
9
fonte
GraphData@{"SelfComplementary",{#,1}}&
, acredito que basta carregar alguns exemplos para baixon
no banco de dados da Wolfram, para que isso não funcione para entradas arbitrariamente grandes.Respostas:
Haskell , 77 bytes
Experimente online!
Isso usa um critério explícito fácil de calcular para decidir se uma aresta
(a,b)
pertence ao gráfico. Instancia esse algoritmo , com a permutação circulando entre os valores do módulo 4Incluímos arestas cujos dois vértices do ponto final acrescentam 0 ou 1 módulo 4. Observe que os vértices de ciclismo de acordo com essa permutação adicionam 2 módulos 4 à soma do vértice em cada um e, portanto, trocam arestas e não arestas. Isso permite uma permutação de vértices que complementam as arestas.
Se o gráfico tiver um nó extra além de um múltiplo de 4, ele será colocado em um ciclo sozinho. Incluímos arestas quando outro vértice é par. A permutação dos vértices inverte a paridade e, portanto, o gráfico permanece auto-complementar.
Se o número de vértices não for 0 ou 1 módulo 4, nenhum gráfico auto-complementar é possível porque há um número ímpar de arestas no gráfico completo
No geral, aqui estão as condições:
(a,b)
coma<b
ea+b
iguais a 0 ou 1 módulo 4.(a,n)
quando a for par.O código combina o segundo e o terceiro casos, substituindo a condição
mod(a+b)4<2
pormod(a+a)4<2
quando ambosodd n
eb==n
.fonte
Braquilog 2 , 24 bytes
Experimente online!
Essa é uma função que retorna um par que consiste em duas listas de adjacência: uma para o gráfico e outra para o gráfico de complemento. (No intérprete Brachylog no TIO, você pode pedir para avaliar uma função, em vez de um programa completo, fornecendo
Z
como argumento de linha de comando.) Por exemplo, a saída para entrada5
é:Aqui está o que parece uma imagem (mostrando os dois gráficos):
Como é comum em idiomas baseados em Prolog, a função suporta mais de um padrão de chamada. Notavelmente, se você tentar usá-lo como um gerador, ele produzirá todos os gráficos auto-complementares possíveis com o número determinado de vértices (embora eu não tenha feito nenhum esforço para tornar esse caso utilizável, e, notavelmente, ele produzirá cada um dos os gráficos muitas vezes cada).
Explicação
Isso é basicamente apenas uma descrição do problema, deixando a implementação do Prolog para encontrar o melhor método para resolvê-lo. (No entanto, duvido que ele utilize um algoritmo melhor que a força bruta nesse caso em particular, portanto é provavelmente bastante ineficiente, e os testes parecem confirmar isso, mostrando o desempenho ficando muito pior quanto maior o gráfico.)
Aliás, acabei tendo que gastar 6 bytes inteiros (¼ do programa, os caracteres
(∨?<2)
) lidando com os casos especiais de 0 e 1. Frustrante, mas essa é a natureza de casos especiais.A
\\ᵐcdl?
seção é um pouco difícil de entender, então aqui está um exemplo. Seu objetivo é verificar se algo é um gráfico e seu complemento, com as arestas correspondentes no gráfico e o complemento na mesma ordem nas listas. O par gráfico / complemento se torna a saída final do programa. Aqui está um exemplo de caso:Transpor isso nos fornece uma lista de pares de arestas correspondentes entre o gráfico e o complemento:
Em seguida, transpomos para dentro dos elementos da lista e nivelamos um nível; que nos fornece uma lista de pares de elementos correspondentes entre o gráfico e o complemento:
Claramente, o que queremos aqui é que não exista mais de 1 par começando de cada elemento (provando assim que os elementos do gráfico e o complemento estão em correspondência 1 para 1). Quase podemos verificar isso apenas afirmando que a lista possui exatamente
?
elementos distintos (ou seja, um número de elementos distintos igual ao número de vértices). Nesse caso, o teste é bem-sucedido; os elementos distintos são:No entanto, isso deixa espaço para um problema em potencial; se um vértice estiver totalmente desconectado no gráfico original, sua correspondência não será mencionada, deixando espaço para uma correspondência duplicada de algum outro vértice. Se este for o caso, o grafo complementar deve ter uma aresta entre esse vértice (sem perda de generalidade, vamos dizer que é
1
), e todos os outros vértices, e assim a lista de correspondências conterá[1,2]
,[1,3]
, ...,[1, ?]
. Quando?
é grande, isso leva a mais correspondências totais do que teríamos de outra forma, portanto não há problema. O único problema ocorre quando?
é 3 ou menos; nesse caso, acabamos adicionando apenas uma correspondência extra (enquanto removemos uma de1
não aparece na entrada); no entanto, isso não é um problema na prática, porque existem 3 arestas possíveis em um gráfico de 3 elementos, que é um número ímpar (da mesma forma, 1 aresta possível em um gráfico de 2 elementos também é um número ímpar) e, portanto, o O teste falhará na\
etapa (você não pode transpor uma lista irregular, ou seja, aquelas cujos elementos têm comprimentos diferentes).fonte
z
e\
é quez
é zip cíclico, o que significa que[[1,2,3],["a"]]
irá acabar por ser[[1,"a"],[2,"a"],[3,"a"]]
comz
, enquanto que ele irá falhar para\
.\
agora só funciona em matrizes quadradas; implementação futura fará com que funcione comoz
, exceto não ciclicamente.BBC BASIC, 161 bytes
Tamanho do arquivo tokenizado 140 bytes
Faça o download do intérprete em http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Código ungolfed
Explicação
Isso usa o mesmo algoritmo que o Xnor, mas produz uma saída diagramática.
Onde
n
está da forma4x+2
ou4x+3
não há solução, pois o número de arestas é ímpar.Onde
n
é da forma 4x, organizamos todos os vértices em um círculo e desenhamos essas arestas onde(a+b) mod 4
é 2 ou 3 (não 0 ou 1, como no caso de Xnor, por razões de golfe. Esse é, portanto, o complemento da solução dada por Xnor.)Para ver isso em um sentido mais pictórico, pegamos todos os segundos vértices e desenhamos as arestas nos vértices 1 e 2, na direção anti-horária. Isso define
n
direções paralelas, metade do total. Em seguida, adicionamos todas as outras arestas paralelas a elas.O complemento pode ser encontrado adicionando 1 a aeb em cada especificação de aresta ou pictoricamente girando o diagrama uma
1/n
volta.Onde
n
é da forma 4x + 1, adicionamos outro vértice, que está vinculado a cada segundo vértice do gráfico 4x. Se ele fosse colocado no centro, a simetria do diagrama seria preservada, mas optei por colocá-lo fora do círculo principal de pontos para maior clareza.Resultado
A seguir, são apresentados os primeiros casos de 4x + 1. os casos 4x podem ser vistos excluindo o vértice no canto inferior direito e as arestas associadas.
fonte
JavaScript (ES6), 191 bytes
Esta função retorna uma lista de adjacência. Ele usa dois algoritmos e diferencia entre gráficos complementares vazios e não resultados, retornando em
0
vez de[]
quando não existe nenhum. O primeiro algoritmo é baseado nos gráficos do Rado construídos usando o predicado BIT e cria gráficos complementares válidos de 0, 1, 4 e 5 ordens. O outro algoritmo, encontrado por nossos amigos em matemática , constrói um gráfico complementar válido de vértices V + 4 aplicando uma adição de 4 caminhos a um gráfico complementar válido de vértices V.Ele começa validando a entrada para confirmar a existência de um gráfico complementar válido (usando
n*~-n/4%1
) e, se isso falhar, retorna0
. Em seguida, ele verifica sen>5
e se repete non-4
caso para construir uma solução válida de ordem inferior, e aplica a adição 4 à lista de adjacência retornada no caminho de volta à cadeia de recursão. Por fim, sen>5
não for verdadeiro, itera de0
paran-1
parax
ey
e verifica se o valor(y>>x)&1
é verdadeiro. Nesse caso, esses nós estão emparelhados.Aqui está um formato mais legível da função, com operadores ternários expandidos para instruções if-else e
eval()
s inline:Demo
fonte