(Eu pretendia postar isso em 1542: o conflito de agendamento ainda era o xkcd atual, mas eu tinha um conflito de agendamento.)
Entrada
A entrada será uma lista de 3n
elementos, que representam n
eventos. O primeiro elemento em cada grupo de 3 será o nome de um evento; o segundo e o terceiro, o horário inicial e final, respectivamente. Por exemplo:
foo 12 34 bar 56 78
representa um evento foo
que começa no "horário 12" (os horários são representados simplesmente por números inteiros; você pode pensar neles como minutos depois da meia-noite) e termina às 34, e um segundo evento bar
que começa às 56 e termina às 78.
Os nomes dos eventos sempre serão compostos apenas por caracteres alfanuméricos e os horários serão sempre números inteiros ≥ 0 e <1440. O horário de término será sempre pelo menos 1 maior que o horário de início. Não é garantido que eles sejam classificados de forma alguma.
Se você preferir, considere isso como uma única string separada por espaço; caso contrário, deve ser tomado como uma matriz, lista, vetor ou equivalente do seu idioma.
Saída
A saída deve ser uma lista separada por espaços de nomes de eventos. As regras para as quais os nomes de eventos serão exibidos:
Nenhum dos eventos que você produz pode entrar em conflito entre si. Por exemplo, com a entrada
a 0 10 b 5 15
, você não pode produzir os doisa
eb
porque os horários estão em conflito (ou seja, se sobrepõem parcialmente). Se um evento terminar exatamente quando outro iniciar, você poderá incluir os dois.Você não pode exibir o evento chamado
NSCC
("Competição Nacional de Conflitos de Agendamento"), do qual sempre haverá exatamente um deles na entrada. Você também deve gerar pelo menos um evento em conflito (parcialmente sobreposto) comNSCC
(e sempre haverá pelo menos um deles).Você deve gerar o maior número possível de eventos enquanto segue as duas regras acima. (Isso é para que você pareça o mais ocupado possível, para que a falta do NSCC pareça mais credível.)
Isso também pode ser produzido como uma única sequência separada por espaço ou uma matriz, lista, vetor etc.
Pode haver mais de uma saída possível.
Casos de teste
Observe que as saídas listadas são apenas exemplos. Seu código pode gerar algo diferente, desde que siga as três regras acima (principalmente, isso significa que deve haver a mesma quantidade de eventos que o exemplo).
Em: UnderwaterBasketWeavingConvention 50 800 NSCC 500 550
Fora:UnderwaterBasketWeavingConvention
Em: SconeEating 0 50 RegexSubbing 45 110 CodeGolfing 95 105 NSCC 100 200
Fora:SconeEating CodeGolfing
Em: VelociraptorHunting 0 300 NerdSniping 200 500 SEChatting 400 700 DoorknobTurning 650 750 NSCC 725 775
Fora:NerdSniping DoorknobTurning
Em: NSCC 110 115 A 100 120 B 120 140 C 105 135 D 100 105 E 135 500
Fora:C D E
Em: A 800 900 NSCC 700 1000 B 650 750 C 950 1050 D 655 660 E 660 665 F 1030 1040 G 1040 1060
Fora:A D E F G
Em: A 10 11 B 11 12 C 12 13 D 13 14 NSCC 15 1090 E 10 16
Fora:E
Sinta-se à vontade para adicionar mais casos de teste em uma edição se houver casos extremos que eu perdi.
Regras
Seu código deve ser concluído dentro de 30 segundos para todos os casos de teste fornecidos (isso é mais uma verificação de integridade, pois provavelmente deve ser concluído muito mais rapidamente em todos os casos de teste combinados) em uma máquina pessoal razoável.
Isso é código-golfe , então o código mais curto em bytes vence.
underwaterBasketWeavingConvention 50 800 nscc 550
vez do seu exemplo?Respostas:
Pitão, 45 bytes
Este foi bastante difícil de jogar golfe. Encontradas algumas soluções de 45 bytes, essa provavelmente é a mais exótica, pois usa
A
(atribuição de pares) e.g
(grupo por).Experimente on-line: demonstração ou equipamento de teste
Explicação
fonte
SWI-Prolog,
537524516502447436 bytesBreve explicação sobre o que cada predicado faz:
z(A,B)
verifica se um evento A não entra em conflito com nenhum evento de uma lista de eventos Bu(A,B)
verifica se todos os eventos de uma lista A não conflitam com nenhum evento de uma lista B (usado para verificar se não há conflitos na lista A chamandou(A,A)
)y(A,B,C)
divide uma lista em uma lista de trigêmeos (para transformar entradas em uma lista de eventos)d(A)
imprime os nomes dos eventos em uma lista Al(A,R)
avalia a lista mais longa de eventos R contida na lista de listas Av(A,NSCC,C,R)
retorna uma lista R contendo todas as listas de eventos em A que não possuem conflito interno e que conflitam com o evento NSCCs(A,B)
verdadeiro se B é um subconjunto de Ax(A)
predicado principal, A é a entrada.Casos de teste : execute
test.
no intérprete depois de carregar o código acima com o seguinte adicionado depois:Isso me levou muito mais tempo do que eu pensava. Provavelmente isso pode ser jogado significativamente mais. Além disso, você provavelmente poderia usar as várias bibliotecas de programação de restrição existentes para obter soluções mais curtas.
Edit: Obrigado a @Oliphaunt pela idéia de usar em
A:B:C
vez de[A,B,C]
trigêmeos. Salva 14 bytes.Edit2: Obrigado novamente a @Oliphaunt por apontar que o predicado `` t / 3` era inútil. Salva 55 bytes
Edit3: Obteve 11 bytes usando gramática de cláusula definitiva nos predicados
y
ed
.fonte
A/B/C
vez dos[A,B,C]
trigêmeos, economizando 10 bytes; 2. Você pode usar em\+
vez denot
? 3. Você poderia explicar por que precisa do corte finalx(A)
?:
vez de/
me beneficiar da associatividade correta do ex, ou seja, para que eu pudesse escreverA:_
como uma abreviação deA:_:_
(masA+B/C
funciona tão bem: você pode usá-loA+_
). A propósito, também no seu original você poderia ter usado em[A|_]
vez de[A,_,_]
. Note finalmente que minha versão do SWI-Prolog não tinhanth0/4
, então useiselect/3
.t(S,T)
mas depois esqueci. Agora testado: você pode salvar mais 55 bytes descartando-o totalmente e ligando diretamentes(E,L)
desetof/3
.JavaScript ( ES6 ), 228
Segunda tentativa, espero que funcione.
Meu destino é a sequência mais longa de eventos com conflito de tempo, mas sem conflito de tempo quando o evento NSCC é removido. Essa sequência modificada com o NSCC removido é a saída solicitada.
Uso uma pesquisa de largura em primeiro lugar para examinar uma fila de soluções candidatas, começando pela mais longa (a primeira é a lista inicial). A partir de uma solução candidata de n eventos, eu construo e enfilio n mais soluções candidatas, removendo um dos eventos e mantendo os outros.
Uma solução candidata é válida se houver um conflito de tempo 'como está', mas quando o evento NSCC é filtrado, não há conflito. Eu uso uma subfunção K para verificar se há conflitos.
Provavelmente poderia ser jogado um pouco mais ...
Teste a execução do trecho abaixo (sendo EcmaScript 6, apenas FireFox)
fonte
Java, 828 bytes
Provavelmente existe uma implementação Java mais concisa por aí, mas aqui está minha facada:
fonte
else return
.Python, 373 caracteres
Cria todas as combinações possíveis e verifica cada uma.
Teste
Entrada:
["NSCC",110,115,"A",100,120,"B",120,140,"C",105,135,"D",100,105,"E",135,500]
Saída:
fonte