Sobre la serie
En primer lugar, puede tratar esto como cualquier otro desafío de golf de código y responderlo sin preocuparse por la serie. Sin embargo, hay una tabla de clasificación en todos los desafíos. Puede encontrar la tabla de clasificación junto con más información sobre la serie en la primera publicación .
Aunque tengo un montón de ideas para la serie, los desafíos futuros aún no están establecidos en piedra. Si tiene alguna sugerencia, hágamelo saber en la publicación de sandbox relevante .
Hoyo 4: La paradoja de Bertrand
La paradoja de Bertrand es un problema interesante, que muestra cómo los diferentes métodos para elegir acordes aleatorios en un círculo pueden producir diferentes distribuciones de acordes, sus puntos medios y sus longitudes.
En este desafío, se supone que debe generar acordes aleatorios del círculo de la unidad, utilizando el método "correcto", es decir, uno que produce una distribución de acordes que es invariable bajo la escala y la traducción. En el artículo vinculado de Wikipedia, "Método 2" es un método de este tipo.
Aquí están las reglas exactas:
- Debe tomar un entero positivo
N
que especifique cuántos acordes se deben devolver. La salida debe ser una lista deN
acordes, cada uno especificado como dos puntos en el círculo unitario, dado por su ángulo polar en radianes. - Su código debe poder devolver al menos 2 20 valores diferentes para cada uno de los dos ángulos . Si su RNG disponible tiene un rango más pequeño, primero debe construir un RNG con un rango lo suficientemente grande encima del incorporado o debe implementar su propio RNG adecuado . Esta página puede ser útil para eso.
- La distribución de los acordes debe ser indistinguible de la producida por el "Método 2" en el artículo vinculado de Wikipedia. Si implementa un algoritmo diferente para elegir acordes, incluya una prueba de corrección. Cualquiera que sea el algoritmo que elija implementar, en teoría debe ser capaz de generar cualquier acorde válido en el círculo unitario (salvo las limitaciones del PRNG subyacente o los tipos de datos de precisión limitada).
- Su implementación debe usar y devolver números de punto flotante (al menos 32 bits de ancho) o números de punto fijo (al menos 24 bits de ancho) y todas las operaciones aritméticas deben ser precisas en un máximo de 16 ulp .
Puede escribir un programa completo o una función y recibir información a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y producir salida a través de STDOUT (o alternativa más cercana), valor de retorno de función o parámetro de función (out).
La salida puede estar en cualquier lista conveniente o formato de cadena, siempre que los números individuales sean claramente distinguibles y su número total sea siempre par.
Este es el código de golf, por lo que gana el envío más corto (en bytes). Y, por supuesto, la presentación más corta por usuario también entrará en la tabla de clasificación general de la serie.
Visualización
Puede usar el siguiente fragmento para representar las líneas generadas e inspeccionar su distribución. Simplemente pegue una lista de pares de ángulos en el área de texto. El fragmento debe poder manejar casi cualquier formato de lista, siempre que los números sean simples números decimales (sin notación científica). Le recomiendo que use al menos 1000 líneas para tener una buena idea de la distribución. También proporcioné algunos datos de ejemplo para los diferentes métodos presentados en el artículo a continuación.
Datos de ejemplo generados con el método 1.
Datos de ejemplo generados con el método 2.
Datos de ejemplo generados con el método 3.
Tabla de clasificación
La primera publicación de la serie genera una tabla de clasificación.
Para asegurarse de que sus respuestas aparezcan, comience cada respuesta con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntuación, se puede mantener viejas cuentas en el título, golpeándolos a través. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(El idioma no se muestra actualmente, pero el fragmento requiere y analiza, y puedo agregar una tabla de clasificación por idioma en el futuro).
Pyth,
252322 bytesUn puerto de respuesta de C ++ 11 de rcrmn. Este es mi primer uso de Pyth, ¡y me he divertido mucho!
Versión de 23 bytes:
Corte un byte cambiando el programa para usar pliegues + sumas y estableciendo J en una tupla, eliminando K.
Original:
Corte 2 bytes gracias a @orlp.
Explicación:
fuente
*2_
es lo mismo quey_
. La variableZ
es inicialmente 0, por lo que puede eliminar el espacio.tO0 4
escribiendo.tOZ4
.,+JK-JK
y
y me olvidéZ
. Fijo; ¡Gracias!Julia, 48 bytes
Esto usa el algoritmo del método 2, como la mayoría de las respuestas hasta ahora. Crea una función lambda que toma una entrada entera y devuelve una matriz nx 2. Para llamarlo, dale un nombre, por ejemplo
f=n->...
.Ungolfed + explicación:
Realmente me gusta cómo se ven las visualizaciones, así que incluiré una. Es el resultado de
f(1000)
.fuente
Pyth, 22 bytes
Un puerto de la respuesta de C ++.
Tenía otra solución de 23 bytes(¡ahora 22!), Pero era casi una copia de la respuesta pyth de @ kirbyfan64sos con optimizaciones, por lo que tuve que pensar un poco fuera de la caja y creativamente (ab) usar el operador de plegado.Tenga en cuenta que esto no funciona en este momento debido a un error en el operador de plegado después de la introducción de
reduce2
. Estoy haciendo una solicitud de extracción.Por referencia, esta fue mi otra solución que funciona de la misma manera:
VQKy*.nZOZJ.tOZ4,+KJ-KJ
fuente
IDL, 65 bytes
Obviamente, este es el mismo algoritmo que @rcrmn, aunque lo deduje de forma independiente antes de leer su respuesta.
La función randomu de IDL utiliza el Mersenne Twister, que tiene un período de 2 19937 -1.
EDITAR: ejecuté 1000 acordes a través del visualizador anterior, aquí hay una captura de pantalla del resultado:
fuente
C ++ 11, 214 bytes
Entonces, esta es una implementación directa del algoritmo correcto de la página de wikipedia. El principal problema aquí en el golf son los nombres tan largos que tienen las clases generadoras aleatorias. Pero, a diferencia del buen rand, es al menos uniforme.
Explicación:
fuente
M_PI_2
parece sospechoso. Creo que debería ser 1 en su lugar.APL, 46 bytes
¡Mi primer programa APL! Seguramente se puede mejorar enormemente (ya que mi comprensión general de APL es insuficiente), por lo que cualquier sugerencia sería fantástica. Esto crea una función
f
que toma un número entero como entrada, calcula los pares de puntos de acorde utilizando el método 2 e imprime cada par separado por una nueva línea.¡Puedes probarlo en línea !
Explicación:
Nota: Mi solución anterior de 19 bytes no era válida ya que devolvía (x, y) en lugar de (x + y, xy). La tristeza abunda.
fuente
Java, 114 bytes
Implementación básica en java. Úselo como una expresión lambda.
Ejemplo de uso
fuente
Math
algún lugar? ¿O algo? (No soy un programador de Java)Math
muestra. ¿Qué dice el meta sobre el uso de un código para generar otro código para resolver el problema?Ruby, 72 bytes
Mi primer golf aquí! Usé el mismo código que todos, espero que esté bien
fuente
Java, 115
123Esto es básicamente lo mismo que la mayoría de los demás, pero necesito una puntuación de Java para este agujero, así que aquí va:
Se pueden encontrar 1000 acordes de muestra en pastebin , estos son los primeros cinco de una ejecución:
fuente
CJam,
2422 bytesSimilar a otros algoritmos, aquí hay una versión en CJam.
Una entrada de 1000 produce una distribución como:
Cómo funciona
El algoritmo es simplemente
x = 2 * Pi * rand(); print [x, x + 2 * acos(rand())]
Actualizar : 2 bytes guardados gracias a Martin!
Pruébalo aquí
fuente
Python 3,
144117bytes(gracias a Blckknght por el
lambda
puntero)Usando el mismo método que otros:
De la documentación de Python:
Salida
Y así.
Visualización
fuente
f=lambda n:[(x,x+2*m.acos(r()))for x in(2*m.pi*r()for _ in range(n))]
Perl, 60
fuente
R,
60565349 bytes4 bytes adicionales gracias a @JayCe y cambiándolo a una función.
Usando la misma fórmula básica que los demás. R utiliza el método Mersenne-Twister de forma predeterminada, pero se pueden configurar otros. Emite una lista separada por espacios.
Pruébalo en línea!
fuente
SmileBASIC, 62 bytes
fuente