Escolha aleatoriamente um número diferente de dois outros números aleatórios


14

Dois números aleatórios A e B foram gerados para serem 1, 2 ou 3

seu trabalho é escolher aleatoriamente um terceiro número C, que também pode ser 1,2 ou 3. Mas, C não pode ser igual a A ou B.

  • E sim, A pode ser igual a B.
  • Se A = B, então C tem apenas dois números restantes.
  • Se A não for igual a B, C terá apenas um número.
  • Suponha que A e B já foram escolhidos para você

É assim que A e B seriam criados em Python

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

Suponha que isso já esteja no seu código.

Este é o mais curto que eu vim em Python

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

É isso que A, B e C podem ser iguais.

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

Isto é o que A, B e C não podem ser iguais

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

1
Então, se A e B são dados, eles não são realmente aleatórios no que diz respeito ao meu programa / função, certo? Além disso, o que você quer dizer com "código geral"? Você está realmente procurando uma solução que possa usar em um projeto seu? Nesse caso, eu não procuraria ajuda no code-golf - o código será absolutamente inutilizável na produção. O objetivo principal do code-golf é abusar dos recursos específicos do idioma para obter o tamanho do código o mais baixo possível.
Martin Ender

Eu estava usando isso para um projeto e já obtive uma resposta longa, mas estou perguntando isso porque achei que era um problema interessante que a comunidade desfrutaria. E eu coloquei o código geral porque acho mais interessante quando alguém usa um pensamento mais lógico para obter uma resposta, em vez de vasto conhecimento de alguns recursos específicos do idioma, mas se o code-golf é abusar deles, removerei a última linha.
tysonsmiths

Bem, suponha que A e B possam ser iguais a 1, 2 ou 3, portanto, corrija seu código para antecipar todas as possibilidades.
Tysonsmiths

1
Eu não entendo Há algo que estou faltando ou C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))funciona? Além disso, sua solução é altamente ineficiente, pois perde tempo e pode levar uma quantidade infinita de tempo para ser executada. Além disso, import randomas contagens de tamanho byte ...
DankMemes

3
Então você quer que escrevamos um simulador de Monty Hall ? ;-)
Ilmari Karonen

Respostas:


17

Ruby, 22 caracteres

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

Ainda não tenho certeza se entendi a pergunta corretamente ...


12

C, 26

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

Se entendi a pergunta corretamente:

Se ae bsão diferentes, não há aleatória. a resposta deve ser o único de 1,2,3 que não é utilizado: 6-a-b.

SE ae bsão iguais, existem 2 opções:

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)

Ok, isso é terrível, eu sei. Mas é minha primeira tentativa de Befunge, então ainda estou muito feliz que funcione. Tenho certeza de que há uma solução muito, muito melhor.

<v1p90&p80&
<<@.g70_v#-g70_v#-g70g90g80p70
  v     <      <
^1?v
^3<2
^  <

1
No meu telefone agora. Não tenho certeza se algumas linhas mudaram um pouco acidentalmente. Vou verificar quando estiver em casa.
Ingo Bürk

Parece bom para mim. Muito melhor do que minha tentativa de 99 bytes. Espero que você esteja se divertindo com befunge.
AndoDaan

Sim, a versão móvel não parece monospace. Befunge é bastante divertido, mas eu gostaria que seria um digno intérprete Befunge-98 (eu não poderia encontrar qualquer ... / edit: rcfunge parece funcionar)
Ingo Bürk

3

GolfScript, 13 caracteres

~0]4,^.,rand=

Este é um programa completo do GolfScript que lê dois números separados por espaços em branco (cada um assumido como 1, 2 ou 3) da entrada padrão e gera um número aleatório do conjunto {1, 2, 3} que não é igual a nenhum dos números de entrada.

Experimente online.(Observação: o link é para a versão anterior; estou em um dispositivo móvel e não consigo corrigi-lo.)

Aqui está uma versão comentada do 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

Se você preferir uma função nomeada que aceita os dois números como argumentos na pilha, isso requer mais alguns caracteres:

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

O corpo real da função é apenas um caractere mais longo que o código independente (porque precisamos do [ ter certeza de que consumimos apenas dois argumentos), mas a sobrecarga de envolver o código em um bloco e atribuí-lo a um símbolo leva cinco mais caracteres, para um total de 19.

Como alternativa, se você literalmente tem os dois números atribuídos às variáveis Ae B, e deseja o terceiro número atribuído C, isso também pode ser feito em 19 caracteres:

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

(Se, em vez disso, deixar o terceiro número na pilha for aceitável, você poderá deixar :C;o final.)

Ps. Obrigado pela sugestão ^, Howard.


Em vez de \-você pode usar ^.
279 Howard Howard

3

Python - 35

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

Assume que aleatório é importado, o que parece estar especificado na pergunta.

PYG - 25

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

2

Python, 14 caracteres

Eu tentei para cada 9 casos possíveis e parece funcionar bem!

C=A^B or A^1|2

(edit): Como o edc65 apontou, isso não é válido, pois não é aleatório ... Eu perdi essa parte da pergunta e me sinto estúpido agora.


3
Não é aleatório
edc65

Ainda assim, +1 para a admissão
Sr. Lister

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

Não é muito impressionante.


2

PowerShell, 21

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

Muito simples. Abusando do fato de que os operadores de comparação agem de maneira diferente com uma matriz como seu operando esquerdo.


Boa dica sobre os operadores de comparação. Me faz querer olhar para alguns dos meus scripts antigos e ver se existem lugares nos quais ele pode ser usado. Particularmente, isso me lembra parte do simulador de Monty Hall.
Iszi

1

Mathematica, 37 bytes

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

Basicamente, o mesmo que a resposta do Ruby, mas consideravelmente maior graças aos nomes das funções do Mathematica. Estou usando variáveis ​​em minúsculas, porque os nomes em maiúsculas podem colidir com os incorporados (nesse caso, eles não são, mas você simplesmente não faz isso no Mathematica).


1

R, 42 caracteres

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

Vetor xé o vetor de pesos de probabilidade para obter os elementos do vetor que está sendo amostrado. Ele é definido como 1 para cada um primeiro e, em seguida, os elementos correspondentes a A e B são definidos como 0, portanto, eles não têm chance de serem selecionados.


1

Rebol - 40 caracteres

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

1

CJam - 12

4,[AB0]-mr0=

Isso pressupõe que as variáveis ​​A e B já foram definidas, de acordo com a pergunta.

Você pode experimentá-lo em http://cjam.aditsu.net/

Para testá-lo com números aleatórios, use:

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

Para testá-lo com valores específicos, use (por exemplo):

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

Explicação:

4,cria a matriz [0 1 2 3]
[AB0]-remove os números A, B e 0 da matriz
mrembaralha a matriz restante
0=leva o primeiro elemento

Em uma versão futura do CJam, este programa será 2 bytes mais curto :)


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 na resposta de Brandon Anzaldi

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

0

Julia, 32 ou 56, dependendo das regras

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

32 se eu não precisar gerar a e b.


A pergunta diz "suponha que A e B já tenham sido escolhidos para você".
nyuszika7h

0

JS, 43

for(C=0;~[0,A,B].indexOf(C);)C=1+new Date%3

Não vai correr. Você pode querer definir Ae Bprimeiro.
Spedwards

bem, a pergunta diz: "Suponha que A e B já foram escolhidos para você". Portanto, você deve executar "A = 1 + nova data% 3; B = 1 + nova data% 3" primeiro.
Xem

0

TI-BASIC, 23

Lbl 1:If C=A+B=A:Goto 1

Não funciona devido à ordem das operações; Além disso, você nunca gerou o número aleatório.
Lirtosiast

0

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

Versão 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);
}

Mas 6-ab não é aleatório, é? :)
xem

1
@xem - Não - mas ele só é usado 6-a-bquando não há outra opção, os dois outros são usados . É uma maneira inteligente de escolher o número não seleccionada a partir de 1, 2, 3. 6-1-2 = 3, 6-1-3=2, 6-2-3=1assim, para cada n igual a, b 6-a-bescolhe o terceiro um. Inteligente eh? A única vez que você pode usar aleatoriamente é quando a==b.
OldCurmudgeon

oh ótimo bom trabalho então.
Xem

0

R, 24 caracteres

Inicialize com

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

Então

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

Ou apenas n=1:3;n[!n%in%c(a,b)]mas depois você retorna os dois números.


0

R, 31 caracteres

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

Se você faz sample(x)em R, é interpretado como uma amostra aleatória de 1:x. Repetir o vetor (1:3)[-c(A,B)]duas vezes é uma maneira de impedir que isso aconteça.


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 pode ser substituído por ~~. Você também pode dizer r = (y, z) => y + Nova data (zy). Além disso, A e B não são iguais, e você não precisa contar a inicialização deles na sua pontuação.
xem

@xem A e B são feitos para serem aleatórios. As regras dizem que eles podem ser iguais. Além disso, não tem certeza sobre ES6 mas y+New Date(z-y)é um SyntaxError
Spedwards

@xem, y+new Date(z-y)por outro lado, relata a new Date()string com yanexado.
Spedwards

desculpe pelo erro de digitação, eu quis dizer y + nova data% (zy) ... ou (z-y + 1) dependendo dos parâmetros.
Xem

e minha observação sobre A e B iguais foi sobre "a = b = r (1,3);". Se você fizer isso, a é sempre igual a b, mas não é isso que as regras pedem. Eles pedem A e B aleatoriamente. Eles podem ser iguais, mas não necessariamente
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 gera nnúmeros aleatórios diferentes de 0 a k.


0

J ( 21 19: tempo demais para o meu gosto)

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

Existem J assistentes por perto para ajudar a remover essa atribuição de variável? É apenas 2 caracteres mais curtos ...

Ou, se não precisar ser aleatório, você pode fazer o seguinte:

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

12 caracteres.



0

JavaScript - 41 (até 46) 37 35 34 30

Atualizada:

Conseguiu reduzir para 30 caracteres modificando-o, inspirado na resposta de stevevarrill em C.

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


Obrigado nyuszika7h por me reduzir a 34 ~:

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

Tomando emprestado da resposta do xem para, pelo menos, se equiparar a ele:

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

Obrigado por me lembrar isso 1+new Date%3 === (new Date%3)+1!

Solução anterior:

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

Certifique-se de que as condições while()sejam satisfeitas e faça um loop até que não estejam.


Outra solução:

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

Isso pressupõe que Cjá foi declarado OU que o interpretador JavaScript pode manipular variáveis ​​não declaradas.

No entanto, se o intérprete JS puder manipular a EOL sem ponto e vírgula, poderá ser reduzido para 41.

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

Se Cnão tiver sido declarado e não houver correção de erro, isso elevará a contagem para 46 caracteres.

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

Programa de teste:

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

ótimo! Fiz uma resposta 35b com base nisso, mas usando um do-while;)
xem

Você deve poder usar em |vez de ||.
nyuszika7h

Salve 1 byte com um loop for:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose

Eu só gostaria de agradecer a todos por sua ajuda :)
Brandon Anzaldi

0

Befunge-98 (57 bytes)

Este código assume que os números serão inseridos no stdin. Ele selecionará um número aleatório se os dois primeiros números forem iguais até que sejam diferentes, caso contrário, escolherá o último número disponível.

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

-3

Python, 54 41 caracteres

Resposta bastante longa em Python, mas eu gosto de entender a lista, então decidi postar isso aqui

// [0] significa que é o primeiro elemento de

C=[i for i in[1,2,3]if not(i in(A,B))][0]

Como isso é aleatório?
precisa saber é o seguinte

Não é, desculpe ...
Caridorc 4/14/14

@ user80551 precisa ser?
John Dvorak

1
@JanDvorak Sim: "seu trabalho é aleatoriamente escolher um terceiro número ..." (Eu acho que isso precisa de mais alguma ênfase na questão, como muitos têm obtido errado)
daniero
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.