Générer des probabilités autour d'un pavé numérique

12

Inspiré par cette question un peu plus tôt dans la journée , j'aimerais voir comment différents langages de programmation peuvent transformer un pavé numérique en probabilités. Généralement, les jeux basés sur des tuiles vous permettront d'utiliser un pavé numérique pour vous déplacer dans n'importe quelle direction en fonction de l'emplacement actuel de votre personnage. Lorsque Math.random() * 8je crée une IA pour ces jeux, ce n'est pas suffisant, j'ai donc dû faire preuve d'un peu de créativité pour donner au mouvement un aspect et une sensation quelque peu naturels.

Un pavé numérique est défini comme tel:

7 | 8 | 9
- - - - -
4 | x | 6
- - - - -
1 | 2 | 3

Veuillez noter que 5 est un nombre invalide, car vous ne pouvez pas passer à vous-même.

Tous les exemples utiliseront ces probabilités: [50, 40, 30, 20, 10]

Si je voulais générer des probabilités 8, cela ressemblerait à ceci:

40 | 50 | 40 
-- | -- | --
30 | xx | 30
-- | -- | --
20 | 10 | 20

La sortie serait [20, 10, 20, 30, 30, 40, 50, 40](avec 5 omis) ou [20, 10, 20, 30, null, 30, 40, 50, 40](avec 5 présents)

Si je voulais les générer 1, ça ressemblerait à ça:

30 | 20 | 10
-- | -- | --
40 | xx | 20
-- | -- | --
50 | 40 | 30

La sortie serait [50, 40, 30, 40, 20, 30, 20, 10](avec 5 omis) ou [50, 40, 30, 40, null, 20, 30, 20, 10](avec 5 présents)

Vous pouvez écrire un programme complet qui prend l'entrée de n'importe quelle manière habituelle (ligne de commande, stdin) et imprime la sortie, ou vous pouvez écrire une fonction avec un argument numérique, qui imprime ou renvoie la sortie. Votre programme ou fonction doit accepter un numéro - la position à générer autour. Vous devez utiliser ces probabilités: [50, 40, 30, 20, 10](elles n'ont pas besoin d'être codées en dur).

Le code le plus court en octets gagne. Les failles standard ne sont pas autorisées. Les réponses publiées dans le fil lié ne sont pas autorisées. Les espaces de fin ou de début sont autorisés. Vous pouvez considérer la position 4comme absente ou vide, selon vos préférences. Je ne suis pas trop pointilleux sur le format de sortie - imprimez-le sous forme de chaînes séparées par des virgules ou sous forme de tableau.

(Ceci est ma première question, allez-y doucement avec moi!)

Seiyria
la source

Réponses:

5

CJam, 27 octets

12369874s_$\_r#m<f{#4-z)0S}

Essayez-le en ligne dans l' interpréteur CJam .

Idée

Si nous parcourons les chiffres autour de 5 dans le sens antihoraire, nous obtenons la chaîne 12369874ou l'une de ses rotations (selon le point de départ).

Après avoir fait tourner cette chaîne de sorte que le chiffre d'entrée n soit à la position la plus à gauche, les chiffres de la chaîne tournée ont les probabilités suivantes:

50 40 30 20 10 20 30 40

Si nous considérons les index de ces chiffres, qui sont

 0  1  2  3  4  5  6  7

soustrayez 4 de chacun pour donner

-4 -3 -2 -1  0  1  2  3

et prendre des valeurs absolues pour obtenir

 4  3  2  1  0  1  2  3

il suffit d'ajouter 1 et d'ajouter un 0 pour obtenir les probabilités souhaitées.

Code

12369874s                   e# Push "12369874".
         _$                 e# Push a sorted copy, i.e., "12346789".
           \                e# Swap it with the unsorted original.
            _r#             e# Find the index of the input in an unsorted copy.
               m<           e# Rotate the unsorted original that many units left.
                 f{       } e# For each character C in "12346789":
                            e#   Push the rotated string.
                   #        e#   Find the index of C.
                    4-      e#   Subtract 4.
                      z     e#   Compute the absolute value.
                       )    e#   Add 1.
                        0S  e#   Push a 0 and a space.
Dennis
la source
2

Prolog, 166 octets

a(A,R):-I:J:K:L:M=50:40:30:20:10,B is abs(5-A),member(B:S,[4:[I,J,K,J,L,K,L,M],3:[J,I,J,K,K,L,M,L],2:[K,J,I,L,J,M,L,K],1:[J,K,L,I,M,J,K,L]]),(A/5>1,reverse(S,R);S=R).

Cela utilise le fait que le résultat pour 9 est l'inverse du résultat pour 1, même pour 2 et 8, 3 et 7 et 4 et 6. Il existe des modèles reconnaissables pour passer du résultat de 1 aux résultats de 2,3 et 4, mais je suis sûr qu'il serait plus long de coder cela que de coder en dur les séquences de 1 à 4, ce que j'ai fait.

Exemple: a(7,R).sorties R = [30, 20, 10, 40, 20, 50, 40, 30].

Fatalize
la source
Une stratégie valable, bien que j'espère que certaines langues rendent plus facile à faire algorithmiquement qu'il ne le serait de le coder en dur. Je suppose que nous verrons.
Seiyria
@Seiyria Je suppose que les langues orientées tableau feront exactement cela. Malheureusement, vous ne pouvez généralement pas permuter des éléments de listes dans un court nombre d'octets dans Prolog.
Fatalize
0

Python - 115

a=[50,40,30,20,10,20,30,40]
b=[0,1,2,7,8,3,6,5,4]
def v(n):
 c=8-b[n-1]
 return[(a[c:]+a[:c])[e]for e in b if e-8]

aest un tableau avec les valeurs dans l'ordre autour du pavé numérique (dans le sens inverse des aiguilles d'une montre à partir de 1) et bmappe les nombres sur le pavé numérique aux positions autour de celui-ci. En fonction du nombre d'espaces autour du pavé numérique pour le numéro d'entrée (déterminé à l'aide b), il crée un tableau avec autant d'éléments déplacés de l'avant avers la fin, puis bréutilise pour réorganiser les éléments afin qu'ils correspondent aux numéros du pavé numérique.

faubi
la source
Vous pouvez économiser beaucoup en faisant un /10puis en mettant un *10dans votre boucle.
Maltysen
N'est-ce pas la (a[c:]+a[:c])[e]même chose a[(c+e)%8]ou a[c+e-8]? Et puis, le branchement csimplifie l'expression.
xnor
0

Pyth - 38 octets

Utilise un peu la même technique que la réponse Python sauf avec la compression de base pour les deux tableaux.

J_jC"3ê"T*RTm@.<jC"<àR"[email protected]

Essayez-le ici en ligne .

Maltysen
la source
Que sont les ê et à faire?
phase
@phase la compression de base susmentionnée: codegolf.stackexchange.com/questions/40039/…
Maltysen
Ces réponses courtes ne cesseront de m'étonner.
Seiyria
@Seiyria Je peux vraiment suggérer d'apprendre Pyth - ces programmes ont l'air beaucoup plus compliqués qu'ils ne le sont :)
orlp
0

Java, 190

void g(int n){int i[]={8,0,1,2,7,8,3,6,5,4};String v="54321234",s="";n=i[n];if(n>0)v=v.substring(8-n)+v.substring(0,8-n);for(n=0;n++<9;s=", ")if(n!=5)System.out.print(s+v.charAt(i[n])+"0");}

String v contient les probabilités (divisées par 10) dans le sens inverse des aiguilles d'une montre, l'entrée = 1 étant la valeur par défaut 50.

int[]itraduit l'entrée en un index en v. Par exemple, v.charAt(i[1])is 5. Les entrées 0 et 5 ne sont pas valides, donc i [0] et i [5] ont une valeur d'espace réservé de 8 qui est l'indice de '\ 0' à la fin de v.

Je fais pivoter les nombres de v vers la droite de la valeur i [n], puis j'imprime les probabilités sous forme de chaînes séparées par des virgules.

Jack Ammo
la source