Nesse desafio, sua tarefa é construir um gráfico não direcionado a partir de uma sequência de diretivas. Há uma diretiva para cada número inteiro não negativo e cada uma transforma um dado gráfico em um novo.
- Diretiva
0
: Adicione um novo nó desconectado. - Diretiva
1
: adicione um novo nó e conecte-o a todos os nós existentes. - Diretiva
m > 1
: Remova todos os nós cujo grau (número de vizinhos) é divisível porm
. Observe que0
é divisível por todosm
, portanto os nós desconectados são sempre removidos.
As diretivas são aplicadas uma a uma, da esquerda para a direita, começando com o gráfico vazio. Por exemplo, a sequência [0,1,0,1,0,1,3]
é processada da seguinte maneira, explicada usando a incrível arte ASCII. Começamos com o gráfico vazio e adicionamos um único vértice conforme indicado por 0
:
a
Em seguida, adicione outro vértice e conecte-o ao primeiro, conforme indicado por 1
:
a--b
Adicionamos outro vértice desconectado e depois um conectado, conforme indicado por 0
e 1
:
a--b c
\ \ /
`--d
Repetimos isso mais uma vez, conforme indicado por 0
e 1
:
,--f--e
/ /|\
a--b | c
\ \|/
`--d
Finalmente, removemos os vértices de grau 3 a
e b
, conforme indicado por 3
:
f--e
|\
| c
|/
d
Este é o gráfico definido pela sequência [0,1,0,1,0,1,3]
.
Entrada
Uma lista de números inteiros não negativos, representando uma sequência de diretivas.
Resultado
O número de nós no gráfico definido pela sequência.
Casos de teste
[] -> 0
[5] -> 0
[0,0,0,11] -> 0
[0,1,0,1,0,1,3] -> 4
[0,0,0,1,1,1] -> 6
[0,0,1,1,0,0,1,1,2,5,7,0,1] -> 6
[0,0,1,1,1,1,5,1,4,3,1,0,0,0,1,2] -> 6
[0,0,1,1,0,0,1,1,5,2,3,0,0,1,1,0,0,1,1,3,4,0,0,1,1,2,1,1] -> 8
[0,0,1,1,0,0,1,1,2,5,7,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,8] -> 14
Regras detalhadas
Você pode escrever uma função ou um programa completo. A menor contagem de bytes vence. As brechas padrão não são permitidas. Por favor, explique seu algoritmo na sua resposta.
Já faz uma semana, então aceitei a resposta mais curta. Se um mais curto aparecer mais tarde, atualizarei minha escolha. Uma menção honrosa vai para a resposta de Peter Taylor , na qual várias outras foram baseadas, incluindo o vencedor.
fonte
Respostas:
Pyth ,
3731Esta solução usa uma função de redução (
u
) para criar uma lista, onde cada entrada corresponde a um nó restante na lista e o valor da entrada correspondente a se o nó foi originalmente adicionado sob a diretiva 0 ou 1.G
é a variável acumuladora na função reduzir e mantém a lista mencionada acima. É inicializado na lista vaziaY
,.H
pega o valor de cada membro daQ
entrada, um por um. O resultado da expressão é atribuído aG
cada vez, e a próxima entrada deQ
é atribuída aH
, e a expressão é executada novamente.Para atualizar
G
corretamente, existem duas possibilidades, uma para a diretiva 0 ou 1 e uma para as outras diretivas. Estes casos distinguem-se dos ternários? ... <H2 ...
Se
H
é 0 ou 1, então tudo o que precisamos fazer é anexarH
aG
.+GH
realiza isso.Caso contrário, a primeira coisa necessária é determinar, para cada nó no gráfico, quantos vizinhos ele possui. Isso é realizado em duas etapas:
Primeiro,
s>GT
conta o número de nós no ou após o nó de entrada que são 1s. Todos eles estão conectados ao nó de entrada, exceto que contaremos mais de 1 se o nó de entrada for 1.Segundo, precisamos do número de nós anteriores ao nó de entrada que está conectado a ele. Este é 0 se o nó de entrada for 0 e o índice do nó de entrada
T
, se o nó de entrada for 1. Este valor seria fornecido por*@GTT
. No entanto, ainda existe a contagem excessiva da primeira seção que precisa ser corrigida. Assim, calculamos em*@GTtT
vez disso, que é 1 a menos se o nó de entrada for 1. Esses valores são somados, para fornecer o número de nós conectados ao nó de entrada.% ... H
dará 0 é que o número é divisível porH
e, portanto, deve ser removido e não dará 0 caso contrário.f ... UG
assim, fornecerá os índices da entrada que não devem ser removidos, poisf
é um filtro e 0 é falso.m@Gd
converte esses índices nos 0s e 1s dos nós correspondentes.Finalmente, uma vez que a lista resultante de nós rotulados 0 e 1 é encontrada, seu comprimento é calculado (
l
) e impresso (implícito).Grande ideia graças a @PeterTaylor.
fonte
GolfScript (53 bytes)
Demonstração online
Na verdade, ainda não joguei isso, mas descobri que não é muito fácil eliminar as variáveis
H
eT
, portanto, isso pode ser o mínimo local.Recebe entrada no stdin no formato
[0 1 2 3]
. Deixa a saída em stdout.Ungolfed:
fonte
CJam,
129 75 73 68 61 4642 bytesSolução baseada no algoritmo de Peter:
Expansão de código a seguir.
Solução anterior (61 bytes):
Recebe entradas do STDIN como:
Saída é o número em STDOUT:
Algoritmo :
U
que armazena o ID do nó a ser adicionado.0
, adicione[U]
a uma lista de lista1
, adicioneU
a cada lista da lista de listas e adicione outra lista composta pelo primeiro elemento de cada lista da lista eU
length - 1
divisíveis porm
e continuo observando o primeiro elemento dessas listas. Após a filtragem, removo todo o ID removido da lista restante de IDs.Expansão do código :
Experimente aqui
fonte
Pyth,
888075 caracteresTerminei. Talvez alguém tenha algumas dicas de golfe.
Y
é a lista de adjacência do gráfico. Por motivos de golfe, também mantenho um nó nesta lista, mesmo após a exclusão do nó (caso contrário, eu precisaria atualizar todos os índices). Cada nó tem a si próprio como vizinho. A listaJ
mantém o controle dos nós excluídos.Eu mostro as alterações da lista de adjacências na entrada de exemplo
[0,1,0,1,0,1,3]
:O algoritmo é bastante simples: itere sobre todas as entradas, se entrada == 0: adicione um novo nó consigo mesmo como vizinho, se entrada == 1: adicione um novo nó com todos os nós como vizinhos (também os excluídos) e adicione este nó à lista de adjacência de todos os nós, se entrada> 1: determine os nós com # neighbour-1% input == 0 e inclua-os
J
, em cada caso, atualize os vizinhos de cada nó usandoJ
. No final, imprima o comprimento deY
menos o comprimento de (o conjunto de)J
.Uso
Basta chamar o script e fornecer como entrada
[0,1,0,1,0,1,3]
ou algum outro caso de teste.fonte
APL,
716555 caracteres{⍬≡⍺:≢⍵⋄r←1↓⍺⋄1<c←⊃⍺:r∇i⌿⍵/⍨i←0≠c|+/⍵⋄c:r∇∨⌿↑a(⍉a←⍵,1)⋄r∇0,0⍪⍵}∘(0 0⍴0)
{⍺←0 0⍴0⋄⍬≡⍵:≢⍺⋄(⍺{1<⍵:i⌿⍺/⍨i←×⍵|+/⍺⋄⍵:-⌿↑(1,1⍪⍺)1⋄0,0⍪⍺}⊃⍵)∇1↓⍵}
{g←0 0⍴0⋄(≢g)⊣{1<⍵:g⌿⍨←g/⍨←×⍵|+/g⋄(⊃g)-←g⍪⍨←g,⍨←⍵}¨2,⍵}
O gráfico é representado como uma matriz de adjacência booleana. Linhas / colunas são adicionadas e removidas conforme necessário.
fonte
Python 2, 296
Cada nó recebe um ID exclusivo e os IDs vizinhos de cada nó são registrados. Quando a diretiva é 0, uma lista de vizinhos vazia é adicionada para o novo nó. Quando a diretiva é 1, os IDs de todos os nós existentes se tornam a lista de vizinhos para o novo nó, e todas as outras listas de vizinhos são atualizadas para incluir o novo ID de nó. Para m> 1, os nós com listas de vizinhos que são um múltiplo de m são removidos da lista de nós e de todas as listas de vizinhos. Agradecemos ao @Optimizer por detectar um bug em uma versão anterior.
fonte
NetLogo, 160
A implementação é simples, lendo cada símbolo e executando a ação apropriada.
Você pode executar a partir da linha de comando como
f[0 0 1 1 0 0 1 1 2 5 7 0 1]
.fonte
Ruby
159157 ( demo )Isso define uma função chamada
G
usando a sintaxe stabby-lambda. UseG[[0, 1]]
para chamá-lo com comandos0
e1
.A implementação é bem direta: existe uma
Node
estrutura (chamadaN
acima) que contém referências a todos os nós vinculados por meio dal
propriedadeG
cria nós conforme necessário e manipula seus links. Uma versão legível está disponível aqui .fonte
CJam,
9997 bytesAinda há muito a ser jogado nisso. O algoritmo baseia-se em acompanhar a matriz de adjacência, mas representar a matriz vazia sem precisar tratá-la especialmente está me dando dores de cabeça.
Teste aqui.
A entrada é uma matriz no estilo CJam:
Você pode usar este equipamento de teste para executar todos os testes:
fonte
Python 2, 174
Provavelmente ainda pode ser muito praticado.
Eu usei um dicionário
g
para representar o gráfico. Os nós são rotulados por números e são mapeados para o conjunto de nós adjacentes. Isso significa que cada atualização de uma borda precisa ser executada nos dois pontos de extremidade.Índices de nós novos são criados pela contagem
n
. Cada vez, eu crio um novo nó vazion
. Para o comando0
, apenas permanece. Para comando1
, ele é conectado um ao outro nó viag[i]^={n};g[n]^={i}
; usando xor faça isso para que o nó não esteja conectado a si mesmo. Para comandos> 1, é excluído imediatamente.A filtragem de nós cujo grau é um múltiplo é feita localizando primeiro os nós que permanecem (
h
) e, em seguida,and
inserindo-o na lista de nós e nos vizinhos de cada nó.Finalmente, o número de entradas no dicionário de gráficos é a resposta.
fonte
Mathematica, 223 bytes
Uau, isso acabou mais do que eu esperava.
Uso:
Aqui estão os resultados dos casos de teste:
Menos golfe:
A maneira como isso funciona é representando o gráfico como uma lista de "listas de vizinhos".
Para a diretiva 0 , apenas anexo uma lista vazia.
Para a diretiva 1 , anexo uma lista de todos os nós anteriores e adiciono o novo nó a todos os nós anteriores.
Para uma diretiva > 1 , removi os nós especificados e atualizei o restante.
fonte