Cette tâche consiste à écrire du code pour calculer exactement une probabilité. La sortie doit être une probabilité précise écrite sous forme de fraction dans sa forme la plus réduite. C'est-à-dire qu'il ne devrait jamais sortir 4/8
mais plutôt 1/2
.
Pour un entier positif n
, considérez une chaîne uniformément aléatoire de 1 et -1 de longueur n
et appelez-la A. Maintenant, concaténez à A
sa première valeur. C'est A[1] = A[n+1]
si l'indexation à partir de 1. a A
maintenant une longueur n+1
. Considérons maintenant également une deuxième chaîne aléatoire de longueur n
dont les premières n
valeurs sont -1, 0 ou 1 avec probabilité 1 / 4,1 / 2, 1/4 chacune et appelons-la B.
Par exemple, réfléchissez n=3
. Les valeurs possibles pour A
et B
pourraient être A = [-1,1,1,-1]
et B=[0,1,-1]
. Dans ce cas, les deux produits intérieurs sont 0
et 2
.
Considérons maintenant le produit intérieur de A[1,...,n]
et B
et le produit intérieur de A[2,...,n+1]
et B
.
Votre code doit générer la probabilité que les deux produits internes soient nuls.
Car n=1
cette probabilité est clairement 1/2
.
Cela ne me dérange pas comment n
est spécifié dans le code, mais il devrait être très simple et évident comment le changer.
Langues et bibliothèques
Vous pouvez utiliser n'importe quelle langue et bibliothèque de votre choix. Je voudrais exécuter votre code, veuillez donc inclure une explication complète sur la façon d'exécuter / compiler votre code sous Linux si possible.
la source
n
seraient utiles. Un exemple explicite de A, B et des deux produits internes peut également être utile.n=4
compte-t-il comme zéro, deux ou trois octets? La sortie doit-elle être exactea/b
ou serait-elle[a b]
, par exemple, autorisée?n
? Sinon, je pense que ce n'est pas permis.Réponses:
Pyth,
48474644 octetsEssayez-le en ligne: Démonstration
La version en ligne ne calcule probablement pas
n=6
. Sur mon ordinateur portable (version hors ligne), cela prend environ 45 secondes.Approche par force brute.
Explication:
la source
+0r1_2
est plus court que/R2r2_2
.Mathematica,
159100878685 octetsPour changer, changez
n
simplement la définition de la variable au début.Comme c'est la force brute, c'est assez lent, mais voici les huit premiers résultats:
Le dernier a déjà pris 231 secondes et le temps d'exécution est horriblement exponentiel.
Explication
Comme je l'ai dit, c'est de la force brute. Essentiellement, j'énumère tout ce qui est possible
A
etB
calcule les deux produits scalaires pour chaque paire possible, puis trouve la fraction de paires qui a donné{0, 0}
. La combinatoire et les fonctions d'algèbre linéaire de Mathematica ont été très utiles pour jouer au golf:Cela génère tous les n-tuples contenant
1
ou-1
, c'est-à-dire tous les possiblesA
. Carn = 3
c'est:Pour calculer,
B
nous faisons presque la même chose:En répétant
0
, nous dupliquons chaque tuple pour chacun0
qu'il contient, ce qui rend0
deux fois plus probable que1
or-1
. En utilisant à nouveaun = 3
comme exemple:Maintenant, pour chaque possible
A
, nous voulons le produit scalaire de chacun de ces possiblesB
, à la fois avecA[1 .. n]
etA[2 .. n+1]
. Par exemple, si notre courantA
est{1, 1, -1}
, nous voulons le produit scalaire avec{1, 1, -1}
et avec{1, -1, 1}
. Puisque tous nosB
sont déjà commodément les lignes d'une matrice, nous voulons que les deux sous-listes soient desA
colonnes d'une autre matrice, afin de pouvoir calculer un simple produit scalaire entre elles. Mais la transposition{{1, 1, -1}, {1, -1, 1}}
donne simplement{{1, 1}, {1, -1}, {-1, 1}}
ce qui n'est qu'une liste de toutes les sous-listes cycliques à 2 éléments deA
. Voilà ce que cela fait:Nous calculons donc cela et prenons le produit scalaire avec notre liste de
B
. Puisque nous obtenons maintenant une liste imbriquée (puisque chaque possibleA
donne un vecteur séparé), nous aplatissons ceux avec##&@@
.Pour savoir si une paire
{x, y}
est,{0, 0}
nous calculonsSign[Norm[{x,y}]]
oùNorm
donne√(x²+y²)
. Cela donne0
ou1
.Enfin, puisque nous voulons maintenant simplement connaître les fractions de
1
s dans une liste de0
s et1
s, tout ce dont nous avons besoin est la moyenne arithmétique de la liste. Cependant, cela donne la probabilité qu'au moins un produit scalaire soit différent de zéro, nous le soustrayons donc1
pour obtenir le résultat souhaité.la source
Pyth -
6555 octetsCorrection d'un bug avec une réduction de fraction au prix d'un octet.
Utilise une approche par force brute et peut être joué au golf énormément, mais je voulais juste obtenir quelque chose. Très lent
Il utilise des produits cartésiens pour générer les deux
A
etB
, faisant les probabilités variables en faisant0
apparaître deux fois dans la liste source, puis compte ceux qui produisent le produit à zéro. Le produit intérieur est facilité par leV
sucre syntaxique d'ectorisation. Simplifier la fraction me faisait peur au départ, mais c'était assez facile avec laP
fonction de factorisation du givre et la prise de conscience que nous n'avons qu'à réduire par des puissances de 2.Essayez-le en ligne ici .
la source
n
?CJam,
5857545146 octetsPour l'exécuter, insérez l'entier souhaité entre
WX]
etm*
.Merci à @ jimmy23013 pour le peu de magie et pour avoir joué 5 octets!
Essayez-le en ligne dans l' interpréteur CJam .
Idée
La plupart des parties de ces réponses sont simples, mais elles utilisent deux astuces intéressantes:
Au lieu d'appairer tous les vecteurs de {-1, 1} n avec tous les vecteurs de {-1, 0, 1} n avec les probabilités souhaitées, il considère le nombre de triplets de vecteurs dans {-1, 1} n qui satisfont une certaine condition.
Si nous ajoutons les deux derniers vecteurs d'un triplet, le résultat sera un vecteur de {-2, 0, 2} n .
Puisque (-1) + 1 = 0 = 1 + (-1) , 0 s se produira deux fois plus souvent que -2 s et 2 s.
La division de chaque composante par 2 donnerait un vecteur de {-1, 0, 1} n avec les probabilités souhaitées.
Puisque nous ne sommes intéressés que si le produit scalaire est 0 ou non, nous pouvons sauter la division par 2 .
Après avoir compté tous les triplets satisfaisant la condition de la question et le nombre total de triplets, nous devons réduire la fraction résultante.
Au lieu de calculer le GCD des deux nombres, puisque le dénominateur sera toujours une puissance de 2, il suffit de diviser les deux nombres par la puissance la plus élevée de 2 qui divise le numérateur.
Pour obtenir la puissance la plus élevée de 2 qui divise x , nous pouvons prendre le ET au niveau du bit de x et ~ x + 1 .
~ x inverse tous les bits de x , donc tous les 0 de fin deviennent 1 s. En ajoutant 1 à ~ x , ces 1 s redeviendront 0 s et le dernier 1 dans ~ x + 1 correspondra au dernier 1 dans x .
Tous les autres bits sont tous les deux 0 de différents, donc le ET au niveau du bit renvoie l'entier composé du dernier 1 de x et de tous les 0 qui le suivent. Il s'agit de la puissance la plus élevée de 2 qui divise x .
Code
la source
WX]m*Zm*_{~.+2,@fm<\f.*::+0-!},,__W*&:T/'/@,T/
.