Losowo wybierz jedną liczbę inną niż dwie inne liczby losowe


14

Wygenerowano dwie liczby losowe A i B o wartości 1, 2 lub 3

Twoim zadaniem jest losowe wybranie trzeciej liczby C, która może również wynosić 1,2 lub 3. Ale C nie może być równe A ani B.

  • I tak, A może być równe B.
  • Jeśli A = B, to C ma tylko dwie liczby, może to być.
  • Jeśli A nie jest równe B, C może mieć tylko jedną liczbę.
  • Załóż, że A i B zostały już dla Ciebie wybrane

Tak powstałyby A i B w Pythonie

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

Załóżmy, że jest to już zawarte w kodzie.

To jest najkrótszy, jaki wymyśliłem w Pythonie

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

Właśnie to mogą równać A, B i C.

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

To, czego A, B i C nie mogą się równać

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

1
Więc jeśli podano A i B, to w rzeczywistości nie są one losowe, jeśli chodzi o mój program / funkcję, prawda? Co również rozumiesz przez „kod ogólny”? Czy naprawdę szukasz rozwiązania, którego możesz użyć w swoim projekcie? W takim razie nie szukałbym pomocy w golfa - ten kod będzie absolutnie bezużyteczny w produkcji. Celem gry w golfa kodowego jest nadużywanie funkcji specyficznych dla języka, aby uzyskać jak najmniejszy rozmiar kodu.
Martin Ender

Używałem tego do projektu i już otrzymałem długą odpowiedź, ale pytam o to, ponieważ uważałem, że to ciekawy problem dla społeczności. Umieściłem ogólny kod, ponieważ uważam, że jest bardziej interesujący, gdy ktoś użył bardziej logicznego myślenia, aby uzyskać odpowiedź, niż ogromnej znajomości niektórych funkcji specyficznych dla języka, ale jeśli kod-golf ma je nadużywać, usunę tę ostatnią linię.
tysonsmiths

Załóżmy, że A i B mogą być równe 1, 2 lub 3, więc popraw kod, aby przewidzieć wszystkie możliwości.
tysonsmiths

1
Nie rozumiem. Czy coś mi brakuje lub C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))działa? Również twoje rozwiązanie jest wysoce nieefektywne, ponieważ marnuje czas na zapętlenie i może zająć nieskończoną ilość czasu. Ponadto import randomliczy się rozmiar bajtu ...
DankMemes

3
Chcesz, żebyśmy napisali symulator Monty Hall ? ;-)
Ilmari Karonen

Odpowiedzi:


17

Ruby, 22 znaki

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

Nadal nie jestem pewien, czy poprawnie zrozumiałem pytanie ...


12

C, 26

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

Jeśli poprawnie zrozumiałem pytanie:

Jeśli ai bsą różne, nie ma losowości. odpowiedź musi być jedynym 1,2,3 że jest nieużywany: 6-a-b.

JEŚLI ai bsą takie same, istnieją 2 opcje:

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)

Okej, to okropne, wiem. Ale to moja pierwsza próba Befunge w historii, więc wciąż jestem bardzo szczęśliwy, że to w ogóle działa. Jestem pewien, że istnieje o wiele lepsze rozwiązanie.

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

1
Na moim telefonie teraz ... Nie jestem pewien, czy niektóre wiersze przesunęły się nieco przypadkowo. Sprawdzę to, kiedy będę w domu.
Ingo Bürk

Dla mnie wygląda dobrze. Znacznie lepiej niż moja 99 bajtowa próba. Mam nadzieję, że dobrze się bawisz z befunge.
AndoDaan,

Tak, wersja mobilna nie wydaje się być monospacowa. Befunge jest dość zabawne, ale szkoda, że nie byłoby to przyzwoity befunge-98 interpreter (nie mogłem znaleźć żadnych ... / edit: rcfunge wydaje się działać)
Ingo BURK

3

GolfScript, 13 znaków

~0]4,^.,rand=

Jest to kompletny program GolfScript, który odczytuje dwie liczby oddzielone spacjami (każda przyjmowana jako 1, 2 lub 3) ze standardowego wejścia i wysyła losową liczbę ze zbioru {1, 2, 3}, która nie jest równa żadnemu liczb wejściowych.

Wypróbuj online.(Uwaga: link jest do poprzedniej wersji; jestem na urządzeniu mobilnym i nie mogę go naprawić).

Oto skomentowana wersja programu:

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

Jeśli wolisz funkcję o nazwie, która przyjmuje dwie liczby jako argumenty na stosie, wymaga to kilku dodatkowych znaków:

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

Rzeczywista treść funkcji jest tylko o jeden znak dłuższa niż samodzielny kod (ponieważ potrzebujemy [ upewnić się, że zużywamy tylko dwa argumenty), ale narzut związany z zawijaniem kodu w bloku i przypisywaniem go do symbolu zajmuje pięć więcej znaków, w sumie 19.

Alternatywnie, jeśli dosłownie masz dwie liczby przypisane do zmiennych Ai Bchcesz przypisać trzecią liczbę C, możesz to zrobić również w 19 znakach:

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

(Jeśli zamiast tego dopuszczalne jest pozostawienie trzeciej liczby na stosie, możesz zostawić :C; koniec.)

Ps. Dzięki za sugestię użycia ^, Howard.


Zamiast \-ciebie możesz użyć ^.
Howard

3

Python - 35

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

Zakłada, że ​​losowy jest importowany, co wydaje się być określone w pytaniu.

PYG - 25

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

2

Python, 14 znaków

Próbowałem tego dla 9 możliwych przypadków i wydaje się, że działa dobrze!

C=A^B or A^1|2

(edytuj): Jak zauważył edc65, nie jest to ważne, ponieważ nie jest przypadkowe ... Przegapiłem tę część pytania i czuję się teraz głupio.


3
Wcale nie jest losowy
edc65

Mimo to +1 za przyjęcie
Pan Lister

2

Befunge - 99 bajtów

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

Niezbyt imponujące.


2

PowerShell, 21

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

Bardzo proste. Nadużywanie faktu, że operatory porównania działają inaczej z tablicą jako lewym operandem.


Dobra wskazówka na temat operatorów porównania. Sprawia, że ​​chcę spojrzeć na niektóre z moich starych skryptów i sprawdzić, czy są miejsca, w których można z nich korzystać. W szczególności przypomina mi to część symulatora Monty Hall.
Iszi

1

Mathematica, 37 bajtów

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

Zasadniczo to samo co odpowiedź Ruby, ale znacznie dłużej dzięki nazwom funkcji Mathematica. Używam zmiennych o małych literach, ponieważ nazwy wielkich liter mogą kolidować z wbudowanymi (w tym przypadku nie, ale po prostu nie robisz tego w Mathematica).


1

R, 42 znaki

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

Wektor xjest wektorem wag prawdopodobieństwa dla uzyskania elementów próbkowanego wektora. Na początku jest ustawiane na 1, a następnie elementy odpowiadające A i B są ustawiane na 0, dlatego nie mają szans na wybranie.



1

CJam - 12

4,[AB0]-mr0=

Zakłada się, że zmienne A i B zostały już ustawione, zgodnie z pytaniem.

Możesz spróbować na http://cjam.aditsu.net/

Aby przetestować go za pomocą liczb losowych, użyj:

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

Aby przetestować go z określonymi wartościami, użyj (na przykład):

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

Wyjaśnienie:

4,tworzy tablicę [0 1 2 3]
[AB0]-usuwa liczby A, B i 0 z tablicy
mrtasuje pozostała tablica
0=bierze pierwszy element

W przyszłej wersji CJam ten program będzie o 2 bajty krótszy :)



1

JS, 35

zainspirowany odpowiedzią Brandona Anzaldiego

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

0

Julia, 32 lub 56 lat w zależności od zasad

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

32 jeśli nie muszę generować a i b.


Pytanie brzmi: „zakładamy, że A i B zostały już dla ciebie wybrane”.
nyuszika7h,

0

JS, 43

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

Nie ucieknę. Możesz zdefiniować Ai Bnajpierw.
Spedwards,

cóż, pytanie brzmi: „Załóżmy, że A i B zostały już dla ciebie wybrane”. Dlatego najpierw należy uruchomić „A = 1 + nowa data% 3; B = 1 + nowa data% 3”.
xem.

0

TI-BASIC, 23

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

Nie działa z powodu kolejności operacji; dodatkowo nigdy nie wygenerowałeś liczby losowej.
lirtosiast

0

Java - 126 123 83 85 (używając sprytnego 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;}

Pełna wersja:

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

Ale 6-ab nie jest losowy, prawda? :)
xem.

1
@xem - Nie - ale używa tylko 6-a-bwtedy, gdy nie ma innego wyboru, oba pozostałe są brane. Jest zręczny sposób wybranie liczby niezaznaczoną spośród 1, 2, 3 6-1-2 = 3, 6-1-3=2, 6-2-3=1więc dla każdego przypadku równe a, b 6-a-bwybiera trzeci. Sprytnie, prawda? Jedyny raz, kiedy możesz użyć losowego, to kiedy a==b.
OldCurmudgeon

świetnie. dobra robota.
xem.

0

R, 24 znaki

Zainicjuj za pomocą

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

Następnie

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

Lub po prostu, n=1:3;n[!n%in%c(a,b)]ale zwracasz obie liczby.


0

R, 31 znaków

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

Jeśli zrobisz to sample(x)w R, to jest interpretowane jako losowa próbka z 1:x. (1:3)[-c(A,B)]Dwukrotne powtórzenie wektora jest jednym ze sposobów na powstrzymanie tego.


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 można zastąpić ~~. Można również powiedzieć r = (y, z) => y + Nowa data (zy). Ponadto A i B nie powinny być równe i nie musisz liczyć ich inicjalizacji w swoim wyniku.
xem.

@xem A i B mają być losowe. Reguły mówią, że mogą być równe. Ponadto nie jestem pewien co do ES6, ale y+New Date(z-y)jest to
błąd składniowy

Z y+new Date(z-y)drugiej strony @xem zgłasza new Date()ciąg z ydołączonym.
Spedwards,

przepraszam za literówkę, miałem na myśli y + nowa data% (zy) ... lub (z-y + 1) w zależności od parametrów.
xem.

a moja uwaga na temat A i B równa była około „a = b = r (1,3);”. Jeśli to zrobisz, a jest zawsze równe b, ale nie tego wymagają reguły. Pytają losowo o A i B. Mogą być równe, ale niekoniecznie
xem.


0

Java, 264 bajty

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

Ten kod generuje nróżne liczby losowe od 0 do k.


0

J ( 21 19: za długo jak na mój gust)

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

Czy w pobliżu są j-kreatorzy, którzy pomogą usunąć to przypisanie zmiennej?To tylko 2 znaki krótsze ...

Lub, jeśli nie musi to być przypadek, możesz to zrobić:

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

12 znaków.



0

JavaScript - 41 (do 46) 37 35 34 30

Zaktualizowano:

Udało się go zmniejszyć do 30 znaków, modyfikując go, zainspirowany odpowiedzią Stevevarrilla w C.

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


Dziękuję nyuszika7h za doprowadzenie mnie do 34 ~:

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

Pożyczając od odpowiedzi Xema, aby przynajmniej był na równi z nim:

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

Dzięki za przypomnienie mi o tym 1+new Date%3 === (new Date%3)+1 !

Poprzednie rozwiązanie:

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

Upewnij się, że warunki while()są spełnione, i powtarzaj, dopóki nie będą.


Inne rozwiązanie:

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

Zakłada się, że Czostała już zadeklarowana LUB, że interpreter JavaScript może obsługiwać niezadeklarowane zmienne.

Jeśli jednak interpreter JS może obsłużyć EOL bez średnika, można go obniżyć do 41.

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

Jeśli Cnie został zadeklarowany i nie ma dla niego korekcji błędów, suma będzie się składać z maksymalnie 46 znaków.

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

Program testowy:

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

świetny! Na tej podstawie udzieliłem odpowiedzi 35b, ale używając pętli do-while;)
xem.

Powinieneś być w stanie użyć |zamiast|| .
nyuszika7h

Zapisz 1 bajt za pomocą pętli for: for(C=A;C==A|C==B;)C=1+new Date%3
openorclose

Chciałbym tylko podziękować wszystkim za pomoc :)
Brandon Anzaldi,

0

Befunge-98 (57 bajtów)

Ten kod zakłada, że ​​liczby będą wprowadzane na standardowe wejście. Wybierze losową liczbę, jeśli obie pierwsze liczby będą takie same, aż będzie inna, w przeciwnym razie wybierze ostatnią dostępną liczbę.

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

-3

Python, 54 41 znaków

Dość długa odpowiedź w Pythonie, ale lubię rozumieć listę, więc postanowiłem opublikować to tutaj

// [0] oznacza, że ​​jest to pierwszy element

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

Jak to jest losowe?
user80551

Nie, przepraszam ...
Caridorc

@ user80551 czy to musi być?
John Dvorak,

1
@JanDvorak Tak: „Twoim zadaniem jest, aby losowo wybrać trzeci numer ...” (myślę, że potrzebuje trochę większy nacisk na pytanie, jak wiele mają zdobyć to źle)
daniero
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.