Непарне чи непарне: три гравця


15

Це гра для трьох гравців, грати однією рукою.

При цьому кожен гравець показує свою руку з витягнутими від 0 до 5 пальців.

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

 P l a y e r s
A      B      C       Winner

Even   Even   Even    No winner
Odd    Odd    Odd     No winner
Even   Odd    Odd     Player A
Odd    Even   Even    Player A
Even   Odd    Even    Player B
Odd    Even   Odd     Player B
Odd    Odd    Even    Player C
Even   Even   Odd     Player C

Запитаний інструмент може використовувати аргументи (3 аргументи як числові від 0 до 5) або STDIN (3 значення за рядком, розділені пробілами).

Немає необхідності перевіряти вхід: Неправильний вхід може дати несподіваний вихід.

Аргументи або значення наводяться зліва направо, від гравця A до гравця C .

Вихід повинен містити тільки A, Bабо C(капіталізуються) або рядокno one (в нижньому регістрі, з регулярним простором).

Інструмент може працювати лише один раз або як фільтр у всіх вхідних рядках.

Найкоротший виграш коду.


6
Можливо, це буде цікавіше, як [цар-горб]. Пограйте в гру.
dmckee --- кошеня колишнього модератора

Цікаво, як факт того, що у нас є 5 пальців (тому можливі 3 непарні та 2 парні числа пальців), впливає на стратегію виграшу ...
Олів'є Дулак

@OlivierDulac, 0 також є парним числом.
Пітер Тейлор

У цьому ігровому правилі так, це дасть однакові шанси на парні, ніж для непарних чисел (0 2 4 проти 1 3 5)
F. Hauri

@PeterTaylor: спасибі, я неправильно прочитав питання (і не думав, що це буде зараховано).
Олів'є Дулак

Відповіді:


12

APL ( 34 30)

(1⍳⍨+/∘.=⍨2|⎕)⊃'ABC',⊂'no one'

Пояснення:

  • 2|⎕: прочитайте рядок введення, візьміть mod-2 кожного номера (даючи список, тобто 1 0 1)
  • ∘.=⍨: порівняйте кожен елемент у векторі з кожним елементом у векторі, даючи матрицю
  • +/: підсумовуйте рядки матриці, даючи для кожного елемента, скільки елементів було рівним. Якщо були два однакові і один різні, у нас зараз такий вектор, як і 2 1 2де, 1позначає, хто був іншим. Якби вони були однакові, ми отримуємо 3 3 3.
  • 1⍳⍨: знайти позицію 1. Якщо його немає 1, в цьому випадку це повертається на один більше, ніж довжина вектора 4.
  • ⊃'ABC',⊂'no one': відображення рядка в заданому індексі.

Приємно, добре використовувати програмування, орієнтоване на масив, для обчислення індексу.
FireFly

8

Математика, 45 43 42 41 ряд

f="no one"[A,B,C]〚Mod[Tr@#-#,2].{2,1,0}〛&

Приклад:

f[{0 ,0, 0}]

ніхто

f[{1, 3, 5}]

ніхто

f[{2, 3, 5}]

А

f[{2, 3, 4}]

Б


Ще одне рішення з 43 42 знаками:

f=Mod[Tr@#-#-1,2].{A,B,C}/._+__->"no one"&


4

Befunge-98, 61 50 45 символів

&&&:11p+2%2*\11g+2%+:"@"+#@\#,_0"eno on">:#,_

Використовує розумний вираз Форса, щоб відголити ще кілька символів. Тепер однолінійні (тобто сумісні з нефункціональними функціями)! Читає, поки гра не виграна; додати @в кінці для одномоментної програми.

Розглядає вхідний модуль 2 як двійкове число, як і в моїй відповіді JS, потім покладається на пошук AC і повертається до "ніхто", якщо поза межами (тестуючи, чи символ є ≥'A ', що дозволяє мені використовувати код поблизу як дані: D).

Варіація, що читає рядок введення, видає вихід, читає новий рядок введення тощо, поки не буде прийнято рішення про гру (тобто не "ніхто"):

&2%4*&2%2*&2%++1g:" "#@-#,_0"eno on">:#,_
 CBAABC


Я переніс це на рибу для своєї відповіді. Я вас відзначив. +1 btw
Cruncher

4

APL, 30

(1+2=/2|⎕)⊃'BA'('C',⊂'no one')

Якщо мені дозволено змінювати системні змінні за конфігурацією, можна змінити 2 символи. (Зокрема, зміна походження індексу⎕IO на 0)

Найважливіший біт

Якщо ми представляємо всі шанси однаково, і всі рівномірно однакові, тоді в операції рівності пари можна виділити всі 4 випадки: 0 0для B виграш, 0 1для A виграш і т.д.

Пояснення

2|⎕Бере введення та mod 2
2=/Пара рівності
1+Додавання 1 для індексації (масиви APL за замовчуванням базуються на 1)

'BA'('C',⊂'no one')Вкладений масив
Вибирає правильний елемент із вкладеного масиву


3

C: 88 символів

На жаль, C, як завжди, вимагає досить багато непотрібних мотлоху. Але все ж, в якій іншій мові можна писати, =**++b+**(++а це насправді щось означає? Досить просто піднесене.

main(int a,char**b){(a=**++b+**(++b+1)&1|2*(**b+**++b&1))?putchar(a+64):puts("no one");}

Просто передайте три аргументи як аргументи та voilà!


Чи визначено точний порядок цих попередніх заходів? Я думав, що це не так ... хоча ви можете замінити їх на *b[1]etc без різниці в розмірі (хоча певна втрата елегантності .. :()
FireFly

У Рубі:: s = "=**++b+**(++"P з усією серйозністю, вау, як це ... як це навіть працює? : O
Дверна ручка

@Doorknob - це дуже розумно, але якщо ви заміните розмежування та попередні надбавки bзамість індексації , і трохи роздрукуєте умову, ви зможете це зрозуміти. : D (ручка та папір також допомагають, за отриманою таблицею правди)
FireFly

3

GolfScript (31 знак)

~]{1&}%.$1=!?)'no one
A
B
C'n/=

Дуже проста логіка: зменшіть модуль введення 2, а потім сортуйте копію. Середній елемент відсортованого масиву в більшості, тому шукайте індекс, який є іншим (а значить, і в меншості).


3

Рубі (функціональне тіло), 42 ч

Припускаючи , 3 числові аргументи a, bі c:

['zCBAABCz'[a%2*4|b%2*2|c%2],'no one'].min

Ruby (інструмент командного рядка), 61 символ

Версія 1 випускається з 62 символів:

$><<["zCBAABCz"[$*.reduce(0){|i,n|i*2|n.to_i%2}],'no one'].min

Але, підробляючи відповідь відповіді Даррена Стоуна , версія 2 зменшується до 61 символу:

i=0;$*.map{|n|i+=i+n.to_i%2};$><<['zCBAABCz'[i],'no one'].min


2

JavaScript (вузол), 87 символів

p=process.argv;console.log("ABC"[3-Math.min(x=p[2]%2*4+p[3]%2*2+p[4]%2,7-x)]||"no one")

Щоб отримати м'яч, котиться ... очікує, що введення буде три додаткових аргументи. Використовує таку схему для введення / виводу ( /являє собою "ніхто"):

  A B C  res  #
 ───────────────
  0 0 0   /   0
  0 0 1   C   1
  0 1 0   B   2
  0 1 1   A   3
  1 0 0   A   4
  1 0 1   B   5
  1 1 0   C   6
  1 1 1   /   7

2

GolfScript, 36 35 33 символів

~]0\{1&\.++}/'no one
C
B
A'n/.$+=

Приймає введення, як описано в STDIN. Ви також можете перевірити код в Інтернеті .


2

Perl, 84 символів.

$x=oct"0b".join"",map{$_%2}<>=~/(\d)/g;print"",('no one','C','B','A')[$x>=4?7-$x:$x]
  • <>=~/(\d)/g розбирає рядок введення на різні цифри
  • map{$_%2 приймає цей список і обчислює значення mod 2 (парне або непарне)
  • oct"0b".join"", приймає цей список значень мод, з'єднує їх у рядок, додає восьмеричний специфікатор та перетворює рядок у число.

В основному, я робив це, щоб створити таблицю істинності, а потім ретельно упорядкував її, щоб у мене була операція інверсії навколо $x == 4. Так що, якщо $x >=4ми зробили інверсію[$x>=4?7-$x:$x] яку ми використовували для індексації в масив('no one','C','B','A')

Це не найкоротший можливий код, але насправді він не є лінійним шумом ... що чудово саме по собі.

Perl: 74 символи + 3 прапори = 77, запустіть perl -anE '(code)'

s/(\d)\s*/$1%2/eg;$x=oct"0b".$_;say"",("no one","C","B","A")[$x>3?7-$x:$x]

Це поліпшення, використовуючи autosplit (-a), скажімо (-E), і, нарешті, з'ясувати, що не було в порівнянні.


Чому >=4замість просто >3? +1 за порадами, яких '0b'.я раніше не знав
Ф. Хаурі

Я спробував обидва у відладчику (> 3 і> = 4), і не знаю чому, але> = 4 спрацював, але> 3 не став. Я не можу пояснити це (можливо, налагодженим налагоджувачем?) На власне задоволення
Джо

у вас, здається, були додаткові знаки в обох підрахунках, які я зафіксував. Також прапори вважаються символами.
Дверна ручка

2

Загальний Лісп, 114 106 70 символів

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

(defun f(a b c)(elt'(no_one c a b)(+(mod(- b c)2)(*(mod(- a b)2)2)))))

Старіший алгоритм:

(defun f(h)(let*((o(mapcar #'oddp h))(p(position 1(mapcar(lambda(x)(count x o))o))))(if p(elt'(a b c)p)"no one")))


1

Mathematica 100 94 89

f=If[(t=Tally[b=Boole@OddQ@#][[-1,2]])==1,{"A","B","C"}[[Position[b,t][[-1,1]]]],"no one"]&

Тестування

f[{5, 3, 1}]
f[{2, 0, 4}]
f[{0, 1, 2}]
f[{0, 1, 3}]
f[{1, 3, 0}]

"ніхто"
"ніхто"
"B"
"A"
"C"



1

R 67

z="no one";c("A","B","C",z,z)[match(2-sum(x<-scan()%%2),c(x,2,-1))]

Цікаво! Як я міг це перевірити? Що мені бігати (може,
шебанг

Вам потрібно буде почати інтерактивний R сеанс (наприклад /usr/bin/R), а потім ввести код вище. scan()це те, що запропонує вам ввести: приклад - це набрати, 1[space]3[space]5[space][enter][enter]і ви побачите відповідний вихід (тут, no one), надрукований на екрані. Завантажити R можна тут: cran.r-project.org/mirrors.html
flodel

1

C, 85 символів

main(int j,char**p){puts("C\0A\0B\0no one"+((**++p&1)*2+(**++p&1)^(**++p&1?0:3))*2);}

Не така коротка, як моя відповідь Рубі, але я задоволений нею, враховуючи mainсуть.


1

Риба - 41

:&+2%2*$&+2%+:"@"+!;$!o :?#"eno on"!;ooo<

Викрав відповідь FireFly і переніс її на рибу, оскільки використання регістрів у рибі дозволяє нам відголити деякі символи. Втратив декілька символів, не маючи горизонталі, якщо оператор, хоча.

Це бере параметри через аргументи.

python fish.py evenodd.fish -v 2 2 2  
no one
python fish.py evenodd.fish -v 2 3 2  
B
python fish.py evenodd.fish -v 2 3 3  
A
python fish.py evenodd.fish -v 3 3 4  
C

Ооооооооо приємно!
Ф. Хаурі

Гм, риба. У вас є батут? якщо так, можливо, ви могли б використати (еквівалент) #@...<в кінці, щоб зберегти знак. О, і ваш теперішній код для мене схожий на 42 знаки, тож декремент, що вашій увазі підрахунок. :)
FireFly

@FireFly дякую! Це врятувало чару, і ти маєш рацію, мене перерахував один. Мій текстовий редактор сказав наприкінці "кол 43". Але звичайно, курсор у порожньому рядку говорить "col 1".
Cruncher

1

Маленька розмова, 128 символів

[:c|o:=c collect:[:e|e odd].k:=o collect:[:e|o occurrencesOf:e].u:=k indexOf:1.^(u>0)ifTrue:[#($a $b $c)at:u]ifFalse:['no one']]

надіслати value:зі збіркою


1

JavaScript (ES6) / CoffeeScript, 50 байт

Використовує таблицю істинності відповідно до відповіді Firefly, але використовує більш прямий підхід у доступі до персонажів:

f=(a,b,c)=>'CBAABC'[(a%2*4+b%2*2+c%2)-1]||'no one' // JavaScript
f=(a,b,c)->'CBAABC'[(a%2*4+b%2*2+c%2)-1]||'no one'  # CoffeeScript

Демо

// Translated into ES5 for browser compatibility
f=function(a,b,c){return'CBAABC'[(a%2*4+b%2*2+c%2)-1]||'no one'}

//f=(a,b,c)=>'CBAABC'[(a%2*4+b%2*2+c%2)-1]||'no one'

for(i=6;i--;)
  for(j=6;j--;)
    for(k=6;k--;)
      O.innerHTML += i + ', ' + j + ', ' + k + ' => ' + f(i,j,k) + "\n"
<pre id=O></pre>




0

Два різні способи у двох різних мовах + варіації -> 6 відповідей

Для цієї операції існує по суті два способи:

  • array на основі: побудовано двійкове число з 3 цифр, ніж приймати відповідь з масиву
  • count на основі: Порахуйте парне і непарне, і подивіться, чи є count == 1

Perl 71 (на основі масиву + варіація)

s/(.)\s*/$1&1/eg;$==oct"0b".$_;$==$=>3?7-$=:$=;say$=?chr 68-$=:"no one"

Один з моїх найкоротших перл:

  • s/(.)\s*/$1&1/eg;перетворити рядок як 1 2 3у101
  • $==oct"0b".$_; перетворити двійкове в окт (те саме, що в грудні під 8)
  • $==$=>3?7-$=:$=;якщо > 3опер 7-. (Звідти no one== 0)
  • say$=?chr 68-$=:"no one"якщо ні 0, то надрукуйте char із значення, інакше роздрукуйтеno one .

Perl 71 (на основі масиву)

s/(.)\s*/$1&1/eg;$==oct"0b".$_;say@{["no one",qw{A B C}]}[$=>3?7-$=:$=]

трохи відрізняється на кроці друку: вихід заснований на "масиві" .

Perl 81 (з урахуванням підрахунку)

$c=A;map{$a[$_%2]=$c++;$b[$_%2]++}split;say$b[0]==1?$a[0]:$b[0]==2?$a[1]:"no one"

Інше значення:

  • $c=A Ініціалізуйте лічильник c с A.
  • map{$a[$_%2]=$c++;$b[$_%2]++}splitЛічильник б лічильник парний і непарний, тільки один магазин , який
  • say$b[0]==1?$a[0]: якщо навіть лічильник == 1? також надрукувати навіть програвач.
  • $b[0]==2?$a[1]:якщо навіть лічильник == 2? також друкувати непарний програвач.
  • :"no one"ще друкувати no one.

Bash 85 (на основі масиву)

c=$((($1%2)<<2|($2&1)*2+($3%2)));((c>3))&&c=$((7-c));o=("no one" C B A);echo ${o[c]}

На основі моєї другої версії perl:

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) зробити індекс поз.
    • $ 1% 2 перетворить перший аргумент у двійковий, використовуючи mod
    • $ 2 & 1 перетворіть другий аргумент у двійковий, використовуючи and
    • << 2 зсув вліво такий самий, ніж*4
    • * 2 помножити на 2 - це те саме, що <<1.
  • ((c>3))&&c=$((7-c)) якщо c> = 4, то c = 7-c.
  • o=() оголосити масив
  • echo ${o[c]} на основі масиву

Bash 133 (з урахуванням підрахунку)

a[$1&1]=A;a[$2&1]=B;a[$3&1]=C;((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))
case $b in 1)echo ${a[0]};;2)echo ${a[1]};;*)echo no one;esac
  • a[$1&1]=A;a[$2&1]=B;a[$3&1]=Cзберігати програвач у змінну [парне] та [непарне]
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))рахувати парне / непарне значення в b.
  • case $b in 1) echo ${a[0]} у разі навіть лічильника == 1 роздрукуйте навіть програвач
  • 2)echo ${a[1]};; case even counter == 2 непарний програвач для друку
  • *)echo no one;esacще друкувати no one.

Bash 133 (з урахуванням підрахунку)

a[$1&1]=A;a[$2&1]=B;a[$3&1]=C;((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))
((b==1))&&echo ${a[0]}||(((b==2))&&echo ${a[1]}||echo no one)

Ця ж версія, використовуючи умову bash та командну групу замість case ... esac


0

Мова виробника ігор, 116

Моя нова відповідь значною мірою покладається на формулу FireFly:

a[1]="no one"a[2]='A'a[3]='B'a[4]='C'return a[(3-min(b=argument0 mod 2*4+argument1 mod 2*2+argument2 mod 2,7-b)||1)]

Старий код скомпільовано з неініціалізованих змінними , як 0, 183 символів:

a=argument0 mod 2b=argument1 mod 2c=argument2 mod 2if((a&&b&&c)||(!a&&!b&&!c))return "no one" else{if((a&&b)||(!a&&!b))return "C" else{if((a&&c)||(!a&&!c))return "B" else return "A"}}

Редагувати №1 - цілий інший код


Цікаво !? Я не знав цієї мови раніше! Але оскільки ця мова дозволяє використовувати масив, цей код здається не найменшим можливим для цієї роботи.
Ф. Хаурі

@ F.Hauri Так, я намагаюся використовувати масиви, щоб скоротити його.
Timtech

0

Clojure, 116

(fn[& h](let[a(map #(bit-and % 1)h)](["no one"\A\B\C](+(.indexOf(map(fn[x](reduce +(map #(if(= x %)1 0)a)))a)1)1))))

0

vba, 116

Function z(q,r,s)
a="A":b="B":c="C":d="no one"
z=Array(d,c,b,a,a,b,c,d)((q And 1)*4+(r And 1)*2+(s And 1))
End Function

дзвоніть ?z(1,2,3)або призначайте змінну з q=z(1,2,3)або навіть використовуйте як UDF у складі excel та використовуйте =z(1,2,3)у формулі excel


0

Пітон 3, 80 символів

r=int(input().replace(' ',''),2)
print(['no one','C','B','A'][7-r if r>3 else r])

Примітка: введення має бути "1" [непарне] або "0" [парне]. Наприклад:

> 1 1 0
C
> 1 1 1
no one

Завдання вимагає, щоб введення було "розділено пробілами". Можливо, є спосіб ефективного гольфу splitі joinтому ви все ще можете використовувати свою (дуже розумну) int(...input...)ідею. ?
Даррен Стоун

Ви можете зняти те, що '0b'+я думаю, принаймні це здається мені зайвим, і, int(input(),2)здається, працює в системі REPL.
FireFly

@DarrenStone Я замість цього використовував заміну рядків, див. Редагувати
Dhara

@FireFly Дякую, ти маєш рацію, я змінив свою відповідь. Я вперше випробував код з Python 2, де знадобилось "0b".
Дхара

Завдання також вимагає введення, щоб прийняти числа від 0 до 5.
Пітер Тейлор

0

Ява, 226 символів

void func(int a, int b, int c){
    a = a%2;
    b = b%2;
    c = c%2;
    String out = "B";
    if((a+b+c)==0 || (a+b+c)==3)
        out = "no one";
    else if(a==b)
        out = "C";
    else if(b==c)
        out = "A";
    System.out.println(out);
}

0

С 101 96

C, мабуть, самий тривіальний приклад (деякі потрійні операції):

main(int v,char** c){(v=c[1]==c[2]?c[1]==c[3]?0:3:c[1]==c[3]?2:1)?puts("no one"):putchar(v+64);}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.