Sua tarefa aqui será implementar uma função 1 que forme uma permutação nos números inteiros positivos (A bijeção dos inteiros positivos para si mesmos). Isso significa que cada número inteiro positivo deve aparecer exatamente uma vez na permutação. O problema é que sua função deve ter uma probabilidade maior de gerar um número ímpar que um número par.
Agora isso pode parecer estranho ou impossível. Certamente existem tantos números ímpares quanto números pares? E embora essa intuição esteja correta para conjuntos finitos, na verdade não é válida para conjuntos infinitos. Por exemplo, tome a seguinte permutação:
1 3 2 5 7 4 9 11 6 13 15 8 17 19 10 21 23 12 25 27 14 29 31 16 33 35 18 37 39 20 41 43 22 45 47 24 49 51 26 53 55 ...
Se você tomar qualquer subseção da sequência com tamanho maior que , terá pelo menos tantos números ímpares quanto números pares, portanto, parece que a probabilidade de qualquer termo aleatório ser ímpar é maior do que a de ser par. Você também notará que todos os números pares ou ímpares aparecerão na sequência e podem aparecer apenas uma vez. Assim, a sequência é uma verdadeira permutação.
Definição de Probabilidade
Para evitar confusão ou ambiguidade, explicarei claramente o que se entende por probabilidade nesta questão.
Digamos que temos uma função . A probabilidade de um número ser ímpar será definida como o limite da razão de membros ímpares do conjunto para o tamanho do conjunto pois tende para o infinito.
Por exemplo, a função acima mencionada teria uma probabilidade de ser ímpar de .
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Desafios extras
Aqui estão algumas idéias divertidas para brincar e talvez tentar implementar. Estes são apenas para diversão e não afetam a pontuação de forma alguma. Algumas delas nem sequer são soluções válidas para esse desafio, e uma resposta que inclui apenas soluções para os desafios 2 ou 3 não é uma resposta válida e pode ser excluída .
Escreva uma permutação com uma probabilidade ímpar de . (isso é possível)
Escreva uma permutação que tenha mais números ímpares do que números pares em para qualquer mas que tenha uma probabilidade ímpar de .
Escreva uma permutação que não tenha probabilidade definida (ou seja, não há limite).
1: Aqui, função significa programa ou função. É apenas um pedaço de código que recebe entrada e produz saída.
Casca ,
1110 bytes-1 byte graças a Leo, e uma função ligeiramente diferente
Isso tem uma probabilidade ímpar de
1
Experimente online!
Indexa a sequência:
Explicação
fonte
Haskell,
353432 bytesImplementa a sequência de exemplo
[1,3,2,5,7,4,9,11,6,13,15,8,17,19,10,21,...]
.Experimente online!
Para referência: versão antiga, 34 bytes (-1 byte graças a @xnor):
Experimente online!
fonte
(!!)$do ...
Casca , 8 bytes
Experimente online!
Isso implementa a sequência de exemplo (
1,3,2,5,7,4...
).Explicação
fonte
Todo mundo faz o Desafio 1, então vamos fazer os outros dois.
Perl 6 , 26 bytes - Desafio 2
Experimente online!
É apenas
1 3 2 5 4 7 6...
Em um número par de termos, sempre existem mais 2 números ímpares que pares. Em um número ímpar, mais 1. No entanto, isso tem claramente um limite de(n+2)/(2n+2) -> ½
.Perl 6 , 70 bytes - Desafio 3
Experimente online!
É certo que isso é terrivelmente jogado de golfe. Indexa uma sequência que contém 2⁰ números ímpares, depois 2¹ pares, 2² ímpares, depois 2³ pares e assim por diante.
A probabilidade após n desses "blocos", se n for ímpar, é (2⁰ + 2² + 2⁴ + ... + 2ⁿ⁻¹) / (2ⁿ-1). A soma no numerador é igual a ⅓ (4 ½ (n + 1) - 1) = ⅓ (2 n + 1 - 1). Portanto, a probabilidade após um número ímpar de blocos é ⅔ (no limite).
Se adicionarmos mais um bloco (e calcularmos uma contagem par deles n + 1), no entanto, não adicionamos números ímpares (o numerador permanece o mesmo), mas agora existem (2 n + 1 - 1) números no total . Os parênteses são cancelados e obtemos a probabilidade de ⅓ (no limite).
Aparentemente, isso deve ter 2 pontos de cluster diferentes, ⅓ e ⅔, para garantir que o limite não exista, mas isso realmente não prova isso. Minha tentativa de fazer uma prova sólida e rigorosa pode ser encontrada nesta resposta do Math.SE: https://math.stackexchange.com/a/2416990/174637 . Bashing erros é bem-vinda.
Perl 6 , 39 bytes - O principal desafio.
Experimente online!
Embora eu tenha postado essa resposta por causa dos desafios 2 e 3, que ofereceram um agradável quebra-cabeça matemático, há um requisito estrito para que todas as respostas contenham uma solução para o desafio principal. Aqui está então.
Esta é a sequência de exemplo.
fonte
Flacidez cerebral , 120 bytes
Experimente online!
Executa a seguinte função:
Esta função gera a sequência
A função tem uma probabilidade ímpar de
1
fonte
R, 82 bytes (desafio extra 1)
Experimente Online!
Se a entrada é um quadrado perfeito, fornece um número par. Caso contrário, fornece um número ímpar. Os quadrados perfeitos têm densidade natural 0, o que significa que essa sequência fornece números ímpares com probabilidade 1.
fonte
C (gcc) , 29 bytes
Experimente online!
Cada quarto número é par:
Desafio extra 1, 52 bytes
Experimente online!
Retorna 2 * (x + 1) se n for igual a 2 x e números ímpares consecutivos, caso contrário:
fonte
Flak cerebral ,
140138136 bytesExperimente online!
Explicação
Isso executa uma função semelhante à sugerida na pergunta.
Funciona principalmente com base em um snippet que fiz para rolar a pilha para pilhas de tamanho 3.
Montamos duas pilhas, uma com valores de acumulador (duas ímpares pares) e uma com os números
4 4 2
. A cada iteração, rolamos as duas pilhas e adicionamos a parte superior da pilha esquerda à parte superior da pilha direita.Isso aumentará cada número ímpar em 4 e o número par em 2. À medida que passamos, obtemos um padrão de 2 ímpares 1 pares, com cada número inteiro positivo sendo atingido. Assim, apenas repetimos os
n
tempos comn
a entrada. Isso tem uma probabilidade assintótica de 2/3 .fonte
Gelatina , 10 bytes
A probabilidade de chances é de 2/3 .
Experimente online!
Como funciona
fonte
C, 80 bytes
Implementação do exemplo permutação da pergunta.
Experimente online!
fonte
Lote, 36 bytes
Implementa a sequência dada na pergunta.
fonte
JavaScript, 23 bytes
Saída: 1, 3, 5, 2, 7, 9, 11, 4, 13, 15, 17, 6, 19, 21, 23, 8 ...
Desafio 2:
Saída: 1, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14
fonte
n=>n%4?1.5*n|1:n/2
é 5 bytes mais curto.CJam (21 bytes)
Demonstração online mostrando as 32 primeiras saídas. Este é um bloco anônimo (função).
Essa também é uma solução para o desafio 1: os números mapeados para números pares são as potências de 2, de modo que a densidade dos números pares nas primeiras n saídas é lg (n) / n que tende a zero.
Dissecação
fonte
Perl 40 bytes
fonte
Conduta cerebral , 88 bytes
Experimente online!
Explicação
Isso implementa a mesma função da minha última resposta, mas usa o modelo FIFO da Brain-Flueue para cortar alguns cantos. Aqui estão os dois primeiros termos que ele gera.
A primeira parte do código é apenas um pouco de configuração, colocamos
0,-1,-3
na primeira pilha e2,4,4
na segunda pilha. O2,4,4
será usado para alternar entre números pares e ímpares, como fiz na minha resposta Brain-Flak.Em seguida, repetimos n vezes, adicionando sempre o topo da pilha esquerda à pilha direita. Como o Brain-Flueue usa filas em vez de empilhar, os valores rolam naturalmente à medida que os tocamos, impedindo a necessidade de código extra.
fonte
-lflueue
argumento.Python 2 ,
4610455 bytesExperimente online!
Leia mal a pergunta, agora implementou corretamente uma função que pode ser usada para gerar uma sequência em vez de uma que gera uma sequência. Também excluído
0
do conjunto de possíveis saídas.A probabilidade de encontrar um número inteiro positivo ímpar agora converge para
1
.fonte
0
.Geléia , 9 bytes
Experimente online!
Implementos
1, 3, 2, 5, 7, 4, 9, 11, 6, ...
(probabilidade 2/3).fonte
05AB1E , 11 bytes
Experimente online!
fonte
Pitão , 9 bytes
Experimente aqui! ou Teste mais de uma vez!
Você pode usar esse código para verificar a proporção de números ímpares até um determinado ponto. Substitua
10000
pelo seu limite desejado (não o configure muito mais, porque há erros de memória).Experimente aqui .
O exposto acima fornece aproximadamente 0,667 . A verdadeira probabilidade de ocorrências ímpares é 2/3 . Essa abordagem é uma implementação equivalente da resposta de Dennis .
Explicação
fonte
Java 8, 20 bytes
Porto da resposta C de @nwellnhof .
Algumas coisas que tentei acabaram sendo alguns bytes mais longos ou ligeiramente incorretos.
Implementos:
1,3,5,2,7,9,11,4,13,15,17,6,19,21,23,8,25,27,29,10,31,33,35,12,37,...
com probabilidade de
3/4
.Experimente aqui.
fonte
Lua,
6753 bytesExplicação que vem quando eu terminar de jogar isso :)Este programa pega um número inteiro via argumentos da linha de comando como entrada e imprime o enésimo elemento da sequência de exemplo em STDOUT
Explicações
Os números pares dessa sequência são o
n
número pares e on
múltiplo de 3; portanto, a fórmulan%3*2
é suficiente para gerá-los.Para números ímpares, é um pouco mais difícil. Com base no fato de podermos encontrá-los, dependendo da corrente
n
, temos a seguinte tabela:Vamos chamar o valor
target-n
i
, podemos ver que a cada vezn%3==2
,i
é incrementado. Lá vai a nossa fórmula:Os números ímpares são baseados
n
nos quais adicionamosi
.O valor de
i
incrementos na mesma taxa da divisão euclidiana em 3, com um deslocamento.math.floor(n/3)
nos fornece a taxa de incremento en%3-1
o deslocamento, fazendo com que aconteça emn%3==2
vez den%3==0
.fonte
...and (n/...
).and n/3*2or
funciona tão bem