Par o impar: tres jugadores

15

Es un juego de tres jugadores, juega con una mano.

Al mismo tiempo, cada jugador muestra su mano con 0 a 5 dedos extendidos.

Si todos los jugadores muestran el mismo tipo de número (par o impar), no hay ganador. Pero, de lo contrario, el jugador que muestra diferentes tipos gana los otros dos.

 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

La herramienta solicitada podría usar argumentos (3 argumentos como numéricos entre 0 y 5) o STDIN (3 valores por línea, separados por espacios).

No es necesario verificar la entrada: la entrada irregular puede producir una salida inesperada.

Argumentos o valores en línea se da de izquierda a derecha, desde el jugador A al jugador C .

La salida solo debe contener A, Bo C(en mayúscula) o la cadena no one(en minúsculas, con un espacio regular).

La herramienta puede funcionar solo una vez o como filtro en todas las líneas de entrada.

El código más corto gana.

F. Hauri
fuente
66
Podría ser más interesante como un [rey de la colina]. Juega el juego.
dmckee --- ex gatito moderador el
Me pregunto cómo el hecho de que tengamos 5 dedos (por lo que hay 3 números impares y 2 pares de dedos posibles) afecta la estrategia ganadora ...
Olivier Dulac
@OlivierDulac, 0 también es un número par.
Peter Taylor
En esta regla del juego, sí, esto deja las mismas oportunidades para pares que para números impares (0 2 4 vs 1 3 5)
F. Hauri
@ PeterTaylor: gracias, leí mal la pregunta (y no pensé que contara).
Olivier Dulac

Respuestas:

12

APL ( 34 30)

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

Explicación:

  • 2|⎕: lee una línea de entrada, toma el mod-2 de cada número (dando una lista, es decir 1 0 1)
  • ∘.=⍨: compara cada elemento en el vector con cada elemento en el vector, dando una matriz
  • +/: suma las filas de la matriz, dando para cada elemento a cuántos elementos era igual. Si hubiera dos iguales y uno diferente, ahora tenemos un vector como 2 1 2donde 1denota quién era diferente. Si fueran todos iguales, obtenemos 3 3 3.
  • 1⍳⍨: encuentra la posición de la 1. Si no hay 1, esto devuelve uno más que la longitud del vector, en este caso 4.
  • ⊃'ABC',⊂'no one': muestra la cadena en el índice dado.
marinus
fuente
Buen uso de la programación orientada a arreglos para calcular el índice.
FireFly
8

Mathematica, 45 43 42 41 caracteres

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

Ejemplo:

f[{0 ,0, 0}]

Ninguno

f[{1, 3, 5}]

Ninguno

f[{2, 3, 5}]

UN

f[{2, 3, 4}]

si


Otra solución con 43 42 caracteres:

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

Befunge-98, 61 50 45 caracteres

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

Utiliza la expresión inteligente de Fors para eliminar algunos personajes más. ¡Ahora de una sola línea (es decir, compatible con Unefunge)! Lee hasta que se gana un juego; añadir@ al final para un programa de una sola vez.

Trata el mod de entrada 2 como un número binario, como con mi respuesta JS, luego se basa en la búsqueda de AC y vuelve a 'nadie' si está fuera de los límites (probando si el carácter es ≥'A ', lo que me permite para usar el código cercano como datos: D).

Variación que lee una línea de entrada, produce salida, lee una nueva línea de entrada, etc. hasta que se decide un juego (es decir, no 'nadie'):

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

Luciérnaga
fuente
Porté esto para pescar mi respuesta. Te noté +1 por cierto
Cruncher
4

APL, 30

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

Si se me permite cambiar las variables del sistema por configuración, se pueden eliminar 2 caracteres. (Específicamente, cambiar el origen del índice⎕IO a 0)

La parte crucial

Si representamos todas las probabilidades de la misma manera y todas las igualaciones de la misma manera, entonces una operación de igualdad por pares puede distinguir los 4 casos: 0 0 para B gana, 0 1para A gana, etc.

Explicación

2|⎕Toma entrada y mod 2
2=/Igualdad por pares
1+ Agregue 1 para indexación (las matrices APL se basan en 1 de forma predeterminada)

'BA'('C',⊂'no one')Matriz anidada
Selecciona el elemento correcto de la matriz anidada

TwiNight
fuente
3

C: 88 caracteres

Desafortunadamente, C, como siempre, requiere bastante basura innecesaria. Pero aún así, ¿en qué otro idioma se puede escribir =**++b+**(++y realmente significa algo? Simplemente sublime.

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

Simplemente pase tres números como argumentos, ¡y listo!

Fors
fuente
¿Se especifica el orden preciso de esos preincrementos? Pensé que no lo era ... aunque, podría reemplazarlos con *b[1]etc. sin diferencia de tamaño (aunque con cierta pérdida de elegancia ... :()
FireFly
En rubí: s = "=**++b+**(++" P con toda seriedad, wow, ¿cómo funciona eso ... cómo funciona eso? : O
Pomo de la puerta
@Doorknob es muy inteligente, pero si sustituyes la desreferenciación y los preincrementos con indexación b, e imprimes bastante la condición, deberías poder resolverlo. : D (lápiz y papel también ayudan, para la tabla de verdad resultante)
FireFly
3

GolfScript (31 caracteres)

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

Lógica muy simple: reduce el módulo de entrada 2, luego ordena una copia. El elemento central de la matriz ordenada está en la mayoría, así que busque un índice que sea diferente (y, por lo tanto, en la minoría).

Peter Taylor
fuente
3

Ruby (cuerpo de la función), 42 caracteres

Suponiendo 3 argumentos numéricos a,b y c:

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

Ruby (herramienta de línea de comando), 61 caracteres

La versión 1 viene con 62 caracteres:

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

Pero, aprovechando la respuesta de Darren Stone , la Versión 2 se reduce a 61 caracteres:

i=0;$*.map{|n|i+=i+n.to_i%2};$><<['zCBAABCz'[i],'no one'].min
Jonathan Hefner
fuente
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]
Piedra de Darren
fuente
['no one',?C,?B,?A]== %w(no\ one C B A)(2 caracteres guardados).
daniero
Agradable. Aplicado eso. ¡Gracias!
Darren Stone el
2

JavaScript (nodo), 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 que la pelota ruede ... espera la entrada como tres argumentos adicionales. Utiliza el siguiente patrón para entrada / salida ( /representa "nadie"):

  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
Luciérnaga
fuente
2

GolfScript, 36 35 33 caracteres

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

Toma la entrada como se describe desde STDIN. También puede probar el código en línea .

Howard
fuente
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 analiza la línea de entrada en dígitos distintos
  • map{$_%2 toma esta lista y calcula el valor mod 2 (par o impar)
  • oct"0b".join"", toma esta lista de valores mod, los une en una cadena, agrega un especificador octal y convierte la cadena en un número.

Básicamente, lo que hice fue crear una tabla de verdad, y luego la reordené cuidadosamente para que tuviera una operación de inversión $x == 4. Entonces $x >=4, si hicimos la inversión [$x>=4?7-$x:$x]que usamos para indexar en la matriz('no one','C','B','A')

No es el código más corto posible, pero en realidad no es ruido de línea ... lo cual es notable en sí mismo.

Perl: 74 caracteres + 3 banderas = 77, corre con perl -anE '(code)'

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

Esta es una mejora, al aprovechar la división automática (la -a), digamos (la -E), y finalmente descubrir qué estaba mal en la comparación.

Joe
fuente
¿Por qué en >=4lugar de simplemente >3? +1 por los consejos '0b'.que no conocía antes
F. Hauri
Intenté ambos en el depurador (> 3 y> = 4), y no estoy seguro de por qué, pero el> = 4 funcionó, pero> 3 no funcionó. Tampoco puedo explicarlo (¿posiblemente depurador borked?) A mi propia satisfacción
Joe
parece que has tenido un personaje extra en ambos aspectos, lo que solucioné. Además, las banderas cuentan como caracteres.
Pomo de la puerta
2

Common Lisp, 114 106 70 caracteres

A partir de los tres valores, cree un par que represente la diferencia de paridad entre elementos adyacentes. Trátelo como un número binario para indexar en la lista de resultados.

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

Algoritmo anterior:

(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")))
Paul Richter
fuente
2

Pitón 2, 54

f=lambda a,b,c:[['no one','C'],'BA'][(a^b)&1][(a^c)&1]
La cripta
fuente
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"]&

Pruebas

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

"nadie"
"nadie"
"B"
"A"
"C"

DavidC
fuente
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
Robin Green
fuente
1

R 67

z="no one";c("A","B","C",z,z)[match(2-sum(x<-scan()%%2),c(x,2,-1))]
flodel
fuente
¡Interesante! ¿Cómo podría probar esto? ¿Qué tengo que correr (tal vez un shebang?)
F. Hauri
Deberá comenzar una sesión interactiva de R (por ejemplo /usr/bin/R) y luego ingresar el código anterior. scan()es lo que le pedirá la entrada: un ejemplo sería escribir 1[space]3[space]5[space][enter][enter]y verá la salida correspondiente (aquí no one) impresa en la pantalla. Puede descargar R aquí: 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);}

No es tan breve como mi respuesta de Ruby, pero estoy contento con eso, teniendo en cuenta el mainrudo.

Piedra de Darren
fuente
1

Pescado - 41

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

Robó la respuesta anterior de FireFly y la portó para pescar porque el uso de registros en peces nos permite eliminar algunos caracteres. Sin embargo, perdí algunos caracteres al no tener el operador horizontal si.

Esto toma parámetros a travé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
Cruncher
fuente
Ooooooooooo lindo!
F. Hauri
Hm, pez eh. ¿Tienes trampolín? si es así, tal vez podría usar (el equivalente de) #@...<al final para guardar un personaje. Ah, y su código actual me parece 42 caracteres, así que disminuya ese recuento de caracteres suyo. :)
FireFly
@FireFly gracias! Eso salvó un char, y tienes razón, fui contado por uno. Mi editor de texto dijo "col 43" al final. Pero, por supuesto, el cursor en una línea vacía dice "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:con una colección

Paul Richter
fuente
1

JavaScript (ES6) / CoffeeScript, 50 bytes

Utiliza la tabla de verdad según la respuesta de Firefly pero adopta un enfoque más directo en el acceso a los personajes:

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

Manifestación

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

rink.attendant.6
fuente
0

Pitón 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")
Ramchandra Apte
fuente
0

Pitón 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")
Ramchandra Apte
fuente
0

Dos métodos diferentes en dos idiomas diferentes + variaciones -> 6 respuestas

Básicamente, hay 2 formas para esta operación:

  • array basado: Construyó un número binario de 3 dígitos, que toma la respuesta de una matriz
  • count basado: Cuenta pares e impares, y mira si hay un count == 1

Perl 71 (basado en matriz + variación)

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

Uno de mis perl más cortos:

  • s/(.)\s*/$1&1/eg;transformar una cadena como 1 2 3en101
  • $==oct"0b".$_; transformar binario a oct (igual que dec, debajo de 8)
  • $==$=>3?7-$=:$=;si > 3oper 7-. (Desde allíno one == 0)
  • say$=?chr 68-$=:"no one"si no 0, imprime char desde el valor, de lo contrario imprimeno one .

Perl 71 (basado en matriz)

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

ligeramente diferente en el paso de impresión: la salida se basa en un 'matriz' .

Perl 81 (basado en conteo)

$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 Inicializar un contador c conA .
  • map{$a[$_%2]=$c++;$b[$_%2]++}splitContador b cuenta par e impar, a única tienda cuál
  • say$b[0]==1?$a[0]: si incluso contador == 1? También imprimir incluso jugador.
  • $b[0]==2?$a[1]:si incluso contador == 2? También imprimir jugador impar .
  • :"no one"De lo contrario imprimir no one.

Bash 85 (basado en matriz)

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

Esto se basa en mi segunda versión de Perl:

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) hacer el índice pos.
    • $ 1% 2 transforma el primer argumento en binario usando mod
    • $ 2 y 1 transforman el segundo argumento en binario usando and
    • << 2 desplazamiento a la izquierda es lo mismo que*4
    • * 2 multiplicar por 2 es lo mismo que <<1.
  • ((c>3))&&c=$((7-c)) si c> = 4 entonces c = 7-c.
  • o=() declarar una matriz
  • echo ${o[c]} basado en la matriz

Bash 133 (basado en conteo)

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]=Calmacenar jugador en la variable a [par] y a [impar]
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))contar par / impar en b.
  • case $b in 1) echo ${a[0]} en caso de que incluso el contador == 1 imprimir incluso jugador
  • 2)echo ${a[1]};; caso incluso contador == 2 imprimir jugador impar
  • *)echo no one;esacDe lo contrario imprimir no one.

Bash 133 (basado en conteo)

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)

Misma versión, usando la condición de bash y el grupo de comandos en lugar de case ... esac

F. Hauri
fuente
0

Game Maker Language, 116

Mi nueva respuesta se basa en gran medida en la fórmula de 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)]

El antiguo código compilado con variables no 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"}}

Edición n. ° 1 : código completamente diferente

Timtech
fuente
¿¡Interesante!? ¡No conocía este idioma antes! Pero como este lenguaje permite el uso de array, este código parece no ser el más pequeño posible para este trabajo.
F. Hauri
@ F.Hauri Sí, estoy tratando de usar matrices para acortarlo.
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))))
omiel
fuente
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

llame ?z(1,2,3)o asigne a una variable con q=z(1,2,3), o incluso use como UDF dentro de Excel, y use =z(1,2,3)en su fórmula de Excel

SeanC
fuente
0

Python 3, 80 caracteres

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

Nota: la entrada debe ser '1' [impar] o '0' [par]. Por ejemplo:

> 1 1 0
C
> 1 1 1
no one
Dhara
fuente
El desafío requiere que la entrada esté "separada por espacios". Tal vez haya una manera de jugar golf de manera efectiva splity joinasí pueda seguir usando su int(...input...)idea (muy inteligente) . ?
Darren Stone
Podría eliminar el '0b'+, creo, al menos me parece redundante y int(input(),2)parece funcionar en un REPL.
FireFly
@DarrenStone Usé un reemplazo de cadena en su lugar, vea editar
Dhara
@FireFly Gracias, tienes razón, edité mi respuesta. Primero probé el código con Python 2, donde se necesitaba el '0b'.
Dhara
El desafío también requiere la entrada para aceptar números del 0 al 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);
}
Anurag
fuente
0

C 101 96

C, probablemente el ejemplo más trivial (algunas operaciones ternarias):

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);}
tasegula
fuente