두 개의 다른 난수와 다른 숫자를 무작위로 선택


14

두 개의 난수 A와 B가 1, 2 또는 3으로 생성되었습니다.

당신의 임무는 1, 2 또는 3 일 수있는 세 번째 숫자 C를 무작위로 선택하는 것입니다. 그러나 C는 A 또는 B와 같을 수 없습니다.

  • 예, A는 B와 같습니다.
  • A = B 인 경우 C에는 두 개의 숫자 만 남을 수 있습니다.
  • A가 B와 같지 않으면 C는 하나의 숫자 만 가질 수 있습니다.
  • A와 B가 이미 선택되었다고 가정

이것이 파이썬에서 A와 B가 생성되는 방식입니다

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

이것이 이미 코드에 있다고 가정하십시오.

이것은 내가 파이썬에서 생각해 낸 가장 짧은 것입니다.

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가 주어지면 실제로 내 프로그램 / 기능에 관한 한 무작위 가 아닙니다 . 또한 "일반 코드"는 무엇을 의미합니까? 실제로 프로젝트에서 사용할 수있는 솔루션을 찾고 있습니까? 이 경우 코드 골프에 도움을 요청하지 않을 것입니다. 코드는 프로덕션에서 절대 사용할 수 없습니다. 코드 골프의 전체 요점은 언어 별 기능을 악용하여 가능한 한 코드 크기를 줄이는 것입니다.
마틴 엔더

나는 이것을 프로젝트에 사용하고 이미 긴 대답을 얻었지만 커뮤니티가 즐길 수있는 흥미로운 문제라고 생각했기 때문에 이것을 묻습니다. 그리고 누군가가 특정 언어 별 기능에 대한 방대한 지식보다는 대답을 얻기 위해 더 논리적 사고를 사용했을 때 더 흥미로워지기 때문에 일반적인 코드를 넣었지만 코드 골프가 이러한 기능을 남용하는 경우 마지막 줄을 제거합니다.
tysonsmiths

A와 B가 1, 2 또는 3과 같다고 가정하면 코드가 모든 가능성을 예상 할 수 있습니다.
tysonsmiths

1
이해가 안 돼요 누락되었거나 C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))작동 하지 않는 것이 있습니까? 또한 솔루션은 시간이 많이 걸리고 실행하는 데 시간이 오래 걸릴 수 있으므로 매우 비효율적입니다. 또한, import random바이트 크기의 카운트 ...
DankMemes

3
몬티 홀 시뮬레이터 를 작성 하시겠습니까? ;-)
Ilmari Karonen

답변:


17

루비, 22 자

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

여전히 질문을 올바르게 이해했는지 확실하지 않습니다 ...


12

C, 26

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

질문을 올바르게 이해했다면 :

ab다른 경우 무작위가 없습니다. 답은 사용되지 않은 1,2,3 중 유일한 것이어야합니다 6-a-b..

경우 ab동일 2 개 선택이있다 :

a=b=           1 2 3
            return value    
rand()%2=0     2 3 1
rand()%2=1     3 1 2

5

베 펀지 ( 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=

이것은 표준 입력에서 공백으로 분리 된 두 개의 숫자 (각각 1, 2 또는 3으로 가정)를 읽고 세트 {1, 2, 3}에서 임의의 숫자가 아닌 임의의 숫자를 출력하는 완전한 GolfScript 프로그램입니다 입력 번호.

온라인으로 사용해보십시오.(참고 :이 링크는 이전 버전으로 연결되어 있습니다. 모바일 장치에 있으며 수정할 수 없습니다.)

주석이 달린 프로그램 버전은 다음과 같습니다.

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

함수의 실제 본문은 독립형 코드보다 하나의 문자 만 길지만 ( [두 개의 인수 만 소비 해야하기 때문에 ) 코드를 블록으로 감싸서 심볼에 할당하는 오버 헤드는 5가 걸립니다. 더 많은 문자, 총 19 개.

다른 방법으로, 말 그대로 변수에 할당 된 두 개의 숫자가있는 경우 AB에 할당 된 세 번째 숫자, 그리고 싶지 C도 19 개 문자에서 수행 할 수 있습니다 :

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

대신 스택에 세 번째 숫자를 그대로 두어도 괜찮다면 :C; 경우 끝 부분을 .)

추신. 사용 제안을 보내 주셔서 감사합니다 ^. Howard.


대신을 \-사용할 수 있습니다 ^.
Howard

3

파이썬-35

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

질문에 지정된 것처럼 보이는 임의의 가져 오기를 가정합니다.

PYG-25

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

2

파이썬, 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

수학, 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)

벡터 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())

a와 b를 생성 할 필요가없는 경우 32입니다.


문제는 "A와 B가 이미 선택되었다고 가정"하는 것입니다.
nyuszika7 시간

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

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

But 6-a-b is not random, is it? :)
xem

1
@xem-아니오-그러나 6-a-b다른 선택이 없을 때만 사용 되며 다른 두 가지가 모두 사용 됩니다. 이것은 1, 2, 3에서 선택되지 않은 번호를 고르는 현명한 방법 6-1-2 = 3, 6-1-3=2, 6-2-3=1각각의 비와 동일한 들어 B는 6-a-b세번째를 픽업. 영리한 어? random을 사용할 수있는 유일한 시간은 when 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)

If you do sample(x) in R, then it is interpreted as a random sample from 1:x. Repeating the vector (1:3)[-c(A,B)] twice is one way of stopping this from happening.


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 can be replaced by ~~. You could also say r=(y,z)=>y+New Date(z-y). Also, A and B are not meant to be equal, and you don't have to count their initialization in your score.
xem

@xem A and B are meant to be random. The rules say that they can be equal. Also, not sure about ES6 but y+New Date(z-y) is a SyntaxError
Spedwards

@xem y+new Date(z-y) on the other hand reports new Date() string with y appended.
Spedwards

sorry for the typo, I meant y+new Date%(z-y) ... or (z-y+1) depending on the params.
xem

and my remark about A and B equal was about "a=b=r(1,3);". If you do that a is always equal to b, but that's not what the rules ask. They ask for A and B random. They can be equal but not necessarily
xem


0

Java, 264 bytes

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

This code generates n different random numbers from 0 to k.


0

J (21 19: too long for my liking)

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

Are there any J wizards around to help remove that variable assignment? It's only 2 chars shorter...

Or, if it doesn't have to be random, you could do with this:

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

12 chars.



0

JavaScript - 41 (up to 46) 37 35 34 30

Updated:

Managed to get it down to 30 chars by modifying it, inspired by stevevarrill's answer in C.

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


Thank you nyuszika7h for getting me down to 34~:

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

Borrowing from xem's answer to at least fall on par with him:

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

Thanks for reminding me that 1+new Date%3 === (new Date%3)+1!

Previous Solution:

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

Ensure conditions of while() are satisfied, and loop through until they're not.


Other solution:

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

This assumes that C has already been declared OR that the JavaScript interpreter can handle undeclared variables.

However, if the JS interpreter can handle EOL without a semicolon, it could be bumped down to 41.

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

If C hasn't been declared, and there is no error correction for it, that will bring the tally up to 46 characters.

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

great! I made a 35b answer based on this, but using a do-while loop ;)
xem

You should be able to use | instead of ||.
nyuszika7h

Save 1 byte with a for loop: for(C=A;C==A|C==B;)C=1+new Date%3
openorclose

I'd just like to thank everyone for their help :)
Brandon Anzaldi

0

Befunge-98 (57 bytes)

This code assumes the numbers will be input on stdin. It will pick a random number if both of the first numbers are the same until it is different, otherwise it will choose the last available number.

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

-3

Python, 54 41 characters

Quite long answer in Python but I like list comprehension, so I decided to post this here

// [0] means it is the first element of

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

How is this random?
user80551

It isn't, sorry...
Caridorc

@user80551 does it need to be?
John Dvorak

1
@JanDvorak Yes: "your job is to randomly pick a third number..." (I think this needs some more emphasis in the question, as many have gotten it wrong)
daniero
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.