Comme nous le savons tous, les systèmes d'exploitation modernes ont des planificateurs de threads qui peuvent choisir différentes commandes pour planifier vos threads en fonction d'une logique interne dont votre code n'est pas au courant. Normalement, vous architecturez votre code multithread pour vous assurer que ce non-déterminisme qui vous est imposé n'affecte pas significativement votre sortie.
Le but ici est le contraire. Produisez un programme qui imprime les entiers dans l'intervalle [0,99] mais dans un ordre qui variera d'une exécution à l'autre en raison du planificateur de threads du système d'exploitation.
Vous devez parvenir à "suffisamment de non-déterminisme", défini comme:
En 10 séries séquentielles de 10 essais, votre programme doit produire au moins 9 permutations uniques dans chaque essai. Vous pouvez avoir un nombre raisonnable d'épreuves échouées de chaque côté des 10 consécutives qui réussissent.
Ou, pour le dire autrement, vous avez besoin de 100 exécutions de votre programme où chaque bloc de 10 exécutions a au plus deux exécutions qui produisent la même chose.
Ainsi, l'échange de temps en temps de 98 et de 99 ne suffira pas.
C'est un code-golf , donc la réponse qui utilise le moins d'octets l'emporte.
Menus détails
- Écrivez votre sortie sur stdout, une entrée par ligne
- Si vous modifiez le format en écrivant deux caractères entrelacés sur la sortie standard (même occasionnellement), ce qui entraîne des choses comme des nombres à trois chiffres ou des lignes vides, votre résultat n'est pas valide.
- La seule exception à la règle ci-dessus est que vous pouvez émettre une seule ligne vide après avoir imprimé le dernier numéro requis (vous êtes les bienvenus)
- Si vous manquez ou dupliquez des valeurs requises, votre résultat n'est pas valide
- Votre programme n'a pas besoin d'être non déterministe sur un processeur monocœur (mais bravo s'il l'est)
- Votre programme peut utiliser des threads / fibres verts qui ne sont pas réellement gérés par le noyau du système d'exploitation s'il ne répond toujours pas aux autres exigences du défi et que le système de thread fait partie de votre langue ou de la bibliothèque standard de votre langue
- Le temps d'exécution de votre programme doit être fiable en moins de 5 secondes sur un processeur moderne
- Vous ne pouvez pas spécifier les modifications de l'environnement qui se produisent en dehors de votre programme, telles que les attentes ou les modifications des paramètres; votre programme devrait réussir, qu'il soit exécuté 100 fois consécutivement ou avec une heure entre chaque exécution ou 100 secondes en parallèle (cela aiderait probablement en fait ...)
- Vous pouvez utiliser un coprocesseur tel qu'un GPU ou Xeon Phi et son propre mécanisme de planification interne pour les tâches. Les règles s'appliquent à cela de la même manière qu'elles s'appliquent aux fils verts.
- N'hésitez pas à provoquer le programmateur avec toutes sortes de sommeil, de rendements et d'autres astuces tant que vous obéissez aux règles spécifiées dans ce post
Opérations interdites
La seule source de non-déterminisme sur laquelle vous êtes autorisé à utiliser est lorsque le planificateur planifie l'exécution de vos threads. La liste suivante n'est pas exhaustive, destinée uniquement à fournir des exemples de choses que vous n'êtes pas autorisé à faire car elles admettent d'autres sources de non-déterminisme.
- Accéder directement ou indirectement à tout type de capacité PRNG ou RNG matériel (sauf si elle fait partie intégrante du planificateur).
- Lecture de tout type d'entrée (heure système, système de fichiers, réseau, etc.)
- Lecture d'ID de thread ou d'ID de processus
- Personnalisation du planificateur du système d'exploitation; vous devez utiliser un planificateur de système d'exploitation standard à partir d'un système d'exploitation traditionnel
- La personnalisation de votre planificateur de thread / fibre verte est également interdite. Cela signifie que si vous écrivez une langue pour ce défi, vous devez utiliser des threads du système d'exploitation.
Validation des réponses
De préférence, une réponse fonctionnerait sur tous les systèmes d'exploitation courants et les processeurs modernes, avec des félicitations attribuées proportionnellement à l'étendue du support. Cependant, ce n'est pas une exigence du défi. Au minimum, une réponse doit prendre en charge un processeur SMP moderne et un système d'exploitation moderne. Je testerai les principales réponses dans la mesure de la disponibilité de mon matériel.
- Si votre entrée ne produit pas la sortie requise sur un i7 5960x exécutant Windows 10 v1607 x64, spécifiez l'environnement requis
- Si c'est quelque chose que je peux facilement reproduire avec VMWare Workstation, fournissez les spécifications exactes du système d'exploitation et de la machine virtuelle
- S'il ne peut pas être produit dans l'une de ces conditions, enregistrez une capture d'écran simultanée du test comme décrit dans la section d'en-tête et un enregistrement vidéo portable de votre écran avec votre interaction avec la souris et le clavier (ou quel que soit le schéma de contrôle de votre calcul non standard utilisation de l'appareil) clairement visible et postez les deux vidéos avec votre réponse et expliquez pourquoi cela fonctionne
- Alternativement, obtenez un utilisateur de longue date de bonne réputation (qui n'est pas vous) avec du matériel correspondant pour reproduire le résultat et se porter garant pour vous
- Si votre entrée est dans un langage de programmation exotique qu'un développeur typique ne sera pas configuré pour compiler / jit / interpréter, fournissez des instructions de configuration
- Si votre entrée dépend d'une version spécifique de l'interpréteur JVM / Python / autre, spécifiez laquelle
- Si cela prend plus de 10 minutes consécutives pour obtenir vos 10 séries d'essais séquentielles réussies dans mes tests, vous échouez (alors ne laissez pas la condition de succès être un phénomène anormal, surtout si vous êtes près de la limite supérieure). lié à l'exécution)