Como todos sabemos, os sistemas operacionais modernos têm agendadores de encadeamentos que podem escolher pedidos diferentes para agendar seus encadeamentos com base na lógica interna da qual seu código não tem acesso. Normalmente, você arquiteta seu código multithread para garantir que esse não determinismo imposto a você não afete significativamente sua saída.
O objetivo aqui é o oposto. Produza um programa que imprima os números inteiros no intervalo [0,99], mas em uma ordem que varia de execução para execução devido ao agendador de encadeamentos do SO.
Você deve obter "não-determinismo suficiente", definido como:
Em 10 conjuntos seqüenciais de 10 tentativas, seu programa deve produzir pelo menos 9 permutações exclusivas dentro de cada tentativa. Você pode ter um número razoável de conjuntos de testes com falha em ambos os lados dos 10 consecutivos que tiverem êxito.
Ou, dito de outra maneira, você precisa de 100 execuções do seu programa, onde cada bloco de 10 execuções possui no máximo duas execuções que produzem a mesma coisa.
Portanto, ocasionalmente, trocar 98 e 99 não será suficiente.
Este é um código-golfe , então a resposta que usa o menor número de bytes vence.
Minutiae
- Escreva sua saída em stdout, uma entrada por linha
- Se você alterar o formato com duas threads que intercalam gravações de caracteres em stdout (mesmo que ocasionalmente), resultando em números de três dígitos ou linhas vazias, seu resultado será inválido.
- A única exceção à regra acima é que você pode emitir uma única linha vazia após imprimir o último número necessário (de nada)
- Se você perder ou duplicar algum valor necessário, seu resultado será inválido.
- Seu programa não precisa ser não determinístico em um processador de núcleo único (apesar de parabéns, se for o caso)
- Seu programa pode usar linhas / fibras verdes que não são realmente gerenciadas pelo kernel do sistema operacional, se ele ainda atender aos outros requisitos do desafio e o sistema de encadeamento fizer parte do seu idioma ou da biblioteca padrão do seu idioma
- O tempo de execução do seu programa deve ser inferior a 5 segundos em um processador moderno
- Você não pode especificar alterações no ambiente que ocorram fora do seu programa, como esperas ou alterações nas configurações; seu programa deve passar se executado 100 vezes vezes consecutivas ou com uma hora entre cada execução ou 100ish vezes em paralelo (isso provavelmente ajudaria realmente ...)
- Você pode usar um coprocessador como uma GPU ou Xeon Phi e seu próprio mecanismo de agendamento interno para tarefas. As regras se aplicam a isso da mesma maneira que se aplicam às linhas verdes.
- Sinta-se à vontade para provocar o agendador com todos os tipos de sonecas, rendimentos e outros truques, desde que você obedeça às regras especificadas nesta postagem
Operações proibidas
A única fonte de não determinismo que você pode usar é quando o agendador agenda seus threads para execução. A lista a seguir não é exaustiva, destina-se apenas a fornecer exemplos de coisas que você não tem permissão para fazer, pois admitem outras fontes de não-determinismo.
- Acessar direta ou indiretamente qualquer tipo de capacidade de PRNG ou RNG de hardware (a menos que seja parte integrante do planejador).
- Leitura em qualquer tipo de entrada (hora do sistema, sistema de arquivos, rede, etc.)
- Lendo IDs de Threads ou Process IDs
- Customizando o agendador do SO; você deve usar um agendador padrão do sistema operacional a partir de um sistema operacional principal
- Também é proibido personalizar seu agendador de linha / fibra verde. Isso significa que, se você escrever um idioma para esse desafio, deverá usar os threads do SO.
Resposta Validação
De preferência, uma resposta funcionaria em todos os sistemas operacionais comuns e processadores modernos, com elogios concedidos proporcional à amplitude do suporte. No entanto, este não é um requisito do desafio. No mínimo, uma resposta deve suportar um processador SMP moderno e um SO moderno. Testarei as principais respostas na extensão da minha disponibilidade de hardware.
- Se sua entrada não produzir a saída necessária em um i7 5960x executando o Windows 10 v1607 x64, especifique o ambiente necessário
- Se for algo que eu possa reproduzir facilmente com o VMWare Workstation, forneça as especificações exatas de SO e VM
- Se não puder ser produzido em nenhuma dessas condições, grave uma captura de tela simultânea do teste, conforme descrito na seção do cabeçalho e uma gravação de vídeo portátil da sua tela com a interação do mouse e do teclado (ou qualquer esquema de controle que seu cálculo não seja padrão) uso do dispositivo) claramente visível e publique os dois vídeos junto com sua resposta e inclua uma explicação do motivo pelo qual ele funciona
- Como alternativa, obtenha um usuário de longa data respeitável (que não seja você) com o hardware correspondente para reproduzir o resultado e atestá-lo
- Se sua entrada estiver em uma linguagem de programação exótica em que um desenvolvedor típico não será configurado para compilar / jit / interpretar, forneça instruções de configuração
- Se sua entrada depender de uma versão específica do interpretador JVM / Python / outro, especifique qual
- Se você levar mais de 10 minutos de execuções consecutivas para obter seus 10 conjuntos de testes sequenciais bem-sucedidos em meus testes, você falhará (portanto, não permita que a condição de sucesso seja uma ocorrência esquisita, especialmente se você estiver próximo da parte superior). limite de tempo de execução)
fonte
Respostas:
Perl 6 , 27 bytes
Explicação:
Espero que isso satisfaça a tarefa. (Se não, por favor me avise).
Teste:
O script de shell que usei para testar o não determinismo suficiente:
Para mim, isso gera:
Instruções de configuração:
Fiz o teste com um Rakudo Perl 6 atualizado no Linux de 64 bits, mas acho que ele funcionará em outras plataformas.
A página de download do Rakudo possui instruções de configuração. Eu compilei o meu do git assim:
Experimente online:
Ou apenas teste-o on-line, usando o link Try It Online, fornecido por @ b2gills. Verifiquei algumas execuções e recebi um pedido diferente a cada vez, mas não tive a paciência de executá-lo 100 vezes por meio dessa interface online.
fonte
Bash,
3228 bytesCorri isso 100 vezes e obtive 100 resultados diferentes.
Editar: salvou 4 bytes graças a @DigitalTrauma.
fonte
for i in {0..99};{ echo $i&}
, mas você postou primeiro - você pode pegá-lo :) #PowerShell ,
54464439 bytesOs fluxos de trabalho do PowerShell não são suportados no TIO, portanto você não pode experimentá-lo lá. No entanto, deve funcionar muito bem na sua máquina Windows 10 :)
Define uma função
p
que produzirá a lista de números quando chamada.Cronometragem
Uma única execução é executada de forma confiável em cerca de 600ms na minha máquina. Os 100 testes definidos abaixo terminam em menos de 2 minutos.
Teste
Aqui está o código completo para testá-lo:
Saída na minha máquina:
fonte
GCC no Linux, 47 bytes
Isso me deu resultados diferentes praticamente todas as vezes, tendo sido compilado com
gcc
(sem sinalizadores) versão 4.9.2. Especificamente, eu estava no Debian 8.6 de 64 bits (versão 3.16.31 do kernel).Explicação
Se o
fork()
retorno zero (processo filho), o valor dei
é impresso e a condição do loop é falsa, porqueprintf
retornará um valor maior que zero. No processo pai, a condição do loop é justai--
.fonte