Як ми всі знаємо, сучасні операційні системи мають планувальники потоків, які можуть вибирати різні замовлення для планування ваших потоків на основі внутрішньої логіки, до якої ваш код не прихований. Зазвичай ви проектуєте свій багатопотоковий код, щоб переконатися, що цей недетермінізм, накладений на вас, не має значущого впливу на ваш результат.
Мета тут - протилежна. Створіть програму, яка друкує цілі числа в інтервалі [0,99], але в порядку, який буде змінюватися від запуску до запуску завдяки планувальнику потоків ОС.
Ви повинні досягти "достатнього недетермінізму", визначеного як:
У 10 послідовних наборах з 10 випробувань ваша програма повинна створити щонайменше 9 унікальних перестановок у межах кожного випробування. Ви можете мати достатню кількість невдалих наборів випробувань з будь-якої сторони послідовних 10, які досягли успіху.
Або, простіше кажучи, вам потрібно 100 запусків вашої програми, де кожен блок з 10 запусків має щонайбільше два запуски, які виводять те саме.
Тож час від часу обмінюванням 98 та 99 це не скоротить.
Це кодовий гольф , тому відповідь, в якій використовується найменше байт, виграє.
Хвилини
- Напишіть свій вихід у stdout, один запис у рядку
- Якщо ви маніпулюєте формат, маючи два перемежуваних символи, що записують у stdout (навіть зрідка), що призводить до таких речей, як трицифрові числа чи порожні рядки, результат недійсний
- Єдиним винятком із вищезазначеного правила є те, що ви можете випустити один порожній рядок після друку останнього необхідного номера (бажано)
- Якщо ви коли-небудь пропускаєте чи дублюєте будь-які необхідні значення, результат недійсний
- Вашій програмі не потрібно бути недетермінованою на одноядерному процесорі (хоча кудо, якщо є)
- Ваша програма може використовувати зелені нитки / волокна, які фактично не керуються ядром ОС, якщо вона все ще відповідає іншим вимогам завдання, і система нарізки є частиною вашої мови або стандартної бібліотеки для вашої мови
- Час виконання вашої програми повинен бути надійно меншим за 5 секунд на сучасному процесорі
- Ви не можете вказувати зміни в середовищі, які відбуваються поза вашою програмою, наприклад, очікування чи зміни налаштувань; Ваша програма повинна проходити 100-кратну передачу назад до спини або з годиною між кожним пробігом або 100 разів паралельно (це, мабуть, допоможе насправді ...)
- Ви можете використовувати такий копроцесор, як GPU або Xeon Phi, і власний внутрішній механізм планування для виконання завдань. Правила застосовуються до цього так само, як і до зелених ниток.
- Сміливо провокуйте планувальника всіма способами сну, врожаїв та іншими хитрощами, якщо ви дотримуєтесь правил, зазначених у цій публікації.
Заборонені операції
Єдине джерело недетермінізму, до якого ви можете дозволитись, - це коли планувальник планує запускати ваші потоки. Наступний список не є вичерпним, призначений лише для того, щоб навести приклади речей, які вам заборонено робити, як вони визнають інші джерела недетермінізму.
- Прямий або опосередкований доступ до будь-якого типу PRNG або апаратних можливостей RNG (якщо це не є невід'ємною частиною планувальника).
- Читання будь-якого типу введення (системний час, файлова система, мережа тощо)
- Читання ідентифікаторів потоку або ідентифікаторів процесів
- Настроювання планувальника ОС; ви повинні використовувати стандартний планувальник ОС з основної ОС
- Настроювання планувальника зелених ниток / волокон також заборонено. Це означає, що якщо ви пишете мову для цього завдання, ви повинні використовувати потоки ОС.
Перевірка відповідей
Переважно відповідь буде працювати у всіх звичайних ОС та сучасних процесорах, причому кудос присвоюється пропорційно широті підтримки. Однак це не є вимогою виклику. Як мінімум, відповідь повинна підтримувати один сучасний SMP-процесор та сучасну ОС. Я перевіряю провідні відповіді в мірі наявності мого обладнання.
- Якщо ваш запис не дасть необхідного виводу для i7 5960x під керуванням Windows 10 v1607 x64, вкажіть необхідне середовище
- Якщо я щось можу легко відтворити за допомогою VMWare Workstation, надайте точні характеристики ОС та VM
- Якщо його не можна створити ні в одному з цих умов, запишіть одночасний знімок екрана тесту, як описано в розділі заголовка, та ручну відеозапис вашого екрана за допомогою взаємодії миші та клавіатури (або будь-якої схеми управління вашої нестандартної обчислення. пристрій використовує) чітко видно і розміщуйте обидва відео разом із вашою відповіддю та додайте пояснення, чому це працює
- Крім того, знайдіть поважного давнього користувача (хто не ви) з відповідним обладнанням, щоб відтворити результат і поручити за вас
- Якщо ваш запис є екзотичною мовою програмування, типовий розробник не буде налаштований на компіляцію / jit / interpret, надайте інструкції з налаштування
- Якщо запис залежить від конкретної версії інтерпретатора JVM / Python / іншого, вкажіть, яку саме
- Якщо на те, щоб отримати 10 успішних послідовних наборів випробувань на моєму тестуванні, потрібно більше 10 хвилин, щоб не вдалося (тому не дозволяйте умові успіху бути виродком, особливо якщо ви знаходитесь біля верхнього час виконання)