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

Ventero
fonte
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
Level River St
fonte
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
^  <
Ingo Bürk
fonte
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.

Ilmari Karonen
fonte
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]
Ian D. Scott
fonte
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.

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

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

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

Martin Ender
fonte
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.

plannapus
fonte
1

Rebol - 40 caracteres

random/only difference[1 2 3]reduce[A B]
draegtun
fonte
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 :)

aditsu
fonte
1

C 67

int C(int a,int b){int c=0;while(c!=a&&c!=b)c=rand()%3+1;return c;}
bacchusbeale
fonte
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
xem
fonte
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.

gggg
fonte
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
xem
fonte
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
Timtech
fonte
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);
}
OldCurmudgeon
fonte
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.

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

Solha
fonte
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
fonte
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

C - 38

main(c){for(;c==a|c==b;c=rand()%2+1);}
nyuszika7h
fonte
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.

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

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

Golfscript, 13 caracteres

~]4,^.,rand)=
Kyle McCormick
fonte
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);
}
Brandon Anzaldi
fonte
ó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#;^
waylon531
fonte
-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]
Caridorc
fonte
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