Objetivo
Escrever uma rotina que aceita uma cadeia de caracteres ASCII imprimíveis, é , e retorna um string contendo os mesmos caracteres que s , reordenadas de modo que não há dois caracteres substring aparece mais de uma vez. O programa deve processar todas as seqüências de referência (veja abaixo) em menos de um minuto cada, em um computador moderno . Também concederei um bônus especial de 50 repetições à resposta de pontuação mais baixa que processa qualquer sequência válida de 30 caracteres em menos de um minuto.
Por exemplo, dada a entrada Mississippi
, uma saída válida seria issiMspiips
(nenhuma substring de dois caracteres aparecerá duas vezes), enquanto uma saída inválida seria ipMsispiiss
(já que a substring is
aparece duas vezes).
A rotina pode assumir a forma de:
- uma leitura completa do programa
stdin
(ou equivalente) ou da linha de comando e saída parastdout
(ou equivalente) - uma função que aceita um argumento de string única e retorna uma string
Você pode assumir que a sequência de entrada sempre admite pelo menos uma saída válida.
O desafio
Sua rotina deve incluir 5 ou mais linhas de código separadas por novas linhas. Linhas vazias (que incluem linhas contendo apenas espaço em branco) são ignoradas em todos os contextos e não contam para a contagem total de linhas.
A troca de duas linhas no seu código-fonte deve gerar um erro fatal. Por "erro fatal", nos referimos a qualquer uma das seguintes condições:
- o código fonte falha ao compilar, com o compilador / intérprete declarando um erro fatal
- a rotina é interrompida com um erro fatal de tempo de execução ou uma exceção de tempo de execução não tratada
- a rotina é forçada a um encerramento abrupto e anormal do programa que não produz nenhum tipo de saída, exceto por uma possível mensagem de erro e / ou despejo de pilha
Como alternativa , blocos contíguos de código que não contêm caracteres de nova linha podem ser usados no lugar de linhas. Esses blocos devem ser exibidos em sua própria linha no arquivo de origem, com o entendimento de que as novas linhas são removidas antes que o código-fonte seja compilado / interpretado.
Por exemplo, o código
aaaa
bbbb
cccc
condensaria a
aaaabbbbcccc
antes de ser avaliado.
Nesse modo, a condição de erro fatal se aplica à troca de dois blocos de código (e, portanto, à troca de linhas no código-fonte antes que as novas linhas sejam removidas). Daí, no exemplo acima as rotinas aaaaccccbbbb
, bbbbaaaacccc
e ccccbbbbaaaa
deve produzir todos os erros fatais, quer no compiletime ou tempo de execução.
Os envios que usam esse modo alternativo devem declarar seu uso.
Pontuação
Seja n o número de linhas de texto não vazias no seu arquivo de origem, com n ≥ 5. Seja c o número de bytes compreendidos pela linha de texto mais longa (pelo comprimento de bytes) no seu arquivo de origem, sem contar nenhuma nova linha à direita.
A pontuação de uma submissão é dada por c ( n + 10).
A finalização com a menor pontuação é a vencedora.
Boa sorte. ;)
Benchmark Strings
Abracadabra Alacazam
Is Miss. Mississauga Missing?
Ask Alaska's Alaskans
GGGGAAAATTTTCCCCgggaaatttccc
A Man A Plan A Canal Panama
Mspiisiipss
válido, pois a única repetição é a ii
que não ocorre Mississippi
?
CooliO
, saídaoOoCli
?