Scegli casualmente un numero diverso da altri due numeri casuali


14

Due numeri casuali A e B sono stati generati per essere 1, 2 o 3

il tuo compito è quello di scegliere casualmente un terzo numero C che può anche essere 1,2 o 3. Ma, C non può essere uguale a A o B.

  • E sì, A può equivalere a B.
  • Se A = B, allora a C rimangono solo due numeri che può essere.
  • Se A non è uguale a B, C ha un solo numero che può essere.
  • Supponiamo che A e B siano già stati scelti per te

Ecco come A e B verrebbero creati in Python

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

Supponiamo che questo sia già nel tuo codice.

Questo è il più breve che ho ideato in Python

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

Questo è ciò che A, B e C possono eguagliare.

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

Questo è ciò che A, B e C non possono eguagliare

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

1
Quindi se vengono dati A e B, in realtà non sono casuali per quanto riguarda il mio programma / funzione, giusto? Cosa intendi per "codice generale"? Stai davvero cercando una soluzione che puoi usare in un tuo progetto? In tal caso, non cercherei aiuto per code-golf: il codice sarà assolutamente inutilizzabile in produzione. Il punto centrale del code-golf è abusare delle funzionalità specifiche della lingua per ridurre al minimo le dimensioni del codice.
Martin Ender,

Lo stavo usando per un progetto e ho già ricevuto una risposta lunga, ma lo sto chiedendo perché pensavo che fosse un problema interessante che la comunità avrebbe apprezzato. E metto il codice generale perché lo trovo più interessante quando qualcuno ha usato un pensiero più logico per ottenere una risposta piuttosto che una vasta conoscenza di alcune caratteristiche specifiche della lingua, ma se il code-golf deve abusare di queste, allora rimuoverò quest'ultima riga.
fabbri

Supponiamo che A e B possano essere uguali a 1, 2 o 3, quindi il tuo codice è giusto per anticipare tutte le possibilità.
fabbri

1
Non capisco. C'è qualcosa che mi manca o C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))funziona? Inoltre, la tua soluzione è altamente inefficiente in quanto spreca tempo e potrebbe richiedere un tempo infinito per l'esecuzione. Inoltre, import randomconta nella dimensione in byte ...
DankMemes

3
Quindi vuoi che scriviamo un simulatore di Monty Hall ? ;-)
Ilmari Karonen il

Risposte:


17

Rubino, 22 caratteri

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

Non sono ancora sicuro di aver capito correttamente la domanda ...


12

C, 26

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

Se ho capito correttamente la domanda:

Se ae bsono diversi, non è casuale. la risposta deve essere l'unica di 1,2,3 non utilizzata:6-a-b .

SE ae bsono uguali ci sono 2 scelte:

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)

Va bene, questo è terribile, lo so. Ma è il mio primo tentativo di Befunge in assoluto, quindi sono ancora abbastanza felice che funzioni. Sono sicuro che esiste una soluzione molto, molto migliore.

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

1
Sul mio telefono in questo momento .. Non sono sicuro se alcune file si sono spostate un po 'accidentalmente. Lo controllerò quando sono a casa.
Ingo Bürk,

Mi sembra buono. Molto meglio del mio tentativo di 99 byte. Spero che ti diverta con Befunge.
AndoDaan,

Sì, la versione mobile non sembra essere monospaziale. Befunge è abbastanza divertente, ma vorrei che ci fosse un discreto interprete Befunge-98 (non riuscivo a trovare alcun ... / modifica: rcfunge sembra funzionare)
Ingo Bürk,

3

GolfScript, 13 caratteri

~0]4,^.,rand=

Questo è un programma GolfScript completo che legge due numeri separati da spazi bianchi (ciascuno assunto 1, 2 o 3) dall'input standard e genera un numero casuale dall'insieme {1, 2, 3} che non è uguale a nessuno dei numeri di input.

Provalo online.(Nota: il collegamento è alla versione precedente; sono su un dispositivo mobile e non riesco a risolverlo.)

Ecco una versione commentata del programma:

~         # 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 preferisci una funzione con nome che accetta i due numeri come argomenti nello stack, che richiede qualche altro carattere:

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

Il corpo effettivo della funzione è solo un carattere più lungo del codice autonomo (perché abbiamo bisogno di [ di assicurarci di consumare solo due argomenti), ma il sovraccarico di racchiudere il codice in un blocco e assegnarlo a un simbolo richiede cinque più caratteri, per un totale di 19.

In alternativa, se hai letteralmente i due numeri assegnati nelle variabili Ae B, e desideri assegnare il terzo numero C, puoi farlo anche in 19 caratteri:

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

(Se lasciare il terzo numero in pila invece è accettabile, è possibile lasciare il :C; la fine).

Ps. Grazie per il suggerimento da usare ^, Howard.


Invece di \-te puoi usare ^.
Howard,

3

Python - 35

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

Presuppone che venga importato random, che sembra essere specificato nella domanda.

PYG - 25

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

2

Python, 14 personaggi

L'ho provato per ogni 9 casi possibili e sembra funzionare bene!

C=A^B or A^1|2

(modifica): Come sottolineato da edc65, questo non è valido poiché non è casuale ... Ho perso quella parte della domanda e mi sento stupido in questo momento.


3
Per nulla casuale
edc65,

Tuttavia, +1 per l'ammissione
Sig. Lister,

2

Befunge - 99 byte

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

Non molto impressionante.


2

PowerShell, 21

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

Molto semplice. Abusando del fatto che gli operatori di confronto agiscono diversamente con un array come operando di sinistra.


Bel consiglio sugli operatori di confronto. Mi fa venire voglia di guardare alcuni dei miei vecchi script e vedere se ci sono posti che possono essere utilizzati. In particolare, questo mi ricorda una parte del simulatore di Monty Hall.
Iszi,

1

Mathematica, 37 byte

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

Sostanzialmente uguale alla risposta di Ruby, ma notevolmente più lunga grazie ai nomi delle funzioni di Mathematica. Sto usando le variabili minuscole, perché i nomi in maiuscolo potrebbero scontrarsi con gli incorporati (in questo caso non lo fanno, ma semplicemente non lo fai in Mathematica).


1

R, 42 caratteri

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

Il vettore xè il vettore dei pesi di probabilità per ottenere gli elementi del vettore da campionare. Inizialmente è impostato su 1 per ciascuno, quindi gli elementi corrispondenti ad A e B sono impostati su 0, quindi non hanno possibilità di essere scelti.


1

Rebol - 40 caratteri

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

1

CJam - 12

4,[AB0]-mr0=

Ciò presuppone che le variabili A e B siano già state impostate, in base alla domanda.

Puoi provarlo su http://cjam.aditsu.net/

Per testarlo con numeri casuali, utilizzare:

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

Per testarlo con valori specifici, utilizzare (ad esempio):

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

Spiegazione:

4,crea l'array [0 1 2 3]
[AB0]-rimuove i numeri A, B e 0 dall'array
mrmescola l'array rimanente
0= prende il primo elemento

In una versione futura di CJam questo programma sarà più corto di 2 byte :)


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

ispirato dalla risposta di 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 a seconda delle regole

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

32 se non ho bisogno di generare a e b.


La domanda dice "supponiamo che A e B siano già stati scelti per te".
nyuszika7h,

0

JS, 43

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

Non scapperò. Potresti voler definire Ae Bprima.
Spedwards

bene, la domanda dice: "Supponiamo che A e B siano già stati scelti per te". Quindi dovresti eseguire prima "A = 1 + nuova data% 3; B = 1 + nuova data% 3".
xem,

0

TI-BASIC, 23

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

Non funziona a causa dell'ordine delle operazioni; inoltre non hai mai effettivamente generato il numero casuale.
lirtosiast

0

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

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

Ma il 6-ab non è casuale, vero? :)
xem,

1
@xem - No - ma utilizza solo 6-a-bquando non c'è altra scelta, vengono prese entrambe le altre due. È un modo intelligente di scegliere il numero non selezionato da 1, 2, 3. 6-1-2 = 3, 6-1-3=2, 6-2-3=1quindi per ogni non uguale a, b 6-a-bprende il terzo. Eh intelligente? L'unica volta che puoi usare random è quando a==b.
OldCurmudgeon,

Oh grande. buon lavoro allora.
XX

0

R, 24 caratteri

Inizializza con

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

Poi

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

O solo n=1:3;n[!n%in%c(a,b)]ma poi restituisci entrambi i numeri.


0

R, 31 caratteri

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

Se lo fai sample(x)in R, allora viene interpretato come un campione casuale da 1:x. Ripetere il vettore (1:3)[-c(A,B)]due volte è un modo per impedire che ciò accada.


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 può essere sostituito da ~~. Potresti anche dire r = (y, z) => y + Nuova data (zy). Inoltre, A e B non sono pensati per essere uguali e non devi contare la loro inizializzazione nel tuo punteggio.
xem,

@xem A e B sono pensati per essere casuali. Le regole dicono che possono essere uguali. Inoltre, non sono sicuro di ES6 ma y+New Date(z-y)è un SyntaxError
Spedwards il

@xem y+new Date(z-y)invece riporta la new Date()stringa con l' yaggiunta.
Spedwards

scusate il refuso, intendevo y + new Date% (zy) ... o (z-y + 1) a seconda dei parametri.
xem,

e la mia osservazione su A e B uguali era su "a = b = r (1,3);". Se lo fai a è sempre uguale a b, ma non è quello che chiedono le regole. Chiedono A e B casuali. Possono essere uguali ma non necessariamente
xem


0

Java, 264 byte

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

Questo codice genera ndiversi numeri casuali da 0 a k.


0

J ( 21 19: troppo lungo per i miei gusti)

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

Ci sono dei maghi J in giro per aiutare a rimuovere quell'assegnazione variabile?È solo 2 caratteri più corto ...

Oppure, se non deve essere casuale, potresti fare questo:

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

12 caratteri.



0

JavaScript - 41 (fino a 46) 37 35 34 30

aggiornato:

Riuscito a portarlo a 30 caratteri modificandolo, ispirato dalla risposta di Stevevarrill in C.

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


Grazie nyuszika7h per avermi portato a 34 ~:

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

Prendendo in prestito dalla risposta di xem almeno cadere alla pari con lui:

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

Grazie per avermelo ricordato 1+new Date%3 === (new Date%3)+1!

Soluzione precedente:

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

Assicurati che le condizioni while()siano soddisfatte e continua fino a quando non lo sono.


Altra soluzione:

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

Ciò presuppone che Csia già stato dichiarato OPPURE che l'interprete JavaScript può gestire variabili non dichiarate.

Tuttavia, se l'interprete JS è in grado di gestire EOL senza un punto e virgola, potrebbe essere ridotto a 41.

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

Se Cnon è stato dichiarato, e non vi è alcuna correzione di errore, questo porterà il conteggio fino a 46 caratteri.

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

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

grande! Ho fatto una risposta 35b basata su questo, ma usando un ciclo do-while;)
xem

Dovresti essere in grado di utilizzare |invece di ||.
nyuszika7h,

Salvare 1 byte con un ciclo for:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose

Vorrei solo ringraziare tutti per l'aiuto :)
Brandon Anzaldi,

0

Befunge-98 (57 byte)

Questo codice presuppone che i numeri verranno immessi su stdin. Sceglierà un numero casuale se entrambi i primi numeri saranno uguali finché non sarà diverso, altrimenti sceglierà l'ultimo numero disponibile.

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

-3

Python, 54 41 caratteri

Piuttosto lunga risposta in Python ma mi piace la comprensione dell'elenco, quindi ho deciso di pubblicare questo qui

// [0] significa che è il primo elemento di

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

Com'è casuale?
user80551

Non è, scusa ...
Caridorc,

@ user80551 deve essere?
John Dvorak,

1
@JanDvorak Sì: "il tuo compito è quello di scegliere casualmente un terzo numero ..." (Penso che questo abbia bisogno di un po 'più di enfasi sulla domanda, dato che molti hanno sbagliato)
daniero
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.