Chọn ngẫu nhiên một số khác với hai số ngẫu nhiên khác


14

Hai số ngẫu nhiên A và B đã được tạo thành 1, 2 hoặc 3

công việc của bạn là chọn ngẫu nhiên một số thứ ba C cũng có thể là 1,2 hoặc 3. Nhưng, C không thể bằng A hoặc B.

  • Và Có, A có thể bằng B.
  • Nếu A = B, thì C chỉ còn hai số.
  • Nếu A không bằng B, C chỉ có một số.
  • Giả sử A và B đã được chọn cho bạn

Đây là cách A và B sẽ được tạo trong Python

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

Giả sử điều này đã có trong mã của bạn.

Đây là đoạn ngắn nhất tôi nghĩ ra trong Python

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

Đây là những gì A, B và C có thể bằng nhau.

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

Đây là những gì A, B và C không thể bằng nhau

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

1
Vì vậy, nếu A và B được đưa ra, chúng không thực sự ngẫu nhiên khi có liên quan đến chương trình / chức năng của tôi, phải không? Ngoài ra, ý nghĩa của "mã chung" là gì? Bạn có thực sự đang tìm kiếm một giải pháp bạn có thể sử dụng trong một dự án của bạn? Trong trường hợp đó, tôi sẽ không tìm đến code-golf để được giúp đỡ - mã này sẽ hoàn toàn không sử dụng được trong sản xuất. Toàn bộ quan điểm của golf-code là lạm dụng các tính năng dành riêng cho ngôn ngữ để có được kích thước mã càng xa càng tốt.
Martin Ender

Tôi đã sử dụng điều này cho một dự án và đã có một câu trả lời dài, nhưng tôi đang hỏi điều này bởi vì tôi nghĩ đó là vấn đề thú vị mà cộng đồng sẽ thích thú. Và tôi đặt mã chung vì tôi thấy thú vị hơn khi ai đó sử dụng tư duy logic hơn để có câu trả lời thay vì kiến ​​thức rộng lớn về một số tính năng dành riêng cho ngôn ngữ, nhưng nếu code-golf là lạm dụng những điều này, thì tôi sẽ xóa dòng cuối cùng đó.
tysonsmiths 04

Giả sử A và B có thể bằng 1, 2 hoặc 3, do đó, đúng mã của bạn để dự đoán tất cả các khả năng.
tysonsmiths 04

1
Tôi không hiểu Có cái gì tôi đang thiếu hoặc không C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))làm việc? Ngoài ra giải pháp của bạn rất kém hiệu quả vì nó lãng phí thời gian lặp và có thể mất một lượng thời gian vô hạn để chạy. Ngoài ra, import randomtính theo kích thước byte ...
DankMeme

3
Vì vậy, bạn muốn chúng tôi viết một mô phỏng Monty Hall ? ;-)
Ilmari Karonen

Câu trả lời:


17

Ruby, 22 ký tự

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

Vẫn không chắc chắn nếu tôi hiểu chính xác câu hỏi ...


12

C, 26

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

Nếu tôi hiểu chính xác câu hỏi:

Nếu abkhác nhau, không có ngẫu nhiên. câu trả lời phải là câu duy nhất trong số 1,2,3 không được sử dụng : 6-a-b.

NẾU abgiống nhau có 2 sự lựa chọn:

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)

Được rồi, điều này là khủng khiếp, tôi biết. Nhưng đó là lần thử Befunge đầu tiên của tôi từ trước đến giờ, vì vậy tôi vẫn rất vui vì nó thậm chí còn hoạt động. Tôi chắc chắn có một giải pháp tốt hơn nhiều.

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

1
Trên điện thoại của tôi ngay bây giờ .. Không chắc chắn nếu một số hàng vô tình thay đổi một chút. Tôi sẽ kiểm tra nó khi tôi về nhà.
Ingo Bürk

Co vẻ tôt vơi tôi. Tốt hơn nhiều so với nỗ lực 99 byte của tôi. Tôi hy vọng bạn có niềm vui với befunge.
AndoDaan

Vâng, phiên bản di động dường như không được đơn cách hóa. Befunge khá thú vị, nhưng tôi ước có một người phiên dịch Befunge-98 đàng hoàng (tôi không thể tìm thấy bất kỳ bản sửa lỗi / chỉnh sửa nào: RCfunge dường như hoạt động)
Ingo Bürk

3

GolfScript, 13 ký tự

~0]4,^.,rand=

Đây là một chương trình GolfScript hoàn chỉnh, đọc hai số được phân tách bằng khoảng trắng (mỗi số được giả sử là 1, 2 hoặc 3) từ đầu vào tiêu chuẩn và xuất ra một số ngẫu nhiên từ tập {1, 2, 3} không bằng bất kỳ của các số đầu vào.

Hãy thử trực tuyến.(Lưu ý: liên kết là phiên bản trước; Tôi đang sử dụng thiết bị di động và không thể sửa nó.)

Đây là phiên bản nhận xét của chương trình:

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

Nếu bạn thích một hàm được đặt tên lấy hai số làm đối số trên ngăn xếp, thì sẽ có thêm một vài ký tự:

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

Phần thân thực tế của hàm chỉ dài hơn một ký tự so với mã độc lập (vì chúng ta cần [ đảm bảo rằng chúng ta chỉ tiêu thụ hai đối số), nhưng chi phí chung của việc gói mã trong một khối và gán nó cho một biểu tượng mất năm nhiều ký tự hơn, với tổng số 19.

Ngoài ra, nếu bạn thực sự có hai số được gán vào các biến ABvà muốn số thứ ba được gán cho C, điều đó cũng có thể được thực hiện trong 19 ký tự:

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

(Nếu để lại số thứ ba trên ngăn xếp thay vào đó là chấp nhận được, bạn có thể để lại :C; phần cuối.)

Thi thiên Cảm ơn về gợi ý sử dụng ^, Howard.


Thay vì \-bạn có thể sử dụng ^.
Howard

3

Con trăn - 35

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

Giả sử ngẫu nhiên được nhập khẩu, dường như được chỉ định trong câu hỏi.

PYG - 25

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

2

Con trăn, 14 ký tự

Tôi đã thử nó cho mỗi 9 trường hợp có thể và nó dường như hoạt động tốt!

C=A^B or A^1|2

(chỉnh sửa): Như edc65 đã chỉ ra, điều này không hợp lệ vì nó không ngẫu nhiên ... Tôi đã bỏ lỡ phần đó của câu hỏi và tôi cảm thấy ngu ngốc ngay bây giờ.


3
Không ngẫu nhiên chút nào
edc65

Tuy nhiên, +1 cho nhập học
Mr 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<        
 > > > >.@       

Không ấn tượng lắm.


2

PowerShell, 21

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

Rất đơn giản. Lạm dụng thực tế là các toán tử so sánh hành động khác nhau với một mảng là toán hạng bên trái của chúng.


Mẹo hay về các toán tử so sánh. Làm cho tôi muốn xem xét một số kịch bản cũ của tôi và xem nếu có những nơi nó có thể được sử dụng. Đặc biệt, điều này làm tôi nhớ đến một phần của trình giả lập Monty Hall.
Iszi

1

Toán học, 37 byte

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

Về cơ bản giống như câu trả lời của Ruby, nhưng dài hơn đáng kể nhờ các tên hàm của Mathicala. Tôi đang sử dụng các biến chữ thường, bởi vì tên chữ hoa có thể xung đột với các phần tử dựng sẵn (trong trường hợp này, nhưng bạn không làm điều đó trong Mathicala).


1

R, 42 ký tự

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

Vectơ xlà vectơ của trọng số xác suất để có được các phần tử của vectơ được lấy mẫu. Nó được đặt thành 1 cho mỗi lần đầu tiên, sau đó các phần tử tương ứng với A và B được đặt thành 0, do đó chúng không có cơ hội được chọn.



1

CJam - 12

4,[AB0]-mr0=

Điều này giả sử các biến A và B đã được đặt, theo câu hỏi.

Bạn có thể dùng thử tại http://cjam.aditsu.net/

Để kiểm tra nó với các số ngẫu nhiên, sử dụng:

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

Để kiểm tra nó với các giá trị cụ thể, hãy sử dụng (ví dụ):

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

Giải trình:

4,tạo mảng [0 1 2 3]
[AB0]-loại bỏ các số A, B và 0 khỏi mảng
mrxáo trộn mảng còn lại
0=lấy phần tử đầu tiên

Trong phiên bản tương lai của CJam, chương trình này sẽ ngắn hơn 2 byte :)



1

Mã số 35

lấy cảm hứng từ câu trả lời của Brandon Anzaldi

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

0

Julia, 32 hoặc 56 tùy theo quy tắc

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

32 nếu tôi không cần tạo a và b.


Câu hỏi cho biết "giả sử A và B đã được chọn cho bạn".
nyuszika7h

0

Mã số 43

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

Đừng chạy. Bạn có thể muốn xác định ABđầu tiên.
Spedwards

tốt, câu hỏi cho biết: "Giả sử A và B đã được chọn cho bạn". Vì vậy, bạn nên chạy "A = 1 + Ngày mới% 3; B = 1 + Ngày mới% 3" trước.
xem

0

TI-BASIC, 23

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

Không hoạt động do thứ tự hoạt động; Ngoài ra, bạn không bao giờ thực sự tạo ra số ngẫu nhiên.
lirtosiast

0

Java - 126 123 83 85 (sử dụng thông minh 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;}

Phiên bản đầy đủ:

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

Nhưng 6-ab không phải là ngẫu nhiên, phải không? :)
xem

1
@xem - Không - nhưng nó chỉ sử dụng 6-a-bkhi không có lựa chọn nào khác, cả hai cái còn lại đều được sử dụng. Đó là một cách thông minh chọn các số được chọn từ 1, 2, 3. 6-1-2 = 3, 6-1-3=2, 6-2-3=1để cho mỗi một tổ chức phi bình đẳng, b 6-a-bchọn một trong ba. Khéo hả? Thời gian duy nhất bạn có thể sử dụng ngẫu nhiên là khi nào a==b.
OldCurmudgeon

Ôi tuyệt. làm tốt lắm
xem

0

R, 24 ký tự

Khởi tạo với

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

Sau đó

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

Hoặc chỉ n=1:3;n[!n%in%c(a,b)]nhưng sau đó bạn trả lại cả hai số.


0

R, 31 ký tự

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

Nếu bạn làm sample(x)trong R, thì nó được hiểu là một mẫu ngẫu nhiên từ 1:x. Lặp lại vectơ(1:3)[-c(A,B)] hai lần là một cách để ngăn chặn điều này xảy ra.


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 có thể được thay thế bằng ~ ~. Bạn cũng có thể nói r = (y, z) => y + Ngày mới (zy). Ngoài ra, A và B không có nghĩa là bằng nhau và bạn không phải tính khởi tạo của chúng trong điểm số của mình.
xem

@xem A và B có nghĩa là ngẫu nhiên. Các quy tắc nói rằng họ có thể bằng nhau. Ngoài ra, không chắc chắn về ES6 nhưng y+New Date(z-y)là một SyntaxError
Spedwards

@xem y+new Date(z-y)mặt khác báo cáo new Date()chuỗi có ynối thêm.
Spedwards

xin lỗi vì lỗi đánh máy, ý tôi là y + Ngày mới% (zy) ... hoặc (z-y + 1) tùy thuộc vào thông số.
xem

và nhận xét của tôi về A và B bằng nhau là về "a = b = r (1,3);". Nếu bạn làm điều đó a luôn bằng b, nhưng đó không phải là những gì quy tắc yêu cầu. Họ yêu cầu A và B ngẫu nhiên. Chúng có thể bằng nhau nhưng không nhất thiết
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));

Mã này tạo ra ncác số ngẫu nhiên khác nhau từ 0 đến k.


0

J ( 21 19: quá dài so với sở thích của tôi)

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

Có bất kỳ trình hướng dẫn J nào xung quanh để giúp loại bỏ phép gán biến đó không?Nó chỉ ngắn hơn 2 ký tự ...

Hoặc, nếu không phải là ngẫu nhiên, bạn có thể làm điều này:

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

12 ký tự.



0

JavaScript - 41 (tối đa 46) 37 35 34 30

Cập nhật:

Quản lý để giảm xuống 30 ký tự bằng cách sửa đổi nó, lấy cảm hứng từ câu trả lời của stevevarrill trong C.

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


Cảm ơn bạn nyuszika7h vì đã đưa tôi xuống 34 ~:

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

Mượn từ câu trả lời của người xem để ít nhất rơi ngang hàng với anh ta:

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

Cảm ơn đã nhắc nhở tôi rằng 1+new Date%3 === (new Date%3)+1!

Giải pháp trước:

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

Đảm bảo các điều kiện while()được thỏa mãn và lặp đi lặp lại cho đến khi chúng không.


Giải pháp khác:

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

Giả định Cnày đã được khai báo HOẶC trình thông dịch JavaScript có thể xử lý các biến không được khai báo.

Tuy nhiên, nếu trình thông dịch JS có thể xử lý EOL mà không có dấu chấm phẩy, nó có thể bị giảm xuống còn 41.

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

Nếu Cchưa được khai báo và không có sửa lỗi cho nó, điều đó sẽ mang lại tổng số lên tới 46 ký tự.

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

Chương trình kiểm tra:

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

tuyệt quá! Tôi đã trả lời 35b dựa trên điều này, nhưng sử dụng vòng lặp do-while;)
xem

Bạn sẽ có thể sử dụng |thay vì ||.
nyuszika7h

Lưu 1 byte với vòng lặp for:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose

Tôi chỉ muốn cảm ơn mọi người vì sự giúp đỡ của họ :)
Brandon Anzaldi

0

Befunge-98 (57 byte)

Mã này giả định các số sẽ được nhập vào stdin. Nó sẽ chọn một số ngẫu nhiên nếu cả hai số đầu tiên giống nhau cho đến khi khác nhau, nếu không nó sẽ chọn số có sẵn cuối cùng.

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

-3

Con trăn, 54 41 ký tự

Câu trả lời khá dài trong Python nhưng tôi thích hiểu danh sách, vì vậy tôi quyết định đăng bài này ở đây

// [0] có nghĩa là nó là phần tử đầu tiên của

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

Làm thế nào là ngẫu nhiên này?
user80551

Không, xin lỗi ...
Caridorc

@ user80551 có cần phải không?
John Dvorak

1
@JanDvorak Có: "công việc của bạn là chọn ngẫu nhiên một số thứ ba ..." (Tôi nghĩ rằng điều này cần nhấn mạnh hơn trong câu hỏi, vì nhiều người đã hiểu sai)
daniero
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.