Четный или нечетный: три игрока


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 значения через строку, разделенные пробелами).

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

Аргументы или значения по линии дается слева направо, от игрока А до игрока C .

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

Инструмент может работать только один раз или в качестве фильтра на всех входных строках.

Самый короткий код выигрыша.


6
Может быть интереснее, как «король холма». Играть в игру
dmckee --- котенок экс-модератора

Интересно, как факт, что у нас есть 5 пальцев (так что возможны 3 нечетных и 2 четных числа пальцев) влияет на выигрышную стратегию ...
Оливье Дюлак

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

В этом игровом правиле да, это даёт одинаковые шансы на четные, чем на нечетные числа (0 2 4 против 1 3 5)
Ф. Хаури

@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

Mathematica, 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}]

A

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">:#,_

Использует умное выражение Форса, чтобы сбрить еще несколько персонажей. Теперь однострочный (т.е. Unefunge-совместимый)! Читает, пока игра не выиграна; добавить @в конце для одноразовой программы.

Обрабатывает входной мод 2 как двоичное число, как и в моем ответе JS, затем полагается на поиск AC и возвращается к «никому», если выходит за пределы (проверяя, является ли символ ≥'A ', что позволяет мне использовать соседний код в качестве данных: D).

Вариация, которая читает строку ввода, производит вывод, читает новую строку ввода и т. Д. До тех пор, пока не будет решена игра (то есть не «никто»):

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


Я портировал это, чтобы ловить рыбу для моего ответа. Я заметил тебя. +1 между прочим
Cruncher

4

APL, 30

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

Если мне разрешено изменять системные переменные по конфигурации, можно сбрить 2 символа. (В частности, изменение источника индекса ⎕IOна 0)

Решающий бит

Если мы представим все шансы одинаковым образом и все четные одинаково, то операция парного равенства может различить все 4 случая: 0 0для побед B, побед 0 1A и т. Д.

объяснение

2|⎕Принимает ввод и мод 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");}

Просто передайте три числа в качестве аргументов и вуаля!


Указан ли точный порядок этих преинкрементов? Я думал, что это не так ... хотя, вы могли бы заменить их и *b[1]т.д. без разницы в размерах (хотя некоторые потери в элегантности .. :()
FireFly

В Ruby:: 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]

Это улучшение за счет использования автоматического разделения (-a), скажем (-E) и, наконец, выяснения того, что не так в сравнении.


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

Я пробовал оба в отладчике (> 3 и> = 4), и я не уверен, почему, но> = 4 сработало, а> 3 - нет. Я также не могу объяснить это (возможно, отлаженный отладчик?) Для собственного удовольствия
Джо

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

2

Common Lisp, 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

С, 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<

Украл ответ befunge от FireFly и портировал его на рыбу, потому что использование регистров в рыбе позволяет нам сбрить некоторых персонажей. Потерял несколько символов из-за отсутствия горизонтального оператора if.

Это принимает параметры через аргументы.

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

@ Огненное спасибо! Это спасло чарса, и вы правы, я был зачтён одним. Мой текстовый редактор сказал «Кол 43» в конце. Но, конечно же, курсор на пустой строке говорит «кол 1».
Cruncher

1

Smalltalk, 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 ответов

По сути, есть 2 способа для этой операции:

  • array на основании: построено двоичное число из 3 цифр, чем беру ответ из массива
  • count на основе: считать четные и нечетные, и посмотреть, если есть count == 1

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

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

Один из моих самых коротких Perl:

  • s/(.)\s*/$1&1/eg;преобразовать строку как 1 2 3в101
  • $==oct"0b".$_; преобразовать двоичный код в октаву (так же, как dec, до 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)) если с> = 4, то с = 7-с.
  • o=() объявить массив
  • echo ${o[c]} на основе массива

Баш 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сохранить плеер в переменную a [четное] и [нечетное]
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))считать четным / нечетным в б.
  • case $b in 1) echo ${a[0]} в случае четного счетчика == 1 распечатать четный плеер
  • 2)echo ${a[1]};; счетчик четных регистров == 2 печать нечетного игрока
  • *)echo no one;esacеще печать no one.

Баш 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

Game Maker Language, 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

Python 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 Вместо этого я использовал замену строки, см. Редактирование
Дхара

@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

C 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.