สุ่มเลือกหนึ่งหมายเลขที่แตกต่างจากหมายเลขสุ่มอื่น ๆ สองหมายเลข


14

มีการสร้างตัวเลขสุ่ม A และ B สองค่าเป็น 1, 2 หรือ 3

งานของคุณคือการสุ่มเลือกหมายเลขสาม C ซึ่งอาจเป็น 1,2 หรือ 3 แต่ C ไม่สามารถเท่ากับ A หรือ B

  • และใช่ A สามารถเท่ากับ B
  • ถ้า A = B ดังนั้น C จะเหลือเพียงสองตัวเลขเท่านั้น
  • ถ้า A ไม่เท่ากับ B, C มีเพียงหนึ่งหมายเลขเท่านั้นที่สามารถเป็นได้
  • สมมติว่า A และ B ได้ถูกเลือกสำหรับคุณแล้ว

นี่คือวิธีที่จะสร้าง A และ B ใน Python

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

สมมติว่าสิ่งนี้มีอยู่ในรหัสของคุณแล้ว

อันนี้สั้นที่สุดที่ฉันคิดไว้ใน Python

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

นี่คือสิ่งที่ A, B และ C สามารถเท่ากัน

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

นี่คือสิ่งที่ A, B และ C ไม่สามารถเท่ากับ

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

1
ดังนั้นหากได้รับ A และ B พวกเขาจะไม่สุ่มเท่าที่เกี่ยวข้องกับโปรแกรม / ฟังก์ชั่นของฉันใช่ไหม? นอกจากนี้คุณหมายถึงอะไรโดย "รหัสทั่วไป"? คุณกำลังมองหาวิธีการแก้ปัญหาที่คุณสามารถใช้ในโครงการของคุณหรือไม่? ในกรณีนี้ฉันจะไม่ขอความช่วยเหลือจากโค้ดกอล์ฟเพราะรหัสจะไม่สามารถใช้งานได้จริง จุดทั้งหมดของ code-golf คือการใช้คุณลักษณะเฉพาะภาษาในทางที่ผิดเพื่อให้ได้ขนาดรหัสเท่าที่จะทำได้
Martin Ender

ฉันใช้สิ่งนี้กับโครงการและได้รับคำตอบมานานแล้ว แต่ฉันขอสิ่งนี้เพราะฉันคิดว่ามันเป็นปัญหาที่น่าสนใจที่ชุมชนจะได้รับ และฉันใส่รหัสทั่วไปเพราะฉันคิดว่ามันน่าสนใจมากขึ้นเมื่อมีคนใช้การคิดเชิงตรรกะมากกว่าเพื่อรับคำตอบมากกว่าความรู้มากมายเกี่ยวกับคุณลักษณะเฉพาะภาษาบางอย่าง แต่ถ้ารหัสกอล์ฟเป็นการละเมิดสิ่งเหล่านี้ฉันจะลบบรรทัดสุดท้ายนั้น
tysonsmiths

สมมติว่า A และ B สามารถเท่ากับ 1, 2 หรือ 3 ดังนั้นให้โค้ดของคุณถูกต้องเพื่อคาดการณ์ความเป็นไปได้ทั้งหมด
tysonsmiths

1
ฉันไม่เข้าใจ มีบางอย่างที่ฉันขาดหายไปหรือใช้C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))งานได้หรือไม่ โซลูชันของคุณไม่มีประสิทธิภาพสูงเนื่องจากเป็นการสิ้นเปลืองเวลาในการวนซ้ำและอาจใช้เวลานานในการรัน นอกจากนี้import randomนับเป็นขนาดไบต์ ...
DankMemes

3
คุณอยากให้พวกเราเขียนMonty Hall simulatorใช่ไหม? ;-)
Ilmari Karonen

คำตอบ:


17

Ruby, 22 ตัวอักษร

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

ยังไม่แน่ใจว่าฉันเข้าใจคำถามถูกต้องหรือไม่ ...


12

C, 26

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

หากฉันเข้าใจคำถามอย่างถูกต้อง:

หากaและbแตกต่างกันจะไม่มีการสุ่ม คำตอบจะต้องเป็นหนึ่งเดียวของ 1,2,3 6-a-bที่ไม่ได้ใช้:

IF aและbเหมือนกันมี 2 ตัวเลือก:

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)

โอเคนี่แย่มากฉันรู้ แต่มันเป็นความพยายามครั้งแรกของฉันใน Befunge ดังนั้นฉันก็ยังค่อนข้างมีความสุขที่มันใช้งานได้ ฉันแน่ใจว่ามีทางออกที่ดีกว่ามาก

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

1
บนโทรศัพท์ของฉันตอนนี้ .. ไม่แน่ใจว่าบางแถวเปลี่ยนไปเล็กน้อยโดยไม่ตั้งใจ ฉันจะตรวจสอบเมื่อฉันอยู่บ้าน
Ingo Bürk

ดูดีกับผม. ดีกว่าความพยายาม 99 ไบต์ของฉัน ฉันหวังว่าคุณจะสนุกไปกับ befunge
AndoDaan

ใช่รุ่นมือถือดูเหมือนจะไม่ได้รับการจำเจ Befunge ค่อนข้างสนุก แต่ฉันหวังว่าจะมีล่าม Befunge-98 ที่เหมาะสม (ฉันไม่สามารถหา… / แก้ไข: rcfunge ดูเหมือนว่าจะทำงาน)
Ingo Bürk

3

GolfScript 13 ตัวอักษร

~0]4,^.,rand=

นี่เป็นโปรแกรม GolfScript ที่สมบูรณ์ที่อ่านตัวเลขสองจำนวนที่คั่นด้วยช่องว่าง (แต่ละหมายเลขถือว่าเป็น 1, 2 หรือ 3) จากอินพุตมาตรฐานและส่งออกตัวเลขสุ่มจากชุด {1, 2, 3} ที่ไม่เท่ากัน ของตัวเลขอินพุต

ลองออนไลน์(หมายเหตุ: ลิงก์นี้เป็นรุ่นก่อนหน้าฉันอยู่ในอุปกรณ์พกพาและไม่สามารถแก้ไขได้)

นี่เป็นเวอร์ชันที่แสดงความเห็นของโปรแกรม:

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

หากคุณต้องการฟังก์ชั่นที่มีชื่อซึ่งใช้ตัวเลขสองตัวเป็นอาร์กิวเมนต์ในสแต็กนั่นจะใช้ตัวอักษรเพิ่มอีกสองสามตัว:

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

เนื้อความที่แท้จริงของฟังก์ชั่นมีเพียงหนึ่งตัวอักษรยาวกว่ารหัสแบบสแตนด์อโลน (เพราะเราต้องการ[ให้แน่ใจว่าเราใช้อาร์กิวเมนต์เพียงสองข้อเท่านั้น) แต่ค่าใช้จ่ายในการห่อโค้ดในบล็อกและการกำหนดให้สัญลักษณ์ใช้เวลาห้า ตัวอักษรมากขึ้นรวมเป็น 19

อีกทางเลือกหนึ่งถ้าคุณมีตัวเลขสองตัวที่กำหนดไว้ในตัวแปรAและBและต้องการตัวเลขที่สามที่กำหนดให้Cคุณสามารถทำได้ใน 19 ตัวอักษร:

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

(หากปล่อยให้หมายเลขที่สามบนสแต็กแทนเป็นที่ยอมรับคุณสามารถออกจาก :C;ปิดท้าย)

ps ขอบคุณสำหรับคำแนะนำในการใช้^Howard


แทนการที่คุณสามารถใช้\- ^
โฮเวิร์ด

3

Python - 35

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

สมมติว่ามีการนำเข้าแบบสุ่มซึ่งดูเหมือนว่าจะระบุไว้ในคำถาม

PYG - 25

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

2

Python 14 ตัว

ฉันลองทุกกรณีที่เป็นไปได้ 9 ข้อและดูเหมือนว่าจะทำงานได้ดี!

C=A^B or A^1|2

(แก้ไข): ตามที่ edc65 ชี้ให้เห็นมันไม่ถูกต้องเนื่องจากมันไม่ใช่แบบสุ่ม ... ฉันพลาดคำถามนั้นไปส่วนหนึ่งและตอนนี้ฉันรู้สึกงี่เง่า


3
ไม่สุ่มเลย
edc65

ยังคง +1 สำหรับการเข้าชม
Mr Lister

2

Befunge - 99 ไบต์

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

ไม่น่าประทับใจมาก


2

PowerShell, 21

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

ตรงไปตรงมามาก เหยียดหยามความจริงที่ว่าผู้ประกอบการเปรียบเทียบทำหน้าที่แตกต่างกันกับอาร์เรย์เป็นตัวถูกดำเนินการด้านซ้ายของพวกเขา


เคล็ดลับที่ดีเกี่ยวกับผู้ประกอบการเปรียบเทียบ ทำให้ฉันต้องการดูสคริปต์เก่าของฉันและดูว่ามีสถานที่ที่สามารถใช้ได้หรือไม่ โดยเฉพาะอย่างยิ่งนี่ทำให้ฉันนึกถึงส่วนหนึ่งของการจำลอง Monty Hall
Iszi

1

Mathematica ขนาด 37 ไบต์

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

โดยพื้นฐานแล้วเหมือนกับคำตอบ Ruby แต่ต้องขอบคุณชื่อฟังก์ชันของ Mathematica อีกมาก ฉันใช้ตัวแปรตัวพิมพ์เล็กเพราะชื่อตัวพิมพ์ใหญ่อาจขัดแย้งกับบิวด์อิน (ในกรณีนี้ไม่ได้ แต่คุณไม่ได้ทำใน Mathematica)


1

R, 42 ตัวอักษร

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

Vector xเป็นเวกเตอร์ของน้ำหนักความน่าจะเป็นสำหรับการรับองค์ประกอบของเวกเตอร์ที่ถูกสุ่มตัวอย่าง มันถูกตั้งค่าเป็น 1 สำหรับแต่ละครั้งแรกจากนั้นองค์ประกอบที่เกี่ยวข้องกับ A และ B จะถูกตั้งค่าเป็น 0 ดังนั้นพวกเขาจึงไม่มีโอกาสถูกเลือก



1

CJam - 12

4,[AB0]-mr0=

สิ่งนี้ถือว่าตัวแปร A และ B ได้ถูกตั้งค่าไปแล้วตามคำถาม

คุณสามารถลองได้ที่http://cjam.aditsu.net/

ในการทดสอบด้วยตัวเลขสุ่มให้ใช้:

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

ในการทดสอบด้วยค่าเฉพาะให้ใช้ (ตัวอย่าง):

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

คำอธิบาย:

4,สร้างอาร์เรย์ [0 1 2 3]
[AB0]-ลบตัวเลข A, B และ 0 ออกจากอาร์เรย์ที่
mrสับเปลี่ยนอาร์เรย์ที่เหลือ
0=จะใช้องค์ประกอบแรก

ในรุ่น CJam ในอนาคตโปรแกรมนี้จะสั้นลง 2 ไบต์ :)



1

JS, 35

แรงบันดาลใจจากคำตอบของ Brandon Anzaldi

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

0

Julia, 32 หรือ 56 ขึ้นอยู่กับกฎ

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

32 ถ้าฉันไม่ต้องการสร้าง a และ b


คำถามบอกว่า "ถือว่า A และ B ได้ถูกเลือกสำหรับคุณแล้ว"
nyuszika7h

0

JS, 43

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

จะไม่วิ่ง คุณอาจต้องการกำหนดAและBก่อน
Spedwards

ดีคำถามพูดว่า: "สมมติว่า A และ B ได้ถูกเลือกสำหรับคุณแล้ว" ดังนั้นคุณควรเรียกใช้ "A = 1 + ใหม่วันที่% 3; B = 1 + วันที่ใหม่% 3" ก่อน
xem

0

TI-BASIC, 23

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

ไม่ทำงานเนื่องจากคำสั่งของการดำเนินงาน นอกจากนี้คุณไม่เคยสร้างตัวเลขสุ่ม
lirtosiast

0

Java - 126 123 83 85 (ใช้ความฉลาด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;}

เวอร์ชันเต็ม:

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

แต่ 6-ab ไม่ได้สุ่มใช่ไหม :)
xem

1
@xem - ไม่ - แต่ใช้6-a-bเมื่อไม่มีตัวเลือกอื่นเท่านั้นทั้งสองจะได้รับการดำเนินการ มันเป็นวิธีที่ชาญฉลาดของการเลือกหมายเลขที่ไม่ได้เลือกจาก 1, 2, 3 6-1-2 = 3, 6-1-3=2, 6-2-3=1ดังนั้นสำหรับแต่ละที่ไม่เท่ากันข6-a-bหยิบหนึ่งในสาม ฉลาดใช่มั้ย a==bครั้งเดียวที่คุณสามารถใช้สุ่มคือเมื่อ
OldCurmudgeon

โอ้เยี่ยมมาก ทำได้ดีมาก
xem

0

R, 24 ตัวอักษร

เริ่มต้นด้วย

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

แล้วก็

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

หรือเพียงn=1:3;n[!n%in%c(a,b)]แต่จากนั้นคุณกลับทั้งตัวเลข


0

R, 31 ตัวอักษร

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

ถ้าคุณทำsample(x)ใน R 1:xแล้วมันถูกตีความว่าเป็นตัวอย่างที่สุ่มจาก การทำซ้ำเวกเตอร์(1:3)[-c(A,B)]สองครั้งเป็นวิธีหนึ่งในการหยุดสิ่งนี้ไม่ให้เกิดขึ้น


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 สามารถถูกแทนที่ด้วย ~~ คุณสามารถพูดว่า r = (y, z) => y + วันที่ใหม่ (zy) นอกจากนี้ A และ B ไม่ได้มีค่าเท่ากันและคุณไม่จำเป็นต้องนับการเริ่มต้นในคะแนนของคุณ
xem

@xem A และ B หมายถึงการสุ่ม กฎบอกว่าพวกเขาสามารถเท่าเทียมกัน นอกจากนี้ไม่แน่ใจเกี่ยวกับ ES6 แต่y+New Date(z-y)เป็น SyntaxError
Spedwards

@xem y+new Date(z-y)บนnew Date()สตริงรายงานอื่น ๆ ที่มีyต่อท้าย
Spedwards

ขอโทษที่พิมพ์ผิดฉันหมายถึง y + ใหม่วันที่% (zy) ... หรือ (z-y + 1) ขึ้นอยู่กับ params
xem

และคำพูดของฉันเกี่ยวกับ A และ B เท่ากับคือ "a = b = r (1,3);" ถ้าคุณทำอย่างนั้น a เท่ากับ b เสมอ แต่นั่นไม่ใช่กฎที่ถาม พวกเขาถามหา A และ B สุ่ม พวกเขาสามารถเท่ากัน แต่ไม่จำเป็น
xem


0

Java, 264 ไบต์

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

รหัสนี้จะสร้างnตัวเลขสุ่มที่แตกต่างกันจาก 0 kถึง


0

J ( 21 19: นานเกินไปสำหรับความชอบของฉัน)

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

มีพ่อมด J คนอื่น ๆ บ้างไหมที่ช่วยลบการกำหนดตัวแปรนั้น?มันสั้นลงเพียง 2 ตัวอักษร ...

หรือหากไม่ต้องสุ่มคุณสามารถทำสิ่งนี้ได้:

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

12 ตัวอักษร



0

JavaScript - 41 (สูงสุด 46) 37 35 34 30

Updated:

บริหารจัดการเพื่อลดระดับลงเหลือ 30 chars โดยปรับเปลี่ยนเป็นแรงบันดาลใจจากคำตอบของ stevevarrill ใน C

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


ขอบคุณ nyuszika7h ที่พาฉันไปที่ 34 ~:

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

การยืมจากคำตอบของ xem อย่างน้อยก็ตกหลุมกับเขา:

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

ขอบคุณสำหรับการเตือนฉันว่า1+new Date%3 === (new Date%3)+1!

โซลูชันก่อนหน้า:

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

ตรวจสอบให้แน่ใจว่าเงื่อนไขwhile()มีความพึงพอใจและวนซ้ำจนกว่าจะไม่เสร็จ


วิธีการแก้ปัญหาอื่น ๆ :

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

นี่ถือว่าCได้รับการประกาศแล้วหรือว่าล่าม JavaScript สามารถจัดการกับตัวแปรที่ไม่ได้ประกาศ

อย่างไรก็ตามหากล่าม JS สามารถจัดการ EOL ได้โดยไม่ต้องใช้เครื่องหมายอัฒภาคอาจถูกชนได้ที่ 41

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

หากCยังไม่ได้รับการประกาศและไม่มีการแก้ไขข้อผิดพลาดมันจะทำให้จำนวนตัวอักษรสูงสุดถึง 46 ตัว

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

โปรแกรมทดสอบ:

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

ที่ดี! ฉันทำคำตอบ 35B ซึ่งเป็นไปตามนี้ แต่ใช้ทำในขณะที่วง;)
xem

คุณควรจะสามารถที่จะใช้แทน| ||
nyuszika7h

บันทึก 1 ไบต์ด้วยห่วงสำหรับ:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose

ฉันแค่อยากจะขอบคุณทุกคนสำหรับความช่วยเหลือ :)
แบรนดอน Anzaldi

0

Befunge-98 (57 ไบต์)

รหัสนี้ถือว่าตัวเลขจะถูกป้อนใน stdin มันจะเลือกหมายเลขสุ่มถ้าทั้งสองหมายเลขแรกเหมือนกันจนกว่าจะแตกต่างกันมิฉะนั้นจะเลือกหมายเลขที่มีอยู่ล่าสุด

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

-3

Python 54ตัวอักษร

คำตอบค่อนข้างยาวใน Python แต่ฉันชอบ list comprehension ดังนั้นฉันจึงตัดสินใจโพสต์ที่นี่

// [0] หมายถึงมันเป็นองค์ประกอบแรกของ

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

การสุ่มนี้เป็นอย่างไร
user80551

มันไม่ได้เป็นขออภัย ...
Caridorc

@ user80551 มันจะต้องเป็นอย่างไร
John Dvorak

1
@JanDvorak ใช่: "งานของคุณคือการสุ่มเลือกตัวเลขที่สาม ..." (ฉันคิดว่านี้ต้องเน้นเพิ่มเติมบางส่วนในคำถามเป็นจำนวนมากมีอากาศมันผิด)
daniero
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.