Wähle zufällig eine Zahl aus, die sich von zwei anderen Zufallszahlen unterscheidet

14

Es wurden zwei Zufallszahlen A und B erzeugt, die entweder 1, 2 oder 3 sind

Ihre Aufgabe ist es, zufällig eine dritte Zahl C auszuwählen, die auch 1,2 oder 3 sein kann. C kann jedoch nicht A oder B entsprechen.

  • Und ja, A kann gleich B sein.
  • Wenn A = B, dann hat C nur noch zwei Zahlen, kann es sein.
  • Wenn A nicht gleich B ist, kann C nur eine Zahl haben.
  • Angenommen, A und B wurden bereits für Sie ausgewählt

So würden A und B in Python erstellt

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

Angenommen, dies ist bereits in Ihrem Code enthalten.

Dies ist die kürzeste, die ich mir in Python ausgedacht habe

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

Dies ist, was A, B und C gleich sein können.

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

Dies ist, was A, B und C nicht gleich sein können

  • 1,2,1
  • 2,3,3
  • 1,1,1
  • 3,2,3
tysonsmiths
quelle
1
Wenn also A und B angegeben sind, sind sie in Bezug auf mein Programm / meine Funktion nicht zufällig , oder? Auch was meinst du mit "allgemeiner Code"? Suchen Sie tatsächlich eine Lösung, die Sie in einem Ihrer Projekte verwenden können? In diesem Fall würde ich nicht auf Code-Golf zurückgreifen - der Code wird in der Produktion absolut unbrauchbar sein. Der gesamte Sinn von Code-Golf besteht darin, sprachspezifische Merkmale zu missbrauchen, um die Codegröße so weit wie möglich zu verringern.
Martin Ender
Ich habe dies für ein Projekt verwendet und habe bereits eine lange Antwort erhalten, aber ich frage dies, weil ich dachte, es wäre ein interessantes Problem, das die Community genießen würde. Und ich schreibe allgemeinen Code, weil ich es interessanter finde, wenn jemand logischer darüber nachdenkt, um eine Antwort zu erhalten, anstatt sich mit einigen sprachspezifischen Merkmalen auskennen zu müssen. Wenn Code-Golf diese jedoch missbrauchen soll, werde ich diese letzte Zeile entfernen.
tysonsmiths
Nehmen wir an, A und B können entweder 1, 2 oder 3 sein. Richten Sie also Ihren Code so ein, dass alle Möglichkeiten vorweggenommen werden.
tysonsmiths
1
Ich verstehe nicht Fehlt mir etwas oder funktioniert es C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))? Außerdem ist Ihre Lösung äußerst ineffizient, da sie Zeit mit Schleifen verschwendet und möglicherweise unendlich viel Zeit in Anspruch nimmt. Auch import randomzählt in
Bytegröße
3
Sie möchten also, dass wir einen Monty Hall-Simulator schreiben ? ;-)
Ilmari Karonen

Antworten:

17

Ruby, 22 Zeichen

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

Immer noch nicht sicher, ob ich die Frage richtig verstanden habe ...

Ventero
quelle
12

C 26

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

Wenn ich die Frage richtig verstanden habe:

Wenn aund bverschieden sind, gibt es keinen Zufall. Die Antwort muss die einzige 1,2,3 sein , das nicht benutzt wird: 6-a-b.

WENN aund bsind gleich gibt es 2 Möglichkeiten:

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

Befunge ( 156 89 85 74)

Okay, das ist schrecklich, ich weiß. Aber es ist mein erster Befunge-Versuch überhaupt, also bin ich immer noch ziemlich froh, dass es überhaupt funktioniert. Ich bin mir sicher, dass es eine viel, viel bessere Lösung gibt.

<v1p90&p80&
<<@.g70_v#-g70_v#-g70g90g80p70
  v     <      <
^1?v
^3<2
^  <
Ingo Bürk
quelle
1
Im Moment auf meinem Handy. Ich bin mir nicht sicher, ob sich einige Zeilen versehentlich verschoben haben. Ich werde es überprüfen, wenn ich zu Hause bin.
Ingo Bürk
Sieht gut für mich aus. Viel besser als mein 99 Byte Versuch. Ich hoffe du hast Spaß mit befunge.
AndoDaan
Ja, die mobile Version scheint nicht monospaced zu sein. Befunge ist ziemlich lustig, aber ich wünschte, es gäbe einen anständigen Befunge-98-Dolmetscher (ich konnte keinen finden ... / edit: rcfunge scheint zu funktionieren)
Ingo Bürk
3

GolfScript, 13 Zeichen

~0]4,^.,rand=

Dies ist ein vollständiges GolfScript-Programm, das zwei durch Leerzeichen getrennte Zahlen (von denen angenommen wird, dass sie entweder 1, 2 oder 3 sind) von der Standardeingabe liest und eine Zufallszahl aus dem Satz {1, 2, 3} ausgibt, die keiner entspricht der eingegebenen Zahlen.

Probieren Sie es online aus.(Hinweis: Der Link verweist auf die vorherige Version. Ich bin auf einem mobilen Gerät und kann ihn nicht reparieren.)

Hier ist eine kommentierte Version des Programms:

~         # 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

Wenn Sie eine benannte Funktion bevorzugen, die die beiden Zahlen als Argumente auf dem Stapel verwendet, sind ein paar Zeichen mehr erforderlich:

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

Der eigentliche Hauptteil der Funktion ist nur ein Zeichen länger als der eigenständige Code (da wir den benötigen) [ nur zwei Argumente verwendet werden müssen), aber der Aufwand, den Code in einen Block einzuschließen und einem Symbol zuzuweisen, beträgt fünf mehr Zeichen für insgesamt 19.

Alternativ, wenn Sie buchstäblich die beiden Zahlen in den Variablen zugewiesen Aund B, und wollen die dritte Nummer zugewiesen C, die auch in 19 Zeichen getan werden kann:

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

(Wenn es akzeptabel ist, stattdessen die dritte Zahl auf dem Stapel zu belassen, können Sie die :C; das Ende weglassen.)

Ps. Vielen Dank für den Vorschlag ^, Howard.

Ilmari Karonen
quelle
Anstelle von \-Ihnen können verwenden ^.
Howard
3

Python - 35

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

Angenommen, es wird zufällig importiert, was in der Frage angegeben zu sein scheint.

PYG - 25

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

Python, 14 Zeichen

Ich habe es für alle 9 möglichen Fälle versucht und es scheint gut zu funktionieren!

C=A^B or A^1|2

(edit): Wie edc65 betonte, ist dies nicht gültig, da es nicht zufällig ist ... Ich habe diesen Teil der Frage verpasst und ich fühle mich im Moment dumm.

SimonD
quelle
3
Überhaupt
Noch +1 für die Aufnahme
Herr 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<        
 > > > >.@       

Nicht sehr beeindruckend.

AndoDaan
quelle
2

PowerShell, 21

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

Sehr unkompliziert. Missbrauch der Tatsache, dass Vergleichsoperatoren mit einem Array als linkem Operanden unterschiedlich agieren.

Joey
quelle
Netter Tipp zu den Vergleichsoperatoren. Ich möchte mir einige meiner alten Skripte ansehen und sehen, ob es Orte gibt, an denen sie verwendet werden können. Dies erinnert mich besonders an einen Teil des Monty Hall-Simulators.
Iszi
1

Mathematica, 37 Bytes

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

Grundsätzlich das gleiche wie die Ruby-Antwort, jedoch dank der Funktionsnamen von Mathematica erheblich länger. Ich verwende Variablen in Kleinbuchstaben, da Namen in Großbuchstaben mit eingebauten Elementen in Konflikt geraten können (dies ist in diesem Fall nicht der Fall, aber Sie tun dies in Mathematica einfach nicht).

Martin Ender
quelle
1

R, 42 Zeichen

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

Vektor xist der Vektor der Wahrscheinlichkeitsgewichte zum Erhalten der Elemente des abgetasteten Vektors. Es wird zuerst für jedes Element auf 1 gesetzt, dann werden Elemente, die A und B entsprechen, auf 0 gesetzt, daher haben sie keine Chance, ausgewählt zu werden.

Plannapus
quelle
1

Rebol - 40 Zeichen

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

CJam - 12

4,[AB0]-mr0=

Dies setzt voraus, dass die Variablen A und B entsprechend der Frage bereits gesetzt wurden.

Sie können es unter http://cjam.aditsu.net/ ausprobieren.

Um es mit Zufallszahlen zu testen, verwenden Sie:

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

Um es mit bestimmten Werten zu testen, verwenden Sie (zum Beispiel):

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

Erläuterung:

4,Erstellt das Array [0 1 2 3], werden
[AB0]-die Zahlen A, B und 0 aus dem Array entfernt.
mrDas verbleibende Array mischt
0=das erste Element

In einer zukünftigen CJam-Version wird dieses Programm 2 Bytes kürzer sein :)

aditsu
quelle
1

C 67

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

JS, 35

inspiriert von Brandon Anzaldis Antwort

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

Julia, 32 oder 56, abhängig von den Regeln

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

32 wenn ich a und b nicht erzeugen muss.

gggg
quelle
Die Frage lautet "Angenommen, A und B wurden bereits für Sie ausgewählt".
Nyuszika7h
0

JS, 43

for(C=0;~[0,A,B].indexOf(C);)C=1+new Date%3
xem
quelle
Läuft nicht. Vielleicht möchten Sie zunächst definieren Aund B.
Spedwards
Nun, die Frage lautet: "Angenommen, A und B wurden bereits für Sie ausgewählt." Sie sollten also zuerst "A = 1 + neues Datum% 3; B = 1 + neues Datum% 3" ausführen.
Xem
0

TI-BASIC, 23

Lbl 1:If C=A+B=A:Goto 1
Timtech
quelle
Funktioniert aufgrund der Reihenfolge der Operationen nicht. Außerdem haben Sie die Zufallszahl nie generiert.
Lirtosiast
0

Java - 126 123 83 85 (mit dem Schlauen 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;}

Vollversion:

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
quelle
Aber 6-ab ist nicht zufällig, oder? :)
Xem
1
@xem - Nein - wird jedoch nur verwendet, 6-a-bwenn keine andere Wahl getroffen wird. Die beiden anderen werden verwendet. Es ist eine geschickte Art und Weise der nicht ausgewählte Zahl von 1 der Kommissionierung, 2, 3 6-1-2 = 3, 6-1-3=2, 6-2-3=1so dass für jede nicht gleich a, b 6-a-bnimmt das dritter. Clever wie? Die einzige Zeit, die Sie zufällig verwenden können, ist wann a==b.
OldCurmudgeon
Oh toll. gute Arbeit dann.
Xem
0

R, 24 Zeichen

Initialisieren Sie mit

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

Dann

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

Oder eben n=1:3;n[!n%in%c(a,b)]doch dann gibst du beide Nummern zurück.

Shadowtalker
quelle
0

R, 31 Zeichen

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

Wenn Sie sample(x)in R tun , dann wird es als Zufallsstichprobe von interpretiert 1:x. Das (1:3)[-c(A,B)]zweimalige Wiederholen des Vektors ist eine Möglichkeit, dies zu verhindern.

Flunder
quelle
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);
Vorwärts
quelle
1
Math.floor kann durch ~~ ersetzt werden. Sie könnten auch r = (y, z) => y + Neues Datum (zy) sagen. Außerdem sollen A und B nicht gleich sein, und Sie müssen ihre Initialisierung nicht in Ihrer Punktzahl berücksichtigen.
06.07.14
@xem A und B sollen zufällig sein. Die Regeln besagen, dass sie gleich sein können. Auch nicht sicher über ES6, sondern y+New Date(z-y)ist ein SyntaxError
Spedwards
@xem y+new Date(z-y)hingegen meldet new Date()String mit yangehängtem.
Spedwards
Entschuldigung für den Tippfehler, ich meinte y + new Date% (zy) ... oder (z-y + 1), abhängig von den Parametern.
Xem
und meine Bemerkung über A und B war ungefähr "a = b = r (1,3);". Wenn du das tust, ist a immer gleich b, aber die Regeln verlangen das nicht. Sie fragen nach A und B zufällig. Sie können gleich sein, aber nicht unbedingt
Xem
0

C - 38

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

Dieser Code generiert nverschiedene Zufallszahlen von 0 bis k.

Padawan
quelle
0

J ( 21 19: zu lang für meinen Geschmack)

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

Gibt es J-Assistenten, die beim Entfernen dieser Variablenzuweisung helfen? Es ist nur 2 Zeichen kürzer ...

Oder, wenn es nicht zufällig sein muss, können Sie dies tun:

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

12 Zeichen.

ɐɔıɐɔuʇǝɥʇs
quelle
0

Golfscript, 13 Zeichen

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

JavaScript - 41 (bis zu 46) 37 35 34 30

Aktualisiert:

Hat es geschafft, es auf 30 Zeichen zu reduzieren, indem es modifiziert wurde, inspiriert von Stevevarrills Antwort in C.

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


Danke, nyuszika7h, dass du mich auf 34 ~ gebracht hast:

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

Aus der Antwort von xem entlehnt, um zumindest mit ihm mithalten zu können:

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

Danke, dass du mich daran erinnert hast 1+new Date%3 === (new Date%3)+1 !

Vorherige Lösung:

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

Stellen Sie sicher, dass die Bedingungen von while()erfüllt sind, und wiederholen Sie den Vorgang, bis sie nicht mehr erfüllt sind.


Andere Lösung:

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

Dies setzt voraus, dass C bereits deklariert wurde ODER dass der JavaScript-Interpreter nicht deklarierte Variablen verarbeiten kann.

Wenn der JS-Interpreter jedoch EOL ohne Semikolon verarbeiten kann, kann er auf 41 reduziert werden.

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

Wenn dies Cnicht deklariert wurde und es keine Fehlerkorrektur gibt, wird die Anzahl der Zeichen auf 46 erhöht.

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

Testprogramm:

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
quelle
großartig! Darauf basierend habe ich eine 35b-Antwort gemacht, aber mit einer do-while-Schleife;)
xem
Sie sollten in der Lage sein, |anstelle von zu verwenden ||.
Nyuszika7h
Speichern Sie 1 Byte mit einer for-Schleife:for(C=A;C==A|C==B;)C=1+new Date%3
Öffnen oder Schließen
Ich möchte mich nur bei allen für ihre Hilfe bedanken :)
Brandon Anzaldi
0

Befunge-98 (57 Bytes)

Dieser Code setzt voraus, dass die Zahlen in stdin eingegeben werden. Es wird eine Zufallszahl ausgewählt, wenn beide ersten Zahlen gleich sind, bis sie unterschiedlich sind, andernfalls wird die letzte verfügbare Zahl ausgewählt.

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

Python, 54 41 Zeichen

Ziemlich lange Antwort in Python, aber ich mag Listenverständnis, also habe ich mich entschieden, dies hier zu posten

// [0] bedeutet, dass es das erste Element von ist

C=[i for i in[1,2,3]if not(i in(A,B))][0]
Caridorc
quelle
Wie ist das zufällig?
User80551
Es ist nicht, sorry ...
Caridorc
@ user80551 muss es sein?
John Dvorak
1
@ JanDvorak Ja: "Ihre Aufgabe ist es, zufällig eine dritte Zahl zu wählen ..." (Ich denke, dies muss in der Frage etwas mehr betont werden, da viele es falsch verstanden haben)
daniero