C'est la rentrée scolaire! Donc, pour un travail à temps partiel, vous aidez à la bibliothèque de l'école. Le problème est que le bibliothécaire en chef n'a même jamais entendu les mots «Dewey Decimal», et encore moins mis en œuvre ce système. Au lieu de cela, le système de tri utilisé s'est développé "organiquement" à mesure que la bibliothèque s'est agrandie ...
Dans un effort pour garder votre santé mentale, vous avez choisi d'écrire un programme pour vous aider à trier les livres au fur et à mesure de leur retour, car malheur à vous si vous triez les livres mal. (Le bibliothécaire en chef est TRÈS strict.)
Entrée sortie
- L'entrée sera une liste de titres de livres (hypothétiques), un par ligne, à partir de l'équivalent STDIN / langue.
- Vous ne pouvez pas accepter plus de 100 livres à la fois (vous ne pouvez en transporter qu'un grand nombre dans la bibliothèque à la fois).
- Les livres peuvent avoir plusieurs mots dans leurs titres, et ces mots peuvent être séparés par des espaces ou d'autres signes de ponctuation (par exemple, deux points
:
, un tiret-
, etc.). - Pour faciliter le calcul, supposez que tous les titres sont UTF-8.
La sortie est les mêmes titres, triés selon les règles ci-dessous, encore une fois par ligne, en équivalent STDOUT / langue.
Les règles de tri
Les livres sont triés numériquement en fonction de leur valeur de caractère moyenne (c.-à-d. La valeur de caractère cumulative divisée par le nombre de caractères dans le titre du livre), comptée selon les règles suivantes:
- Tous les caractères comptent pour déterminer le nombre de caractères dans un titre.
- Les lettres minuscules sont comptées par leur position dans l'alphabet. (a = 1, b = 2, ... z = 26)
- Si le titre contient des majuscules, celles-ci comptent pour 1,5 leur valeur minuscule (A = 1,5, B = 3, ... Z = 39). ("Les majuscules sont importantes!", Explique le bibliothécaire.)
- Chaque signe / symbole de ponctuation dans cette liste
!@#$%^&*()-=_+[]\{}|;':",./<>?~
compte -1 à partir de la valeur cumulée avant la moyenne. ("Les titres grandioses ne le sont pas!") - Si le titre contient un nombre, écrit en chiffres arabes , ce nombre est soustrait de la valeur moyenne avant le tri. Plusieurs chiffres consécutifs sont traités comme un seul chiffre (par exemple,
42
soustraire 42, pas soustraire 4 puis soustraire 2). Les chiffres individuels ne comptent pas pour la valeur cumulative (c'est-à-dire que chaque chiffre contribue à 0), mais comptent pour le nombre de caractères. Notez que cela peut entraîner une valeur négative et doit être traité de manière appropriée. (Selon la rumeur, le bibliothécaire a le béguin pour un professeur de mathématiques depuis plusieurs années, maintenant.) - Si le titre contient deux mots distincts qui commencent par un
R
, le livre obtient une partition «infini» et est jeté dans une pile dans le coin (c'est-à-dire disposé au hasard à la fin de la liste). (Le bibliothécaire a déjà été jeté par une personne portant ces initiales, ou du moins vous l'avez entendu.) - Les espaces ne comptent pas pour la valeur cumulée des caractères (c'est-à-dire qu'ils contribuent 0), mais contribuent au nombre de caractères dans un titre.
- Les caractères qui ne correspondent pas aux règles ci-dessus (par exemple, a
ÿ
) ne comptent pas pour la valeur de caractère cumulative (c'est-à-dire qu'ils contribuent 0), mais contribuent au nombre de caractères dans un titre. - Par exemple, un livre hypothétique
ÿÿÿÿÿ
aurait une «partition» de(0+0+0+0+0) / 5 = 0
, mais un livre hypothétiqueÿÿyÿÿ
aurait une «partition» de(0+0+25+0+0) / 5 = 5
. - Deux livres qui arrivent à "marquer" la même chose peuvent être sortis dans votre choix de commande. (Ils sont sur la même étagère, de toute façon)
Exemple d'entrée 1
War and Peace
Reading Rainbow: The Best Unicorn Ever
Maus
Home for a Bunny
Exemple de résultat 1 (avec "scores" entre parenthèses pour montrer le raisonnement - vous n'avez pas besoin de les imprimer)
War and Peace (8.5)
Home for a Bunny (10.125)
Maus (15.125)
Reading Rainbow: The Best Unicorn Ever (infinity)
Exemple d'entrée 2
Matthew
Mark
Luke
John
Revelations
Exemple de résultat 2 (avec "scores" entre parenthèses pour montrer le raisonnement - vous n'avez pas besoin de les imprimer)
Mark (12.375)
John (13)
Revelations (13.545454...)
Luke (13.75)
Matthew (~13.786)
Exemple d'entrée 3
42
9 Kings
1:8
7th
Exemple de résultat 3 (avec "scores" entre parenthèses pour montrer le raisonnement - vous n'avez pas besoin de les imprimer)
42 (-42)
1:8 (-9.3333...)
9 Kings (~0.36)
7th (2.3333...)
Autres restrictions
- Il s'agit de Code-Golf, car vous devez garder le programme secret aux yeux du bibliothécaire, et plus le programme est petit, plus il est facile à cacher.
- Des restrictions standard contre les échappatoires s'appliquent
- Ne laissez pas le bibliothécaire vous rattraper en vous détendant en passant tout votre temps sur PPCG.
Réponses:
APL (132)
Puisque tout le monde fait la même chose, c'est aussi une fonction qui prend un tableau de titres et le renvoie trié, par exemple:
Explication:
⎕ML←3
: défini⎕ML
sur3
(pour⊂
)⍵[⍋{
...}¨⍵]
: trie l'entrée en fonction des valeurs renvoyées par la fonction interne↑¨⍵⊂⍨⍵≠' '
: obtenir le premier caractère de chaque mot2='R'+.=
: voir si deux d'entre eux le sont'R'
.:!99
: si oui, retournez 99! (≈ 9,3 × 10 155 ). Ce n'est pas tout à fait l'infini, mais ça va faire: un titre ne peut jamais avoir un score plus de 38 fois sa longueur (ZZZZ ...), donc tant qu'aucun titre n'est plus grand qu'environ 2 × 10 130 yottabytes, il est garanti que ceux-ci seront à la fin.⋄
: autrement:(
...)÷⍴⍵
: divisez le score par la longueur⍵
après le calcul:G←(⊂⎕A),(⎕UCS 96+⍳26)
: stocker dansG
les lettres majuscules et minuscules(⎕UCS 32+⍳94)~'`',⎕D,∊G
: les caractères ASCII imprimables, à l'exception des lettres, chiffres, espaces et'`'
, qui sont les caractères pour lesquels un point est soustrait. (C'est plus court que de les écrire tous, car ilG
sera utilisé plus tard.)+/⍵∊
: compter le nombre de ces caractères dans⍵
-
: soustrayez ceci de:+/∊1.5 1×(⍳×∊⍨)∘⍵¨G
: la somme de 1,5 × les scores pour les majuscules et 1 × les scores pour les lettres minuscules.-⍨
: ensuite, soustrayez le total des nombres dans⍵
:⍵⊂⍨⍵∊⎕D
: trouver les groupes de chiffres dans⍵
'0',
: ajouter'0'
, pour éviter que la liste soit vide⍎¨
: évaluer chaque chaîne+/
: trouver la sommela source
!99
vous pourriez utiliser⌊/⍬
Lua 5.3,
366364 octetsCe code ne fonctionne que dans Lua 5.3 car il doit gérer les caractères Unicode. Si vous ne vous souciez pas d'Unicode, remplacez "utf8" par "string" et cela fonctionnera bien avec Lua 5.2 ou 5.1.
Il prend ses entrées à partir des arguments de ligne de commande, alors exécutez-le à partir de la ligne de commande ou mettez ce code au-dessus de ma réponse:
la source
utf8
avecstring
sur Ideone et je n'ai eu aucune sortie.(arg)
est assis là à me regarder en face. Cette question m'a apparemment frit le cerveau. Avoir un +1.Mathematica,
253216octets (214 caractères)Appelez la fonction comme
f[{"42", "9 Kings", "1:8", "7th"}]
; il renverra une liste triée des entrées.À peine arrivé! La correspondance de motifs de Mathematica n'est pas aussi concise lorsque des chaînes sont impliquées, et je me fais juste tuer par ces noms longs. Les deux octets supplémentaires sont destinés au
Infinity
caractère unicode.(Faites-moi savoir si je suis tombé sous le coup de failles standard.)
Mise à jour
En regardant un peu plus près la réponse d'edc65, il semble que l'OP accepte une fonction qui trie une liste de chaînes. Dans cet esprit, nous pouvons utiliser la forme curry de
SortBy
(que Mathematica appelle la "forme opérateur"); avec un argument (la fonction appliquée aux éléments de la liste pour déterminer leur ordre), il se comporte comme une fonction qui prend un argument, renvoyant la forme triée de l'entrée; c'est-à-direSortBy[list, f]
est équivalent à(SortBy[f])[list]
.Non golfé
la source
JavaScript (ES6), 210
218 251En tant que fonction avec un argument de tableau, renvoyé trié.
la source
O.innerHTML
àthis.InnerHTML
dans la console de Firefox.C #,
352349 octetsEn raison de la magie de linq:
Aurait pu économiser encore 6 octets si le backtick était inclus dans la liste de ponctuation!
la source
Aller, 755 octets
La version formatée:
L'implémentation d'une interface de tri personnalisée l'a rendue plus longue que prévu. Le programme lit depuis STDIN jusqu'à la fin de la saisie d'une ligne vierge.
la source
PHP, 362
367OctetsVersion formatée:
Lignes intéressantes:
Convertit un seul caractère UTF-8 en ses valeurs d'octets et les additionne, de sorte que nous obtenons la valeur réelle pour les caractères ASCII et une valeur supérieure à 127 pour les caractères multi-octets.
Utilise la faible priorité d'opérateur de
and
etor
pour affecter la valeur de caractère dans une seule instruction sansif
.la source
Perl 5 , 190 octets
Essayez-le en ligne!
la source