Випадково виберіть одне число, яке відрізняється від двох інших випадкових чисел


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

Це те, що А, В і С можуть дорівнювати.

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

Це те, що А, В і С не можуть дорівнювати

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

1
Отже, якщо задано A і B, вони насправді не випадкові , що стосується моєї програми / функції, правда? Також що ви маєте на увазі під загальним кодом? Ви справді шукаєте рішення, яке можете використовувати у вашому проекті? У такому випадку я не хотів би шукати код-гольф на допомогу - код буде абсолютно непридатним у виробництві. Вся суть коду-гольфу полягає у зловживанні особливостями мови, щоб максимально зменшити розмір коду.
Мартін Ендер

Я використовував це для проекту і вже отримав довгу відповідь, але я це запитую, тому що вважав, що це буде цікава проблема громади. І я ставлю загальний код, тому що мені здається цікавішим, коли хтось використовував більше логічного мислення, щоб отримати відповідь, а не широкі знання про деякі особливості мови, але якщо код-гольф буде зловживати цим, я видаляю цей останній рядок.
тисоністи

Добре припустимо, що А і В можуть дорівнювати 1, 2 або 3, тому правильно введіть код, щоб передбачити всі можливості.
tysonsmiths

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

3
Отже, ви хочете, щоб ми написали тренажер Monty Hall ? ;-)
Ільмарі Каронен

Відповіді:


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 (я не зміг знайти жодного… / редагувати: 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;в кінці.)

Пс. Дякую за пропозицію використовувати ^, Говард.


Замість \-вас можна використовувати ^.
Говард

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 за вступ
містер Лістер

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.
Іссі

1

Математика, 37 байт

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

В основному те саме, що відповідь Рубі, але значно довше завдяки іменам функцій Mathematica. Я використовую великі регістри, тому що імена верхнього регістру можуть зіткнутися із вбудованими модулями (у цьому випадку вони цього не роблять, але ви просто не робите це в Mathematica).


1

R, 42 символи

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

Вектор x- вектор ваги ймовірності для отримання елементів вибірки. Спочатку встановлюється 1 для кожного, потім елементи, що відповідають А і В, встановлюються на 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, якщо мені не потрібно генерувати 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

Не працює через замовлення операцій; крім того, ви ніколи фактично не генерували випадкове число.
ліртосіаст

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так що для кожного не рівного 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)це SyntaxError
Spedwards

@xem y+new Date(z-y)з іншого боку повідомляє new Date()рядок із yдоданим.
Spedwards

Вибачте за друкарський помилок, я мав на увазі y + нова дата% (zy) ... або (z-y + 1), залежно від параметрів.
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

Оновлено:

Вдалося зменшити його на 30 знаків, модифікувавши його, натхненну відповіддю Стівварріл у С.

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:for(C=A;C==A|C==B;)C=1+new Date%3
openorclose

Я просто хотів би подякувати всім за допомогу :)
Брендон Анзалді

0

Befunge-98 (57 байт)

Цей код передбачає, що цифри будуть введені на stdin. Він вибере випадкове число, якщо обидва перші числа однакові, поки воно не буде іншим, інакше він вибере останнє доступне число.

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

-3

Пітон, 54 41 символ

Досить довга відповідь у Python, але мені подобається розуміння списку, тому я вирішив опублікувати це тут

// [0] означає, що це перший елемент

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

Як це випадково?
user80551

Це не вибачте ...
Caridorc

@ user80551 це потрібно?
Джон Дворак

1
@JanDvorak Так: "Ваша робота полягає у тому, щоб випадковим чином вибрати третє число ..." (Я думаю, що цьому потрібно ще більше акцентувати питання, оскільки багато хто
зрозумів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.