Score de quilles à dix quilles - Édition World Bowling

20

Classement du World Bowling

Beaucoup de gens sont allés à leur centre de bowling local pour jouer quelques parties de bowling, et beaucoup de gens continuent à avoir du mal à calculer leurs scores. Le World Bowling a introduit un système de notation simplifié afin d'attirer plus de gens dans ce sport. Ce système de notation est utilisé dans les jeux internationaux.

Le système de notation fonctionne comme ceci (de Wikipedia ):

Le système de notation du World Bowling - décrit comme la "notation de la trame actuelle" [32] - garantit les broches comme suit:

  • grève: 30 (indépendamment des résultats des rôles suivants)
  • de rechange: 10 plus de chutes au premier rouleau du cadre actuel
  • ouvert: chute totale pour l'image actuelle

Si vous n'êtes pas familier avec le bowling à dix quilles, voici un récapitulatif.

Il y a 10 quilles à la fin d'une piste de bowling où le but est de les abattre toutes avec une boule de bowling. Vous obtenez 2 rouleaux d'une balle pour tenter de les faire tomber, de préférence en les renversant tous avec le premier lancer (connu sous le nom de frappe ). Si vous obtenez un coup, ce cadre est terminé et vous n'avez pas besoin de faire rouler la balle une deuxième fois. Une grève vaut 30.

Si vous ne renversez pas les dix, vous obtenez un autre jet. Si vous abattez toutes les broches restantes, cela s'appelle une pièce de rechange . Le score vaut 10 quilles + le nombre de quilles renversées au premier lancer. Par exemple, si j'ai abattu 7 broches, puis réussi à abattre les 3 restantes, cela vaudrait 17.

Si après votre deuxième lancer, vous ne parvenez pas à abattre les dix, cela s'appelle un cadre ouvert . Le score vaut le nombre total de broches renversées pour cette image.

Il y a 10 images dans un jeu . Si vous êtes familier avec le score de bowling traditionnel, vous n'obtenez pas de jet supplémentaire dans le 10ème cadre avec le World Bowling Scoring. Dans le classement traditionnel des quilles, il faut 12 frappes consécutives pour obtenir un score parfait de 300, tandis que la notation du World Bowling ne nécessite que 10 frappes consécutives.

Défi

Votre défi consiste à calculer le score donné à partir d'une feuille de score.

Sur une feuille de match, un échec est indiqué par un tiret ( - ), une frappe avec un X et un remplaçant avec une barre oblique ( / ). Si ceux-ci ne s'appliquent pas, le nombre de chutes est simplement indiqué par un nombre (1-9). Les fautes et les écarts sont également enregistrés sur les feuilles de score, mais vous n'avez pas à vous en préoccuper.

Contribution

Vous recevrez une chaîne composée de scores pour chaque image, et vous aurez un total de dix images. Chaque trame aura jusqu'à deux valeurs, ou aussi peu qu'une valeur s'il y a eu une grève. Votre entrée peut être un paramètre de chaîne d'une fonction, lu à partir d'un fichier ou de STDIN.

Par exemple, si j'ai abattu 1 broche sur mon premier rouleau, puis abattu 2, le cadre ressemblerait à "12". Cela ne signifie pas 12 (douze), mais signifie 1 et 2, pour un total de 3.

Si je manquais chaque épingle avec les deux rouleaux (boules de gouttière), cela ressemblerait à ceci "-" (score de 0).

Chaque cadre sera séparé par un espace.

Exemple d'entrée

-- 9- -9 X -/ 8/ 71 15 44 X

Pour décomposer cet exemple,

  • Image 1 (-) - les deux rouleaux manqués. marqué 0
  • Image 2 (9-) - renversé 9 sur le premier rouleau, raté sur le deuxième rouleau. Score 9
  • Frame 3 (-9) - Tout manqué sur le premier, obtenu 9 sur le second. Score 9
  • Frame 4 (X) - Strike, renversé tous les dix. Score 30
  • Frame 5 (- /) - Spare, a tout raté le premier, a tout renversé avec le 2e lancer. Score 10 + 0 = 10
  • Cadre 6 (8 /) - Rechange, 8 broches sur le premier rouleau, renversé les 2 autres avec le deuxième rouleau. Score 10 + 8 = 18
  • Cadre 7 (71) - cadre ouvert, 7 broches sur le premier rouleau, 1 broche sur le deuxième rouleau. Score 7 + 1 = 8
  • Les cadres 8, 9, 10 suivent les mêmes exemples que ci-dessus.

Production

La sortie sera simplement une valeur qui a la somme des scores des 10 images. En utilisant l'exemple d'entrée, la sortie sera 128. Votre sortie peut être une chaîne ou un type numérique. Il peut s'agir d'une valeur de retour de fonction ou écrite dans STDOUT.

Règles

  • Supposons que l'entrée sera toujours valide. Par exemple, une trame non valide serait "/ 8", "XX", "123", "0", etc.
  • Vous n'avez pas à vous soucier des écarts ou des fautes.
  • Votre code peut être un programme complet ou une fonction qui prend une chaîne et renvoie le score.
  • Votre code ne doit lever aucune exception.
  • C'est le golf de code, la réponse avec le moins de victoires d'octets.
  • Les langues qui utilisent des inclusions ou des importations doivent inclure les instructions d'importation dans leur code et compter dans le nombre d'octets.

Cas de test

"-- 9- -9 X -/ 8/ 71 15 44 X" -> 128
"-- -1 2- 12 22 5- 42 61 8- 72" -> 45
"X X X 1/ 2/ 3/ 4/ 5/ -- 9/" -> 174
"X X X X X X X X X X" -> 300
"-- -- -- -- -- -- -- -- -- --" -> 0
Makotosan
la source
21
Je suis déçu que ce ne soit pas un défi de bowling de code
Jo King
13
Votre premier exemple de rechange dit que le score serait de 13, mais je pense que c'est censé être 17.
Jo.
@Jo. Bonne prise. J'ai mis à jour la question pour corriger cette erreur.
Makotosan
@JoKing Je pensais que c'était un défi de bowling composé de 10 sous-défis lorsque j'ai vu le titre pour la première fois.
Weijun Zhou
1
L'un des défis les mieux documentés et écrits que j'ai vus.
Joshua

Réponses:

7

05AB1E , 12 11 octets

Code

S'/T:'X30:O

Essayez-le en ligne!

Explication

S             # Split the string into a list of characters
 '/T:         # Replace '/' with 10
     'X30:    # Replace 'X' with 30
          O   # Sum up the array (ignoring non-number elements)
Adnan
la source
7

JavaScript, 43 octets

f=([c,...s])=>c?({'/':10,X:30}[c]|c)+f(s):0

Comment ça marche

Nous convertissons chaque personnage en son point:

  • «X» vaut 30 points
  • '/' vaut 10 points
  • '1' .. '9' vaut 1 .. 9 points
  • d'autres personnages valent 0 point

Additionnez ensuite tous les points.

Convertir

L' opérateur OR au niveau du bit |convertit son opérande en Int32 avant d'opérer. Lors de la conversion en Int32, la valeur est d'abord convertie au format Number (64bit float number), puis jonction en Int32 (ou convertie en 0 si non valide).

  • ToInt32({'/':10,X:30}[c]) pourrait se lire comme suit:
    • si c == '/': le résultat est 10;
    • si c == 'X': le résultat est 30;
    • sinon: le résultat est ToInt32(undefined)-> ToInt32(NaN)-> 0;
  • ToInt32(c) pourrait être:
    • si c == '1' ... '9': le résultat est 1 .. 9;
    • si c == '': Number(c)est 0, le résultat est 0;
    • sinon: Number(c)est NaN, le résultat est 0;
  • Au niveau du bit ou ici est identique à "ajouter", car l'un de ses opérandes sera 0

Somme

  • [c,...s] = slaissez c = s[0], et s = s.slice(1);
    • si s est une chaîne vide, c n'est pas défini ;
    • sinon, c est la première lettre de s
  • non défini est faux, la chaîne non vide (y compris l'espace) est vraie
tsh
la source
1
Pouvez-vous expliquer votre code? a l'air vraiment bien
Luis felipe De jesus Munoz
@LuisfelipeDejesusMunoz Je viens d'en ajouter.
tsh
5

Stax , 13 octets

─*âⁿ┴8òt↨HÉ÷8

Exécuter et déboguer

Déballé, non golfé et commenté c'est ainsi.

F               for each character in input, execute...
 9R$'/20*+'X+   build the string "123456789////////////////////X"
 I              get the index of the current character in string
 ^+             increment and add to running total
                (index is -1 when no match; space and dash are 0 score)

Exécutez celui-ci

récursif
la source
3

Python 2 , 55 octets

lambda l:sum(map(('123456789/'+'X'*20).rfind,l))+len(l)

Essayez-le en ligne!

Basé sur l'approche d'index de chaîne de nombreuses solutions.

xnor
la source
3

Java 8, 64 59 46 octets

s->s.map(c->c<46?0:c<48?10:c>87?30:c-48).sum()

-5 octets grâce à @Neil .
-13 octets grâce à @ OlivierGrégoire .

Explication:

Essayez-le en ligne.

s->               // Method with an IntStream parameter and integer return-type
  s.map(c->       //  Loop over the characters
          c<46?   //   If the character is a space or '-':
           0      //    Count it as 0
          :c<48?  //   Else-if it's a '/':
           10     //    Count it as 10
          :c>87?  //   Else-if it's an 'X':
           30     //    Count it as 30
          :       //   Else (it's a digit):
           c-48   //    Count it as the value of the digit
       ).sum()    //   And sum everything
Kevin Cruijssen
la source
1
("123456789//"+1e6+1e6+"X")semble économiser 5 octets.
Neil
C'est une technique intelligente pour créer une chaîne de remplissage.
Makotosan
1
46 octets
Olivier Grégoire
3

F #, 106 103 octets

let s c=Seq.sumBy(fun x->if x=' '||x='-'then 0 elif x='X'then 30 elif x='/'then 10 else int(string x))c

Essayez-le en ligne!

Je pense que ce puzzle (sans le golf) serait une excellente question pour un guide "Programmation fonctionnelle pour débutants". Et je devrais savoir!

-3 de Kevin Cruijssen, pour avoir remarqué que les espaces entre 'et "puis" peuvent être supprimés. Merci!

La solution Stax de recursive qui utilise des index de chaîne est très très bonne. Si vous le portez sur F #, vous pouvez l'obtenir pour 77 octets :

let s c=Seq.sumBy(fun x->"123456789/???????????????????X".IndexOf(char x)+1)c

Essayez ceci en ligne!

Ciaran_McCarthy
la source
1
Je ne connais pas très bien F #, mais il semble que vous puissiez supprimer les espaces après '-3 octets.
Kevin Cruijssen
Moi non plus! Mais tu as raison, bien repéré! Merci!
Ciaran_McCarthy
2
@Ciaran_McCarthy: Cela ne me dérange pas si vous copiez ma solution si vous souhaitez l'inclure également. Les gens ici sont généralement assez ouverts sur ce genre de chose. C'est un effort coopératif pour trouver le code le plus petit, même s'il s'agit officiellement d'un concours.
récursif
1
Merci récursif. Je vais l'inclure ensuite, car c'est une très bonne solution, et il est intéressant de voir à quoi cela ressemble dans différentes langues.
Ciaran_McCarthy
2

Gelée , 17 octets

ḟ⁾ -“X0/⁵”yV€o30S

Un lien monadique acceptant une liste de caractères et renvoyant un entier

Essayez-le en ligne!

Comment?

ḟ⁾ -“X0/⁵”yV€o30S - Link: list of characters
 ⁾ -              - literal list of characters [' ','-']
ḟ                 - filter discard
    “X0/⁵”        - literal list of characters ['X','0','/','⁵']
          y       - translate (change 'X's to '0's and '/'s to '⁵'s)
           V€     - evaluate €ach character as Jelly code (the '⁵'s become 10s)
             o30  - logical OR with 30 (change all instances of 0 to 30)
                S - sum

Également à 17 ans:

”/ẋ20ØD;;”XḊiЀ⁸S

Essayez ça

Jonathan Allan
la source
2

Rétine , 17 octets

X
///
/
55
\d
*
_

Essayez-le en ligne!

Je ne suis pas tout à fait au courant des derniers changements de Retina. Je vais m'intéresser davantage à eux lorsque j'en aurai l'occasion et voir s'il y a de nouvelles astuces pour jouer au golf. Le code transforme toutes les frappes en trois pièces de rechange, toutes les pièces de rechange en dix points, puis tous les points pour le nombre correspondant de soulignements. Ensuite, il compte le nombre de soulignements.

PunPun1000
la source
2

Perl 5 -pF , 30 27 octets

-3 octets grâce à Xcali

#!/usr/bin/perl -pF
$\+=m%/%+3*/X/.0+$_ for@F}{

Essayez-le en ligne!

Ton Hospel
la source
Vous pouvez couper deux octets en utilisant /X/au lieu de y/X//et un de plus en utilisant à la m%/%place de y%/%%: Essayez-le en ligne!
Xcali
@Xcali Ah, bien sûr. La myopie du golf classique, je pensais toujours à y///partir de quand je les ai fait en dehors d'une boucle. Merci
Ton Hospel
1

05AB1E , 14 octets

þ`I…/aXS¢ƶT*`O

Essayez-le en ligne!

Explication

þ`              # Push the digits of the input on the stack (removes everyting that isn't a digit)
  I…/aXS        # Push the input and the array "/","a","X" on the stack
        ¢       # Index of each element in the input ...
         ƶT*    # ... multiplied by its index (a could be anything that can't be found in the input), multiplied by 10.
            `O  # Sum the stack, implicit display
Kaldo
la source
1

J , 33 octets

1#.31|('-123456789',20 1#'/X')i.]

Essayez-le en ligne!

Explication:

] l'entrée

('-123456789',20 1#'/X')ajoute 20 /et un Xà la chaîne-123456789

i. trouve les indices de l'entrée dans la chaîne ci-dessus

31|modulo 31 - pour se débarrasser des espaces - ils ne sont pas trouvés dans la chaîne, donc i.retourne 31 pour eux

1#. trouve la somme des indices

Galen Ivanov
la source
Étant donné que J et Red sont deux langues complètement différentes, il est préférable de publier deux réponses séparées, même si elles peuvent faire de même. Vous pouvez ajouter un lien de la réponse rouge à cette réponse J, indiquant qu'il s'agit d'un port de votre réponse J.
Kevin Cruijssen
@Kevin Cruijssen - D'accord, merci - je vais le faire. La raison de les publier ensemble est qu'évidemment la solution rouge n'est pas compétitive (bien que très lisible :))
Galen Ivanov
1

Python 2 , 67 octets

-3 octets grâce à @KevinCruijssen

lambda I,p='-123456789/'+20*'X':sum(p.rfind(i)for i in I if i in p)

Essayez-le en ligne!

Possum mort
la source
1
Vous pouvez enregistrer 3 octets en changeant '-123456789'+'/'*20+'X':sum(p.index(i)à'-123456789/'+'X'*20:sum(p.rfind(i)
Kevin Cruijssen
@KevinCruijssen merci, bien!
Dead Possum
1

Gelée , 12 octets

⁾/X,“½œ‘y|0S

Essayez-le en ligne!

Comment ça marche

⁾/X,“½œ‘y|0S  Main link. Argument: s (string)

⁾/X,“½œ‘      Literal; yield [['/', 'X'], [10, 30]].
        y     Transliterate; replace '/' with 10, 'X' with 30.
         |0   Bitwise OR with 0. Bitwise operators attempt to cast to int, mapping 
              '0', ..., '9' to 0, ..., 9. All other characters map to 0.
           S  Take the sum.
Dennis
la source
1

Kotlin , 50 octets

x->x.sumBy{"123456789/_${Math.E}_X".indexOf(it)+1}

Essayez-le en ligne!

J'espère que ce n'est pas contre les règles de répondre à votre propre question, mais je voulais participer au plaisir.

Math.Eproduit la valeur 2.718281828459045. Je l'utilise pour créer une chaîne de remplissage pour pousser X en position 30.

indexOfobtient la position (basée sur 0) du caractère dans la chaîne "12345 ...". S'il n'est pas trouvé, il renvoie -1. Nous ajoutons 1 pour faire ces 0, et cela fait également de la position basée sur 0 la valeur de la chaîne.

Makotosan
la source
1

PHP, 119 109 octets

-10 octets grâce à @KevinCruijssen

<?foreach(explode(" ",$argv[1])as$f){[$a,$b]=str_split($f);$n+=$f==X?30:(int)$a+($b=='/'?10:(int)$b);}echo$n;

Essayez-le en ligne!

Jo.
la source
Vous pouvez passer ($b=='/'?10+(int)$a:((int)$a+(int)$b))à (int)$a+($b=='/'?10:(int)$b)-10 octets.
Kevin Cruijssen
@KevinCruijssen Merci, ça a l'air bien! Bien que, en regardant les autres réponses, on dirait que j'y vais de la mauvaise / longue façon. :)
Jo.
0

Fusain , 23 octets

IΣEχΣES⎇№-/Xλ×χ⌕-//XλIλ

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

  Eχ                    Map over 10 frames
      S                 Input the frame
     E                  Map over the characters
            λ           Current character
        №-/X            Search the literal string `-/X`
                    λ   Current character
               ⌕-//X    Find position in literal string `-//X`
             ×χ         Multiply by predefined variable 10
                      λ Current character
                     I  Cast to integer
       ⎇                Ternary
    Σ                   Sum for each frame
 Σ                      Sum over frames
I                       Cast to string for implicit print
Neil
la source
0

SNOBOL4 (CSNOBOL4) , 169 151 147 octets

	F =INPUT ' '
R	F '-' =0	:S(R)
T	F 'X' ='_'	:S(T)
S	F LEN(1) . X ARB . Y ' ' REM . F	:F(O)
	X '_' =30
	Y '/' =10
	S =S + X + Y	:(S)
O	OUTPUT =S
END

Essayez-le en ligne!

	F =INPUT ' '					;* read input and append a space
R	F '-' =0	:S(R)				;* replace - with 0
T	F 'X' ='_'	:S(T)				;* replace X with _
S	F LEN(1) . X ARB . Y ' ' REM . F	:F(O)	;* set first character to x, remainder up to ' ' to y, and remainder to F
	X '_' =20					;* replace _ in x with 20
	Y '/' =10					;* replace / in y with 10
	S =S + X + Y	:(S)				;* else X and Y are their values so we can sum them
O	OUTPUT =S					;* output the sum
END
Giuseppe
la source
0

Clojure , 70 octets

#(reduce(fn[s i](+ s(case i\- 0\/ 10\X 30\space 0(bigint(str i)))))0%)

Essayez-le en ligne!

Lorsque vous reduceutilisez une chaîne, chaque caractère est en fait converti en un caractère - qui aurait pensé. Mais ce méchant, je dois écrire \spaceet cela fait plus de mal que l'on puisse imaginer. De plus, lors de la création d'un nombre réel à partir d'un caractère, la combinaison de bigintetstr semble être la seule combinaison utilisable.

Eh bien, en dehors de toutes ces luttes: fonction anonyme qui renvoie le score comme un naturel.

Joshua
la source