Jak wszyscy wiemy, nowoczesne systemy operacyjne mają harmonogramy wątków, które mogą wybierać różne zamówienia do planowania wątków w oparciu o wewnętrzną logikę, do której kod nie jest wtajemniczony. Zwykle architektujesz swój wielowątkowy kod, aby mieć pewność, że narzucony ci niedeterminizm nie wpłynie znacząco na wynik.
Cel tutaj jest odwrotny. Utwórz program, który drukuje liczby całkowite w przedziale [0,99], ale w kolejności, która będzie się różnić w zależności od uruchomienia z powodu harmonogramu wątków systemu operacyjnego.
Musisz osiągnąć „wystarczającą niedeterminizm”, zdefiniowaną jako:
W 10 kolejnych zestawach po 10 prób twój program musi wygenerować co najmniej 9 unikalnych kombinacji w każdej próbie. Możesz mieć rozsądną liczbę nieudanych zestawów prób po obu stronach kolejnych 10, które się powiodły.
Innymi słowy, potrzebujesz 100 uruchomień programu, w których każdy blok 10 uruchomień ma co najwyżej dwa uruchomienia, które generują to samo.
Od czasu do czasu zamiana 98 i 99 go nie uciszy.
To jest golf golfowy , więc wygrywa odpowiedź wykorzystująca najmniej bajtów.
Drobne szczegóły
- Napisz wyjście na standardowe wyjście, po jednym wpisie w wierszu
- Jeśli zmienisz format, gdy dwa wątki przeplatają zapisywanie znaków na standardowe wyjście (nawet sporadycznie), czego rezultatem są liczby trzycyfrowe lub puste linie, wynik jest nieprawidłowy
- Jedynym wyjątkiem od powyższej zasady jest to, że możesz wydrukować pojedynczy pusty wiersz po wydrukowaniu ostatniego wymaganego numeru (nie ma za co)
- Jeśli kiedykolwiek pominiesz lub powielisz wymagane wartości, wynik jest nieważny
- Twój program nie musi być niedeterministyczny w przypadku procesorów jednordzeniowych (choć w przypadku uznania)
- Twój program może używać zielonych wątków / włókien, które nie są w rzeczywistości zarządzane przez jądro systemu operacyjnego, jeśli nadal spełnia inne wymagania wyzwania, a system wątków jest częścią twojego języka lub standardowej biblioteki dla twojego języka
- Środowisko wykonawcze dla Twojego programu musi działać niezawodnie poniżej 5 sekund na nowoczesnym procesorze
- Nie można określić zmian w środowisku, które mają miejsce poza programem, takich jak zmiany oczekiwania lub zmiany ustawień; Twój program powinien przejść bez względu na to, czy uruchamia się 100 razy z powrotem do tyłu, czy z godziną między każdym uruchomieniem, czy 100 razy równolegle (prawdopodobnie pomogłoby to faktycznie ...)
- Do zadań możesz użyć koprocesora, takiego jak GPU lub Xeon Phi i własnego wewnętrznego mechanizmu planowania. Reguły mają do tego zastosowanie w taki sam sposób, jak dotyczą zielonych nici.
- Nie krępuj się sprowokować harmonogramu wszystkimi rodzajami snu, wydajności i innymi sztuczkami, o ile przestrzegasz zasad określonych w tym poście
Zablokowane operacje
Jedynym źródłem niedeterminizmu, z którego możesz korzystać, jest harmonogram, w którym harmonogram uruchamia wątki. Poniższa lista nie jest wyczerpująca, ma jedynie na celu przedstawienie przykładów rzeczy, których nie wolno ci robić, ponieważ dopuszczają inne źródła niedeterminizmu.
- Bezpośredni lub pośredni dostęp do dowolnego rodzaju PRNG lub sprzętu RNG (chyba że jest to nieodłączna część harmonogramu).
- Odczytywanie dowolnego rodzaju danych wejściowych (czas systemowy, system plików, sieć itp.)
- Odczytywanie identyfikatorów wątków lub identyfikatorów procesów
- Dostosowywanie harmonogramu systemu operacyjnego; musisz użyć standardowego harmonogramu systemu operacyjnego z głównego systemu operacyjnego
- Dostosowywanie harmonogramu zielonej nici / włókna jest również zabronione. Oznacza to, że jeśli piszesz język dla tego wyzwania, musisz używać wątków systemu operacyjnego.
Odpowiedź Walidacja
Najlepiej byłoby, gdyby odpowiedź działała we wszystkich popularnych systemach operacyjnych i nowoczesnych procesorach, a nagrody uznania byłyby proporcjonalne do zakresu wsparcia. Nie jest to jednak wymaganie związane z wyzwaniem. Odpowiedź musi co najmniej obsługiwać jeden nowoczesny procesor SMP i nowoczesny system operacyjny. Przetestuję wiodące odpowiedzi w zakresie mojej dostępności sprzętu.
- Jeśli twoja pozycja nie wygeneruje wymaganego wyjścia na i7 5960x z systemem Windows 10 v1607 x64, określ wymagane środowisko
- Jeśli jest to coś, co mogę łatwo odtworzyć za pomocą VMWare Workstation, podaj dokładne specyfikacje systemu operacyjnego i maszyny wirtualnej
- Jeśli nie można go wyprodukować w żadnym z tych warunków, należy zarejestrować jednoczesne przechwytywanie ekranu testu zgodnie z opisem w sekcji nagłówka oraz ręczne nagrywanie wideo ekranu za pomocą interakcji myszy i klawiatury (lub dowolnego schematu sterowania niestandardowego obliczenia urządzenie używa) wyraźnie widoczne i opublikuj oba filmy wraz z odpowiedzią oraz wyjaśnij, dlaczego to działa
- Alternatywnie, uzyskaj renomowanego długoletniego użytkownika (który nie jest tobą) z pasującym sprzętem, aby odtworzyć wynik i ręczyć za ciebie
- Jeśli Twój wpis jest w egzotycznym języku programowania, którego typowy programista nie zostanie skonfigurowany do kompilacji / jit / interpret, podaj instrukcje instalacji
- Jeśli wpis zależy od konkretnej wersji interpretera JVM / Python / innej, określ którą
- Jeśli zajmie Ci więcej niż 10 minut ciągłych przebiegów, aby uzyskać 10 udanych sekwencyjnych zestawów prób w moim teście, nie powiedzie się (więc nie pozwól, aby warunek powodzenia był dziwnym zjawiskiem, szczególnie jeśli jesteś blisko górnej granicy związany ze środowiskiem uruchomieniowym)