Pilih secara acak satu nomor yang berbeda dari dua angka acak lainnya

14

Dua angka acak A dan B telah dihasilkan menjadi 1, 2, atau 3

tugas Anda adalah memilih secara acak angka ketiga C yang juga bisa 1,2 atau 3. Tapi, C tidak bisa sama dengan A atau B.

  • Dan Ya, A bisa sama dengan B.
  • Jika A = B, maka C hanya memiliki dua angka yang tersisa.
  • Jika A tidak sama dengan B, C hanya memiliki satu angka.
  • Anggap A dan B sudah dipilih untuk Anda

Ini adalah bagaimana A dan B akan dibuat dengan Python

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

Anggap ini sudah ada dalam kode Anda.

Ini adalah yang terpendek yang saya buat dengan Python

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

Inilah yang dapat disamakan dengan A, B, dan C.

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

Inilah yang tidak dapat disamakan dengan A, B, dan C

  • 1,2,1
  • 2,3,3
  • 1,1,1
  • 3,2,3
tysonsmiths
sumber
1
Jadi jika A dan B diberikan, mereka sebenarnya tidak acak sejauh menyangkut program / fungsi saya, kan? Apa yang Anda maksud dengan "kode umum"? Apakah Anda benar-benar mencari solusi yang dapat Anda gunakan dalam proyek Anda? Dalam hal ini, saya tidak akan mencari bantuan kode golf - kode ini akan benar-benar tidak dapat digunakan dalam produksi. Inti dari kode-golf adalah menyalahgunakan fitur khusus bahasa untuk mendapatkan ukuran kode sejauh mungkin.
Martin Ender
Saya menggunakan ini untuk sebuah proyek dan sudah mendapat jawaban panjang, tetapi saya menanyakan ini karena saya pikir ini adalah masalah yang menarik yang akan dinikmati masyarakat. Dan saya meletakkan kode umum karena saya merasa lebih menarik ketika seseorang menggunakan pemikiran yang lebih logis untuk mendapatkan jawaban daripada pengetahuan luas tentang beberapa fitur khusus bahasa, tetapi jika kode-golf adalah untuk menyalahgunakan ini, maka saya akan menghapus baris terakhir itu.
tysonsmiths
Asumsikan A dan B dapat sama dengan 1, 2 atau 3, jadi benar kode Anda untuk mengantisipasi semua kemungkinan.
tysonsmiths
1
Saya tidak mengerti. Apakah ada sesuatu yang saya lewatkan atau tidak C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))berfungsi? Solusi Anda juga sangat tidak efisien karena membuang-buang waktu dan mungkin membutuhkan waktu yang tidak terbatas untuk berjalan. Juga, import randomdihitung dalam ukuran byte ...
DankMemes
3
Jadi, Anda ingin kami menulis simulator Monty Hall ? ;-)
Ilmari Karonen

Jawaban:

17

Ruby, 22 karakter

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

Masih tidak yakin apakah saya memahami pertanyaan dengan benar ...

Ventero
sumber
12

C, 26

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

Jika saya memahami pertanyaan dengan benar:

Jika adan bberbeda, tidak ada yang acak. jawabannya harus menjadi satu-satunya dari 1,2,3 yang tidak terpakai: 6-a-b.

JIKA adanb sama ada 2 pilihan:

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

Befunge ( 156) 89 85 74)

Oke, ini mengerikan, saya tahu. Tapi ini adalah upaya Befunge pertamaku, jadi aku masih cukup senang bahwa itu berhasil. Saya yakin ada solusi yang jauh lebih baik.

<v1p90&p80&
<<@.g70_v#-g70_v#-g70g90g80p70
  v     <      <
^1?v
^3<2
^  <
Ingo Bürk
sumber
1
Di ponsel saya sekarang .. Tidak yakin apakah beberapa baris bergeser sedikit secara tidak sengaja. Saya akan memeriksanya saat saya di rumah.
Ingo Bürk
Terlihat bagus untukku. Jauh lebih baik daripada upaya 99 byte saya. Saya harap Anda bersenang-senang dengan befunge.
AndoDaan
Ya, versi seluler sepertinya tidak monospace. Befunge cukup menyenangkan, tetapi saya berharap akan ada juru bahasa Befunge-98 yang layak (saya tidak dapat menemukan ... / sunting: rcfunge tampaknya berfungsi)
Ingo Bürk
3

GolfScript, 13 karakter

~0]4,^.,rand=

Ini adalah program GolfScript lengkap yang membaca dua angka yang dipisahkan spasi (masing-masing diasumsikan 1, 2, atau 3) dari input standar, dan menghasilkan angka acak dari set {1, 2, 3} yang tidak sama dengan dari nomor input.

Cobalah online.(Catatan: tautannya ke versi sebelumnya; Saya menggunakan perangkat seluler dan tidak dapat memperbaikinya.)

Berikut versi program yang dikomentari:

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

Jika Anda lebih suka fungsi bernama yang mengambil dua angka sebagai argumen di stack, itu membutuhkan beberapa karakter lagi:

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

Tubuh sebenarnya dari fungsi ini hanya satu karakter lebih panjang dari kode yang berdiri sendiri (karena kita membutuhkannya [ memastikan bahwa kita hanya mengkonsumsi dua argumen), tetapi biaya overhead untuk membungkus kode dalam sebuah blok dan menugaskannya ke simbol membutuhkan waktu lima lebih banyak karakter, dengan total 19.

Atau, jika Anda benar-benar memiliki dua angka yang ditugaskan ke dalam variabel Adan B, dan ingin nomor ketiga ditugaskan C, itu juga dapat dilakukan dalam 19 karakter:

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

(Jika meninggalkan nomor ketiga di tumpukan sebaliknya dapat diterima, Anda dapat meninggalkan :C; yang terakhir.)

Ps. Terima kasih atas sarannya untuk digunakan ^, Howard.

Ilmari Karonen
sumber
Alih-alih \-bisa Anda gunakan ^.
Howard
3

Python - 35

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

Asumsikan acak diimpor, yang tampaknya ditentukan dalam pertanyaan.

PYG - 25

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

Python, 14 karakter

Saya mencobanya untuk setiap 9 kasus yang mungkin dan tampaknya berfungsi dengan baik!

C=A^B or A^1|2

(edit): Seperti yang ditunjukkan edc65, ini tidak valid karena ini tidak acak ... Saya melewatkan bagian pertanyaan itu dan saya merasa bodoh sekarang.

SimonD
sumber
3
Sama sekali tidak acak
edc65
Namun, +1 untuk pendaftaran
Tn. 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<        
 > > > >.@       

Tidak terlalu mengesankan.

AndoDaan
sumber
2

PowerShell, 21

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

Sangat mudah. Menyalahgunakan fakta bahwa operator pembanding bertindak berbeda dengan array sebagai operan kiri mereka.

Joey
sumber
Tip yang bagus tentang operator perbandingan. Buat saya ingin melihat beberapa skrip lama saya dan melihat apakah ada tempat yang bisa digunakan. Terutama, ini mengingatkan saya pada bagian dari simulator Monty Hall.
Iszi
1

Mathematica, 37 byte

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

Pada dasarnya sama dengan jawaban Ruby, tetapi jauh lebih lama berkat nama fungsi Mathematica. Saya menggunakan variabel huruf kecil, karena nama huruf besar mungkin berbenturan dengan built-in (tidak, dalam kasus ini, tetapi Anda tidak melakukannya di Mathematica).

Martin Ender
sumber
1

R, 42 karakter

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

Vektor xadalah vektor bobot probabilitas untuk memperoleh elemen-elemen vektor yang disampel. Ini diatur ke 1 untuk masing-masing pada awalnya, kemudian elemen yang sesuai dengan A dan B diatur ke 0, sehingga mereka tidak memiliki peluang untuk dipilih.

plannapus
sumber
1

Rebol - 40 karakter

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

CJam - 12

4,[AB0]-mr0=

Ini mengasumsikan variabel A dan B telah ditetapkan, sesuai dengan pertanyaan.

Anda dapat mencobanya di http://cjam.aditsu.net/

Untuk mengujinya dengan angka acak, gunakan:

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

Untuk mengujinya dengan nilai tertentu, gunakan (misalnya):

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

Penjelasan:

4, menciptakan array [0 1 2 3]
[AB0]- menghilangkan angka A, B dan 0 dari array
mrmengocok array yang tersisa
0=mengambil elemen pertama

Dalam versi CJam masa depan, program ini akan lebih pendek 2 byte :)

aditsu berhenti karena SE adalah JAHAT
sumber
1

C 67

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

JS, 35

terinspirasi oleh jawaban Brandon Anzaldi

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

Julia, 32 atau 56 tergantung pada aturan

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

32 jika saya tidak perlu membuat a dan b.

gggg
sumber
Pertanyaannya mengatakan "anggap A dan B sudah dipilih untuk Anda".
nyuszika7h
0

JS, 43

for(C=0;~[0,A,B].indexOf(C);)C=1+new Date%3
xem
sumber
Tidak akan lari Anda mungkin ingin mendefinisikan Adan Bterlebih dahulu.
Spedwards
baik, pertanyaannya mengatakan: "Asumsikan A dan B sudah dipilih untuk Anda". Jadi Anda harus menjalankan "A = 1 + Tanggal baru% 3; B = 1 + Tanggal baru% 3" terlebih dahulu.
xem
0

TI-BASIC, 23

Lbl 1:If C=A+B=A:Goto 1
Timtech
sumber
Tidak berfungsi karena urutan operasi; selain itu Anda tidak pernah benar-benar menghasilkan angka acak.
lirtosiast
0

Java - 126 123 83 85 (menggunakan pintar 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;}

Versi lengkap:

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
sumber
Tapi 6-ab tidak acak, kan? :)
xem
1
@xem - Tidak - tetapi hanya digunakan 6-a-bsaat tidak ada pilihan lain, keduanya diambil. Ini adalah cara cerdas memilih jumlah yang tidak dipilih dari 1, 2, 3. 6-1-2 = 3, 6-1-3=2, 6-2-3=1sehingga untuk setiap non-sama a, b 6-a-bmengambil yang ketiga. Pintar ya? Satu-satunya waktu Anda dapat menggunakan secara acak adalah kapan a==b.
OldCurmudgeon
Oh bagus. kerja bagus kalau begitu.
xem
0

R, 24 karakter

Inisialisasi dengan

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

Kemudian

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

Atau baru saja n=1:3;n[!n%in%c(a,b)]Anda mengembalikan kedua angka.

shadowtalker
sumber
0

R, 31 karakter

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

Jika Anda melakukannya sample(x)dalam R, maka itu ditafsirkan sebagai sampel acak dari 1:x. Mengulang vektor (1:3)[-c(A,B)]dua kali adalah salah satu cara untuk menghentikan hal ini terjadi.

Flounderer
sumber
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);
Cepat
sumber
1
Math.floor dapat diganti dengan ~~. Anda juga bisa mengatakan r = (y, z) => y + Tanggal Baru (zy). Juga, A dan B tidak dimaksudkan untuk menjadi sama, dan Anda tidak harus menghitung inisialisasi mereka dalam skor Anda.
xem
@xem A dan B dimaksudkan untuk menjadi acak. Aturan mengatakan bahwa mereka bisa sama. Juga, tidak yakin tentang ES6 tetapi y+New Date(z-y)SyntaxError
Spedwards
@xem y+new Date(z-y)di sisi lain melaporkan new Date()string dengan yditambahkan.
Spedwards
maaf untuk kesalahan ketik, maksud saya y + Tanggal baru% (zy) ... atau (z-y + 1) tergantung pada params.
xem
dan komentar saya tentang A dan B sama tentang "a = b = r (1,3);". Jika Anda melakukan itu selalu sama dengan b, tapi bukan itu yang diminta peraturan. Mereka meminta A dan B secara acak. Mereka bisa sama tetapi tidak harus
xem
0

C - 38

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

Kode ini menghasilkan nangka acak berbeda dari 0 hingga k.

padawan
sumber
0

J ( 21 19: terlalu lama untuk seleraku)

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

Apakah ada penyihir J di sekitar untuk membantu menghapus tugas variabel itu?Ini hanya 2 karakter lebih pendek ...

Atau, jika tidak harus acak, Anda bisa melakukannya dengan ini:

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

12 karakter.

ɐɔıʇǝɥʇu
sumber
0

Golfscript, 13 Karakter

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

JavaScript - 41 (hingga 46) 37 35 34 30

Diperbarui:

Berhasil menurunkannya menjadi 30 karakter dengan memodifikasinya, terinspirasi oleh jawaban stevevarrill dalam C.

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


Terima kasih nyuszika7h untuk membuat saya turun ke 34 ~:

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

Meminjam dari jawaban xem untuk setidaknya jatuh setara dengannya:

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

Terima kasih telah mengingatkan saya akan hal itu 1+new Date%3 === (new Date%3)+1 !

Solusi Sebelumnya:

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

Pastikan kondisi while()puas, dan lewati sampai tidak.


Solusi lain:

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

Ini mengasumsikan bahwa Ctelah dinyatakan ATAU bahwa penerjemah JavaScript dapat menangani variabel yang tidak dideklarasikan.

Namun, jika interpreter JS dapat menangani EOL tanpa tanda titik koma, itu dapat dikurangi menjadi 41.

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

Jika Cbelum dideklarasikan, dan tidak ada koreksi kesalahan untuk itu, itu akan membawa penghitungan hingga 46 karakter.

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

Program Tes:

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
sumber
Bagus! Saya membuat jawaban 35b berdasarkan ini, tetapi menggunakan do-while;)
xem
Anda harus dapat menggunakan |bukan ||.
nyuszika7h
Hemat 1 byte dengan for loop:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose
Saya hanya ingin mengucapkan terima kasih kepada semua orang atas bantuan mereka :)
Brandon Anzaldi
0

Befunge-98 (57 byte)

Kode ini mengasumsikan angkanya akan diinput pada stdin. Ini akan memilih nomor acak jika kedua angka pertama sama sampai berbeda, jika tidak maka akan memilih nomor terakhir yang tersedia.

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

Python, 54 41 karakter

Jawaban yang cukup panjang dengan Python tapi saya suka daftar pemahaman, jadi saya memutuskan untuk memposting ini di sini

// [0] berarti itu adalah elemen pertama dari

C=[i for i in[1,2,3]if not(i in(A,B))][0]
Caridorc
sumber
Bagaimana ini acak?
user80551
Bukan, maaf ...
Caridorc
@ user80551 apakah perlu?
John Dvorak
1
@JanDvorak Ya: "tugas Anda adalah memilih secara acak nomor ketiga ..." (Saya pikir ini perlu lebih banyak penekanan dalam pertanyaan, karena banyak yang salah
mengartikannya