À propos de la série
Tout d'abord, vous pouvez traiter cela comme n'importe quel autre défi de golf de code et y répondre sans vous soucier de la série. Cependant, il existe un classement pour tous les défis. Vous pouvez trouver le classement avec plus d'informations sur la série dans le premier post .
Bien que j'ai un tas d'idées alignées pour la série, les défis futurs ne sont pas encore gravés dans le marbre. Si vous avez des suggestions, faites-le moi savoir sur le post sandbox correspondant .
Trou 4: Le paradoxe de Bertrand
Le paradoxe de Bertrand est un problème intéressant, qui montre comment différentes méthodes de sélection d'accords aléatoires dans un cercle peuvent produire différentes distributions d'accords, leurs points médians et leurs longueurs.
Dans ce défi, vous êtes censé générer des accords aléatoires du cercle unitaire, en utilisant la méthode "droite", c'est-à-dire qui produit une distribution des accords qui est invariante sous l'échelle et la traduction. Dans l'article Wikipédia lié, la "Méthode 2" est une telle méthode.
Voici les règles exactes:
- Vous devez prendre un entier positif
N
qui spécifie le nombre d'accords à renvoyer. La sortie doit être une liste d'N
accords, chacun spécifié en deux points sur le cercle unitaire, donné par leur angle polaire en radians. - Votre code doit pouvoir renvoyer au moins 2 20 valeurs différentes pour chacun des deux angles . Si votre RNG disponible a une gamme plus petite, vous devez d'abord construire un RNG avec une gamme suffisamment large au-dessus de celui intégré ou vous devez implémenter votre propre RNG approprié . Cette page peut être utile pour cela.
- La distribution des accords doit être indiscernable de celle produite par la "Méthode 2" dans l'article Wikipedia lié. Si vous implémentez un algorithme différent pour choisir les accords, veuillez inclure une preuve d'exactitude. Quel que soit l'algorithme que vous choisissez d'implémenter, il doit théoriquement être capable de générer n'importe quel accord valide dans le cercle unitaire (sauf limitations des PRNG sous-jacents ou types de données à précision limitée).
- Votre implémentation doit utiliser et renvoyer des nombres à virgule flottante (au moins 32 bits de large) ou des nombres à virgule fixe (au moins 24 bits de large) et toutes les opérations arithmétiques doivent être précises dans un maximum de 16 ulp .
Vous pouvez écrire un programme complet ou une fonction et prendre une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et produire une sortie via STDOUT (ou l'alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
La sortie peut être dans n'importe quel format de liste ou de chaîne, à condition que les numéros individuels soient clairement distinguables et que leur nombre total soit toujours pair.
Il s'agit du code golf, donc la soumission la plus courte (en octets) l'emporte. Et bien sûr, la soumission la plus courte par utilisateur entrera également dans le classement général de la série.
Visualisation
Vous pouvez utiliser l'extrait de code suivant pour rendre les lignes générées et inspecter leur distribution. Collez simplement une liste de paires d'angles dans la zone de texte. L'extrait doit être capable de gérer presque tous les formats de liste, tant que les nombres sont de simples nombres décimaux (pas de notation scientifique). Je vous recommande d'utiliser au moins 1000 lignes pour avoir une bonne idée de la distribution. J'ai également fourni quelques exemples de données pour les différentes méthodes présentées dans l'article ci-dessous.
Exemple de données générées avec la méthode 1.
Exemple de données générées avec la méthode 2.
Exemple de données générées avec la méthode 3.
Classement
Le premier post de la série génère un classement.
Pour vous assurer que vos réponses s'affichent, veuillez commencer chaque réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(La langue n'est pas actuellement affichée, mais l'extrait de code l'exige et l'analyse, et je pourrai ajouter un classement par langue à l'avenir.)
Pyth,
252322 octetsUn port de la réponse C ++ 11 de rcrmn. Ceci est ma première utilisation de Pyth, et je me suis bien amusé!
Version 23 octets:
Coupez un octet en modifiant le programme pour utiliser les plis + sommes et en définissant J sur un tuple, en supprimant K.
Original:
Coupez 2 octets grâce à @orlp.
Explication:
la source
*2_
est le même quey_
. La variableZ
est initialement 0, vous pouvez donc supprimer l'espace en.tO0 4
écrivant.tOZ4
.,+JK-JK
y
et j'ai oubliéZ
. Fixé; Merci!Julia, 48 octets
Il utilise l'algorithme de la méthode 2, comme la plupart des réponses jusqu'à présent. Il crée une fonction lambda qui prend une entrée entière et retourne un tableau nx 2. Pour l'appeler, donnez-lui un nom, par exemple
f=n->...
.Non golfé + explication:
J'aime vraiment l'apparence des visualisations, j'en inclurai donc une. C'est le résultat de
f(1000)
.la source
Pyth, 22 octets
Un port de la réponse C ++.
J'avais une autre solution de 23 octets(maintenant 22!), Mais c'était presque une copie de la réponse pyth de @ kirbyfan64sos avec des optimisations, j'ai donc dû réfléchir un peu en dehors de la boîte et utiliser de manière créative (ab) l'opérateur de pliage.Notez que cela ne fonctionne pas pour le moment en raison d'un bogue dans l'opérateur de pliage après l'introduction de
reduce2
. Je fais une demande de pull.Pour référence, c'était mon autre solution qui fonctionne de la même manière:
VQKy*.nZOZJ.tOZ4,+KJ-KJ
la source
IDL, 65 octets
Évidemment, c'est le même algorithme que @rcrmn, même si je l'ai dérivé indépendamment avant de lire leur réponse.
La fonction randomu d'IDL utilise le Twister de Mersenne, qui a une période de 2 19937 -1.
EDIT: J'ai exécuté 1000 accords via le visualiseur ci-dessus, voici une capture d'écran du résultat:
la source
C ++ 11, 214 octets
Il s'agit donc d'une implémentation directe du bon algorithme à partir de la page wikipedia. Le principal problème ici dans le golf est les noms oh-so-fleaking-long que les classes de générateur aléatoire ont. Mais, contrairement au bon vieux rand, il est au moins convenablement uniforme.
Explication:
la source
M_PI_2
semble suspect. Je pense que ce devrait être 1 à la place.APL, 46 octets
Mon tout premier programme APL! Cela peut certainement être considérablement amélioré (car ma compréhension globale de l'APL fait défaut), donc toutes les suggestions seraient fantastiques. Cela crée une fonction
f
qui prend un entier en entrée, calcule les paires de points d'accord à l'aide de la méthode 2 et imprime chaque paire séparée par une nouvelle ligne.Vous pouvez l' essayer en ligne !
Explication:
Remarque: Ma précédente solution de 19 octets n'était pas valide car elle renvoyait (x, y) plutôt que (x + y, xy). La tristesse abonde.
la source
Java, 114 octets
Implémentation de base en java. À utiliser comme expression lambda.
Exemple d'utilisation
la source
Math
quelque part? Ou quelque chose? (Je ne suis pas un programmeur Java)Math
s'affiche. Que dit la méta sur l'utilisation d'un code pour générer un autre code pour résoudre le problème?Rubis, 72 octets
Mon premier golf ici! J'ai utilisé le même code que tout le monde, j'espère que ça va
la source
Java, 115
123C'est fondamentalement le même que la plupart des autres, mais j'ai besoin d'un score Java pour ce trou, alors voici:
1000 exemples d'accords peuvent être trouvés sur pastebin , voici les cinq premiers d'un même run:
la source
CJam,
2422 octetsSemblable à d'autres algorithmes, voici une version dans CJam.
Une entrée de 1000 produit une distribution comme:
Comment ça fonctionne
L'algorithme est simplement
x = 2 * Pi * rand(); print [x, x + 2 * acos(rand())]
Mise à jour : 2 octets économisés grâce à Martin!
Essayez-le ici
la source
Python 3,
144117 octets(merci à Blckknght pour le
lambda
pointeur)En utilisant la même méthode que les autres:
Dans la documentation Python:
Production
Etc.
Visualisation
la source
f=lambda n:[(x,x+2*m.acos(r()))for x in(2*m.pi*r()for _ in range(n))]
Perl, 60
la source
R,
60565349 octets4 octets supplémentaires grâce à @JayCe et en le changeant en fonction.
En utilisant la même formule de base que les autres. R utilise la méthode Mersenne-Twister par défaut, mais d'autres peuvent être définies. Génère une liste séparée par des espaces.
Essayez-le en ligne!
la source
SmileBASIC, 62 octets
la source