짝수 또는 홀수 : 3 명


15

3 인용 게임입니다. 한 손으로 플레이하십시오.

동시에 각 플레이어는 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

요청 된 도구는 인수 (0에서 5 사이의 숫자로 3 개의 인수) 또는 STDIN (행으로 3 개의 값, 공백으로 구분)을 사용할 수 있습니다.

입력을 확인할 필요가 없습니다. 불규칙한 입력으로 인해 예기치 않은 출력이 발생할 수 있습니다.

행의 인수 또는 값은 플레이어 A 에서 플레이어 C로 왼쪽에서 오른쪽으로 제공됩니다 .

출력은 A, B또는 C(대문자) 또는 문자열 no one(소문자의 경우 일반 공백) 만 포함해야합니다 .

도구는 모든 입력 라인에서 한 번만 또는 필터로 작동 할 수 있습니다.

최단 코드 승리.


6
[언덕]으로서 더 흥미로울 수 있습니다. 플레이 게임.
dmckee --- 전 운영자 고양이

나는 우리가 5 개의 손가락을 가지고 있다는 사실 (3 개의 홀수와 2 개의 짝수의 손가락이 가능하다)이이기는 전략에 어떤 영향을 미치는지 궁금합니다.
Olivier Dulac

@OlivierDulac, 0도 짝수입니다.
피터 테일러

이 게임의 규칙에서 예,이에 대한 동일한 기회를하자 홀수 번호보다 (0 2 4 1 3 5 대)
F. 하우리

@ PeterTaylor : 감사합니다, 나는 질문을 잘못 읽었습니다 (그리고 나는 그것이 중요하다고 생각하지 않았습니다).
Olivier Dulac

답변:


12

APL ( 34 30)

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

설명:

  • 2|⎕(즉,이리스트를 제공하는 번호 개조 -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">:#,_

Fors의 영리한 표현을 사용하여 더 많은 캐릭터를 면도합니다. 이제 한 줄 (즉, Unefunge 호환)! 게임이 이길 때까지 읽습니다. @원샷 프로그램의 끝에 추가하십시오 .

JS 응답과 같이 입력 모드 2를 이진수로 취급 한 다음 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으로 변경 )

결정적인 비트

모든 승률을 같은 방식으로, 모든 짝수를 동일한 방식으로 나타내면 쌍별 평등 연산이 0 0B 승, 0 1A 승 등 4 가지 경우를 모두 구별 할 수 있습니다 .

설명

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

간단히 세 개의 숫자를 인수로 전달하면됩니다.


사전 증분의 정확한 순서가 지정되어 있습니까? 나는 그것이 아니라고 생각했지만 ... *b[1]크기 차이없이 등으로 대체 할 수 있습니다 (우아함이 다소 손실 되었음에도 불구하고 .. :()
FireFly

루비에서 : s = "=**++b+**(++": P는 진지하게, 와우, 어떻게 ... 어떻게 작동합니까? : O
Doorknob

@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

루비 (명령 줄 도구), 61 자

버전 1은 62 자입니다.

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

그러나 Darren Stone의 답변 을 피기 백하여 버전 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")

공을 굴리기 위해서는 세 가지 추가 인수로 입력이 필요합니다. 입 / 출력에 다음 패턴을 사용합니다 ( /"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

펄, 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"", 이 mod 값 목록을 가져 와서 문자열로 결합하고 8 진수 지정자를 추가 한 후 문자열을 숫자로 변환합니다.

기본적으로 내가 한 일은 진리표를 만든 다음 신중하게 재정렬하여 반전 작업을 수행했습니다 $x == 4. 그렇다면 배열에 색인을 생성하는 데 사용 $x >=4했던 반전 [$x>=4?7-$x:$x]을 수행했습니다.('no one','C','B','A')

가능한 가장 짧은 코드는 아니지만 실제로는 라인 노이즈가 아닙니다 ...

펄 : 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? '0b'.내가 전에 몰랐던 팁 +1
F. Hauri

디버거 (> 3 및> = 4)에서 모두 시도했지만 왜 그런지 확실하지 않지만> = 4는 작동했지만> 3은 작동하지 않았습니다. 내 자신의 만족을 설명 할 수 없습니다 (아마도 디버거?)
Joe

두 카운트에 여분의 문자가있는 것 같습니다. 또한 플래그는 문자로 계산됩니다.
Doorknob

2

일반 리스프, 114106 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")))

2

파이썬 2, 54

f=lambda a,b,c:[['no one','C'],'BA'][(a^b)&1][(a^c)&1]

1

매스 매 티카 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

하스켈, 97

main=interact$(["no one","A","B","C"]!!).(\x->min x$7-x).foldr(\y x->x*2+mod y 2)0.map read.words

1

R 67

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

흥미 롭습니다! 이것을 어떻게 테스트 할 수 있습니까? 무엇을 실행해야합니까 (어쩌면 shebang?)
F. Hauri

대화식 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<

Stole 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

Ooooooooooo 멋지다!
F. Hauri

흠, 물고기. 트램폴린이 있습니까? 그렇다면 #@...<마지막에 (동등한) 문자를 사용하여 문자를 저장할 수 있습니다. 오, 그리고 현재 코드는 42 문자처럼 보이므로 그 문자 수를 줄입니다. :)
FireFly

@FireFly 감사합니다! 그것은 문자를 저장했고 당신이 옳았습니다. 내 텍스트 편집기는 끝에 "col 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

자바 스크립트 (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

파이썬 3, 115

l=[int(x)%2for x in input().split()];0if[print("ABC"[i])for i,x in enumerate(l)if l.count(x)%2]else print("no one")

0

파이썬 3, 114

r=[0,3,2,1,1,2,3,0][int("".join(map(str,(int(x)%2for x in input().split()))),2)];print("ABC"[r-1]if r else"no one")

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 3101
  • $==oct"0b".$_; 이진을 10 진수로 변환
  • $==$=>3?7-$=:$=;> 3작동하는 경우 7-. (여기서 no one== 0)
  • say$=?chr 68-$=:"no one"하지 않을 경우 0, 가치, 다른 인쇄에서 문자를 인쇄 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카운터 B의 짝수 및 홀수 개수, 하나 가기 만
  • say$b[0]==1?$a[0]:짝수 카운터 == 1 이라면 ? 또한 인쇄 선수.
  • $b[0]==2?$a[1]:짝수 카운터 == 2 라면 ? 홀수 인쇄 플레이어 합니다.
  • :"no one"그렇지 않으면 인쇄하십시오 no one.

배쉬 85 (배열 기반)

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

이것은 내 두 번째 펄 버전을 기반으로합니다.

  • 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]} 배열 기반

배쉬 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 [even]a [odd]에 플레이어 저장
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))짝수 / 홀수 로 계산 b.
  • 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

게임 메이커 언어, 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

@ F.Hauri 예, 배열을 사용하여 더 짧게하려고합니다.
Timtech

0

클로저, 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)하거나 Excel 내에서 UDF로 사용 =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'[odd] 또는 '0'[even]이어야합니다. 예를 들면 다음과 같습니다.

> 1 1 0
C
> 1 1 1
no one

문제는 입력을 "공백으로 분리"해야합니다. 아마도 효과적으로 골프에 방법이 split그리고 join여전히 (매우 스마트)를 사용할 수 있도록 int(...input...)아이디어를. ?
Darren Stone

당신은 '0b'+내가 생각하기에 적어도 중복되어 int(input(),2)보이고 REPL에서 작동하는 것처럼 보입니다.
FireFly

@DarrenStone 대신 문자열 대체를 사용했습니다. 편집 참조
Dhara

@FireFly 감사합니다. 맞습니다. 제 답변을 편집했습니다. 먼저 '0b'가 필요한 Python 2로 코드를 테스트했습니다.
Dhara

도전 과제는 또한 입력이 0에서 5까지의 숫자를 받아 들여야합니다.
Peter Taylor

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);}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.