Rastgele diğer iki rastgele sayıdan farklı bir sayı seçin


14

İki rastgele sayı A ve B, 1, 2 veya 3 olarak üretildi

işiniz rastgele 1,2 veya 3 olabilen üçüncü bir C sayısını seçmek. Ancak, C, A veya B'ye eşit olamaz.

  • Ve Evet, A B'ye eşit olabilir.
  • A = B ise, C'de sadece iki sayı kalmış olabilir.
  • A, B'ye eşit değilse, C'nin olabileceği tek bir numarası vardır.
  • A ve B'nin sizin için zaten seçildiğini varsayın

Python'da A ve B böyle yaratılacaktı

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

Bunun zaten kodunuzda olduğunu varsayalım.

Bu Python'da bulduğum en kısa şey

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

A, B ve C eşit olabilir.

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

A, B ve C eşit olamaz

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

1
A ve B verilirse, programım / fonksiyonum açısından aslında rastgele değiller , değil mi? Ayrıca "genel kod" ile ne demek istiyorsun? Aslında bir projenizde kullanabileceğiniz bir çözüm mü arıyorsunuz? Bu durumda, yardım için kod golfüne bakmazdım - kod üretimde kesinlikle kullanılamaz olacak. Kod golfünün tüm amacı, kod boyutunu olabildiğince küçültmek için dile özgü özellikleri kötüye kullanmaktır.
Martin Ender

Bunu bir proje için kullanıyordum ve zaten uzun bir cevabım var, ama bunu soruyorum çünkü topluluğun zevk alacağı ilginç bir sorun olduğunu düşündüm. Ve genel kodu koydum çünkü birisi bazı dile özgü özelliklerin geniş bilgisinden ziyade bir cevap almak için daha mantıklı düşünme kullandığında daha ilginç buluyorum, ancak kod golf bunları kötüye kullanmaksa, o zaman bu son satırı kaldıracağım.
tysonsmiths

A ve B'nin 1, 2 veya 3'e eşit olabileceğini varsayalım, bu yüzden tüm olasılıkları tahmin etmek için kodunuzu düzeltin.
tysonsmiths

1
Anlamıyorum. Eksik olduğum bir şey var mı veya C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))işe yarıyor mu? Ayrıca, zaman döngüsünü boşa harcadığından ve muhtemelen sonsuz miktarda zaman alabileceğinden çözümünüz oldukça verimsizdir. Ayrıca, import randombayt boyutunda sayar ...
DankMemes

3
Yani bir Monty Hall simülatörü yazmamızı mı istiyorsun ? ;-)
Ilmari Karonen

Yanıtlar:


17

Ruby, 22 karakter

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

Soruyu doğru anladığımdan hala emin değilim ...


12

Cı-26

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

Soruyu doğru anladıysam:

Eğer ave bfarklı, hiçbir tesadüfi yoktur. Cevap kullanılmayan 1,2,3 sadece biri olmalıdır: 6-a-b.

EĞER ave baynı ise 2 seçenek vardır:

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)

Tamam, bu korkunç, biliyorum. Ama bu benim şimdiye kadarki ilk Befunge girişimim, bu yüzden işe yaradığı için hala çok mutluyum. Eminim çok daha iyi bir çözüm vardır.

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

1
Şu anda telefonumda .. Bazı satırların kazara biraz kaymadığından emin değilim. Evdeyken kontrol edeceğim.
Ingo Bürk

Bana iyi görünüyor. 99 bayt girişimimden çok daha iyi. Umarım befunge ile eğlenirsiniz.
AndoDaan

Evet, mobil sürüm tek aralıklı görünmüyor. Befunge oldukça eğlenceli, ama keşke iyi bir Befunge-98 tercümanı olsaydı (herhangi bir şey bulamadım… / düzenle: rcfunge işe yarıyor gibi görünüyor)
Ingo Bürk

3

GolfScript, 13 karakter

~0]4,^.,rand=

Bu, standart girdiden boşlukla ayrılmış iki sayıyı (her birinin 1, 2 veya 3 olduğu varsayılır) okuyan ve {1, 2, 3} kümesinden herhangi birine eşit olmayan rastgele bir sayı veren eksiksiz bir GolfScript programıdır. giriş numaraları.

Çevrimiçi deneyin. (Not: bağlantı önceki sürüme aittir; Bir mobil cihazdayım ve düzeltemiyorum.)

İşte programın yorumlanmış bir sürümü:

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

İki sayıyı yığın üzerinde bağımsız değişken olarak alan adlandırılmış bir işlevi tercih ederseniz, birkaç karakter daha alır:

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

İşlevin gerçek gövdesi, bağımsız koddan yalnızca bir karakter daha uzundur (çünkü [yalnızca iki bağımsız değişken kullandığımızdan emin olmamız gerekir ), ancak kodu bir bloğa sarmanın ve bir sembole atamanın ek yükü beş daha fazla karakter, toplam 19.

Alternatif olarak, kelimenin tam anlamıyla bir değişkene atanabilir iki sayı varsa Ave Batanan üçüncü numarasını ve istediğiniz Czamanda 19 karakter yapılabilir:

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

(Bunun yerine üçüncü numarayı yığının üzerinde bırakmak kabul edilebilir bir durumdur :C;.)

Ps. Önerisi için teşekkürler ^Howard.


Bunun yerine \-kullanabilirsiniz ^.
Howard

3

Python - 35

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

Sorunda belirtildiği gibi rastgele içe aktarıldığını varsayar.

PYG - 25

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

2

Python, 14 karakter

Her 9 vaka için denedim ve iyi çalışıyor gibi görünüyor!

C=A^B or A^1|2

edc65'in işaret ettiği gibi, bu rastgele olmadığı için geçerli değil ... Sorunun bu bölümünü kaçırdım ve şu anda kendimi aptal hissediyorum.


3
Hiç rastgele değil
edc65

Yine de, giriş için +1
Bay Lister

2

Befunge - 99 bayt

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

Çok etkileyici değil.


2

PowerShell, 21

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

Çok basit. Karşılaştırma işleçlerinin sol işlenen olarak bir dizi ile farklı şekilde hareket etmesini kötüye kullanmak.


Karşılaştırma operatörleri hakkında güzel bir ipucu. Eski senaryolarımdan bazılarına bakmamı ve kullanılabilecek yerler olup olmadığını görmemi sağlıyor. Özellikle, bu bana Monty Hall simülatörünün bir bölümünü hatırlatıyor.
Iszi

1

Mathematica, 37 bayt

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

Temelde Ruby cevabı ile aynı, ancak Mathematica'nın işlev adları sayesinde oldukça uzun. Küçük harfli değişkenler kullanıyorum, çünkü büyük harfli isimler yerleşiklerle çakışabilir (bu durumda yapmazlar, ancak bunu Mathematica'da yapmazsınız).


1

R, 42 karakter

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

Vektör x, örneklenen vektörün elemanlarını elde etmek için olasılık ağırlıklarının vektörüdür. İlk önce her biri için 1'e ayarlanır, ardından A ve B'ye karşılık gelen elemanlar 0'a ayarlanır, dolayısıyla toplanma şansları yoktur.


1

Rebol - 40 karakter

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

1

CJam - 12

4,[AB0]-mr0=

Bu, soruya göre A ve B değişkenlerinin önceden ayarlandığını varsayar.

Http://cjam.aditsu.net/ adresinden deneyebilirsiniz.

Rastgele sayılarla test etmek için şunu kullanın:

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

Belirli değerlerle test etmek için şunu kullanın (örneğin):

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

Açıklama:

4,[0 1 2 3] dizisini oluşturur,
[AB0]-A, B ve 0 sayılarını diziden çıkarır
mr, kalan dizi
0=ilk öğeyi alır

Gelecekte bir CJam sürümünde bu program 2 bayt daha kısa olacaktır :)


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

Brandon Anzaldi'nin cevabından ilham aldı

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

0

Julia, kurallara bağlı olarak 32 veya 56

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

32 a ve b oluşturmam gerekmiyorsa.


Soru "A ve B'nin sizin için zaten seçilmiş olduğunu varsayalım" diyor.
nyuszika7h

0

JS, 43

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

Kaçmayacak. Sen tanımlamak isteyebilirsiniz Ave Bilk.
Spedwards

soru şu: "A ve B'nin sizin için zaten seçilmiş olduğunu varsayalım". Bu yüzden önce "A = 1 + yeni Tarih% 3; B = 1 + yeni Tarih% 3" çalıştırmalısınız.
xem

0

TI-BASIC, 23

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

İşlem sırası nedeniyle çalışmaz; buna ek olarak rastgele sayıyı asla üretmediniz.
lirtosiast

0

Java - 126 123 83 85 (akıllı kullanılarak 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;}

Tam versiyon:

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

Ama 6-ab rastgele değil, değil mi? :)
xem

1
@xem - Hayır - ancak yalnızca 6-a-bbaşka seçenek olmadığında kullanılır, diğer ikisi de alınır. 1, 2, 3 'den seçilmeyen sayıda toplama akıllı bir şekilde 6-1-2 = 3, 6-1-3=2, 6-2-3=1böylece her bir eşit olmayan A, B 6-a-b, üçüncü birini seçer. Zeki ha? Rastgele kullanabileceğiniz tek zaman a==b.
OldCurmudgeon

Ah harika. o zaman iyi iş çıkardın.
xem

0

R, 24 karakter

İle başlat

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

Sonra

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

Ya da sadece n=1:3;n[!n%in%c(a,b)]ama sonra her iki sayıyı da döndürürsünüz .


0

R, 31 karakter

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

sample(x)R'de yaparsanız , o zaman rastgele bir örnek olarak yorumlanır 1:x. Vektörün (1:3)[-c(A,B)]iki kez tekrarlanması, bunun olmasını engellemenin bir yoludur.


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 ~~ ile değiştirilebilir. Ayrıca r = (y, z) => y + Yeni Tarih (zy) diyebilirsiniz. Ayrıca, A ve B'nin eşit olması amaçlanmamıştır ve puanlarınızı ilklendirmeleri saymanıza gerek yoktur.
xem

@xem A ve B'nin rastgele olması kastedilmektedir. Kurallar eşit olabileceğini söylüyor. Ayrıca, ES6 hakkında emin değilim ama y+New Date(z-y)bir SyntaxError
Spedwards

@xem y+new Date(z-y)ise new Date()dize yeklenmiş olarak raporlar .
Spedwards

yazım hatası için özür dilerim, parametrelere bağlı olarak y + yeni Tarih% (zy) ... veya (z-y + 1) demek istedim.
xem

ve A ve B'ye eşit sözlerim yaklaşık "a = b = r (1,3);" idi. Bunu yaparsanız a her zaman b'ye eşittir, ancak kuralların istediği bu değildir. A ve B'yi rastgele isterler. Eşit olabilirler, ancak zorunlu olmayabilirler
xem


0

Java, 264 bayt

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

Bu kod n0 ile 0 arasında farklı rasgele sayılar üretir k.


0

J ( 21 19: Sevdiğim için çok uzun)

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

Bu değişken atamanın kaldırılmasına yardımcı olacak J sihirbazları var mı? Sadece 2 karakter daha kısa ...

Veya, rastgele olması gerekmiyorsa, bunu yapabilirsiniz:

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

12 karakter.



0

JavaScript - 41 (46'ya kadar) 37 35 34 30

Güncellenmiş:

Stevevarrill'in C'deki cevabından esinlenerek, onu değiştirerek 30 karaktere indirmeyi başardı.

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


Beni 34 aşağı almak için nyuszika7h teşekkür ederim:

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

Xem'in cevabından en azından onunla eşit olmak için borçlanma:

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

Bunu hatırlattığın için teşekkürler 1+new Date%3 === (new Date%3)+1!

Önceki Çözüm:

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

Koşullarının yerine getirildiğinden emin olun while()ve tatmin oluncaya kadar döngü yapın.


Diğer çözüm:

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

Bu C, daha önce bildirilmiş VEYA JavaScript yorumlayıcısının bildirilmemiş değişkenleri işleyebileceğini varsayar .

Bununla birlikte, JS yorumlayıcısı EOL'yi noktalı virgül kullanmadan işleyebiliyorsa 41'e düşürülebilir.

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

Eğer Cbeyan edilmiş ve 46 karaktere çetelesini getirecektir onun için hiçbir hata düzeltme yoktur.

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

Test programı:

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

harika! Buna dayanarak bir 35b cevap verdim, ancak bir do-while döngüsü kullanarak;)
xem

Bunun |yerine kullanabilirsiniz ||.
nyuszika7h

For döngüsü ile 1 bayt kaydet:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose

Herkese yardımları için teşekkür etmek istiyorum :)
Brandon Anzaldi

0

Befunge-98 (57 bayt)

Bu kod, sayıların stdin'e girileceğini varsayar. İlk sayıların her ikisi de farklı olana kadar aynı ise rastgele bir sayı seçer, aksi takdirde son kullanılabilir sayıyı seçer.

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

-3

Python, 54 41 karakter

Python'da oldukça uzun bir cevap ama liste kavrayışını seviyorum, bu yüzden buraya göndermeye karar verdim

// [0] bunun ilk elemanı olduğu anlamına gelir

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

Bu nasıl rastgele?
user80551

Üzgünüm ...
Caridorc

@ user80551 olması gerekiyor mu?
John Dvorak

1
@JanDvorak Evet: "işiniz rastgele bir üçüncü sayı seçmek ..." (Sanırım bu soruya biraz daha fazla önem verilmesi gerekiyor, çünkü birçok kişi yanlış
anladı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.