Задание
Напишите программу на языке по вашему выбору, которая читает строки ввода от стандартного ввода до EOF, а затем записывает их в стандартный вывод в ASCIIbetical порядке, аналогично программе sort
командной строки. Короткий, не закулисный пример в Python:
import sys
for line in sorted(sys.stdin):
print(line.rstrip('\n'))
Закулисная часть
Как и в OS War , ваша цель - доказать, что ваша любимая платформа «лучше», так как ваша программа намеренно работает намного медленнее на конкурирующей платформе. Ради этого конкурса «платформа» состоит из любой комбинации:
- процессор
- Архитектура (x86, Alpha, ARM, MIPS, PowerPC и т. Д.)
- Битность (64-битные и 32-битные против 16-битных)
- Биг - против байтов
- Операционная система
- Windows против Linux против Mac OS и т. Д.
- Разные версии одной и той же операционной системы
- Языковая реализация
- Различные поставщики компиляторов / интерпретаторов (например, MSVC ++ против GCC)
- Разные версии одного и того же компилятора / интерпретатора
Хотя вы могли бы удовлетворить требования, написав такой код:
#ifndef _WIN32
Sleep(1000);
#endif
Такой ответ не должен быть одобрен. Цель состоит в том, чтобы быть тонким. В идеале ваш код должен выглядеть так, как будто он вообще не зависит от платформы. Если же есть какие - либо #ifdef
заявления (или условия , основанные на os.name
или System.Environment.OSVersion
или любой другой ), они должны иметь правдоподобное обоснование (на основе лжи, конечно).
Включить в свой ответ
- Код
- Ваши «любимые» и «любимые» платформы.
- Вход для тестирования вашей программы.
- Время работы на каждой платформе для одного и того же ввода.
- Описание того, почему программа работает так медленно на нежелательной платформе.
Ответы:
С
CleverSort
CleverSort - это современный (то есть чрезмерно спроектированный и неоптимальный) алгоритм двухэтапной сортировки строк.
На шаге 1 он начинается с предварительной сортировки входных строк с использованием сортировки по основанию и первых двух байтов каждой строки. Radix sort не сравнительный и очень хорошо работает со строками.
На шаге 2 он использует сортировку вставкой в предварительно отсортированном списке строк. Так как список почти отсортирован после шага 1, сортировка вставки довольно эффективна для этой задачи.
Код
платформы
Мы все знаем, что машины с прямым порядком байтов намного эффективнее их аналогов с прямым порядком байтов. Для бенчмаркинга мы скомпилируем CleverSort с включенной оптимизацией и случайным образом создадим огромный список (чуть более 100 000 строк) из 4-байтовых строк:
Big-endian тест
Не слишком потрепанный.
Младшая последовательность
Бу, маленький Эндиан! Бу!
Описание
Сортировка вставками действительно довольно эффективна для почти отсортированных списков, но ужасно неэффективна для случайно отсортированных.
Подчеркнутой частью CleverSort является макрос FIRSTSHORT :
На машинах с обратным порядком байтов упорядочение строки из двух 8-разрядных целых чисел лексикографически или преобразование их в 16-разрядные целые числа и последующее их упорядочение дает те же результаты.
Естественно, это возможно и на машинах с прямым порядком байтов, но макрос должен был
который работает, как и ожидалось, на всех платформах.
Вышеуказанный «эталонный порядок байтов» является результатом использования правильного макроса.
При неправильном макросе и порядке с прямым порядком байтов список предварительно сортируется по второму символу каждой строки, что приводит к случайному упорядочению с лексикографической точки зрения. Сортировка вставок в этом случае ведет себя очень плохо.
источник
Python 2 против Python 3
Очевидно, что Python 3 на несколько порядков быстрее, чем Python 2. Давайте возьмем эту реализацию алгоритма Shellsort в качестве примера:
Код
эталонный тест
Подготовьте тестовый ввод. Это взято из ответа Дениса, но с меньшим количеством слов - Python 2 ооочень медленный ...
Python 2
Python 3
Где секретный код?
Я предполагаю, что некоторые читатели могут захотеть выследить обманщика сами, поэтому я скрываю ответ с помощью тега спойлера.
Бонус 1:
Бонус 2:
источник
flag
выглядит только для записи, не могли бы вы удалить его? Кроме того,r
кажется излишним, если вы делаетеif lst[i+h] < lst[i]: ...
. С другой стороны, если вы продолжаете,r
зачем делать своп? Не могли бы вы просто сделатьlst[i+h] = lst[i]
? Является ли все это намеренным отвлечением?