Случайно выбрать одно число, которое отличается от двух других случайных чисел


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 - код будет абсолютно непригодным для использования в производстве. Весь смысл Code-Golf состоит в том, чтобы злоупотреблять специфическими для языка функциями, чтобы максимально уменьшить размер кода.
Мартин Эндер

Я использовал это для проекта и уже получил длинный ответ, но я спрашиваю об этом, потому что я думал, что это была интересная проблема, которая понравится сообществу. И я добавляю общий код, потому что нахожу его более интересным, когда кто-то использует более логичное мышление, чтобы получить ответ, а не обширные знания некоторых языковых функций, но если code-golf использует их, то я удалю эту последнюю строку.
tysonsmiths

Предположим, что A и B могут быть равны 1, 2 или 3, поэтому исправьте свой код, чтобы предвидеть все возможные варианты.
tysonsmiths

1
Я не понимаю Я что-то пропустил или это C = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))работает? Кроме того, ваше решение крайне неэффективно, поскольку оно тратит время на цикл и, возможно, может занять бесконечное количество времени для запуска. Также import randomучитывается размер в байтах ...
DankMemes

3
Итак, вы хотите, чтобы мы написали симулятор Монти Холла ? ;-)
Илмари Каронен

Ответы:


17

Рубин, 22 символа

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

Все еще не уверен, правильно ли я понял вопрос ...


12

С 26

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

Если я правильно понял вопрос:

Если aи bотличаются, то нет случайного. ответ должен быть единственным из 1,2,3, который не используется:6-a-b .

ЕСЛИ 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
На моем телефоне прямо сейчас .. Не уверен, что некоторые строки немного сместились случайно. Я проверю это, когда буду дома.
Инго Бюрк

Выглядит хорошо для меня. Намного лучше, чем моя попытка 99 байтов. Я надеюсь, что вам весело с befunge.
AndoDaan

Да, мобильная версия не кажется моноширинной. Befunge довольно забавно, но я бы хотел, чтобы был приличный переводчик Befunge-98 (я не смог найти ни одного… / edit: 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. Спасибо за предложение использовать ^, Говард.


Вместо \-тебя можно использовать ^.
Говард

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

Питон, 14 символов

Я попробовал это для каждых 9 возможных случаев, и это, кажется, работает хорошо!

C=A^B or A^1|2

(правка): Как указывало edc65, это недопустимо, поскольку это не случайно ... Я пропустил эту часть вопроса и сейчас чувствую себя глупо.


3
Совсем не случайно
edc65

Тем не менее, +1 за вход
мистер Листер

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

Очень просто. Злоупотребление фактом, что операторы сравнения действуют по-другому с массивом как их левый операнд.


Приятный совет по поводу сравнения операторов. Заставляет меня захотеть взглянуть на некоторые из моих старых сценариев и посмотреть, есть ли места, которые можно использовать. В частности, это напоминает мне часть симулятора Монти Холл.
Изи

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)

Вектор 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

вдохновленный ответом Брэндона Анзальди

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

0

Юлия, 32 или 56 в зависимости от правил

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

32, если мне не нужно генерировать а и б.


Вопрос говорит: «Предположим, А и В уже выбраны для вас».
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-АБ не случайно, не так ли? :)
xem

1
@xem - Нет - но он используется только 6-a-bтогда, когда нет другого выбора, оба других взяты. Это умный способ выбора невыбранного числа от 1, 2, 3. 6-1-2 = 3, 6-1-3=2, 6-2-3=1так что для каждого не равного A, B 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)это ошибка синтаксиса
Spedwards

@xem, y+new Date(z-y)с другой стороны, сообщает new Date()строку с yдобавленным.
Спедвардс

извините за опечатку, я имел ввиду y + new Date% (zy) ... или (z-y + 1) в зависимости от параметров.
xem

и мое замечание о равенстве A и B было около «a = b = r (1,3);». Если вы сделаете это, 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

Обновлено:

Удалось уменьшить его до 30 символов, изменив его, вдохновленный ответом Стиваррилл на 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

Заимствуя из ответа Ксема, по крайней мере, попал в один ряд с ним:

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 ответ, основываясь на этом, но используя цикл do-while;)
xem

Вы должны быть в состоянии использовать |вместо ||.
nyuszika7h

Сохраните 1 байт с циклом for:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose

Я просто хотел бы поблагодарить всех за помощь :)
Брэндон Анзальди

0

Befunge-98 (57 байт)

Этот код предполагает, что числа будут введены на стандартный ввод. Он выберет случайное число, если оба первых числа будут одинаковыми, пока оно не станет другим, в противном случае он выберет последнее доступное число.

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

-3

Python, 54 41 символов

Довольно длинный ответ в Python, но мне нравится понимание списка, поэтому я решил опубликовать это здесь

// [0] означает, что это первый элемент

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

Как это случайно?
user80551

Это не извините ...
Каридорк

@ user80551 это должно быть?
Джон Дворак

1
@JanDvorak Да: «Ваша задача состоит в том, чтобы случайным образом выбрать третье число ...» (я думаю, что в этом вопросе необходимо уделить больше внимания, так как многие ошиблись)
Даниеро
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.