Visão geral
Nesse desafio, sua tarefa é gerar aleatoriamente uma função matemática monotônica entre dois conjuntos.
Entrada
Suas entradas são dois números inteiros positivos s
e n
.
Depois de obter essas entradas, seu programa deve gerar uma função matemática aleatóriaf
do conjunto para . Em outras palavras, é uma "regra" que recebe um número múltiplo de números inteiros entre e e retorna um número inteiro. Além disso, deve ser monotônico no seguinte sentido. Se e são dois -tuples, tal que vale para todas as coordenadas , então .{0,1,...,s-1}n
{0,1,...,s-1}
f
n
0
s-1
f
A
B
n
A[i] ≥ B[i]
i
f(A) ≥ f(B)
A distribuição exata das funções monotônicas f
não importa, desde que cada uma dessas funções tenha uma probabilidade positiva de ser gerada (assumindo um RNG perfeito).
Resultado
Sua saída deve ser uma enumeração das entradas e saídas de f
. Deve conter todos os n
-tuplos de números inteiros entre 0
e s-1
em alguma ordem, cada um sendo seguido pela saída correspondente de f
. O formato exato da saída é flexível (dentro do motivo).
Exemplos
As entradas s = 3
e n = 2
podem produzir a saída
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 0
(1, 1) 1
(1, 2) 2
(2, 0) 1
(2, 1) 1
(2, 2) 2
Ele contém todos os pares sobre o conjunto {0, 1, 2}
exatamente uma vez e cada um é seguido pelo seu f
valor. A condição de monotonicidade também é satisfeita. As tuplas são fornecidas aqui em ordem lexicográfica, mas isso não é necessário.
Como outro exemplo, s = 2
e n = 4
pode produzir
(0, 0, 0, 0) 0
(0, 0, 0, 1) 0
(0, 0, 1, 0) 0
(0, 0, 1, 1) 0
(0, 1, 0, 0) 1
(0, 1, 0, 1) 1
(0, 1, 1, 0) 1
(0, 1, 1, 1) 1
(1, 0, 0, 0) 0
(1, 0, 0, 1) 1
(1, 0, 1, 0) 0
(1, 0, 1, 1) 1
(1, 1, 0, 0) 1
(1, 1, 0, 1) 1
(1, 1, 1, 0) 1
(1, 1, 1, 1) 1
A seguir, são apresentadas todas as saídas possíveis para s = 2
e n = 2
(até a reordenação das tuplas); seu programa deve gerar aleatoriamente um deles:
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 0
-------
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 0
(1,0) 1
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 1
(1,1) 1
-------
(0,0) 1
(0,1) 1
(1,0) 1
(1,1) 1
Regras e Pontuação
Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas. Código com explicação é o preferido.
Não há restrições à complexidade do tempo, mas darei um bônus de -15% se a sua solução sempre garantir a conclusão em um determinado período de tempo (dependendo das entradas e assumindo um RNG perfeito que funcione em tempo constante) .
fonte
Respostas:
Pitão, 35 bytes (38 - 15% = 31,45 mais abaixo)
Demonstração
A entrada está no formato:
A saída está no formato:
Simplesmente gera possibilidades aleatórias e as testa.
Versão alternativa de 37 bytes, que acredito qualificar para o bônus:
Demonstração
Isso começa gerando todas as funções monotônicas possíveis e gera uma aleatoriamente. É muito mais lento e termina em
2,2
.fonte
3, 2
. Infelizmente, nem recebi uma resposta3, 3
no executor pyth online. Existe um loop infinito para essa combinação ?!2, 4
, mas não muito mais.CJam, 40 bytes - 15% = 34 bytes
Essa abordagem gera todas as funções válidas e, em seguida, seleciona aleatoriamente. O tempo de execução é pelo menos O (s 2s n ) , mas constante para uma determinada entrada.
Duvido que seja isso que o OP tinha em mente, mas é garantido que terminará em um determinado período de tempo (dependendo das entradas) [...] e, portanto, qualifique-se para o bônus.
Experimente on-line no intérprete CJam .
fonte
Julia, 64 bytes (-15% = 54,4)
Ungolfed:
Isso será executado rapidamente, com o único problema possível com a memória para se suficientemente grande n (g (10,10) tiver que produzir uma matriz 10 ^ 10, portanto, obviamente, ficará sem memória - mesmo que cada número seja um byte, são 10 gigabytes de dados).
A saída é indexação com base em 1; portanto, para determinar o resultado de uma determinada entrada, você precisa adicionar uma a cada valor de entrada. Por exemplo, para encontrar f (1,2,6,0,3), você precisa examinar
K[2,3,7,1,4]
.fonte