Choisissez au hasard un nombre différent de deux autres nombres aléatoires

14

Deux nombres aléatoires A et B ont été générés pour être 1, 2 ou 3

votre travail consiste à choisir au hasard un troisième nombre C qui peut également être 1,2 ou 3. Mais, C ne peut pas être égal à A ou B.

  • Et oui, A peut être égal à B.
  • Si A = B, alors C n'a plus que deux nombres, cela peut être.
  • Si A n'est pas égal à B, C ne peut avoir qu'un seul nombre.
  • Supposons que A et B ont déjà été choisis pour vous

C'est ainsi que A et B seraient créés en Python

A = random.randrange(1,4)
B = random.randrange(1,4)

Supposons que cela se trouve déjà dans votre code.

C'est le plus court que j'ai trouvé en Python

while True:
    C = random.randrange(1,4)
    if C != A and C != B:
        break

C'est ce que A, B et C peuvent égaler.

  • 1,2,3
  • 1,1,2
  • 2,3,1
  • 3,3,2

C'est ce que A, B et C ne peuvent pas égaler

  • 1,2,1
  • 2,3,3
  • 1,1,1
  • 3,2,3
tysonsmiths
la source
1
Donc, si A et B sont donnés, ils ne sont pas réellement aléatoires en ce qui concerne mon programme / fonction, non? Qu'entendez-vous également par «code général»? Êtes-vous réellement à la recherche d'une solution que vous pouvez utiliser dans un de vos projets? Dans ce cas, je ne chercherais pas à l'aide de code-golf - le code sera absolument inutilisable en production. L'intérêt du code-golf est d'abuser des fonctionnalités spécifiques à la langue pour obtenir la taille de code aussi bas que possible.
Martin Ender
J'utilisais cela pour un projet et j'ai déjà une longue réponse, mais je pose cette question parce que je pensais que c'était un problème intéressant que la communauté aimerait. Et j'ai mis du code général parce que je trouve plus intéressant quand quelqu'un a utilisé une pensée plus logique pour obtenir une réponse plutôt qu'une vaste connaissance de certaines fonctionnalités spécifiques au langage, mais si le code-golf doit en abuser, alors je supprimerai cette dernière ligne.
tysonsmiths du
Supposons bien que A et B peuvent être égaux à 1, 2 ou 3, alors corrigez votre code pour anticiper toutes les possibilités.
tysonsmiths
1
Je ne comprends pas. Y a-t-il quelque chose qui me manque ou qui C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))fonctionne? De plus, votre solution est très inefficace car elle perd du temps en boucle et peut éventuellement prendre un temps infini pour s'exécuter. Aussi, import randomcompte en taille d'octet ...
DankMemes
3
Vous voulez donc que nous écrivions un simulateur Monty Hall ? ;-)
Ilmari Karonen

Réponses:

17

Ruby, 22 caractères

([1,2,3]-[A,B]).sample

Je ne sais toujours pas si j'ai bien compris la question ...

Ventero
la source
12

C, 26

a-b?6-a-b:(rand()%2+a)%3+1

Si j'ai bien compris la question:

Si a et bsont différents, il n'y a pas d'aléatoire. la réponse doit être le seul 1,2,3 qui est utilisé: 6-a-b.

SI aet bsont les mêmes, il y a 2 choix:

a=b=           1 2 3
            return value    
rand()%2=0     2 3 1
rand()%2=1     3 1 2
Level River St
la source
5

Befunge ( 156 89 85 74)

D'accord, c'est terrible, je sais. Mais c'est ma première tentative de Befunge, donc je suis toujours assez content que cela fonctionne même. Je suis sûr qu'il existe une solution beaucoup, bien meilleure.

<v1p90&p80&
<<@.g70_v#-g70_v#-g70g90g80p70
  v     <      <
^1?v
^3<2
^  <
Ingo Bürk
la source
1
Sur mon téléphone en ce moment .. Je ne sais pas si certaines lignes se sont décalées un peu accidentellement. Je vérifierai quand je serai à la maison.
Ingo Bürk
Cela me semble correct. Beaucoup mieux que ma tentative de 99 octets. J'espère que vous vous amusez avec befunge.
AndoDaan
Oui, la version mobile ne semble pas être monospace. Befunge est assez amusant, mais j'aimerais qu'il y ait un bon interprète Befunge-98 (je n'ai trouvé aucun… / edit: rcfunge semble fonctionner)
Ingo Bürk
3

GolfScript, 13 caractères

~0]4,^.,rand=

Il s'agit d'un programme GolfScript complet qui lit deux nombres séparés par des espaces (chacun étant supposé être 1, 2 ou 3) à partir de l'entrée standard et génère un nombre aléatoire de l'ensemble {1, 2, 3} qui ne correspond à aucun des numéros d'entrée.

Essayez-le en ligne. (Remarque: le lien est vers la version précédente; je suis sur un appareil mobile et je ne peux pas le réparer.)

Voici une version commentée du programme:

~         # eval the input, pushing the input numbers onto the stack
0         # push the number 0 onto the stack
]         # collect all the numbers on the stack into an array
4,        # create another array containing the numbers 0, 1, 2 and 3
^         # xor the arrays (i.e. take their symmetric set difference)
.,rand=   # choose a random element from the array

Si vous préférez une fonction nommée qui prend les deux nombres comme arguments sur la pile, cela prend quelques caractères supplémentaires:

{[\0]4,^.,rand=}:f;

Le corps réel de la fonction n'a qu'un caractère de plus que le code autonome (car nous avons besoin de [pour nous assurer que nous ne consommons que deux arguments), mais la surcharge de l'encapsulation du code dans un bloc et de son affectation à un symbole prend cinq plus de caractères, pour un total de 19.

Alternativement, si vous avez littéralement les deux nombres affectés dans les variables Aet Bque vous voulez que le troisième numéro soit attribué C, cela peut également être fait en 19 caractères:

4,[0A B]^.,rand=:C;

(Si laisser le troisième numéro sur la pile est acceptable, vous pouvez laisser le :C; à la fin.)

Ps. Merci pour la suggestion d'utilisation ^, Howard.

Ilmari Karonen
la source
Au lieu de \-vous pouvez utiliser ^.
Howard
3

Python - 35

C=random.sample({1,2,3}-{A,B},1)[0]

Suppose que le hasard est importé, ce qui semble être spécifié dans la question.

PYG - 25

C=RSm({1,2,3}-{A,B},1)[0]
Ian D. Scott
la source
2

Python, 14 caractères

Je l'ai essayé pour tous les 9 cas possibles et cela semble bien fonctionner!

C=A^B or A^1|2

(modifier): Comme l'a souligné edc65, ce n'est pas valable car ce n'est pas aléatoire ... J'ai raté cette partie de la question et je me sens stupide en ce moment.

SimonD
la source
3
Pas du tout aléatoire
edc65
Toujours, +1 pour l'admission
M. Lister
2

Befunge - 99 octets

&:01p&:11p-!!#v_v
   @,g2+g11g10< "
   321 vv*2g<"v ^
 2v v v 5v*2^10<"
 v?v?v?vp5     ^<
 2 3 1 2<        
 > > > >.@       

Pas très impressionnant.

AndoDaan
la source
2

PowerShell, 21

1..3-ne$A-ne$B|random

Très simple. Abuser du fait que les opérateurs de comparaison agissent différemment avec un tableau comme opérande gauche.

Joey
la source
Bon conseil sur les opérateurs de comparaison. Cela me donne envie de regarder certains de mes anciens scripts et de voir s'il y a des endroits où ils peuvent être utilisés. En particulier, cela me rappelle une partie du simulateur Monty Hall.
Iszi
1

Mathematica, 37 octets

RandomChoice@DeleteCases[{1,2,3},a|b]

Fondamentalement la même que la réponse Ruby, mais considérablement plus longue grâce aux noms de fonctions de Mathematica. J'utilise des variables en minuscules, car les noms en majuscules peuvent entrer en conflit avec les fonctions intégrées (ce n'est pas le cas dans ce cas, mais vous ne le faites tout simplement pas dans Mathematica).

Martin Ender
la source
1

R, 42 caractères

x=c(1,1,1);x[c(A,B)]=0;C=sample(1:3,1,p=x)

Le vecteur xest le vecteur des poids de probabilité pour obtenir les éléments du vecteur échantillonné. Il est d'abord mis à 1 pour chacun, puis les éléments correspondant à A et B sont mis à 0, donc ils n'ont aucune chance d'être choisis.

plannapus
la source
1

Rebol - 40 caractères

random/only difference[1 2 3]reduce[A B]
draegtun
la source
1

CJam - 12

4,[AB0]-mr0=

Cela suppose que les variables A et B ont déjà été définies, selon la question.

Vous pouvez l'essayer sur http://cjam.aditsu.net/

Pour le tester avec des nombres aléatoires, utilisez:

"A="3mr):A", B="3mr):B", C="
4,[AB0]-mr0=

Pour le tester avec des valeurs spécifiques, utilisez (par exemple):

"A="1:A", B="1:B", C="
4,[AB0]-mr0=

Explication:

4,crée le tableau [0 1 2 3]
[AB0]-supprime les nombres A, B et 0 du tableau
mrmélange le tableau restant
0=prend le premier élément

Dans une future version CJam, ce programme sera 2 octets plus court :)

aditsu quitte parce que SE est MAL
la source
1

C 67

int C(int a,int b){int c=0;while(c!=a&&c!=b)c=rand()%3+1;return c;}
bacchusbeale
la source
1

JS, 35

inspiré par la réponse de Brandon Anzaldi

A=1; // init
B=3; // init
do{C=1+new Date%3}while(C==A||C==B) // 35b
xem
la source
0

Julia, 32 ou 56 selon les règles

julia> r()=rand(1:3);f(x...)=(i=r();i in x?f(x...):i)
julia> f(r(),r())

32 si je n'ai pas besoin de générer a et b.

gggg
la source
La question dit "supposons que A et B ont déjà été choisis pour vous".
nyuszika7h
0

JS, 43

for(C=0;~[0,A,B].indexOf(C);)C=1+new Date%3
xem
la source
Ne courra pas. Vous voudrez peut-être définir Aet d' Babord.
Spedwards
eh bien, la question dit: "Supposons que A et B ont déjà été choisis pour vous". Vous devez donc exécuter "A = 1 + nouvelle date% 3; B = 1 + nouvelle date% 3" en premier.
xem
0

TI-BASIC, 23

Lbl 1:If C=A+B=A:Goto 1
Timtech
la source
Ne fonctionne pas en raison de l'ordre des opérations; de plus, vous n'avez jamais généré le nombre aléatoire.
lirtosiast
0

Java - 126 123 83 85 ( en utilisant l'intelligent c=6-a-b)

int c;if(a==b){int r=(int)(Math.random()*2);c=a==1?r+2:a==2?2*r+1:r+1;}else{c=6-a-b;}

Version complète:

public void test(int a, int b) {
    int c;
    if (a == b) {
        // Random 0 or 1.
        int r = (int)Math.random()*2;
        c = // 1 -> 2 or 3
                a == 1 ? r + 2
                // 2 -> 1 or 3
                : a == 2 ? 2 * r + 1
                // 3 -> 1 or 2
                : r + 1;
    } else {
        // Whichever is not taken.
        //int[][] r = {{0, 3, 2}, {3, 0, 1}, {2, 1, 0}};
        //c = r[a - 1][b - 1];
        // Using @steveverrill's clever
        c = 6 - a - b;
    }
    System.out.println("a=" + a + " b=" + b + " c=" + c);
}
OldCurmudgeon
la source
Mais 6-ab n'est pas aléatoire, n'est-ce pas? :)
xem
1
@xem - Non - mais il n'utilise que 6-a-blorsqu'il n'y a pas d'autre choix, les deux autres sont pris. Il est un moyen intelligent de choisir le nombre de unselected 1, 2, 3 6-1-2 = 3, 6-1-3=2, 6-2-3=1donc pour chaque non-égalité, b 6-a-bprend la troisième. Intelligent hein? Le seul moment où vous pouvez utiliser au hasard est quand a==b.
OldCurmudgeon
Oh génial. bon travail alors.
xem
0

R, 24 caractères

Initialiser avec

a = sample(1:3,1)
b = sample(1:3,1)

alors

n=1:3;n[!n%in%c(a,b)][1]

Ou tout simplement, n=1:3;n[!n%in%c(a,b)]mais vous retournez les deux numéros.

shadowtalker
la source
0

R, 31 caractères

sample(rep((1:3)[-c(A,B)],2),1)

Si vous le faites sample(x)dans R, alors il est interprété comme un échantillon aléatoire de 1:x. Répéter le vecteur (1:3)[-c(A,B)]deux fois est un moyen d'empêcher que cela ne se produise.

Flet
la source
0

Javascript - 76

r=(y,z)=>Math.floor(Math.random()*(z-y+1)+y);a=b=r(1,3);while(c==a)c=r(1,3);
Spedwards
la source
1
Math.floor peut être remplacé par ~~. Vous pouvez également dire r = (y, z) => y + Nouvelle date (zy). De plus, A et B ne sont pas censés être égaux, et vous n'avez pas à compter leur initialisation dans votre score.
2014
@xem A et B sont censés être aléatoires. Les règles disent qu'elles peuvent être égales. En outre, je ne suis pas sûr de ES6, mais il y+New Date(z-y)s'agit d'un SyntaxError
Spedwards
@xem y+new Date(z-y), d'autre part, rapporte la new Date()chaîne avec en yannexe.
Spedwards
désolé pour la faute de frappe, je voulais dire y + nouvelle date% (zy) ... ou (z-y + 1) selon les paramètres.
xem
et ma remarque à propos de A et B égaux était d'environ "a = b = r (1,3);". Si vous faites cela, a est toujours égal à b, mais ce n'est pas ce que les règles demandent. Ils demandent A et B au hasard. Ils peuvent être égaux mais pas nécessairement
xem
0

C - 38

main(c){for(;c==a|c==b;c=rand()%2+1);}
nyuszika7h
la source
0

Java, 264 octets

Random r = new Random();ArrayList<Integer> s = new ArrayList<>();ArrayList<Integer> q = new ArrayList<>();for(int i=0; i<n; i++) s.add(r.nextInt(k));q.add(s.get(r.nextInt(n)));q.add(s.get(r.nextInt(n)));int x;do{x = s.get(r.nextInt()); }while(!q.contains(x));

Ce code génère ndifférents nombres aléatoires de 0 à k.

padawan
la source
0

J ( 21 19: trop long à mon goût)

({~?@#)(>:i.3)-.A,B

Existe-t-il des assistants J pour supprimer cette affectation de variable?C'est seulement 2 caractères plus courts ...

Ou, si cela ne doit pas être aléatoire, vous pouvez le faire:

{:(i.4)-.A,B

12 caractères.

ɐɔıʇǝɥʇuʎs
la source
0

Golfscript, 13 personnages

~]4,^.,rand)=
Kyle McCormick
la source
0

JavaScript - 41 (jusqu'à 46) 37 35 34 30

Mis à jour:

A réussi à le réduire à 30 caractères en le modifiant, inspiré par la réponse de stevevarrill en C.

C=A-B?6-A-B:1+(A+new Date%2)%3


Merci nyuszika7h de m'avoir fait descendre à 34 ~:

C=A;while(C==A|C==B)C=1+new Date%3

Emprunter de la réponse de xem pour au moins être à égalité avec lui:

C=A;while(C==A||C==B)C=1+new Date%3

Merci de me le rappeler 1+new Date%3 === (new Date%3)+1 !

Solution précédente:

C=A;while(C==A||C==B)C=(new Date%3)+1

Assurez-vous que les conditions while()sont remplies et parcourez jusqu'à ce qu'elles ne le soient pas.


Autre solution:

C=A!=B?6-A-B:A%2!=0?4-B:new Date%2!=1?3:1;

Cela suppose qu'il Ca déjà été déclaré OU que l'interpréteur JavaScript peut gérer les variables non déclarées.

Cependant, si l'interpréteur JS peut gérer EOL sans point-virgule, il peut être ramené à 41.

C=A!=B?6-A-B:A%2!=0?4-B:new Date%2!=1?3:1

S'il Cn'a pas été déclaré et qu'il n'y a pas de correction d'erreur, cela portera le décompte à 46 caractères.

var C=A!=B?6-A-B:A%2!=0?4-B:new Date%2!=1?3:1;

Programme de test:

var iterations = 100;

for(var i = 0;i<iterations;i++) {
    var A = Math.floor(Math.random() * 3) + 1;
    var B = Math.floor(Math.random() * 3) + 1;
    C=A!=B?6-A-B:A%2!=0?4-B:new Date%2!=1?3:1
    if (C === A || C === B || C > 3 || C < 1) {
        console.log('FAILURE!');
        console.log(A + ',' + B + ',' + C)
        return;
    }
    console.log(A+','+B+','+C);
}
Brandon Anzaldi
la source
génial! J'ai fait une réponse 35b basée sur cela, mais en utilisant une boucle do-while;)
xem
Vous devriez pouvoir utiliser |au lieu de ||.
nyuszika7h
Économisez 1 octet avec une boucle for:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose
Je voudrais juste remercier tout le monde pour leur aide :)
Brandon Anzaldi
0

Befunge-98 (57 octets)

Ce code suppose que les nombres seront entrés sur stdin. Il choisira un nombre aléatoire si les deux premiers nombres sont identiques jusqu'à ce qu'il soit différent, sinon il choisira le dernier numéro disponible.

6&::11p&:12pw>   ?1  >#<:11g-!_.@
     @.-g21-<>3;#[2#;^
waylon531
la source
-3

Python, 54 41 caractères

Quite long answer in Python but I like list comprehension, so I decided to post this here

// [0] means it is the first element of

C=[i for i in[1,2,3]if not(i in(A,B))][0]
Caridorc
la source
How is this random?
user80551
It isn't, sorry...
Caridorc
@user80551 does it need to be?
John Dvorak
1
@JanDvorak Yes: "your job is to randomly pick a third number..." (I think this needs some more emphasis in the question, as many have gotten it wrong)
daniero