Elija aleatoriamente un número que sea diferente de otros dos números aleatorios

14

Se han generado dos números aleatorios A y B para ser 1, 2 o 3

su trabajo es elegir aleatoriamente un tercer número C que también puede ser 1,2 o 3. Pero, C no puede ser igual a A o B.

  • Y sí, A puede ser igual a B.
  • Si A = B, entonces a C solo le quedan dos números, puede ser.
  • Si A no es igual a B, C solo tiene un número que puede ser.
  • Suponga que A y B ya han sido elegidos para usted

Así es como se crearían A y B en Python

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

Suponga que esto ya está en su código.

Este es el más corto que he encontrado en Python

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

Esto es lo que A, B y C pueden igualar.

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

Esto es lo que A, B y C no pueden igualar

  • 1,2,1
  • 2,3,3
  • 1,1,1
  • 3,2,3
Tysonsmiths
fuente
1
Entonces, si se dan A y B, en realidad no son aleatorias en lo que respecta a mi programa / función, ¿verdad? Además, ¿qué quieres decir con "código general"? ¿Estás buscando una solución que puedas usar en un proyecto tuyo? En ese caso, no buscaría ayuda en code-golf: el código será absolutamente inutilizable en la producción. El objetivo de code-golf es abusar de las características específicas del idioma para obtener el tamaño del código lo más abajo posible.
Martin Ender
Estaba usando esto para un proyecto y ya obtuve una respuesta larga, pero lo pregunto porque pensé que era un problema interesante que la comunidad disfrutaría. Y pongo código general porque me parece más interesante cuando alguien usó un pensamiento más lógico para obtener una respuesta en lugar de un vasto conocimiento de algunas características específicas del lenguaje, pero si el golf de código es abusar de estas, entonces eliminaré esa última línea.
tysonsmiths
Supongamos que A y B pueden ser iguales a 1, 2 o 3, por lo que debe corregir su código para anticipar todas las posibilidades.
tysonsmiths
1
No entiendo. ¿Hay algo que me falta o C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))funciona? Además, su solución es altamente ineficiente, ya que desperdicia el tiempo en bucle y posiblemente podría tomar una cantidad infinita de tiempo en ejecutarse. Además, import randomcuenta en tamaño de byte ...
DankMemes
3
¿Entonces quieres que escribamos un simulador de Monty Hall ? ;-)
Ilmari Karonen

Respuestas:

17

Ruby, 22 personajes.

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

Aún no estoy seguro si entendí la pregunta correctamente ...

Ventero
fuente
12

C, 26

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

Si he entendido la pregunta correctamente:

Si ay bson diferentes, no hay al azar. la respuesta debe ser el único de 1,2,3 que es utilizado: 6-a-b.

SI ay bson los mismos que hay 2 opciones:

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

Befunge ( 156 89 85 74)

Bien, esto es terrible, lo sé. Pero es mi primer intento de Befunge, así que todavía estoy muy feliz de que incluso funcione. Estoy seguro de que hay una solución mucho mejor.

<v1p90&p80&
<<@.g70_v#-g70_v#-g70g90g80p70
  v     <      <
^1?v
^3<2
^  <
Ingo Bürk
fuente
1
En mi teléfono en este momento ... No estoy seguro si algunas filas cambiaron un poco accidentalmente. Lo comprobaré cuando esté en casa.
Ingo Bürk
Me parece bien. Mucho mejor que mi intento de 99 bytes. Espero que te estés divirtiendo con befunge.
AndoDaan
Sí, la versión móvil no parece ser monoespaciada. Befunge es bastante divertido, pero desearía que hubiera un intérprete Befunge-98 decente (no pude encontrar ninguna ... / editar: rcfunge parece funcionar)
Ingo Bürk
3

GolfScript, 13 caracteres

~0]4,^.,rand=

Este es un programa completo de GolfScript que lee dos números separados por espacios en blanco (se supone que cada uno es 1, 2 o 3) de la entrada estándar, y genera un número aleatorio del conjunto {1, 2, 3} que no es igual a ninguno de los números de entrada.

Pruébalo en línea.(Nota: el enlace es a la versión anterior; estoy en un dispositivo móvil y no puedo solucionarlo).

Aquí hay una versión comentada del programa:

~         # 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 prefiere una función con nombre que tome los dos números como argumentos en la pila, eso requiere algunos caracteres más:

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

El cuerpo real de la función es solo un carácter más largo que el código independiente (porque necesitamos el [ que nos aseguremos de consumir solo dos argumentos), pero la sobrecarga de envolver el código en un bloque y asignarlo a un símbolo requiere cinco más caracteres, para un total de 19.

Alternativamente, si literalmente tiene los dos números asignados a las variables Ay Bdesea asignar el tercer número C, eso también se puede hacer en 19 caracteres:

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

(Si dejar el tercer número en la pila es aceptable, puede dejar el :C; el final).

PD. Gracias por la sugerencia de usar ^, Howard.

Ilmari Karonen
fuente
En lugar de \-que pueda usar ^.
Howard
3

Python - 35

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

Asume que se importa al azar, lo que parece especificarse en la pregunta.

PYG - 25

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

Python, 14 caracteres

¡Lo probé por cada 9 casos posibles y parece funcionar bien!

C=A^B or A^1|2

(editar): Como señaló edc65, esto no es válido ya que no es aleatorio ... Me perdí esa parte de la pregunta y me siento estúpido en este momento.

SimonD
fuente
3
No es aleatorio en absoluto
edc65
Aún así, +1 para la admisión
Sr. Lister el
2

Befunge - 99 bytes

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

No muy impresionante

AndoDaan
fuente
2

PowerShell, 21

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

Muy sencillo Abusando del hecho de que los operadores de comparación actúan de manera diferente con una matriz como su operando izquierdo.

Joey
fuente
Buen consejo sobre los operadores de comparación. Me dan ganas de mirar algunos de mis viejos scripts y ver si hay lugares donde se pueda usar. Particularmente, esto me recuerda parte del simulador de Monty Hall.
Iszi
1

Mathematica, 37 bytes

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

Básicamente lo mismo que la respuesta de Ruby, pero considerablemente más largo gracias a los nombres de las funciones de Mathematica. Estoy usando variables en minúsculas, porque los nombres en mayúsculas pueden entrar en conflicto con los integrados (no lo hacen, en este caso, pero simplemente no lo haces en Mathematica).

Martin Ender
fuente
1

R, 42 caracteres

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

Vector xes el vector de ponderaciones de probabilidad para obtener los elementos del vector que se está muestreando. Al principio se establece en 1 para cada uno, luego los elementos correspondientes a A y B se establecen en 0, por lo tanto, no tienen posibilidad de ser seleccionados.

plannapus
fuente
1

Rebol - 40 caracteres

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

CJam - 12

4,[AB0]-mr0=

Esto supone que las variables A y B ya se han establecido, de acuerdo con la pregunta.

Puedes probarlo en http://cjam.aditsu.net/

Para probarlo con números aleatorios, use:

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

Para probarlo con valores específicos, use (por ejemplo):

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

Explicación:

4,crea la matriz [0 1 2 3]
[AB0]-elimina los números A, B y 0 de la matriz
mrbaraja la matriz restante
0= toma el primer elemento

En una futura versión de CJam, este programa será 2 bytes más corto :)

aditsu renunció porque SE es MALO
fuente
1

C 67

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

JS, 35

inspirado en la respuesta de Brandon Anzaldi

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

Julia, 32 o 56 dependiendo de las reglas

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

32 si no necesito generar ayb.

gggg
fuente
La pregunta dice "asuma que A y B ya han sido elegidos para usted".
nyuszika7h
0

JS, 43

for(C=0;~[0,A,B].indexOf(C);)C=1+new Date%3
xem
fuente
No correrá Es posible que desee definir Ay Bprimero.
Spedwards
bueno, la pregunta dice: "Suponga que A y B ya han sido elegidos para usted". Por lo tanto, primero debe ejecutar "A = 1 + nueva fecha% 3; B = 1 + nueva fecha% 3".
xem
0

TI-BASIC, 23

Lbl 1:If C=A+B=A:Goto 1
Timtech
fuente
No funciona debido al orden de las operaciones; Además, en realidad nunca generó el número aleatorio.
lirtosiast
0

Java - 126 123 83 85 (usando el inteligente 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;}

Versión completa:

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
fuente
Pero 6-ab no es aleatorio, ¿verdad? :)
xem
1
@xem - No - pero solo se usa 6-a-bcuando no hay otra opción, se toman las otras dos. Es una forma inteligente de recoger el número no seleccionado de 1, 2, 3. 6-1-2 = 3, 6-1-3=2, 6-2-3=1por lo que para cada una no-iguales, b 6-a-brecoge la tercera. Listo eh? El único momento en que puede usar al azar es cuándo a==b.
OldCurmudgeon
Oh, genial. buen trabajo entonces.
xem
0

R, 24 caracteres

Inicializar con

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

Luego

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

O simplemente n=1:3;n[!n%in%c(a,b)]pero luego devuelve ambos números.

Shadowtalker
fuente
0

R, 31 caracteres

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

Si lo hace sample(x)en R, entonces se interpreta como una muestra aleatoria de 1:x. Repitiendo el vector(1:3)[-c(A,B)] dos veces es una forma de evitar que esto suceda.

Flounderer
fuente
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
fuente
1
Math.floor se puede reemplazar por ~~. También podría decir r = (y, z) => y + Nueva fecha (zy). Además, A y B no están destinados a ser iguales, y no tiene que contar su inicialización en su puntaje.
xem
@xem A y B están destinados a ser aleatorios. Las reglas dicen que pueden ser iguales. Además, no estoy seguro sobre ES6 pero y+New Date(z-y)es un SyntaxError
Spedwards
@xem y+new Date(z-y)por otro lado informa new Date()cadena con yadjunto.
Spedwards
perdón por el error tipográfico, quise decir y + nueva Fecha% (zy) ... o (z-y + 1) dependiendo de los parámetros.
xem
y mi comentario sobre A y B igual fue sobre "a = b = r (1,3);". Si haces eso, a siempre es igual a b, pero eso no es lo que piden las reglas. Piden A y B al azar. Pueden ser iguales pero no necesariamente
xem
0

C - 38

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

Java, 264 bytes

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));

Este código genera ndiferentes números aleatorios de 0 a k.

padawan
fuente
0

J ( 21 19: demasiado largo para mi gusto)

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

¿Hay algún asistente J para ayudar a eliminar esa asignación variable?Solo son 2 caracteres más cortos ...

O, si no tiene que ser aleatorio, puede hacer esto:

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

12 caracteres

ɐɔıʇǝɥʇuʎs
fuente
0

Golfscript, 13 personajes

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

JavaScript - 41 (hasta 46) 37 35 34 30

Actualizado:

Logré reducirlo a 30 caracteres modificándolo, inspirado en la respuesta de stevevarrill en C.

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


Gracias nyuszika7h por bajarme a 34 ~:

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

Tomando prestado de la respuesta de xem al menos estar a la par con él:

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

¡Gracias por recordarme eso 1+new Date%3 === (new Date%3)+1!

Solución anterior:

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

Asegúrese de que while()se cumplan las condiciones de , y repita hasta que no lo sean.


Otra solución:

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

Esto supone que C ya se ha declarado O que el intérprete de JavaScript puede manejar variables no declaradas.

Sin embargo, si el intérprete JS puede manejar EOL sin punto y coma, podría reducirse a 41.

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

Si Cno se ha declarado, y no hay corrección de errores, eso llevará la cuenta de hasta 46 caracteres.

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

Programa de prueba:

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
fuente
¡genial! Hice una respuesta 35b basada en esto, pero usando un ciclo do-while;)
xem
Debería poder usar en |lugar de ||.
nyuszika7h
Ahorre 1 byte con un bucle for:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose
Me gustaría agradecer a todos por su ayuda :)
Brandon Anzaldi
0

Befunge-98 (57 bytes)

Este código supone que los números se ingresarán en stdin. Escogerá un número aleatorio si los dos primeros números son iguales hasta que sea diferente; de ​​lo contrario, elegirá el último número disponible.

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

Python, 54 41 caracteres

Respuesta bastante larga en Python pero me gusta la comprensión de la lista, así que decidí publicar esto aquí

// [0] significa que es el primer elemento de

C=[i for i in[1,2,3]if not(i in(A,B))][0]
Caridorc
fuente
¿Cómo es esto al azar?
user80551
No lo es, lo siento ...
Caridorc
@ user80551 ¿necesita ser?
John Dvorak
1
@ JanDvorak Sí: "su trabajo es elegir aleatoriamente un tercer número ..." (Creo que esto necesita más énfasis en la pregunta, ya que muchos se equivocaron)
daniero