A tarefa
Escreva um programa, no idioma de sua escolha, que leia as linhas de entrada da entrada padrão até o EOF e, em seguida, grave-as na saída padrão na ordem ASCIIbetics, semelhante ao sort
programa de linha de comando. Um exemplo curto e não dissimulado em Python é:
import sys
for line in sorted(sys.stdin):
print(line.rstrip('\n'))
A parte secreta
Semelhante ao The OS War , seu objetivo é provar que sua plataforma preferida é "melhor", fazendo com que seu programa seja executado deliberadamente muito mais lentamente em uma plataforma concorrente. Para o efeito deste concurso, uma "plataforma" consiste em qualquer combinação de:
- Processador
- Arquitetura (x86, Alpha, ARM, MIPS, PowerPC, etc.)
- Bitness (64 bits vs. 32 bits vs. 16 bits)
- Big-end-little-endian
- Sistema operacional
- Windows vs. Linux vs. Mac OS, etc.
- Versões diferentes do mesmo sistema operacional
- Implementação de linguagem
- Fornecedores diferentes de compilador / intérprete (por exemplo, MSVC ++ vs. GCC)
- Versões diferentes do mesmo compilador / intérprete
Embora você possa atender aos requisitos escrevendo código como:
#ifndef _WIN32
Sleep(1000);
#endif
Essa resposta não deve ser votada. O objetivo é ser sutil. Idealmente, seu código deve parecer que não depende da plataforma. Se você não tem nenhum #ifdef
declarações (ou condições baseadas em os.name
ou System.Environment.OSVersion
ou qualquer outro), eles devem ter uma justificação plausível (baseada em uma mentira, é claro).
Incluir na sua resposta
- O código
- Suas plataformas "favoritas" e "desfavorecidas".
- Uma entrada com a qual testar seu programa.
- O tempo de execução em cada plataforma, para a mesma entrada.
- Uma descrição do motivo pelo qual o programa é executado tão lentamente na plataforma desfavorável.
Respostas:
C
CleverSort
O CleverSort é um algoritmo de classificação de duas etapas de última geração (exageradamente manipulado e subótimo).
Na etapa 1, ele começa pré-classificando as linhas de entrada usando classificação de raiz e os dois primeiros bytes de cada linha. A classificação Radix não é comparativa e funciona muito bem para strings.
Na etapa 2, ele usa classificação de inserção na lista pré-classificada de seqüências de caracteres. Como a lista está quase classificada após a etapa 1, a classificação por inserção é bastante eficiente para esta tarefa.
Código
Plataformas
Todos sabemos que as máquinas big-endian são muito mais eficientes do que suas contrapartes little-endian. Para comparação, compilaremos o CleverSort com otimizações ativadas e criaremos aleatoriamente uma enorme lista (pouco mais de 100.000 strings) de linhas de 4 bytes:
Referência big-endian
Não é muito pobre.
Bechmark little-endian
Boo, pequeno Endian! Vaia!
Descrição
A classificação por inserção é realmente bastante eficiente para listas quase ordenadas, mas é terrivelmente ineficiente para listas ordenadas aleatoriamente.
A parte secreta do CleverSort é a macro FIRSTSHORT :
Em máquinas big endian, ordenar uma sequência de dois números inteiros de 8 bits lexicograficamente ou convertê-los em números inteiros de 16 bits e ordená-los posteriormente produz os mesmos resultados.
Naturalmente, isso também é possível em máquinas little-endian, mas a macro deveria ter sido
que funciona como esperado em todas as plataformas.
O "benchmark big endian" acima é realmente o resultado do uso da macro apropriada.
Com a macro errada e uma máquina little-endian, a lista é pré-classificada pelo segundo caractere de cada linha, resultando em uma ordem aleatória do ponto de vista lexicográfico. O tipo de inserção se comporta muito mal nesse caso.
fonte
Python 2 x Python 3
Obviamente, o Python 3 é várias ordens de magnitude mais rápido que o Python 2. Vamos tomar esta implementação do algoritmo Shellsort como um exemplo:
Código
Referência
Prepare uma entrada de teste. Isso é retirado da resposta de Dennis, mas com menos palavras - o Python 2 é muito lento ...
Python 2
Python 3
Onde está o código secreto?
Suponho que alguns leitores possam querer caçar o malandro, então escondo a resposta com uma etiqueta de spoiler.
Bônus 1:
Bônus 2:
fonte
flag
parece somente para gravação, não foi possível removê-lo? Além disso,r
parece supérfluo se você o fizerif lst[i+h] < lst[i]: ...
. Por outro lado, se você continuar,r
por que fazer a troca? Você não poderia simplesmente fazerlst[i+h] = lst[i]
? Tudo isso é uma distração intencional?