Votre tâche consiste à déterminer si une chaîne donnée est de bonne longueur et peut être représentée avec des tuiles Scrabble et, si c'est le cas, à produire la somme du score de chaque lettre.
Si vous ne savez pas comment jouer au Scrabble :, vous avez 100 tuiles avec différentes lettres A – Z imprimées dessus, ainsi que deux jokers qui peuvent représenter n'importe quelle lettre. Chaque lettre a un certain nombre de points, et chaque tuile (mais pas nécessairement un mot) ne peut être utilisée qu'une seule fois. Lorsqu'un mot est joué, la valeur en points de chaque tuile utilisée est additionnée, ce qui devient le score. Comme il y a un nombre limité de lettres disponibles, un mot ne peut avoir qu'une certaine lettre autant de fois que cette lettre a de tuiles + tous les caractères génériques inutilisés. Le tableau Scrabble est de 15 × 15 cellules, donc le mot doit comprendre entre 2 et 15 caractères.
Pour une liste de la quantité et du score de chaque lettre dans la version anglaise, voir ci-dessous ou http://boardgames.about.com/od/scrabble/a/tile_distribute.htm ( archive ).
Lettre Qté Points Lettre Qté Points ------------------- ------------------- A 9 1 O 8 1 B 2 3 P 2 3 C 2 3 Q 1 10 D 4 2 R 6 1 E 12 1 S 4 1 F 2 4 T 6 1 G 3 2 U 4 1 H 2 4 V 2 4 I 9 1 W 2 4 J 1 8 X 1 8 K 1 5 Y 2 4 L 4 1 Z 1 10 M 2 3 [sauvage] 2 0 N 6 1
Règles supplémentaires
- Le programme doit prendre une seule chaîne d'entrée de STDIN ou similaire.
- L'entrée ne contiendra toujours que des lettres majuscules.
- Si la chaîne contient plus de copies d'une lettre qu'il n'y a de caractères génériques ou de tuiles inutilisés pour cette lettre OU que la longueur de la chaîne n'est pas comprise entre 2 et 15 inclus, le programme doit sortir
Invalid
. - Sinon, le score doit être additionné en utilisant les données du graphique ci-dessus et en sortie.
- N'utilisez pas de caractères génériques, sauf si cela est nécessaire.
- Ne vous inquiétez pas des bonus tels que les scores de double mot ou si la chaîne est un vrai mot.
- Le programme doit sortir le résultat via STDOUT ou similaire.
- Les failles interdites par défaut ne sont pas autorisées.
- L'utilisation d'une source externe telle qu'un site Web, ainsi que toutes bibliothèques, API, fonctions ou similaires qui calculent les scores Scrabble ou les quantités appropriées ne sont pas autorisées.
- Il s'agit de code-golf , donc le moins d'octets gagne.
Procédure pas à pas
Input: CODEGOLF
C -> 3, O -> 1, D -> 2, E -> 1, G -> 2, O -> 1, L -> 1, F -> 4
3 + 1 + 2 + 1 + 2 + 1 + 1 + 4 = 15
Output: 15
Cas de test
Entrée sortie ------------------------ SCRABBLE 14 JAZZ 19 STACKEXCHANGE 32 XYWFHQYVZVJKHFW 81 PIZZAZZ invalide KIXOKEJAJAX non valide MISUNDERSTANDING Invalid
la source
-1
,?Invalid
.Réponses:
Perl 5
228 205 186 184 178 178 177 153 150 149 142 137135Exécutez avec perl -E.
Golfé:
Cette solution utilise des caractères non imprimables, donc un vidage hexadécimal est fourni ci-dessous:
Alternativement, en utilisant Ctrl + Key:
Non golfé + a commenté:
la source
-M5.010
(pénalité de 0 car il spécifie une version de la langue à utiliser) plutôt que-e
(pénalité de 1)? Vous pourrez peut-être enregistrer un octet dans les arguments.C, Rév 2,
151 145138Inspiré par le code de 159 octets dans le commentaire de @ bebe, j'ai pressé encore
8 1421 caractères:4 octets enregistrés en réorganisant le compteur de longueur
i
. Celui-ci est initialisé à 1 (en supposant que le programme ne prend aucun argument) puis multiplié par 4 à chaque lecture d'une lettre. Il déborde à zéro lorsque la longueur du mot est supérieure à 15, donc pour vérifier si la longueur du mot est mauvaise, nous vérifions simplement sii<5
(je metsi<9
donc cela donnera toujours invalide pour les mots d'une lettre si l'utilisateur initialise accidentellementi
à 2 en mettant un seul argument sur la ligne de commande.)4 octets enregistrés en changeant le test de condition de boucle en simple
&31
. Cela nécessite que le mot se termine par un espace (ASCII 32) ou un caractère nul (ASCII 0.) Normalement, la saisie au clavier se termine par une nouvelle ligne (ASCII 10), donc le programme est un peu gênant à utiliser, car vous devez taper le espace, puis appuyez également sur Retour pour que l'ordinateur lise le tampon. Pour les chaînes terminées par une nouvelle ligne, je pourrais faire correspondre mais pas battre la façon dont bebe le fait.613 octets enregistrés en changeant l'encodage en - (nombre de tuiles de chaque lettre) - (score pour cette lettre-1) * 13 . Cela nécessite désormais une plage de -4 pour L, S, U à -118 pour Q, Z. La raison d'utiliser des nombres négatifs est d'éviter la plage ASCII non imprimable de 0 à 31. Au lieu de cela, la plage utilisée est le complément à deux des nombres négatifs 256-4 = 252 à 256-118 = 138. Ce sont des caractères ASCII étendus imprimables. Il y a des problèmes avec les copier-coller en Unicode (la façon dont cela simplifie le retour en ASCII dépend de la page de codes installée, ce qui peut conduire à des résultats imprévisibles), j'ai donc inclus les bons codes ASCII dans le commentaire du programme.L'avantage de ce codage est l'élimination de la variable
r
car le nombre de tuiles est toujours réduit de 1 (car il est stocké comme un nombre négatif, nous le faisonst[x]++
. De plus, l'opérateur postfix signifie que nous pouvons effectuer cet incrément en même temps que en ajoutant le score às
.C,
184Rev 1 173 (ou 172 avec option de compilation)J'utilise GCC, et avec l'option du compilateur,
-std=c99
cela me permettra de passerchar t[]="...."
à l'initialisation de lafor
boucle pour économiser un point-virgule supplémentaire. Pour plus de lisibilité, j'ai montré le programme sans ce changement, et avec des espaces laissés dedans.L'astuce est dans le datatable. Pour chaque lettre, un code ASCII du formulaire (score total de tuiles pour cette lettre) * 10 + (score d'une tuile-1) est stocké dans le tableau
t[]
. Au moment de l'exécution, ces scores totaux sont réduits à mesure que les tuiles sont épuisées.Le score total de toutes les tuiles pour chaque lettre varie de 12 pour E à 4 pour L, S, U. Cette forme d'encodage permet d'utiliser uniquement des caractères ASCII imprimables (ASCII 120,
x
pour E jusqu'à ASCII 40,(
pour L, S, U.) L'utilisation du nombre de tuiles nécessiterait une plage de 120 à 10, c'est pourquoi je l'évité.Merci à une
#define
macro, un seul symboleT
est utilisé dans le programme principal pour récupérer l'index de lettrei
du premier argument de ligne de commande, soustrayez ASCIIA
= 65 de celui - ci pour donner un indice, et le chercher dans la table T:t[x[1][i]-65]
.La
for
boucle est utilisée plus comme unewhile
boucle: la boucle se termine lorsqu'un zéro octet (terminateur de chaîne) est rencontré dans la chaîne d'entrée.Si les tuiles de cette lettre ne sont pas épuisées (
T/10
est non nulle)s
est incrémentée par le score des tuilesT%10+1
pour garder un score total. En même temps, le score de tuile est stocké dansr
, de sorte que la valeur dans le représenté parT
puisse être décrémentée parr*10
pour indiquer qu'une tuile a été utilisée. Si les tuiles sont épuisées, le compteur générique / viergeb
est incrémenté.La
printf
déclaration est assez explicite. si la longueur de mot est hors limites ou si le nombre de blancs est trop élevé, imprimezInvalid
sinon imprimez la partitions
.la source
?
et:
. Votre autre point est dépassé, car j'ai complètement changé l'encodage, il n'est donc pas nécessaire de manipuler spécialement Q et Z. Maintenant, descendez à 173/172 avec votre aide.getchar()
c'est 159:l,w,f;main(t,i){for(char b[]="Z>>QxS=SZW6(><P>m<(<(SSWSm";(i=getchar()-65)>=0;l++)b[i]/10?f+=t=b[i]%10+1,b[i]-=t*10:w++;printf(l<2|l>15|w>2?"Invalid":"%d",f);}
bien que je ne comprenne toujours pas pourquoi leschar*foo=<string>
plantages. cela pourrait économiser 2 caractères.char*foo="string"
est un littéral de chaîne et son contenu ne peut pas être modifié. D'un autre côté,char foo[]="string"
crée un tableau de caractères initialisé àstring\0
, qui peut ensuite être modifié.getchar().
J'ai utilisé vos améliorations du code (avec mes noms de variables pour la cohérence avec le reste de ma réponse), plus une amélioration de la vérification de la validité de la longueur des mots et une amélioration effrontée de l'état de la boucle test (j'ai essayé de raccourcir le vôtre mais je n'ai pas pu le faire avec la même fonctionnalité.) J'ai également essayégetche()
etgetch()
mais mon compilateur (gcc sur cygwin) ne les relierait pas automatiquement.JavaScript (ES6) -
241230199182Modifier - a changé la façon dont j'ai codé les quantités / scores pour réduire la taille et supprimer les variables non ascii
Édition 2 - a changé les encodages quantité / score en entiers au lieu de chaînes
Édition 3 - basculé vers
%13
(merci @ edc65), inversé l'encodage, modifié directement les valeurs et quelques autres améliorations mineuresTesté dans la console Firefox.
la source
f[c]=1+f[c]||1
->f[c]=-~f[c]
, 2.pourquoi ne pas utiliser% 13%13
est cependant un coup de génie. Je suis resté coincé en pensant que je devais stocker les choses en chiffres, mais les mathématiques ne se soucient pas de la différence entre base10 et base13.SyntaxError: Unexpected token >
f=s=>{...}
notation).Python 3,
217201Non golfé:
Edit: Merci à @BeetDemGuise pour un conseil qui m'a finalement conduit à bien plus qu'une réduction à 1 caractère! Code d'origine ci-dessous:
la source
int('1332142418513113a11114484a'[o],16)
:)BEFUNGE 93 - 210 octets.
Mais il ne vérifie pas la limite de 15 lettres.
la source
C, 197
Suppose que la chaîne est fournie comme argument de ligne de commande, par exemple
./scrabble STACKEXCHANGE
la source
JavaScript -
232201z
stocke le mot. Sorties comme alerte.Modifier: amélioré selon les recommandations ci-dessous.
la source
s
n'est utilisé qu'une seule fois, vous n'avez donc pas du tout besoin d'en faire une variable; vous pouvez supprimer cette déclaration et la remplacerr+=s[x]
parr+=-~"02210313074020029000033739"[x]
. De plus, vous n'avez pas besoin de parenthèses(w>2|y<2|y>15)
dans l'alerte.Haskell - 538
Enregistrez-le sous scrabble.hs, puis compilez-le en utilisant
Saisissez ensuite votre mot comme entrée et appuyez sur Entrée
la source
"ABCDEFG"
peut être écrit comme['A'..'G']
,[1,2,3]
peut être écrit comme[1..3]
Python 2.7 - 263
Je ne pouvais pas me rapprocher de la réponse de DLosc , mais cela traite chaque lettre comme un `` sac '' dont vous tirez, jusqu'à ce qu'elle soit vide, puis vous tirez des blancs, et quand cela est vide, cela provoque des erreurs.
la source
raw_input
si c'est Python2 (une chose que j'aime à propos de Python3). L'entrée est garantie en majuscules, donc supprimez.lower()
et changez97+i
en65+i
. La saisie de moins de 2 caractères doit également être invalide. Vous pouvez augmenter l'erreur de division zéro sansif
déclaration: divisez votre score total par(1<len(S)<16)
. Quelques autres ajustements, comme mettre leprint
s sur la même ligne que les en-têtes de bloc et supprimer l'espace avant, le"Invalid"
ramènent à 250 par mon compte. :)Haskell,
290283Aussi loin que j'ai pu le faire pour l'instant:
Ce code respecte très strictement les règles, alors assurez-vous de ne lui transmettre aucun caractère supplémentaire (comme la fin de ligne). Utilisez comme ceci:
echo -n "JAZZ" | runghc scrabble.hs
.Explication
Le motif
(_:_:_)
s'assure que seules les chaînes d'au moins deux caractères sont prises en compte, tout le reste résulte en"Invalid"
(motif de secours_
). La table des tuiles est codée comme11*nTiles+value
convertie en ASCII avec un décalage qui permet à la recherche modulo 11 de fonctionner, où les lettresAEIO
sont dupliquées car elles se produisent plus de 6 fois chacune. Le pool de tuiles est ensuite créé en utilisantreplicate
, duquel les caractères du mot sont supprimés au fur et à mesure (différence de liste,\\
). Le pool contient 98 tuiles, donc si la longueur totale du mot et la partie restante du pool est supérieure à 100, alors nous avons utilisé trop de caractères génériques. De plus, le mot moins les 15 premières lettres est ajouté trois fois au calcul de la longueur, donc tout mot de plus de 15 lettres semble utiliser automatiquement trois caractères génériques et n'est donc pas valide. Le score est fait sur le pool restant, qui comptait initialement 187 points, dont nous soustrayons simplement. Notez lef 61
plutôt quef 65
, 65 étant le numéro ASCII de'A'
, en raison du doublon"AEIO"
au début du pool. Le reste est juste passe-partout.la source
Python3 - 197
Mettons les bignums à utiliser: D (il ne gère pas les caractères génériques actuellement, j'ai complètement ignoré la lecture de cette règle, putain)
la source
Rubis - 195
Je suppose que la sortie de
"Invalid"
est correcte, sinon je devrais faire ce$><<(-b<1&&w.size<16?s:'Invalid')
qui la ferait monter à 198Clojure - 325
Je n'ai pas fait de clojure depuis un moment donc je suis sûr qu'il existe plusieurs façons d'améliorer ma solution .ie les listes de quantité et de points
Certains ce qui n'a pas été joué au golf
la source
ES6: 184 (non strict)
w
est supposé contenir déjà le mot.r
est la chaîne de sortie.Voici cela expliqué et un peu moins golfé:
la source
Fléchette - 201
Cela nécessite des bignums, donc il ne sera pas compilé en JavaScript.
Avec plus d'espace:
la source
PHP,
180170168 octetsYay! battre JS!
panne
Je suis tellement content qu'aucun score de lettre ne soit supérieur à 10.
la source