Basé sur le golf pratique - États-Unis
Votre tâche consiste à trouver l'abréviation (symbole) d'un élément en fonction du nom de l'élément, jusqu'à ununoctium (118) inclus. Utilisez le tableau périodique sur Wikipedia .
Grâce à Squifish ossifrage, vous pouvez trouver une liste complète des éléments en abréviations sur http://pastebin.com/DNZMWmuf .
Vous ne pouvez utiliser aucune ressource externe. De plus, vous ne pouvez utiliser aucune donnée intégrée spécifiquement concernant les éléments du tableau périodique. Les failles standard s'appliquent.
Contribution
Les entrées peuvent provenir de stdin, fichier prompt
, input
etc.
Format d'entrée:
Toutes les entrées suivantes sont valides:
Carbon
carbon
CARBON
cArBOn
Essentiellement, le nom de l'élément est insensible à la casse.
Vous n'êtes pas obligé de gérer les fautes d'orthographe ou tout nom d'élément non valide. Une entrée invalide est un comportement indéfini.
Sortie :
Le symbole de l'élément. Le premier caractère doit être capitalisé et le reste doit être en minuscule.
Exemple de sortie: C
Cas de test:
Carbon -> C
NiTROGen -> N
Sodium -> Na
Gold -> Au
Silver -> Ag
Tin -> Sn
Il y a beaucoup plus d'éléments que d'États, alors je m'attends à ce qu'il soit plus difficile de trouver une règle générale à leur propos.
C'est du code golf. Le code le plus court gagne!
la source
Au
, ou ce que vous voulez. @Paul R S'il existe de nombreuses manières d'épeler un élément (par exemple, soufre vs soufre ou aluminium vs aluminium), selon ce qui rend votre programme plus court. Vous n'êtes pas obligé de gérer les deux cas.Réponses:
CJam,
337297293232220201200 octetsLe code ci-dessus utilise la notation caret, car il contient des caractères de contrôle.
Au prix de 24 octets supplémentaires (pour un total de 224), ces caractères peuvent être évités.
Vous pouvez essayer ce code dans l' interpréteur CJam .
Cas de test
Comment ça fonctionne
La première étape consiste à lire le nom de l’élément à partir de STDIN et à appliquer une fonction de hachage plutôt élaborée, qui mappe tous les noms d’élément compris dans la plage [0, 225] :
De nombreux symboles d'élément sont formés par les premier et deuxième, premier et troisième, premier et quatrième, premier et cinquième ou premier et dixième caractères (ce qui n'est que le premier) du nom anglais de l'élément. Nous allons représenter ces éléments par des nombres de 0 à 4 respectivement. Tous les éléments restants (représentés par 5) nécessiteront une table de consultation.
La table résultante peut être poussée comme suit:
La matrice de codes de caractères est convertie de la base 256 en base 7 et les valeurs 6 sont remplacées par des exécutions de trois 0.
Voici le tableau de décision D:
L'action nécessaire pour l'élément avec le hachage 1 correspond par exemple au premier élément du tableau this. Les éléments de tableau qui ne correspondent au hachage d'aucun élément sont également nuls, ce qui permet la compression (0 0 0) ↦ 6 .
Maintenant, nous interprétons D pour le hash H.
Ensuite, nous poussons la table de recherche. Si nous ajoutons j aux symboles à caractère unique et remplaçons Uu par Q , chaque symbole aura exactement deux caractères. Il peut être poussé comme suit:
Le tableau de codes de caractères est converti de la base 256 à la base 25, le code de caractère de A est ajouté à tous les chiffres (transtypage en caractère dans le processus) et le résultat est divisé en morceaux de longueur deux.
Ceci est la table de recherche L:
Nous allons maintenant calculer les noms d’éléments potentiels.
La pile contient maintenant
où B est le booléen D [H-1] / 5 , M est le nom extrait de la table de recherche et N est le nom de l'élément formé en sélectionnant les caractères de E.
Nous avons presque fini:
la source
C, 452
Une bonne fonction de hachage aide. Il y en a peut-être de meilleurs. (Améliorations suggérées par @ugoren et al.)
Ungolfed avec des commentaires:
J'ai utilisé la force brute pour trouver ce hash; Ce fut le seul avec une taille de hachage de ≤512 qui n'a pas eu de collision. Je n'ai cependant pas vérifié les orthographes alternatives, et il pourrait y avoir de meilleures fonctions avec différents algorithmes (par exemple, utiliser XOR au lieu de l'addition).
La fonction de hachage mappe les chaînes de texte sur des valeurs comprises entre 0 et 440. Le hachage "Tin" étant égal à zéro, "Sn" figure donc au début du tableau. Les 7 prochaines positions sont vides. Pour conserver le code compact, ceci est indiqué par la valeur ASCII 34 + 7 = 41 (")"). Viennent ensuite "Cuivre" (8), quatre cellules vides (34 + 4 = 38 = "&") et "Vanadium" (13). Après avoir calculé un hachage, le programme parcourt le tableau en soustrayant 1 pour chaque lettre majuscule suivi de 0 ou plusieurs lettres minuscules et en soustrayant (VALEUR ASCII) -34 pour chaque caractère non alphabétique. Lorsque la valeur atteint zéro, nous avons trouvé le résultat correct.
la source
(h+c%32+74)*311%441
.. 2. Laisser tomberp
et utilisers
. 3.main(c)
enregistre une virgule.JavaScript ES6, 690
708octetsLe premier tableau contient les symboles et le second contient le nombre minimum de lettres nécessaires pour indiquer à quel élément il est fait référence. Merci à core1024 et edc65 pour avoir aidé à le raccourcir. Testez à http://jsfiddle.net/xjdev4m6/2/ . Un peu plus lisible:
la source
Neo
avant de toucherNeon
car elle contient moins de lettres.if
déclaration (c'est unefor
condition parfaite ) et aussi insérer ou déplacer les positions de certaines variables, raccourcir le code;)).toLowerCase(
->)[L='toLowerCase'](
puis à la fina.toLowerCase(
->a[L](
devrait couper 4 caractèresRuby 1.9+,
565 471 447444Un one-liner. Parce que rien n’est "impossible à faire avec les regex" ...
(On vient de sauver 94 caractères en ajoutant un autre regex) ((et 24 en les simplifiant))
(nouvelle ligne après chaîne ajoutée pour "lisibilité", à supprimer pour test)
utilisation:
ruby periodic.rb aluminum
$>Explanation: La
division de la chaîne dans les majuscules renvoie un tableau de regex à faire correspondre aux noms d'éléments. Les seuls caractères alphabétiques autorisés dans chacun d'eux sont ceux de l'abréviation *. Ils sont ordonnés de telle sorte que la première correspondance trouvée lors de la comparaison avec l'argument de la ligne de commande
*$*
est la bonne. Le gsub de fin supprime les caractères non alpha avant l’impression.* Les abréviations impaires telles que "Fe" pour "Iron" sont gérées par un
|
élément: "Iro | Fe". Le premier choix est ce qui est réellement assorti; le gsub supprime ensuite tous les caractères jusqu'au '|', laissant l'abréviation réelle.Cadre de test (nécessite la liste de @ squeamish : téléchargée sous le nom 'table.txt' dans le répertoire de travail).
la source
Ruby, 1068 octets
Entrée via STDIN.
Les sous-chaînes uniques les plus courtes des noms d'élément vont du deuxième au sixième caractère (ou à la fin du nom s'il est trop court). Donc, je les récupère simplement et je les cherche dans un hachage. J'ai également compressé le hachage car cela économise 200 octets supplémentaires. Voici à quoi ressemble le hash lui-même:
la source
CJam,
462 449 434 401 391 384382Avec l'aide de Dennis.
Code
Les ifs ternaires imbriqués ne sont probablement pas la bonne façon de faire cela dans CJam.
Avec des tirets:
La plupart des symboles ne sont que les deux premières lettres du nom de l'élément. Celles-ci sont traitées dans la deuxième couche la plus profonde des instructions if imbriquées. Beaucoup d'autres sont les première et troisième lettres, ou les première et quatrième lettres - elles sont traitées dans des couches extérieures successives. Les symboles contenant uniquement la première lettre et les irréguliers complets sont traités respectivement dans les cinquième et troisième couches les plus profondes.
Il y a quelques endroits où cela devient confus (
TelLurium
vsThaLlium
, ouSILicon
vsSILver
, ouRUThenium
vsRUTherfordium
). Ceux-ci sont traités séparément.On pourrait faire beaucoup de golf ici, principalement en réutilisant des blocs de code et en améliorant le traitement des irréguliers.
la source
"RUTHENIUM"=
vous pouvez donc l'utiliser"RUTHEN"#!
. 2. Vous n'avez pas besoin d'imprimer explicitement (o
) ni de supprimer quoi que ce soit avant le nom réel de l'élément (;"Si"
); ajoutez simplement]W=
à la fin de votre code pour supprimer tout sauf l'élément le plus haut de la pile. 3. Cela rend quelques blocs vides. SiB
est un booléen,B{...}{}?
etB{...}*
atteindre le même objectif. 4. Le ternaire si prend des blocs ou des éléments de pile, vous pouvez donc raccourcir{"Si"}
à"Si"
._
et;
partoutPHP,
507485476466 caractèresUtilisation: entrez le nom de l'élément en tant que paramètre GET '0' - elements.php? 0 = carbon
Algorithme: Parcourez la chaîne de données, en extrayant des paires de codes d'abréviation et de sous-chaînes. Si la sous-chaîne correspond au début de l'élément transmis, utilisez le code d'abréviation pour déterminer le contenu à afficher: Si le code commence par une lettre, générez-le sous forme de chaîne. S'il s'agit d'un nombre N, indiquez la première lettre de l'élément + la Nième lettre. Les éléments Unun ont une casse spéciale avec le code '|'. Si aucune sous-chaîne ne correspond au nom transmis, indiquez les deux premiers caractères du nom sous forme d'abréviation.
Code lisible:
Condensé:
la source
JavaScript (1100)
Une mise en œuvre naïve qui brille par sa simplicité. La sous-chaîne unique à partir du début du nom est simplement mappée sur le symbole.
la source
Python -
652 649637Ma table de hachage est basée sur la combinaison de chaque seconde et de chaque troisième caractère du nom en majuscule:
Voici le générateur correspondant:
Des améliorations sont probablement possibles, notamment la compression des deux longues chaînes.
Testé avec:
la source
Golfscript -
1052821Explication:
la source
n/
Haskell,
920817807776 CharsAprès avoir travaillé trop longtemps à créer un système de règles pour déterminer quels caractères d'un nom d'élément sont inclus dans son symbole, et un peu de bricolage, j'ai réussi à écrire un script qui traduit facilement l'élément en symbole. Le fer était un problème pour moi, car je pouvais échantillonner certains caractères de GOld, SilVer, TiN, LEAD, SoDium, MerCury, ANtimony, PotaSsium et TUngsten, en les convertissant en un symbole périodique inutilisé (j'ai choisi l'échantillonnage le plus simple à intégrer en les traduisant dans les règles existantes), puis en traduisant après la conversion symbolique; Le fer, cependant, était un problème, car Ir, Io et In sont déjà utilisés. Il s’agissait au départ de 920 caractères, mais j’ai réalisé que la correspondance finale de motifs (la plus grande) n’avait pas besoin d’être présente, car elle laissait les choses filer (ce qui n’était pas le cas) ou leur correspondait toutes; par conséquent, Je l'ai remplacé par un wildcard fourre-tout. Après cela, j’ai passé de 817 à 808 en abréviant certains modèles en utilisant des jokers de telle sorte qu’ils restaient uniques pour le nom de cet élément (par exemple, le seul élément avec un «w» dans son nom est Lawrencium, donc "* w "correspond à cela dans 1 caractère de moins que" Law ").
Voici mon code. Je l'ai testé pour tous les éléments et je l'ai codé pour qu'il convertisse automatiquement son entrée en titlecase, évitant ainsi les problèmes de sensibilité à la casse.
EDIT 1
Je l'ai ensuite réduite à 776 caractères en remplaçant l'expression de casse dans t par une correspondance de motif (cela a du sens car l'expression de cas testait l'opérande brut par opposition à une expression en termes d'opérande), en supprimant les parenthèses inutiles et s'exprimant
e
sous la forme d'une chaîne délimitée par des lignes et non d'une liste de chaînes, puis en la divisant par la suite dans la fonction principale. Parce que ces changements sont purement liés au golf, la version lisible par l'homme est restée inchangée.Version lisible par l'homme (saut de ligne, espacement, noms détaillés, commentaires: 2311 caractères)
Si quelqu'un est intéressé par une explication à ce sujet, n'hésitez pas à demander.
la source
C # (826)
pas le meilleur mais j’ai pensé que j’essayerais avec le handicap de c #.
J'ai donc écrit un programme pour transformer le nom complet des éléments (par exemple, carbone) en une chaîne la plus petite mais toujours unique possible et je l'ai fait pour tous les éléments par rapport à toutes les autres chaînes uniques. J'ai ensuite sérialisé cela en une grosse chaîne laide où les lettres majuscules désignent le début des "morceaux", les morceaux alternant entre clés et valeurs. Comme KeyValueKey2Value2 etc.
Ce script déstérilise cette grande chaîne et coupe un caractère à la fin de la chaîne entrée jusqu'à ce qu'il le trouve dans le dictionnaire créé à partir de la grande chaîne.
(Je devrais ajouter que ma connaissance du langage C # n’est pas étonnante et que j’avais déjà soumis des propositions que j’avais faites, mais j’ai eu des astuces que d’autres m'ont indiquées.
la source
var
. Vous pouvez économiser un peu plus en supprimant les accolades après une instruction unique si elle est bloquée. Si vous attribuezt.Substring(int, int)
à un,Func<int, int, string>
vous pouvez enregistrer un autre couple.var
ing lastring[] r
et un autre 3 envar
ing lastring t = Console....
, enfin, vous gagnerez 7 plus en changeantreturn new string[]
dansreturn new[]
à la fin.if(...) break;
logique dans les conditions de sortie de la boucle for. Un certain nombre d'autres inversions logiques peuvent être appliquées, par exempledo { } while(..)
dans votre méthode d'extraction. Cela est plus court que l'ajout d'une opération logique distincte pour le cas de saisie. J'ai posté une modification dans votre code qui doit encore être révisée / acceptée en raison de ma faible représentation sur ce site. Je l'ai eu à 870 caractères.JavaScript (E6) 1433
Voici une limite supérieure
Test dans la console FireFox / FireBug
Sortie
la source
SmileBASIC,
1763141812041128 octetsJ'ai choisi 3 caractères qui étaient pour la plupart uniques (les 0e, 2e et 3e), ce qui laisse 2 cas particuliers: Cérium / Curium sont à la fois "Ciu" et Ruthenium / Rutherfordium sont à la fois "Rhe". Pour Ciu, je vérifie si le deuxième caractère du nom est "e" ou "E", et pour "Rhe", je vérifie la longueur du nom.
VAR(name)
renvoie la variable portant ce nom. Les noms de variables sont insensibles à la casse.la source
T-SQL,
900 894676 octetsLes retours sont pour la lisibilité seulement, la deuxième ligne est une très longue chaîne.
STRING_SPLIT
est pris en charge dans SQL 2016 et versions ultérieures.La saisie s'effectue via une table préexistante t avec le champ varchar e , conformément à nos normes IO . La sortie est complétée par des espaces de 3 caractères. les règles n'étaient pas claires quant à savoir si c'était ok. Si nécessaire, je peux ajouter un
TRIM
.La table en entrée est jointe à une table générée avec une liste de tous les symboles d'éléments (complétée à 3 caractères) avec le préfixe unique le plus court pour chaque nom d'élément (
X
suffit pour Xenon , mais Rutherfordium nécessiteRuther
de le distinguer de Ruthenium ).EDIT 1 : 218 caractères enregistrés en supprimant les 44 entrées de la liste dont le symbole correspond aux deux premières lettres de leur nom; la
ISNULL
fonction est utilisée pour voir si la première requête échoue pour renvoyer une ligne et, le cas échéant, génère le symbole (correctement mis en casse) à partir du nom de l'élément en entrée.la source