Sobre a série
Primeiro, você pode tratar isso como qualquer outro desafio de código de golfe e respondê-lo sem se preocupar com a série. No entanto, existe uma tabela de classificação em todos os desafios. Você pode encontrar o placar junto com mais informações sobre a série no primeiro post .
Embora eu tenha várias idéias alinhadas para a série, os desafios futuros ainda não estão definidos. Se você tiver alguma sugestão, informe-me na postagem da sandbox relevante .
Buraco 4: O Paradoxo de Bertrand
O paradoxo de Bertrand é um problema interessante, que mostra como diferentes métodos para escolher acordes aleatórios em um círculo podem produzir distribuições diferentes de acordes, seus pontos médios e seus comprimentos.
Neste desafio, você deve gerar acordes aleatórios do círculo unitário, usando o método "correto", isto é, um que produz uma distribuição de acordes invariável em escala e conversão. No artigo vinculado da Wikipedia, "Método 2" é esse método.
Aqui estão as regras exatas:
- Você deve pegar um número inteiro positivo
N
que especifique quantos acordes devem ser retornados. A saída deve ser uma lista deN
acordes, cada um especificado como dois pontos no círculo unitário, dados pelo ângulo polar em radianos. - Seu código deve poder retornar pelo menos 2 20 valores diferentes para cada um dos dois ângulos . Se o seu RNG disponível tiver um intervalo menor, você deve primeiro criar um RNG com um intervalo suficientemente grande em cima do incorporado ou implementar o seu próprio RNG adequado . Esta página pode ser útil para isso.
- A distribuição dos acordes deve ser indistinguível da produzida pelo "Método 2" no artigo vinculado da Wikipedia. Se você implementar um algoritmo diferente para escolher acordes, inclua uma prova de correção. Qualquer que seja o algoritmo que você escolha implementar, teoricamente deve ser capaz de gerar qualquer acorde válido no círculo de unidades (limitações de restrição do PRNG subjacente ou tipos de dados de precisão limitada).
- Sua implementação deve usar e retornar números de ponto flutuante (pelo menos 32 bits de largura) ou números de ponto fixo (pelo menos 24 bits de largura) e todas as operações aritméticas devem ser precisas em no máximo 16 ulp .
Você pode escrever um programa completo ou uma função e obter entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e produzir saída via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
A saída pode estar em qualquer formato conveniente de lista ou string, desde que os números individuais sejam claramente distinguíveis e seu número total seja sempre par.
Isso é código de golfe, então a submissão mais curta (em bytes) vence. E, é claro, o menor envio por usuário também entrará na tabela geral de líderes da série.
Visualização
Você pode usar o seguinte snippet para renderizar as linhas geradas e inspecionar sua distribuição. Basta colar uma lista de pares de ângulos na área de texto. O trecho deve ser capaz de lidar com quase qualquer formato de lista, desde que os números sejam simples números decimais (sem notação científica). Eu recomendo que você use pelo menos 1000 linhas para ter uma boa idéia da distribuição. Também forneci alguns dados de exemplo para os diferentes métodos apresentados no artigo abaixo.
Dados de exemplo gerados com o método 1.
Dados de exemplo gerados com o método 2.
Dados de exemplo gerados com o método 3.
Entre os melhores
O primeiro post da série gera uma tabela de classificação.
Para garantir que suas respostas sejam exibidas, inicie todas as respostas com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(O idioma não é exibido no momento, mas o snippet exige e o analisa, e posso adicionar um cabeçalho por idioma no futuro.)
Pyth,
252322 bytesUma porta da resposta C ++ 11 da rcrmn. Este é o meu primeiro uso do Pyth, e me diverti bastante!
Versão de 23 bytes:
Corte um byte alterando o programa para usar dobras + somas e definindo J como uma tupla, removendo K.
Original:
Corte 2 bytes graças a @orlp.
Explicação:
fonte
*2_
é o mesmo quey_
. A variávelZ
é inicialmente 0, para que você possa remover o espaço.tO0 4
escrevendo.tOZ4
.,+JK-JK
y
e esqueciZ
. Fixo; obrigado!Julia, 48 bytes
Isso usa o algoritmo do método 2, como a maioria das respostas até agora. Ele cria uma função lambda que recebe uma entrada inteira e retorna uma matriz nx 2. Para chamá-lo, dê um nome, por exemplo
f=n->...
.Ungolfed + explicação:
Eu realmente gosto da aparência das visualizações, então incluirei uma. É o resultado de
f(1000)
.fonte
Pitão, 22 bytes
Uma porta da resposta C ++.
Eu tinha outra solução de 23 bytes(agora 22!), Mas era quase uma cópia da resposta pyth de @ kirbyfan64sos com otimizações, então tive que pensar fora da caixa um pouco e de forma criativa (ab) usar o operador fold.Observe que isso não funciona no momento por causa de um bug no operador fold após a introdução de
reduce2
. Estou fazendo uma solicitação de recebimento.Para refence, essa foi minha outra solução que funciona da mesma maneira:
VQKy*.nZOZJ.tOZ4,+KJ-KJ
fonte
IDL, 65 bytes
Obviamente, esse é o mesmo algoritmo que o @rcrmn, embora eu tenha derivado de forma independente antes de ler a resposta.
A função randomu da IDL usa o Mersenne Twister, que possui um período de 2 19937 -1.
Edição: Corri 1000 acordes através do visualizador acima, aqui está uma captura de tela do resultado:
fonte
C ++ 11, 214 bytes
Portanto, esta é uma implementação direta do direito algoritmo na página da wikipedia. O principal problema aqui no golfe são os nomes tão assustadores que as classes de geradores aleatórios têm. Mas, ao contrário do bom e velho, é pelo menos adequadamente uniforme.
Explicação:
fonte
M_PI_2
parece suspeito. Eu acho que deveria ser 1 em vez disso.APL, 46 bytes
Meu primeiro programa de APL! Certamente, ele pode ser bastante aprimorado (como minha compreensão geral do APL está ausente), portanto, qualquer sugestão seria fantástica. Isso cria uma função
f
que recebe um número inteiro como entrada, calcula os pares de pontos de acordes usando o método 2 e imprime cada par separado por uma nova linha.Você pode experimentá-lo online !
Explicação:
Nota: Minha solução de 19 bytes anterior era inválida, pois retornava (x, y) em vez de (x + y, xy). Tristeza abunda.
fonte
Java, 114 bytes
Implementação básica em java. Use como uma expressão lambda.
Exemplo de uso
fonte
Math
algum lugar? Ou alguma coisa? (Im não um programador Java)Math
aparece. O que a meta diz sobre o uso de um código para gerar outro código para resolver o problema?Ruby, 72 bytes
Meu primeiro golfe aqui! Eu usei o mesmo código de todos, espero que esteja tudo bem
fonte
Java, 115
123Isso é basicamente o mesmo que a maioria dos outros, mas eu preciso de uma pontuação Java para esse buraco, então aqui vai:
Podem ser encontrados 1000 acordes de amostra em pastebin , eis os cinco primeiros de uma execução:
fonte
CJam,
2422 bytesSemelhante a outros algoritmos, aqui está uma versão no CJam.
Uma entrada de 1000 produz uma distribuição como:
Como funciona
O algoritmo é simplesmente
x = 2 * Pi * rand(); print [x, x + 2 * acos(rand())]
Atualização : 2 bytes salvos graças ao Martin!
Experimente aqui
fonte
Python 3,
144117 bytes(obrigado a Blckknght pela
lambda
ponteiro)Usando o mesmo método que outros:
Na documentação do Python:
Resultado
E assim por diante.
Visualização
fonte
f=lambda n:[(x,x+2*m.acos(r()))for x in(2*m.pi*r()for _ in range(n))]
Perl, 60
fonte
R,
60565349 bytesUm extra de 4 bytes graças a @JayCe e alterando-o para uma função.
Usando a mesma fórmula básica que as outras. R usa o método Mersenne-Twister por padrão, mas outros podem ser definidos. Produz uma lista separada por espaço.
Experimente online!
fonte
SmileBASIC, 62 bytes
fonte