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

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 ...


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

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
^  <

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.


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]

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.


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


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.


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


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.


1

Rebol - 40 caracteres

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

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


1

C 67

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

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

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.


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

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

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

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.


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.


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

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

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.


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



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

¡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#;^

-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]

¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.