Par ou ímpar: três jogadores


15

É um jogo de três jogadores, joga com uma mão.

Ao mesmo tempo, cada jogador mostra sua mão com 0 a 5 dedos estendidos.

Se todos os jogadores mostrarem o mesmo tipo de número (par ou ímpar), não haverá vencedor. Mas, caso contrário, o jogador que mostra o tipo diferente vence os outros dois.

 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

A ferramenta solicitada pode usar argumentos (3 argumentos como numéricos entre 0 e 5) ou STDIN (3 valores por linha, separados por espaços).

Não é necessário verificar a entrada: a entrada irregular pode produzir uma saída inesperada.

Argumentos ou valores na linha é dado da esquerda para a direita, de jogador A para o jogador C .

Apenas saída deve conter A, Bou C(capitalizado) ou a corda no one(em letras minúsculas, com um espaço regular).

A ferramenta pode funcionar apenas uma vez ou como um filtro em todas as linhas de entrada.

Menor vitória no código.


6
Pode ser mais interessante como um [rei-da-colina]. Jogue o jogo.
dmckee --- gatinho ex-moderador

Eu me pergunto como o fato de que temos 5 dedos (assim há 3 estranho e 2 números pares de dedos possíveis) afeta a estratégia vencedora ...
Olivier Dulac

@OlivierDulac, 0 também é um número par.
Peter Taylor

Nesta regra do jogo, sim, isso dá as mesmas chances para números pares do que para números ímpares (0 2 4 vs 1 3 5)
F. Hauri

@ PeterTaylor: obrigado, eu interpretei mal a pergunta (e não achei que fosse valer).
Olivier Dulac

Respostas:


12

APL ( 34 30)

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

Explicação:

  • 2|⎕: leia uma linha de entrada, pegue o mod-2 de cada número (fornecendo uma lista, ie 1 0 1)
  • ∘.=⍨: compare cada elemento do vetor com cada elemento do vetor, fornecendo uma matriz
  • +/: soma as linhas da matriz, fornecendo para cada elemento quantos elementos ele era igual. Se houvesse dois iguais e um diferente, agora temos um vetor como 2 1 2onde 1denota quem era diferente. Se eles fossem todos iguais, nós entendemos 3 3 3.
  • 1⍳⍨: encontre a posição do 1. Se não houver 1, isso retornará um a mais que o comprimento do vetor, neste caso 4.
  • ⊃'ABC',⊂'no one': exibe a string no índice especificado.

Bom, bom uso da programação orientada a matrizes para calcular o índice.
FireFly

8

Mathematica, 45 43 42 41 caracteres

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

Exemplo:

f[{0 ,0, 0}]

ninguém

f[{1, 3, 5}]

ninguém

f[{2, 3, 5}]

UMA

f[{2, 3, 4}]

B


Outra solução com 43 42 caracteres:

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


4

Befunge-98, 61 50 45 caracteres

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

Usa a expressão inteligente de Fors para raspar mais alguns personagens. Agora linha única (ou seja, compatível com Unefunge)! Lê até que um jogo seja vencido; adicione @no final um programa de tiro único.

Trata a entrada mod 2 como um número binário, como na minha resposta JS, depois depende da pesquisa de CA e volta a 'ninguém' se estiver fora dos limites (testando se o caractere é ≥'A ', o que me permite para usar código próximo como dados: D).

Variação que lê uma linha de entrada, produz saída, lê uma nova linha de entrada, etc. até que um jogo seja decidido (ou seja, não 'ninguém'):

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


Eu portado isso para pescar a minha resposta. Eu notei você. 1 btw
Cruncher

4

APL, 30

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

Se eu tiver permissão para alterar as variáveis ​​do sistema por configuração, dois caracteres podem ser cortados. (Especificamente, alterando a origem do índice ⎕IOpara 0)

A parte crucial

Se representarmos todas as probabilidades da mesma maneira e todas iguais da mesma maneira, uma operação de igualdade entre pares pode distinguir todos os quatro casos: 0 0para vitórias B, 0 1vitórias A, etc.

Explicação

2|⎕Recebe entrada e mod 2
2=/Igualdade entre pares
1+Adicione 1 para indexação (matrizes APL são baseadas em 1 por padrão)

'BA'('C',⊂'no one')Matriz aninhada
Seleciona o elemento correto da matriz aninhada


3

C: 88 caracteres

Infelizmente, C, como sempre, requer bastante lixo desnecessário. Mas ainda assim, em que outra língua alguém pode escrever =**++b+**(++e realmente significa alguma coisa? Simplesmente sublime.

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

Simplesmente passe três números como argumentos, e pronto!


A ordem exata desses pré-incrementos está especificada? Eu pensei que não era ... embora, você poderia substituí-los com *b[1]etc para nenhuma diferença de tamanho (embora alguma perda de elegância .. :()
FireFly

Em Ruby:: s = "=**++b+**(++"P com toda a seriedade, uau, como isso ... como isso funciona? : O
Maçaneta da porta

O @Doorknob é muito inteligente, mas se você substituir a referência e os pré-incrementos pela indexação be imprimir algumas condições, poderá conseguir descobrir isso. : D (caneta e papel também ajuda, para a tabela de verdade resultante)
FireFly

3

GolfScript (31 caracteres)

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

Lógica muito simples: reduza o módulo de entrada 2 e depois ordene uma cópia. O item do meio da matriz classificada é a maioria, portanto, procure um índice que seja diferente (e, portanto, minoria).


3

Ruby (corpo da função), 42 caracteres

Assumindo 3 argumentos numéricos a, be c:

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

Ruby (ferramenta de linha de comando), 61 caracteres

A versão 1 vem com 62 caracteres:

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

Mas, pegando carona na resposta de Darren Stone , a Versão 2 chega a 61 caracteres:

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

3

Ruby, 61 caracteres

w=0
$*.map{|p|w+=w+p.to_i%2}
$><<%w(no\ one C B A)[w>3?w^7:w]

['no one',?C,?B,?A]== %w(no\ one C B A)(2 caracteres salvos).
Daniero

Agradável. Aplicou isso. Valeu!
Darren Pedra

2

JavaScript (nó), 87 caracteres

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

Para fazer a bola rolar ... espera entrada como três argumentos extras. Utiliza o seguinte padrão para entrada / saída ( /representa "ninguém"):

  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 caracteres

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

Recebe a entrada conforme descrito em STDIN. Você também pode testar o código online .


2

Perl, 84 caracteres.

$x=oct"0b".join"",map{$_%2}<>=~/(\d)/g;print"",('no one','C','B','A')[$x>=4?7-$x:$x]
  • <>=~/(\d)/g analisa a linha de entrada em dígitos distintos
  • map{$_%2 pega essa lista e calcula o valor mod 2 (par ou ímpar)
  • oct"0b".join"", pega essa lista de valores de mod, junta-os a uma string, anexa um especificador octal e converte a string em um número.

Basicamente, o que fiz foi criar uma tabela de verdade e, em seguida, reordená-la cuidadosamente, para que eu fizesse uma operação de inversão $x == 4. Então $x >=4, se fizemos a inversão[$x>=4?7-$x:$x] que costumávamos indexar na matriz('no one','C','B','A')

Não é o código mais curto possível, mas na verdade não é ruído de linha ... o que é notável por si só.

Perl: 74 caracteres + 3 sinalizadores = 77, executado com perl -anE '(code)'

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

Isso é uma melhoria, aproveitando a divisão automática (o -a), digamos (o -E) e, finalmente, descobrindo o que havia de errado na comparação.


Por que ao >=4invés de simplesmente >3? +1 para as dicas '0b'.que eu não conhecia antes
F. Hauri

Tentei ambos no depurador (> 3 e> = 4) e não sei por que, mas o> = 4 funcionou, mas o> 3 não. Eu não posso explicá-lo (depurador possivelmente borked?) Para minha própria satisfação, quer
Joe

você parece ter tido um caractere extra nas duas contagens, que eu consertei. Além disso, os sinalizadores contam como caracteres.
Maçaneta

2

Lisp comum, 114 106 70 caracteres

A partir dos três valores, crie um par representando a diferença de paridade entre os elementos adjacentes. Trate isso como um número binário para indexar na lista de resultados.

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

Algoritmo mais antigo:

(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

Python 2, 54

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

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"]&

Teste

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

"ninguém"
"ninguém"
"B"
"A"
"C"


1

Haskell, 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))]

Interessante! Como eu pude testar isso? O que eu tenho que correr (talvez um shebang?)
F. Hauri

Você precisará iniciar uma sessão R interativa (por exemplo /usr/bin/R) e depois inserir o código acima. scan()é o que solicitará a entrada: um exemplo seria digitar 1[space]3[space]5[space][enter][enter]e você verá a saída correspondente (aqui no one) impressa na tela. Você pode fazer o download do R aqui: cran.r-project.org/mirrors.html
flodel

1

C, 85 caracteres

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

Não é tão curto quanto a minha resposta Ruby, mas estou feliz com isso, considerando a maincrosta.


1

Peixe - 41

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

Roubou a resposta anterior do FireFly e a portou para pescar, porque o uso de registros no peixe nos permite raspar alguns caracteres. Perdeu alguns caracteres por não ter o operador horizontal se.

Isso leva parâmetros através de argumentos.

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 legal!
F. Hauri 02/12/13

Hum, peixe hein. Você tem trampolim? Nesse caso, talvez você possa usar (o equivalente a) #@...<no final para salvar um caractere. Ah, e seu código atual parece 42 caracteres para mim, então diminua esse número de caracteres. :)
FireFly

@FireFly thanks! Isso salvou um char, e você está certo, eu fui contada por um. Meu editor de texto disse "col 43" no final. Mas é claro que o cursor em uma linha vazia diz "col 1".
Cruncher

1

Smalltalk, 128 caracteres

[: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']]

enviar value:com uma coleção


1

JavaScript (ES6) / CoffeeScript, 50 bytes

Usa a tabela de verdade de acordo com a resposta do Firefly, mas adota uma abordagem mais direta no acesso ao personagem:

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

Demo

// 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

Python 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

Python 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

Dois métodos diferentes em dois idiomas diferentes + variações -> 6 respostas

Existem basicamente duas maneiras para esta operação:

  • array baseado: Construiu um número binário de 3 dígitos, que recebe a resposta de uma matriz
  • count com base: conte par e ímpar e verifique se há um count == 1

Perl 71 (baseado em matriz + variação)

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

Um dos meus menores perl:

  • s/(.)\s*/$1&1/eg;transformar uma string como 1 2 3em101
  • $==oct"0b".$_; transformar binário em outubro (o mesmo que dec, abaixo de 8)
  • $==$=>3?7-$=:$=;se > 3oper 7-. (A partir daí no one== 0)
  • say$=?chr 68-$=:"no one"caso contrário 0, imprima char a partir do valor, caso contrário, imprima no one.

Perl 71 (baseado em matriz)

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

ligeiramente diferente na etapa de impressão: A saída é baseada em uma 'matriz' .

Perl 81 (baseado em contagem)

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

Significado diferente:

  • $c=A Inicialize um contador c com A.
  • map{$a[$_%2]=$c++;$b[$_%2]++}splitContador b conta par e ímpar, uma única loja que
  • say$b[0]==1?$a[0]: se mesmo contador == 1? Também imprima jogador par .
  • $b[0]==2?$a[1]:se mesmo contador == 2? Também imprima jogador estranho .
  • :"no one"mais imprima no one.

Bash 85 (baseado em matriz)

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

Isso é baseado na minha segunda versão perl:

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) faça o índice pos.
    • $ 1% 2 transforma o primeiro argumento em binário usando mod
    • $ 2 e 1 transformam o segundo argumento em binário usando and
    • << 2 deslocar para a esquerda é igual a*4
    • * 2 multiplique por 2 é igual a <<1.
  • ((c>3))&&c=$((7-c)) se c> = 4 então c = 7-c.
  • o=() declarar uma matriz
  • echo ${o[c]} com base na matriz

Bash 133 (baseado em contagem)

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]=Carmazena o jogador na variável a [par] e a [ímpar]
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))conte par / ímpar em b.
  • case $b in 1) echo ${a[0]} caso o contador par == 1 imprima o par
  • 2)echo ${a[1]};; case even counter == 2 print odd player
  • *)echo no one;esacmais imprima no one.

Bash 133 (baseado em contagem)

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)

Mesma versão, usando a condição e o grupo de comandos do bash em vez de case ... esac


0

Linguagem do Game Maker, 116

Minha nova resposta depende muito da fórmula do 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)]

O código antigo compilado com variáveis ​​não inicializadas como 0, 183 caracteres:

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

Editar # 1 - Código totalmente diferente


Interessante!? Eu não conhecia esse idioma antes! Mas como essa linguagem permite o uso de array, esse código parece não ser o menor possível para esse trabalho.
F. Hauri

@ F.Hauri Sim, estou tentando usar matrizes para reduzi-las.
Timtech # 03:

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

chamar ?z(1,2,3)ou atribuir a uma variável com q=z(1,2,3), ou até mesmo usar como uma UDF no excel e usar =z(1,2,3)na sua fórmula do excel


0

Python 3, 80 caracteres

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

Nota: a entrada deve ser '1' [ímpar] ou '0' [par]. Por exemplo:

> 1 1 0
C
> 1 1 1
no one

O desafio exige que a entrada seja "separada por espaços". Talvez haja uma maneira eficaz de jogar golfe splite, joinportanto, você ainda pode usar sua int(...input...)ideia (muito inteligente) . ?
Darren Pedra

Você pode remover o que '0b'+eu acho, pelo menos parece redundante para mim e int(input(),2)parece funcionar em um REPL.
FireFly

@DarrenStone eu usei um texto de substituição em vez disso, ver edição
Dhara

@ FireFly Obrigado, você está certo, eu editei minha resposta. Testei o código pela primeira vez com o Python 2, onde o '0b' era necessário.
Dhara

O desafio requer também a entrada para aceitar números de 0 a 5.
Peter Taylor

0

Java, 226 caracteres

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, provavelmente o exemplo mais trivial (algumas operações ternárias):

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);}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.