De quel côté devrais-je servir?
introduction
Au Tennis, le serveur alterne en servant du côté gauche ou du côté droit du court à chaque point, en commençant par la droite. Il est possible de déterminer de quel côté servir pour ce point uniquement en fonction du score; s'il y a eu un nombre pair de points, vous servez à droite, et après un nombre impair de points, à gauche. La notation au tennis fonctionne comme suit:
Points | Corresponding Call
|
0 | Love
1 | 15
2 | 30
3 | 40
Une fois qu'un joueur marque 4 points, il gagne la partie. Si le score est à égalité à 40-40, l'appel est "Deuce" plutôt que "40-40" ou "40 all". A Deuce, le point suivant est appelé "Avantage [x]" ou "Ad [x]" où x est le joueur qui a marqué. Si le joueur adverse marque ensuite, le score revient à Deuce, mais si le même joueur marque à nouveau, il gagne.
Le défi
Votre tâche consiste à écrire une fonction qui prend le score et renvoie une valeur vraie ou fausse. L'entrée peut être une chaîne contenant l'appel ou une liste contenant les scores. Love, Deuce et Ad doivent être des chaînes, mais le reste des appels peut également être de n'importe quel type numérique. Deuce peut être représenté par une liste de singleton contenant "Deuce" ou une liste avec "Deuce" et une autre valeur de votre choix. Vous pouvez choisir quel côté correspond à la vérité et au faux, mais vous devez spécifier lequel correspond à quel côté dans votre réponse . Les scores seront séparés par un trait d'union, sauf dans le cas de Deuce où ce sera simplement "Deuce". Pour avantage, le score sera "Ad-40" ou "40-Ad".
Gagnant
Il s'agit de code golf, donc le score est le nombre d'octets dans votre fonction et la réponse avec le score le plus bas l'emporte. Les échappatoires standard sont interdites.
Cas de test
Love-Love | True
Love-15 | False
Love-30 | True
Love-40 | False
15-Love | False
15-15 | True
15-30 | False
15-40 | True
30-Love | True
30-15 | False
30-30 | True
30-40 | False
40-Love | False
40-15 | True
40-30 | False
Deuce | True
Ad-40 | False
40-Ad | False
Ces cas de test sont exhaustifs, c'est-à-dire que cette liste représente chaque entrée possible et sa sortie correspondante. J'ai utilisé True pour la droite et False pour la gauche.
Réponses
Retina 0.8.2 , 7 octets
M`4|5
1
Essayez-le en ligne! Le lien comprend des cas de test. Sorties 0pour droite et 1pour gauche. Explication:
M`[45]
Le nombre de 4s et 5s ...
1
... doit être égal à 1 si le service est à gauche.
Perl 5 (-p), 17 , 11 , 10 octets
-6 en utilisant la solution de Neil, -1 grâce à la re-commande de Dom Hastings
$_=1^y;45;
Essayez-le en ligne!
0 pour faux, <> 0 pour vrai
Python 2 , 26 octets
Prend les entrées dans le même format que les cas de test. La sortie est inversée, 1pour les cas faux et 0pour les cas véridiques. La sortie normale serait plus longue de 1 octet avec un -préprogrammé.
lambda s:hash(s)*199%421%2
Essayez-le en ligne!
Haskell , 29 octets
odd.sum.map(mod 882.fromEnum)
Essayez-le en ligne!
Une fonction anonyme prenant un appel avec trait d'union et retournant Trueou False, tout comme dans les cas de test.
Remarque: il semble que nous prenions les valeurs "mod 882", mais en fait dans Haskell mod 882est la fonction \$y \mapsto (882 \bmod y)\$. (Autrement dit: c'est une application partielle mod x y.)
Haskell , 28 octets
f s=[1|c<-s,elem c"45"]==[1]
Essayez-le en ligne!
Implémentez la méthode de Neil de vérifier que la chaîne a exactement un 4 ou 5. Suite de tests de Lynn .
Haskell n'a pas une bonne façon de compter les éléments satisfaisant une propriété. Nous pourrions faire filter(`elem`"45"), mais il semble trop longtemps pour vérifier la liste résultante est un seul élément, ou vérifier qu'il est l' un des "4"ou "5".
Nous utilisons une compréhension de liste pour faire une liste avec un 1pour chaque caractère "45", et vérifier si nous nous retrouvons avec la liste [1]. N'importe quelle valeur pourrait être utilisée à la place de 1here, y compris slui-même.
Gelée , 6 octets
OP%25Ḃ
Un lien monadique acceptant une liste de caractères qui donne 1s'il sert de la droite ou 0s'il sert de la gauche.
Essayez-le en ligne!
Comment?
OP%25Ḃ - Link: list of characters e.g. "15-30"
O - ordinals [49,53,45,51,48]
P - product 286085520
25 - twenty-five 25
% - modulo 20
Ḃ - modulo-2 0
Aussi 6 octets utilisant l' observation de Neil (résultat inversé):
f⁾45LḂ - Link: list of characters, S
⁾45 - list of characters = "45"
f - filter (S) keep (those characters)
L - length -> 0, 1, or 2; but only 1 when serving from the left
Ḃ - modulo-2
Raku , 12 octets
{1-m:g/1|4/}
Essayez-le en ligne!
Une fonction anonyme qui renvoie zéro pour la gauche et différente de zéro pour la droite. Cela utilise l'observation de Neil selon laquelle il doit y en avoir exactement un 1ou 4pour que ce soit le service du côté gauche.
Pyth , 10 octets
%%CSz287 2
Essayez-le en ligne!
Explication, un peu différent des autres ici ...
%%CSz287 2
Sz - Sort the input string, (so that Love-15 and 15-Love provide the same string)
CSz - Get the 256 base int value of the string.
% ^ 287 - Modulo that number by 287
% ^ 2 - Return whether that number is odd or even.
Scala , 30 29 octets
_.matches("[^45]*[45][^45]*")
Essayez-le en ligne!
Ma solution utilise false pour droite et true pour gauche.
- -1 Merci à Jo-King ♦ !
JavaScript (ES6), 26 octets
L'utilisation de la méthode de @ Neil permet d' économiser 4 octets supplémentaires.
Attend une chaîne. Renvoie 0 pour gauche ou 1 pour droite .
s=>s.split(/4|5/).length%2
Essayez-le en ligne!
JavaScript (ES6), 30 octets
Attend une paire de scores de chaîne (ou un singleton pour Deuce). Renvoie 0 pour la droite ou 1 pour la gauche .
a=>parseInt(a.join`2`,36)%31%2
Essayez-le en ligne!
JavaScript (ES6), 34 octets
Attend une chaîne. Renvoie 0 pour gauche ou 1 pour droite .
s=>parseInt(s[0]+s[3]+s[5],35)%3%2
Essayez-le en ligne!
Comment?
Regarder le 1er et le 4e caractère fournit suffisamment d'informations, sauf si le score l'est, Love-Xauquel cas nous devons également regarder le 6e caractère. Pour faciliter les choses, il suffit de regarder ces 3 positions dans tous les cas et de les hacher.
Vous trouverez ci-dessous un résumé du processus pour chaque entrée possible.
input | s[0]+s[3]+s[5] | parsed as base-35 | mod 3 | mod 2
-------------+----------------+-------------------+-------+-------
"Love-Love" | "LeL" | 26236 | 1 | 1
"Love-15" | "Le1" | 26216 | 2 | 0
"Love-30" | "Le3" | 26218 | 1 | 1
"Love-40" | "Le4" | 26219 | 2 | 0
"15-Love" | "1Lv" | 1991 | 2 | 0
"15-15" | "11undefined" | 2906423713803553 | 1 | 1
"15-30" | "13undefined" | 3064054991147303 | 2 | 0
"15-40" | "14undefined" | 3142870629819178 | 1 | 1
"30-Love" | "3Lv" | 4441 | 1 | 1
"30-15" | "31undefined" | 8423518420834803 | 0 | 0
"30-30" | "33undefined" | 8581149698178553 | 1 | 1
"30-40" | "34undefined" | 8659965336850428 | 0 | 0
"40-Love" | "4Lv" | 5666 | 2 | 0
"40-15" | "41undefined" | 11182065774350428 | 1 | 1
"40-30" | "43undefined" | 11339697051694176 | 0 | 0
"Deuce" | "Dcundefined" | 36875963981381680 | 1 | 1
"Ad-40" | "A4undefined" | 27969796811459804 | 2 | 0
"40-Ad" | "4Aundefined" | 11891406522397304 | 2 | 0
Gelée , 7 octets
Ṣ“Œọ‘ḥḂ
Essayez-le en ligne! (le pied de page teste le programme sur toutes les entrées possibles)
Prend entrée sous la forme d'une liste de chaînes, par exemple ["Love","15"], ["40","Ad"]ou ["Deuce"]. Sorties 0 ou 1, dans le sens opposé du tableau des cas de test de la question (c'est-à-dire 0 = droite, 1 = gauche).
Cela utilise à peu près la même idée que les autres réponses: nous trouvons simplement une fonction de hachage qui mappe chaque entrée possible à la sortie correcte. Afin de rendre plus probable qu'une fonction de hachage sélectionnée au hasard produirait le résultat correct (réduisant ainsi le nombre d'octets nécessaires pour spécifier la fonction de hachage que nous voulons), la liste d'entrée est triée avant de la hacher (réduisant ainsi presque de moitié le nombre de cas que nous devons faire correspondre; un score de X - Y produit toujours la même réponse qu'un score de Y - X ).
Il n'y avait aucune compétence dans la sélection de la fonction de hachage; il y avait une probabilité de 2 à 12 pour qu'une fonction de hachage donnée fonctionne, ce qui est assez élevé, j'ai donc simplement essayé les fonctions de hachage intégrées de Jelly dans l'ordre de la configuration la plus courte à la plus longue, et j'ai choisi la première qui fonctionnait. C'est la fonction de hachage [19,221]. Parce que la configuration de la fonction de hachage pour générer des booléens nécessiterait une chaîne de configuration beaucoup plus grande, j'ai simplement utilisé le format de sortie par défaut (celui-ci génère des nombres compris entre 1 et 221) et j'ai pris le bit le moins significatif de la sortie comme sortie.
Explication
Ṣ“Œọ‘ḥḂ
Ṣ Sort {the input list}
ḥ Hash {the sorted list}, with configuration
“Œọ‘ [19, 221] (compressed representation)
Ḃ Take the least significant bit of the output
Bash , 20 octets
[[ $[$1] = *[14]* ]]
Essayez-le en ligne!
Dans Bash, toutes les variables non définies sont à 0 dans $[arithmetic mode]. Un test rapide a révélé que si l'entrée était évaluée en mode arithmétique, le modèle suivant apparaît:
Result: 0 10 -10 15 -15 25 -25 30 -30 40 -40
Side: R L L L L R R R R L L
Ainsi, si le résultat arithmétique contient un 1 ou un 4, c'est un service gauche, sinon c'est un service droit.
Husk , 9 octets
%2`%25Πmc
Essayez-le en ligne!
Même méthode que la réponse de Jonathan Allan.
Lot, 32 octets
@set/an=(%1)/10%%3^&1
@echo %n%
Prend des entrées sur la ligne de commande et des sorties 1pour les services à gauche et 0pour les services à droite. Explication: Sur la base de la réponse de @ GammaFunction, en effectuant une évaluation arithmétique sur l'entrée, et en supposant que les variables Love, Adet Deucesont non définies et donc nulles, le chiffre des dizaines du résultat est 1ou 4pour les services à gauche et 0, 2ou 3pour les services à droite . Ceci est ensuite encore réduit via modulo avec 3et au niveau du bit et avec 1pour produire le résultat souhaité.
Charbon , 9 octets
⁼¹LΦθ№45ι
Essayez-le en ligne! Le lien est vers la version verbeuse du code. La sortie est un booléen Charcoal, où -(True) signifie que vous servez à gauche et une sortie vide (False) signifie que vous servez à droite. Explication:
Φθ Filter input where
№45ι Literal string `45` contains character
L Length
⁼¹ Equals literal `1`
Implicitly print
Plus long que Retina, soupir ... (J'ai trouvé plusieurs formulations pour 9 octets, mais aucune plus courte qui n'était pas boguée.)
05AB1E , 6 octets
45S¢O≠
Réponse Retina de Port of @Neil , alors assurez-vous de lui donner un vote positif !!
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
45S # Push 45, and convert it to a list of digits: [4,5]
¢ # Count both of those in the (implicit) input-string
O # Take the sum of this pair of counts
≠ # And check that it's NOT equal to 1
# (after which the result is output implicitly)
MathGolf , 7 octets
▒$ε*N%¥
Port of @JonathanAllan 's Jelly réponse , alors assurez-vous de lui donner un vote positif !!
Essayez-le en ligne.
Explication:
▒ # Convert the (implicit) input-string to a list of characters
$ # Convert each character to its codepoint integer
ε* # Take the product of this list (reduce by multiplication)
N% # Modulo-25
¥ # Modulo-2
# (after which the entire stack joined together is output implicitly as result)