Pair ou impair: trois joueurs


15

C'est un jeu à trois joueurs, jouez d'une seule main.

En même temps, chaque joueur montre sa main avec 0 à 5 doigts tendus.

Si tous les joueurs affichent le même type de nombre (pair ou impair), il n'y a pas de gagnant. Mais sinon, le joueur montrant un autre type gagne les deux autres.

 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

L'outil demandé pourrait utiliser des arguments (3 arguments sous forme numérique entre 0 et 5) ou STDIN (3 valeurs par ligne, séparées par des espaces).

Il n'est pas nécessaire de vérifier l'entrée: une entrée irrégulière peut produire une sortie inattendue.

Les arguments ou les valeurs en ligne est donnée de gauche à droite, du joueur A à joueur C .

La sortie ne doit contenir que A, Bou C(en majuscule) ou la chaîne no one(en minuscules, avec un espace régulier).

L'outil ne peut fonctionner qu'une seule fois ou comme filtre sur toutes les lignes d'entrée.

Victoire de code la plus courte.


6
Pourrait être plus intéressant en tant que [roi de la colline]. Jouez le jeu.
dmckee --- chaton ex-modérateur

Je me demande comment le fait que nous ayons 5 doigts (donc il y a 3 paires et 2 paires de doigts possibles) affecte la stratégie gagnante ...
Olivier Dulac

@OlivierDulac, 0 est également un nombre pair.
Peter Taylor

Dans cette règle de jeu oui, cela laisse les mêmes chances pour les nombres pairs que pour les nombres impairs (0 2 4 vs 1 3 5)
F. Hauri

@PeterTaylor: merci, j'ai mal lu la question (et je ne pensais pas que cela compterait).
Olivier Dulac

Réponses:


12

APL ( 34 30)

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

Explication:

  • 2|⎕: lire une ligne d'entrée, prendre le mod-2 de chaque nombre (donner une liste, ie 1 0 1)
  • ∘.=⍨: comparer chaque élément du vecteur à chaque élément du vecteur, donnant une matrice
  • +/: additionne les lignes de la matrice, donnant pour chaque élément le nombre d'éléments auquel il était égal. S'il y en avait deux identiques et un différent, nous avons maintenant un vecteur comme 2 1 2où le 1dénote qui était différent. S'ils étaient tous les mêmes, nous obtenons 3 3 3.
  • 1⍳⍨: trouver la position du 1. S'il n'y en a pas 1, cela renvoie un de plus que la longueur du vecteur, dans ce cas 4.
  • ⊃'ABC',⊂'no one': affiche la chaîne à l'index donné.

Nice, bonne utilisation de la programmation orientée tableau pour calculer l'index.
FireFly

8

Mathematica, 45 43 42 41 caractères

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

Exemple:

f[{0 ,0, 0}]

personne

f[{1, 3, 5}]

personne

f[{2, 3, 5}]

UNE

f[{2, 3, 4}]

B


Une autre solution avec 43 42 caractères:

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


4

Befunge-98, 61 50 45 caractères

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

Utilise l'expression intelligente de Fors pour raser encore quelques personnages. Désormais monoligne (c'est-à-dire compatible avec Unfunge)! Lit jusqu'à ce qu'une partie soit gagnée; ajouter@ à la fin pour un programme unique.

Traite le mod d'entrée 2 comme un nombre binaire, comme avec ma réponse JS, puis s'appuie sur la recherche de AC et revient à `` personne '' si hors des limites (en testant si le caractère est ≥'A ', ce qui me permet pour utiliser le code à proximité comme données: D).

Variation qui lit une ligne d'entrée, produit une sortie, lit une nouvelle ligne d'entrée, etc. jusqu'à ce qu'un jeu soit décidé (c'est-à-dire pas «personne»):

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


J'ai porté ceci pour pêcher ma réponse. Je t'ai noté. +1 btw
Cruncher

4

APL, 30

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

Si je suis autorisé à modifier les variables système par configuration, 2 caractères peuvent être supprimés. (Plus précisément, modification de l'origine de l'index⎕IO à 0)

Le bit crucial

Si nous représentons toutes les cotes de la même manière et que tous les événements sont identiques, alors une opération d'égalité par paire peut distinguer les 4 cas: 0 0pour B gagne,0 1 pour les victoires A, etc.

Explication

2|⎕Prend entrée et mod 2
2=/égalité par paire
1+ Ajoutez 1 pour l'indexation (les tableaux APL sont basés sur 1 par défaut)

'BA'('C',⊂'no one')Tableau imbriqué
Extrait l'élément correct du tableau imbriqué


3

C: 88 caractères

Malheureusement, C, comme toujours, nécessite beaucoup de déchets inutiles. Mais quand même, dans quelle autre langue peut-on écrire =**++b+**(++et cela signifie réellement quelque chose? Tout simplement sublime.

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

Passez simplement trois nombres comme arguments, et voilà!


L'ordre précis de ces pré-incréments est-il spécifié? Je pensais que ce n'était pas le cas ... bien que vous puissiez les remplacer par *b[1]etc. pour aucune différence de taille (bien qu'une certaine perte d'élégance .. :()
FireFly

En Ruby:: s = "=**++b+**(++"P en toute sincérité, wow, comment ça ... comment ça marche même? : O
Poignée de porte

@Doorknob c'est très intelligent, mais si vous remplacez le déréférencement et les pré-incréments par l'indexation b, et imprimez la condition un peu, vous devriez être en mesure de le comprendre. : D (stylo et papier aide également, pour la table de vérité résultante)
FireFly

3

GolfScript (31 caractères)

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

Logique très simple: réduisez l'entrée modulo 2, puis triez une copie. L'élément du milieu du tableau trié est majoritaire, alors recherchez un indice différent (et donc minoritaire).


3

Ruby (corps de fonction), 42 caractères

En supposant 3 arguments numériques a, bet c:

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

Ruby (outil en ligne de commande), 61 caractères

La version 1 est disponible en 62 caractères:

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

Mais, en se basant sur la réponse de Darren Stone , la version 2 descend à 61 caractères:

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

3

Rubis, 61 caractères

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 caractères enregistrés).
daniero

Agréable. Appliqué cela. THX!
Darren Stone

2

JavaScript (nœud), 87 caractères

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

Pour lancer la balle ... attend l'entrée comme trois arguments supplémentaires. Utilise le modèle suivant pour les entrées / sorties ( /représente "personne"):

  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 caractères

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

Prend l'entrée comme décrit à partir de STDIN. Vous pouvez également tester le code en ligne .


2

Perl, 84 caractères.

$x=oct"0b".join"",map{$_%2}<>=~/(\d)/g;print"",('no one','C','B','A')[$x>=4?7-$x:$x]
  • <>=~/(\d)/g analyse la ligne d'entrée en chiffres distincts
  • map{$_%2 prend cette liste et calcule la valeur mod 2 (pair ou impair)
  • oct"0b".join"", prend cette liste de valeurs de mod, les joint en une chaîne, ajoute un spécificateur octal et convertit la chaîne en nombre.

Fondamentalement, ce que j'ai fait était de créer une table de vérité, puis de la réorganiser soigneusement, j'ai donc eu une opération d'inversion $x == 4. Donc, si $x >=4nous avons fait l'inversion[$x>=4?7-$x:$x] que nous avons utilisée pour indexer dans le tableau('no one','C','B','A')

Ce n'est pas le code le plus court possible, mais ce n'est pas du bruit de ligne ... ce qui est remarquable en soi.

Perl: 74 caractères + 3 drapeaux = 77, exécuté avec perl -anE '(code)'

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

Il s'agit d'une amélioration, en exploitant l'autosplit (le -a), disons (le -E), et enfin en découvrant ce qui n'allait pas avec la comparaison.


Pourquoi >=4au lieu de simplement >3? +1 pour les conseils que '0b'.je ne connaissais pas auparavant
F. Hauri

J'ai essayé les deux dans le débogueur (> 3 et> = 4), et je ne sais pas pourquoi, mais> = 4 a fonctionné, mais> 3 n'a pas fonctionné. Je ne peux pas l'expliquer (peut-être un débogueur borked?) À ma propre satisfaction non plus
Joe

vous semblez avoir eu un caractère supplémentaire dans les deux cas, que j'ai corrigé. De plus, les drapeaux comptent comme des caractères.
Poignée de porte

2

Lisp commun, 114106 70 caractères

À partir des trois valeurs, créez une paire représentant la différence de parité entre les éléments adjacents. Traitez cela comme un nombre binaire à indexer dans la liste des résultats.

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

Algorithme plus ancien:

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

Essai

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

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

Intéressant! Comment pourrais-je tester cela? Que dois-je courir (peut-être un shebang?)
F. Hauri

Vous devrez démarrer une session R interactive (par exemple /usr/bin/R), puis saisir le code ci-dessus. scan()est ce qui vous demandera la saisie: un exemple serait de taper 1[space]3[space]5[space][enter][enter]et vous verrez la sortie correspondante (ici, no one) imprimée à l'écran. Vous pouvez télécharger R ici: cran.r-project.org/mirrors.html
flodel

1

C, 85 caractères

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

Pas aussi court que ma réponse Ruby mais j'en suis satisfait, compte tenu de la maincruauté.


1

Poisson - 41

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

Stole FireFly a répondu à l'improviste et l'a porté à fish car l'utilisation de registres dans fish nous permet de raser certains personnages. J'ai perdu quelques caractères si je n'avais pas l'opérateur horizontal si.

Cela prend les paramètres à travers des arguments.

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 sympa!
F. Hauri

Hm, poisson hein. Avez-vous du trampoline? si c'est le cas, vous pourriez peut-être utiliser (l'équivalent de) #@...<à la fin pour enregistrer un caractère. Oh, et votre code actuel ressemble à 42 caractères pour moi, alors décrémentez ce nombre de caractères. :)
FireFly

@FireFly merci! Cela a sauvé un char, et vous avez raison, j'étais dépassé par un. Mon éditeur de texte a dit "col 43" à la fin. Mais bien sûr, le curseur sur une ligne vide indique "col 1".
Cruncher

1

Smalltalk, 128 caractères

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

envoyer value:avec une collection


1

JavaScript (ES6) / CoffeeScript, 50 octets

Utilise la table de vérité selon la réponse de Firefly mais adopte une approche plus directe dans l'accès aux personnages:

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

Démo

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

Deux méthodes différentes dans deux langues différentes + variantes -> 6 réponses

Il y a essentiellement 2 voies pour cette opération:

  • array basé: Construit un nombre binaire de 3 chiffres, que prendre la réponse d'un tableau
  • count basé: comptez pair et impair, et regardez s'il y a un count == 1

Perl 71 (basé sur un tableau + variation)

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

Un de mes perl les plus courts:

  • s/(.)\s*/$1&1/eg;transformer une chaîne comme 1 2 3en101
  • $==oct"0b".$_; transformer le binaire en oct (identique à dec, moins de 8)
  • $==$=>3?7-$=:$=;si > 3opér 7-. (De làno one == 0)
  • say$=?chr 68-$=:"no one"sinon 0, affichez char à partir de value, sinon print no one.

Perl 71 (basé sur un tableau)

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

légèrement différent dans l'étape d'impression: la sortie est basée sur un «tableau» .

Perl 81 (basé sur le nombre)

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

Signification différente:

  • $c=A Initialiser un compteur c avecA .
  • map{$a[$_%2]=$c++;$b[$_%2]++}splitCompteur b nombre pair et impair, a seul magasin que l'on
  • say$b[0]==1?$a[0]: si même compteur == 1? également imprimer même joueur.
  • $b[0]==2?$a[1]:si même compteur == 2? également imprimer le lecteur impair .
  • :"no one"sinon imprimer no one.

Bash 85 (basé sur la baie)

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

Ceci est basé sur ma deuxième version Perl:

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) faire l'index pos.
    • $ 1% 2 transforme le premier argument en binaire en utilisant mod
    • $ 2 & 1 transforment le deuxième arg en binaire en utilisant and
    • << 2 décalage vers la gauche est identique à*4
    • * 2 multiplié par 2 est identique à <<1.
  • ((c>3))&&c=$((7-c)) si c> = 4 alors c = 7-c.
  • o=() déclarer un tableau
  • echo ${o[c]} basé sur un tableau

Bash 133 (basé sur le nombre)

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]=Cstocker le joueur dans une variable a [pair] et un [impair]
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))compter pair / impair dans b.
  • case $b in 1) echo ${a[0]} dans le cas où même le compteur == 1 imprimer même le joueur
  • 2)echo ${a[1]};; cas même compteur == 2 imprimer lecteur impair
  • *)echo no one;esacsinon imprimer no one.

Bash 133 (basé sur le nombre)

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)

Même version, en utilisant la condition et le groupe de commandes de bash au lieu de case ... esac


0

Langue de Game Maker, 116

Ma nouvelle réponse repose largement sur la formule 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)]

L' ancien code compilé avec des variables non initialisées en 0, 183 caractères:

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

Edit # 1 - Code complètement différent


Intéressant!? Je ne connaissais pas cette langue auparavant! Mais comme ce langage permet l'utilisation de tableaux, ce code ne semble pas être le plus petit possible pour ce travail.
F.Hauri

@ F.Hauri Oui, j'essaie d'utiliser des tableaux pour le raccourcir.
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

appeler avec ?z(1,2,3)ou affecter à une variable avec q=z(1,2,3), ou même utiliser comme UDF dans Excel, et utiliser =z(1,2,3)dans votre formule Excel


0

Python 3, 80 caractères

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

Remarque: l'entrée doit être «1» [impair] ou «0» [pair]. Par exemple:

> 1 1 0
C
> 1 1 1
no one

Le défi exige que l'entrée soit «séparée par des espaces». Il existe peut-être un moyen de jouer efficacement au golf splitet joinvous pouvez donc toujours utiliser votre int(...input...)idée (très intelligente) . ?
Darren Stone

Vous pouvez supprimer le '0b'+je pense, au moins cela me semble redondant et int(input(),2)semble fonctionner dans un REPL.
FireFly

@DarrenStone J'ai utilisé un remplacement de chaîne à la place, voir modifier
Dhara

@FireFly Merci, vous avez raison, j'ai modifié ma réponse. J'ai d'abord testé le code avec Python 2, où le «0b» était nécessaire.
Dhara

Le défi nécessite également l'entrée pour accepter des nombres de 0 à 5.
Peter Taylor

0

Java, 226 caractères

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, probablement l'exemple le plus trivial (quelques opérations ternaires):

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);}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.