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

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


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

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

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.


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]

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.



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.


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.


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


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.


1

Rebol - 40 Zeichen

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

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


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

inspiriert von Brandon Anzaldis Antwort

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

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.


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

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

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

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.


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.


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

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.


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.



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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.