Tableau périodique des éléments - Code Golf

47

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, inputetc.

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!

soktinpk
la source
4
@squeamishossifrage Merci. Les deux versions ("soufre" et "soufre") sont acceptables. Votre programme n'a pas à gérer les deux, cependant, un seul.
soktinpk
1
... impossible à faire avec les regex. Vous nous avez bien.
Josiah Winslow
2
@Xrylite Essayez de lire les règles: " Saisie ... du nom de l'élément - insensible à la casse ... Sortie ... Le premier caractère doit être en majuscule et le reste en minuscule".
Jim Balter
2
Qu'en est-il de l'orthographe correcte (aluminium) par rapport à l'orthographe américaine (aluminium)?
Paul R
4
@codebreaker Oui, si l'entrée n'est pas valide, votre programme peut se bloquer, se bloquer, imprimer 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.
soktinpk

Réponses:

27

CJam, 337 297 293 232 220 201 200 octets

leu:E2f^3b2+4%_"53N5903CVCT4":i3/=~Ef+b\%]53b"gØâ^ÃP·^À4ξ^ß^E5^W^Ma{áª^B¤±´oòæ»^XÊQÑ»4žDÙÝòÙ 0^ÝþKa6^Ó£,Ûkû¥¡ùh^E"256b7b6a/0a3**<)5md@5a/,(" ¬^GH/N¿·%^U^RU1²Bd
òë^м~í^ÌéáU"256b25b'Af+2/='J-'Q/"UU"*\)_5=)*E%2<?(\el

Le 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.

leu:E2f^3b2+4%_"53N5903CVCT4":i3/=~Ef+b\%]53b
"' NwEvKv6e8@]jO4G)=b{L!v@hFQ/oCN)*|BRxvNRL+LO7NI(pLs4[d87$Q%8R\t+' M5JU"
{32f-95b}:B~7b6a/0a3**<)5md@5a/,(
"&y.$h*z^t\rQPUc]l8F h$=18C^r|vD~S"
B25b'Af+2/='J-'Q/"UU"*\)_5=)*E%2<?(\el

Vous pouvez essayer ce code dans l' interpréteur CJam .

Cas de test

$ base64 -d > elements.cjam <<< bGV1OkUyZl4zYjIrNCVfIjUzTjU5MDNDVkNUNCI6aTMvPX5FZitiXCVdNTNiImfY4oNQt4A0zr6fBTUXDWF74aoCpLG0b/LmuxjKUdG7NMW+RNnd8tmgMJ3+S2E2k6Ms22v7paH5aAUiMjU2YjdiNmEvMGEzKio8KTVtZEA1YS8sKCIgrAdIL06/tyUVElUxskJkCvLrkLx+7Yzp4VUiMjU2YjI1YidBZisyLz0nSi0nUS8iVVUiKlwpXzU9KSpFJTI8PyhcZWw=
$ cksum elements.cjam 
952664534 200 elements.cjam
$ for e in Carbon NiTROGen Sodium Gold Silver Tin; do LANG=en_US cjam elements.cjam <<< $e; echo; done
C                                                                                                       
N                                                                                                       
Na                                                                                                      
Au                                                                                                      
Ag                                                                                                      
Sn

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] :

l eu :E          " Read a line from STDIN, convert to uppercase and save in E.            ";
2 f^             " XOR each character code with 2.                                        ";
3 b              " Convert to integer; consider the resulting array a base 3 number.      ";
2 + 4 %          " Add 2 and take the result modulo 4. Result: R                          ";
"53N5903CVCT4":i " Push [53 51 78 53 57 48 51 67 86 67 84 52].                            ";
3 / =            " Retrieve the chunk of length 3 that corresponds to R. Result: C        ";
~ E f+           " Add C[2] to all character codes of E.                                  ";
b                " Convert to integer; consider the resulting array a base C[1] number.   ";
\ %              " Take the integer modulo C[0]. Result: M                                ";
] 53 b           " Push H := 53 * R + M.                                                  ";

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:

"gØâ^ÃP·^À4ξ^ß^E5^W^Ma{áª^B¤±´oòæ»^XÊQÑ»4žDÙÝòÙ 0^ÝþKa6^Ó£,Ûkû¥¡ùh^E"256b7b6a/0a3**

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:

[4 0 0 0 1 0 0 0 0 0 0 3 0 2 0 1 0 0 0 0 0 0 0 0 4 1 1 0 0 0 0 2 0 4 0 5 2 0 0 3 4 0 0 0 0 4 0 1 0 0 3 1 0 0 2 1 1 1 0 0 0 1 0 5 5 0 0 2 0 0 0 5 5 0 0 0 5 0 3 0 0 0 0 5 0 0 0 0 0 0 0 0 5 2 3 0 1 0 5 0 4 0 0 0 0 4 0 5 0 0 0 0 0 5 0 0 0 2 5 1 4 1 5 0 0 0 5 0 0 5 1 1 0 0 0 0 0 0 2 0 5 0 0 0 3 1 0 2 0 0 0 2 0 0 0 5 0 0 0 0 1 0 0 0 0 0 4 0 2 2 5 2 0 0 5 1 0 0 0 0 4 0 5 0 0 3 5 0 0 5 0 1 0 0 0 2 0 0 0 0 0 5 0 4 0 0 0 0 0 0 0 0 3 0 4 0 0 1 2 2 0 0 0 0 0]

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.

< ) 5 md     " Push D[:H-1] (D[H-1] / 5) (D[H-1] % 5).                                    ";
@ 5a / , (   " Count the number of 5's in D[:H-1] (by splitting at [5]). Result: I        ";

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:

" ¬^GH/N¿·%^U^RU1²Bd
òë^м~í^ÌéáU"256b25b'Af+2/

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:

["QP" "YB" "PD" "SN" "QO" "QT" "QS" "SB" "KJ" "TM" "FE" "PB" "AU" "WJ" "CN" "SG" "RF" "CM" "CU" "HG" "NA" "RG" "AG"]

Nous allons maintenant calculer les noms d’éléments potentiels.

=                " Push L[I].                                                             ";
'J - 'Q / "UU" * " Remove J's and replace Q's with runs of two U's.                       ";
\ ) _ 5 = ) *    " Push S := (D[H-1] % 5 + 1) * ((D[H-1] % 5 + 1 == 5) + 1).              ";
E %              " Push every Sth character of E.                                         ";
2 <              " Discard all but the first two characters.                              ";

La pile contient maintenant

B M N

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:

?                " If B, push M; else, push N.                                            ";
( \              " Extract the first character from the string.                           ";
el               " Convert the rest to lowercase.                                         ";
Dennis
la source
Mais comment ça fonctionne?
Claudiu
2
@ Claudiu: J'ai ajouté une explication.
Dennis
3
J'ai lu le premier tiers de l'explication, et jusqu'à présent, ce que j'ai est "magique". Incroyable
Mooing Duck
7
"AcAlAmSbArAsAtBaBkBeBiBhBBrCdCsCaCfCCeClCrCoCnCuCmDsDbDyEsErEuFmFlFFrGdGaGeAuHf HsHeHoHInIIrFeKrLaLrPbLiLvLuMgMnMtMdHgMoNdNeNpNiNbNNoOsOPdPPtPuPoKPrPmPaRaRnReRh RgRbRuRfSmScSgSeSiAgNaSrSTaTcTeTbTlThTmSnTiWUuoUupUusUutUVXeYbYZnZr" = 226 caractères. Votre solution = 200 caractères. Il y a du bon vaudou ici.
ossifrage
J'ai accepté cette réponse car elle semble être la plus courte, mais n'hésitez pas à poster des réponses supplémentaires.
soktinpk
43

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.)

h;main(c){char*p="Sn)Cu&V$U#Mo#Rf#Sg&Cs#Y+FTa%Rb)S'Nd#GaK&Mg'Zr$PtPm%ReUuo#SmDy(Ac$Lu%W&CaRa(Cf)EuB#Ds%Md$Uus*NpIn$H&YbIr*BeEs*Tc#I(FlRuC#ThSrBh/NaCoLrKr&Nb$CePb$Ne'Am)At*PdLa#Tl%HgMt,CrTbBk$Rh&Rn4TeZn$HfAg%Fm)Xe$AlScFePo$As'HeO#LvN&DbGe#Ho&Mn$Cd+Ni$Rg$HsBr$AuSi#Pr&Uup#Se*Ti#Tm$Er$Sb&PPu&Cm$GdBa'Cn&UutLiFr#Ar#Bi#NoOs%Pa4Cl";while((c=getchar())>64)h=(h+c%32+74)*311%441;while(h)if(*p<65?h-=*p++-34,0:1)for(h--;*++p>96;);do putchar(*p++);while(*p>96);}

Ungolfed avec des commentaires:

int h;
main(c) {

  /* Hashed element symbols. Characters #$% etc. are used as padding: */
  char *p="Sn)Cu&V$U#Mo#Rf#Sg&Cs#Y+FTa%Rb)S'Nd#GaK&Mg'Zr$PtPm%ReUuo#SmDy(Ac$Lu%W&C"
          "aRa(Cf)EuB#Ds%Md$Uus*NpIn$H&YbIr*BeEs*Tc#I(FlRuC#ThSrBh/NaCoLrKr&Nb$CeP"
          "b$Ne'Am)At*PdLa#Tl%HgMt,CrTbBk$Rh&Rn4TeZn$HfAg%Fm)Xe$AlScFePo$As'HeO#Lv"
          "N&DbGe#Ho&Mn$Cd+Ni$Rg$HsBr$AuSi#Pr&Uup#Se*Ti#Tm$Er$Sb&PPu&Cm$GdBa'Cn&Uu"
          "tLiFr#Ar#Bi#NoOs%Pa4Cl";

  /* This hash function gives a unique result for each element: */
  while((c=getchar())>64) h=(h+c%32+74)*311%441;

  /* Find the corresponding position in the hashed data */
  while(h) {
    if(*p<65?h-=*p++-34,0:1) {      /* Step over an abbreviation */
      for(h--;*++p>96;);            /* Skip padding */
    }
  }

  /* Output first uppercase character and all following lowercase characters: */
  do {
    putchar(*p++);
  } while(*p>96);
}

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.

ossifrage délirant
la source
3
@soktinpk Brute l'a forcé :-) C'était le seul avec une taille de hachage de ≤512 qui n'avait pas 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).
ossifrage
2
Faites que 464 ... vous avez une paire inutile d'accolades.
Jim Balter
1
Si vous pensez à la grammaire, il est sans ambiguïté et doit être permis ... il semble juste ambigu pour nous . Oh, et vous en avez attrapé un autre que je n'ai pas fait! Félicitations pour cela ... J'ai essayé de resserrer l'algorithme, mais vous avez tout bien compris.
Jim Balter
5
@Harshdeep - La fonction de hachage mappe les chaînes de texte sur des valeurs comprises entre 0 et 440. Le hachage "Tin" est égal à zéro, ainsi "Sn" est 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.
ossifrage
2
Joli. Sauvegardez quelques caractères avec: 1 (h+c%32+74)*311%441.. 2. Laisser tomber pet utiliser s. 3. main(c)enregistre une virgule.
Ugoren
13

JavaScript ES6, 690 708 octets

for(n=prompt()[l='toLowerCase'](i=0);!(c='HHeLiBeBCNFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'.match(x=/[A-Z][a-z]*/g)['HyHeLitBeryBorCarNitFluNeonSoMagAlSiliPhSuChlArgPotCalcScTitVChrManIroCobNicCoppZinGalGeArsSelBrKRubStYttrZirNioMoTecRuthenRhoPaSilvCadInTinAnTelIoXCaeBaLanCePraNeodPromSaEuGadTerDyHoErThuYtteLuHafTaTuRheOsIriPlaGoMerThaLeBiPolAsRadoFrRadiAcThoProtUrNepPluAmCuBerkCaliEiFeMenNoLawRutherDuSeaBohHasMeiDaRoCopeUnuntFleUnunpLivUnunsUnuno'.match(x).map(a=>a[l]()).indexOf(n.slice(0,i++))]);)
alert(c)

Le 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:

n=prompt().toLowerCase()
e='HyHeLitBeryBorCarNitFluNeonSoMagAlSiliPhSuChlArgPotCalcScTitVChrManIroCobNicCoppZinGalGeArsSelBrKRubStYttrZirNioMoTecRuthenRhoPaSilvCadInTinAnTelIoXCaeBaLanCePraNeodPromSaEuGadTerDyHoErThuYtteLuHafTaTuRheOsIriPlaGoMerThaLeBiPolAsRadoFrRadiAcThoProtUrNepPluAmCuBerkCaliEiFeMenNoLawRutherDuSeaBohHasMeiDaRoCopeUnuntFleUnunpLivUnunsUnuno'.match(x=/[A-Z][a-z]*/g).map(a=>a.toLowerCase())
s='HHeLiBeBCNFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'.match(x)
for(i=0;i<7;i++){
  if(c=s[e.indexOf(n.slice(0,i))]){
    alert(c,i=8) // i=8 breaks out of the loop so the result is only alerted once
  }
}
NinjaBearMonkey
la source
Pouvez-vous réduire certains octets en utilisant le fait que Neo correspond à Néodyme, étant donné que Néon a été ajouté à la liste?
Dancrumb
1
@Dancrumb Malheureusement non. La boucle commence par la sous-chaîne la plus courte, elle sera donc lancée Neoavant de toucher Neoncar elle contient moins de lettres.
NinjaBearMonkey
1
+1 pour le JS le plus court jusqu'à présent. Bien que vous puissiez vous débarrasser de cette ifdéclaration (c'est une forcondition parfaite ) et aussi insérer ou déplacer les positions de certaines variables, raccourcir le code;)
core1024
2
au début ).toLowerCase(-> )[L='toLowerCase'](puis à la fin a.toLowerCase(-> a[L](devrait couper 4 caractères
edc65
10

Ruby 1.9+, 565 471 447 444

Un 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))

p"VAlAmA.sArAcAnt|SbA.tBaB..kBeBiB.hBrBDyD.+sD.bE..sErEuF..mFrFlu|[email protected]|AuH.fH.sHeHoHInIro|FeIrIKrL.vL.+rLaLiLuL|PbM.gMoM.+dM.nM.+tM|HgC.+sC.dC.+fCeCar|[email protected]|CmCop|CuCoC.rC.lN.+dN.+pNeN..bNit|[email protected]|PdP...aPrP.uP..tPot|KPoPR.*n$RaR.+gR.eRhR.+bR.+fRuS.mScS.+gSeS..v|AgSiSo|NaS.rSTaT.cT.+bTeThu|TmT..lThTin|SnTiTu|WU.u.oU.u.pU.u.sU.u.tUXeY.+bYZ.nZ.r"
.split(/(?<!\|)(?=[A-Z])/).find{|r|/^#{r}/i.match *$*}.gsub /.*\||\W/,''

(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).

def testfunc(name) 
  #replace with however you call your code
  return `ruby1.9.3 periodic2.rb #{name}`.chomp()
end

elements= File.new('table.txt').readlines.map{|s|s.chomp}

elements.each{|l|
  a,n=l.split(' ')
  r = testfunc(n)
  print "#{n} => #{a} "
  if r!=a then
    print ("FAIL: gave #{r}\n")
    exit
  else 
    print("\tOK\n")
  end
}
print("PASS: #{elements.size} elements matched\n")
AShelly
la source
1
Ovation
Bien sûr, cela fonctionne: ideone.com/7FZlAt
AShelly
On a l'audace d'affirmer que quelque chose ne peut pas être fait avec regex. Merci de nous avoir prouvé qu'ils avaient tort (un d'entre eux a dit, bien pensé) :)
Mât
4

Ruby, 1068 octets

require"zlib"
require"base64"
$><<eval(Zlib::Inflate.inflate(Base64.decode64"eJwlU8tu2zAQ/Bee+QW6CLYTx0FiR7CdtsmNkmhJCEUKfKQViv57Z9YnE+vd2ZnZ0d+1j2Go6oO2bipzpQ5W6SmPU6nU66S0jatzldqiGmLwVb3VJrZ87NAmoyf9Zx0sKm/alRCnqt5riw514lAvqCejtBm8TZU6Dgp984SGjcMuN3WhUhfsGkNaxqpudHG3Eqv6okdHPLVDXxwIuYmAzCalqn7RxnWkuQN2Z3yPxktH8sbjeQWg8QbV+oceY5iJE1kbDICOHpBE3JNka1zG3wHT3ZeF3hOmw7LYiGpB1XeV+sSIcY4rnwydmQn0hPmYLFduEqpOnhdWg4jcYmlclwyRL3iWdiLTc6s07PNYe0E15wjc+kNPsSOrT9Sm0HLXCZ3BrW0P0iBou9FbyIPSkkfYrs6F1vXsPY9C0aC36entNxVs4LjpZ/EKVX8/ybOnLqzHr8/TzCO0FODgvbreb4dV9bO2npx+oWSTzO6g1ER5bnlZn0eDvIgr9wbqN8kCtIEUG/qVKejFFQvRzYyx2fC6FzxLDAuej4VMg8PzqSeYOHAFrTUtEWAPK80QKQeYwf+B+4gVY5HLXGeaicFKfbS0yGaAvRL35mXsJnwNjnwF3+KHlKv6p4aV4iCIp1lQ3yAyTuLrMxY4k2lXk8kABm8KCXY06wCDR0YDmIiqFf+xfUpzgdYtw+QCc9GAdMqGnDZZtPKAzKLxHYp7JvR+nzNjjZVs7XjhKPpGWpgN8tgYGWNu3rVdcuEnt/DjykRtwG/GOdC5EYfvh5nJWjK+/WJYphts3d2YhZQRrMck0eauPXt9z95jz6/EUuEJEszvyOS9xnsIYcH5xmiLhQ9MkWkDqhcYE0YhvmU0U5ITcMWUGeMjTYgzTqAeUA3W5wFgHMPHhxU7prP4DLD3gmZnY/gGNSflxbIMzROCDnWv31JOUk7yDh3fQf37D7D/kWs="))[gets.downcase[1..5].to_sym]

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:

{ydrog:?H,elium:"He",ithiu:"Li",eryll:"Be",oron:?B,arbon:?C,itrog:?N,xygen:?O,luori:?F,eon:"Ne",
 odium:"Na",agnes:"Mg",lumin:"Al",ilico:"Si",hosph:?P,ulfur:?S,hlori:"Cl",rgon:"Ar",otass:?K,
 alciu:"Ca",candi:"Sc",itani:"Ti",anadi:?V,hromi:"Cr",angan:"Mn",ron:"Fe",obalt:"Co",ickel:"Ni",
 opper:"Cu",inc:"Zn",alliu:"Ga",erman:"Ge",rseni:"As",eleni:"Se",romin:"Br",rypto:"Kr",ubidi:"Rb",
 tront:"Sr",ttriu:?Y,ircon:"Zr",iobiu:"Nb",olybd:"Mo",echne:"Tc",uthen:"Ru",hodiu:"Rh",allad:"Pd",
 ilver:"Ag",admiu:"Cd",ndium:"In",in:"Sn",ntimo:"Sb",ellur:"Te",odine:?I,enon:"Xe",esium:"Cs",
 arium:"Ba",antha:"La",erium:"Ce",raseo:"Pr",eodym:"Nd",romet:"Pm",amari:"Sm",uropi:"Eu",
 adoli:"Gd",erbiu:"Tb",yspro:"Dy",olmiu:"Ho",rbium:"Er",huliu:"Tm",tterb:"Yb",uteti:"Lu",
 afniu:"Hf",antal:"Ta",ungst:?W,heniu:"Re",smium:"Os",ridiu:"Ir",latin:"Pt",old:"Au",ercur:"Hg",
 halli:"Tl",ead:"Pb",ismut:"Bi",oloni:"Po",stati:"At",adon:"Rn",ranci:"Fr",adium:"Ra",ctini:"Ac",
 horiu:"Th",rotac:"Pa",raniu:?U,eptun:"Np",luton:"Pu",meric:"Am",urium:"Cm",erkel:"Bk",alifo:"Cf",
 inste:"Es",ermiu:"Fm",endel:"Md",obeli:"No",awren:"Lr",uther:"Rf",ubniu:"Db",eabor:"Sg",
 ohriu:"Bh",assiu:"Hs",eitne:"Mt",armst:"Ds",oentg:"Rg",opern:"Cn",nuntr:"Uut",lerov:"Fl",
 nunpe:"Uup",iverm:"Lv",nunse:"Uus",nunoc:"Uuo"}
Martin Ender
la source
3

CJam, 462 449 434 401 391 384 382

Avec l'aide de Dennis.

Code

Les ifs ternaires imbriqués ne sont probablement pas la bonne façon de faire cela dans CJam.

rel_"ruthen"#!"Ru"{_"tel"#!"Te"{__5{\_ceu\@=+_}:U~"PdYbRgCmCn"{\#)!}:X~{;__4U"RnPaCfDs"X{;_3U"NbCsNdPmTbPtTlBkEsFmMdLrMt"X{;2U"MgClCrMnZnAsRbSrZrTcCdSmGdHfReAtNpPuDbBhHsLv"X{;__"sili"#{;__ceu\1=@2=++"SodIroCopSilTinAntThuGolMerLeaTunPotRutSeaHydBorCarNitOxyFluPhoSulVanYttIodUra"\#3d/m[)"_NaFeCuAgSnSbTmAuHgPbWKRfSgHBCNOFPSVYIU"S%\=_"_"={;_1U"Un"={;4="Uu"\+}*}*}"Si"?}*}*}*}*}?}?]W=

Avec des tirets:

rel
_"ruthen"#!"Ru"
{
_"tel"#!"Te"
{
  __5{\_ceu\@=+_}:U~
  "PdYbRgCmCn"{\#)!}:X~
  {
   ;__4U
   "RnPaCfDs"X
   {
    ;_3U
    "NbCsNdPmTbPtTlBkEsFmMdLrMt"X
    {
     ;2U
     "MgClCrMnZnAsRbSrZrTcCdSmGdHfReAtNpPuDbBhHsLv"X
     {

       ;__"sili"#
       {
        ;__ceu\1=@2=++"SodIroCopSilTinAntThuGolMerLeaTunPotRutSeaHydBorCarNitOxyFluPhoSulVanYttIodUra"\#3d/m[)"_ Na Fe Cu Ag Sn Sb Tm Au Hg Pb W K Rf Sg H B C N O F P S V Y I U"S%\=_"_"=
        {;_1U"Un"={;4="Uu"\+}*}*
       }
      "Si"?

     }*
    }*
   }*
  }*
 }?
}?
]W=

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 ( TelLuriumvs ThaLlium, ou SILiconvs SILver, ou RUTheniumvs RUTherfordium). 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
1
Quelques conseils: 1. Le comportement des noms d'élément non valides peut ne pas être défini, "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. Si Best un booléen, B{...}{}?et B{...}*atteindre le même objectif. 4. Le ternaire si prend des blocs ou des éléments de pile, vous pouvez donc raccourcir {"Si"}à "Si".
Dennis
@ Dennis Je pense que j'ai ajouté tout cela. La gestion de la pile a besoin de travail, cependant - trop _et ;partout
@Dennis Et j'ai rasé quelques caractères en changeant la casse par défaut en minuscule et en utilisant le code avec alias qui bloque davantage
3

PHP, 507 485 476 466 caractères

Utilisation: 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:

<?
$l=ucfirst(strtolower($_GET[0]));
for(
  $m[3]="AnSbArs2As2Berk3Boh2BoBCad2Cae3Cali4CarCChl2Ch2Cope5CopCuCu5Da4Du2Ei3Fe3FluFGad2GoAuHaf2Ha2HyHIo0IroFeLaw3LePbLiv2Mag2Man2Mei3Men3MeHgNeod3Nep2Nio3NiNOxOPa5PhPPla3Plu2PotKProm3Pro4Rado4Rhe2Roe5Rub2Ruther6Sa2Sea6SilvAgSoNaSt2SuSTec2Ter3Tha3Thu6TinSnTuWUn|UUVVYtte5YYZin2Z2";
  preg_match('/(.[a-z]*)(.[a-z]*)(.*)/',$m[3],$m)
;)
    if(strstr($l,$m[1]))
        echo($x=$m[2][0])>'@'?$x>'{'?"Uu$l[4]":$m[2]:$l[0].$l[$x],die;
echo$l[0],$l[1];

Condensé:

<?$l=ucfirst(strtolower($_GET[0]));for($m[3]="AnSbArs2As2Berk3Boh2BoBCad2Cae3Cali4CarCChl2Ch2Cope5CopCuCu5Da4Du2Ei3Fe3FluFGad2GoAuHaf2Ha2HyHIo0IroFeLaw3LePbLiv2Mag2Man2Mei3Men3MeHgNeod3Nep2Nio3NiNOxOPa5PhPPla3Plu2PotKProm3Pro4Rado4Rhe2Roe5Rub2Ruther6Sa2Sea6SilvAgSoNaSt2SuSTec2Ter3Tha3Thu6TinSnTuWUn|UUVVYtte5YYZin2Z2";preg_match('/(.[a-z]*)(.[a-z]*)(.*)/',$m[3],$m);)if(strstr($l,$m[1]))echo($x=$m[2][0])>'@'?$x>'{'?"Uu$l[4]":$m[2]:$l[0].$l[$x],die;echo$l[0],$l[1];
Sir_Lagsalot
la source
2

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.

e={hy:"H",he:"He",lit:"Li",bery:"Be",bor:"B",car:"C",nit:"N",ox:"O",flu:"F",neon:"Ne",so:"Na",mag:"Mg",al:"Al",sili:"Si",ph:"P",su:"S",chl:"Cl",arg:"Ar",pot:"K",calc:"Ca",sc:"Sc",tit:"Ti",v:"V",chr:"Cr",man:"Mn",iro:"Fe",cob:"Co",nic:"Ni",copp:"Cu",zin:"Zn",gal:"Ga",ge:"Ge",ars:"As",sel:"Se",br:"Br",k:"Kr",rub:"Rb",st:"Sr",yttr:"Y",zir:"Zr",nio:"Nb",mo:"Mo",tec:"Tc",ruthen:"Ru",rho:"Rh",pa:"Pd",silv:"Ag",cad:"Cd",in:"In",tin:"Sn",an:"Sb",tel:"Te",io:"I",x:"Xe",cae:"Cs",ba:"Ba",lan:"La",ce:"Ce",pra:"Pr",neod:"Nd",prom:"Pm",sa:"Sm",eu:"Eu",gad:"Gd",ter:"Tb",dy:"Dy",ho:"Ho",er:"Er",thu:"Tm",ytte:"Yb",lu:"Lu",haf:"Hf",ta:"Ta",tu:"W",rhe:"Re",os:"Os",iri:"Ir",pla:"Pt",go:"Au",mer:"Hg",tha:"Tl",le:"Pb",bi:"Bi",pol:"Po",as:"At",rado:"Rn",fr:"Fr",radi:"Ra",ac:"Ac",tho:"Th",prot:"Pa",ur:"U",nep:"Np",plu:"Pu",am:"Am",cu:"Cm",berk:"Bk",cali:"Cf",ei:"Es",fe:"Fm",men:"Md",no:"No",law:"Lr",ruther:"Rf",du:"Db",sea:"Sg",boh:"Bh",has:"Hs",mei:"Mt",da:"Ds",ro:"Rg",cope:"Cn",ununt:"Uut",fle:"Fl",ununp:"Uup",liv:"Lv",ununs:"Uus",ununo:"Uuo"}
n=prompt().toLowerCase()
for(i in e)n.indexOf(i)?i:alert(e[i])
Mika Lammi
la source
2

Python - 652 649 637

Ma table de hachage est basée sur la combinaison de chaque seconde et de chaque troisième caractère du nom en majuscule:

import re
def f(s,c='S<8F0FCE;2.ACR;J@W$;BI8>GD*?GnHQ<K>&T\(51IAg/Y?S2=169.,325(F(98?>?=^97DUCITX;SJ`0C<P9iLP/G4B,A(-A?(3QLLZ;81D(.4F;L8GaVP[=\=cOX3U,LQl6:E9/OXdSe(4,TSV/=FN98?K.18Q>R$+<GG[IS-4?;4H;T/IMq9<LXMYH4HG<>>KTT,>IIEM,[Nf<,:Z60(A9fImZTMRTcM?[lVg^qC}',e='HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'):
 U=s.upper();X=lambda x:chr(32+sum(ord(u)-65for u in x))
 return re.findall('[A-Z][a-z]*',e)[zip(c[::2],c[1::2]).index((X(U[1::3]),X(U[:-1:2])))]

Voici le générateur correspondant:

table = '''
H     Hydrogen
He    Helium
...
Uuo   Ununoctium
'''

table = map(lambda l: l.split(), table.split('\n')[1:-1])

abbr = []
for name in map(str.upper, zip(*table)[1]):
    abbr.append(chr(32+sum(ord(u)-65 for u in name[1::3]))+
                chr(32+sum(ord(u)-65 for u in name[:-1:2])))
print 'c=' + ''.join(abbr)
print 'e=' + ''.join(zip(*table)[0])
print 'Unique' if len(table) == len(set(abbr)) else 'Duplicates'

Des améliorations sont probablement possibles, notamment la compression des deux longues chaînes.

Testé avec:

for short, name in table:
    if f(name) != short:
        print "Wrong result!"
Falko
la source
2

Golfscript - 1052 821

{.91<32*+}%:x;'H
He
Li
Be
B
C
N
F
Ne
Na
Mg
Al
Si
P
S
Cl
Ar
K
Ca
Sc
Ti
V
Cr
Mn
Fe
Co
Ni
Cu
Zn
Ga
Ge
As
Se
Br
Kr
Rb
Sr
Y
Zr
Nb
Mo
Tc
Ru
Rh
Pd
Ag
Cd
In
Sn
Sb
Te
I
Xe
Cs
Ba
La
Ce
Pr
Nd
Pm
Sm
Eu
Gd
Tb
Dy
Ho
Er
Tm
Yb
Lu
Hf
Ta
W
Re
Os
Ir
Pt
Au
Hg
Tl
Pb
Bi
Po
At
Rn
Fr
Ra
Ac
Th
Pa
U
Np
Pu
Am
Cm
Bk
Cf
Es
Fm
Md
No
Lr
Rf
Db
Sg
Bh
Hs
Mt
Ds
Rg
Cn
Uut
Fl
Uup
Lv
Uus'n/'hy
he
lit
bery
bor
car
nit
flu
neon
so
mag
al
sili
ph
su
chl
arg
pot
calc
sc
tit
v
chr
man
iro
cob
nic
copp
zin
gal
ge
ars
sel
br
k
rub
st
yttr
zir
nio
mo
tec
ruthen
rho
pa
silv
cad
in
tin
an
tel
io
x
cae
ba
lan
ce
pra
neod
prom
sa
eu
gad
ter
dy
ho
er
thu
ytte
lu
haf
ta
tu
rhe
os
iri
pla
go
mer
tha
le
bi
pol
as
rado
fr
radi
ac
tho
prot
ur
nep
plu
am
cu
berk
cali
ei
fe
men
no
law
ruther
du
sea
boh
has
mei
da
ro
cope
ununt
fle
ununp
liv
ununs
ununo'n/[{x\?)}/]1?=

Explication:

{        }%                              Map these ops to the input string:
 .91<32*+                                   Add 32 if less than 91 (convert to lowercase, in essence)
           :x;                           Store to x.
              '...'  '...'               The first array is the symbols, the second is the names.
                                         (stripped down to the minimum necessary)
                   n/     n/             Convert them to arrays.
                             {    }/     For each element in the name array...
                              x\?)          ...return 1 if the element is found in the input.
                            [       ]    Gather every element in an array...
                                     1?  Find the 1 in the array (the only element name match)...
                                       = ...then return that symbol in the symbol array.
                               (implied) Print.
Josiah Winslow
la source
11
OMG, un morceau de Golfscript qui n’est pas 10 caractères ou moins!
WallyWest
1
Vous pouvez obtenir une amélioration considérable de ce tableau de chaînes en utilisant une chaîne avec newline comme séparateur puis en faisantn/
Peter Taylor
Je l'ai fait la dernière fois, pourquoi diable n'y ai-je pas pensé? Mise à jour maintenant.
Josiah Winslow
2

Haskell, 920 817 807 776 Chars

Aprè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 esous 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.

import Data.Char
m _[]=True;m[]_=False;m k@(c:s)x@(y:z)=case y of{']'->m s x;'['->let(i,(_:j))=break(==']')z in(c`elem`i)&&m s j;'?'->m s z;'*'->null z||m k z||m s z||m s x;_->c==y&&m s z};p(a:t)(x:y)=case a of{'.'->x:p t y;'_'->p t y;_->a:p t y};p[]_=[];e="Iro\nUn\nCu Pa Ro Y*e\nR*r\n*pp\nCop Rado\nSea Thu\nCali Da P*ot Tha\nA*s Boh ?ub Ch [CG]ad [HM]a Liv Nep Plu Rhe S[ato] Tec Tin Z\nB*k Cae [ES]i *w Nio [FM]e N*d Pro Pla Ter\nBor Car Flu Hy Io Nit Ox Ph Su [UVY]\n*";s="Fe ._._. .____. .f .u .n ._____. .___. ._. .__. . ..";t"Sv"="Ag";t"Sd"="Na";t"Go"="Au";t"Le"="Pb";t"Mc"="Hg";t"An"="Sb";t"Ps"="K";t"Tu"="W";t"Tn"="Sn";t x=x;main=interact$unlines.map(\(a:b)->let y=toUpper a:map toLower b in t$p(snd.head.filter(any(m y).fst)$zip(map words$lines e)$words s)y).lines

Version lisible par l'homme (saut de ligne, espacement, noms détaillés, commentaires: 2311 caractères)

import Data.Char

-- Test against search-pattern strings
match _ [] = True
match [] _ = False
match k@(c:s) x@(y:z) = case y of
']' -> match s x
'[' -> let (i,(_:j)) = break (==']') z in (c `elem` i) && match s j
'?' -> match s z
'*' -> null z || match k z || match s z || match s x
 _  -> c == y && match s z

-- Write according to name-pattern string
pattern (a:t) (x:y) = case a of
'.' -> x : (pattern t y)
'_' -> (pattern t y)
 _  -> a : (pattern t y)
pattern [] _ = []

-- Search-Patterns for the elements
elements=["Iro", -- Iron -> Fe
      "Un", -- UnUn-Blank-ium (1,3,5)
      "Cu Pa Ro Y*e", -- CuriuM PallaDium RoentGenium YtterBium (1,6)
      "R*r", -- Rutherfordium (1,f)
      "*pp", -- Copper (1,u)
      "Cop Rado", -- Copernicium Radon (1,n)
      "Sea Thu", -- SeaborGium ThuliuM (1,7)
      "Cali Da P*ot Tha", -- CaliFornium DarmStadtium ProtActinium PotaSsium (1,5)

      {- AsTatine ArSenic BoHrium DuBnium RuBidium ChLorine ChRome CaDmium
      GaDolinium HaFnium HaSsium MaNganese MaGnesium LiVermorium NePtunium
      PlUtonium RhEnium SaMarium StRontium SoDium TeChnetium TiN ZiNc
      ZiRconium (1,3) -}

      "A*s Boh ?ub Ch [CG]ad [HM]a Liv Nep Plu Rhe S[ato] Tec Tin Z", 

      {- BerKelium CaeSium EinSteinum SilIcon SilVer LawRencium NioBium
      FerMium MenDelevium MeiTnerium MerCury NeoDymium ProMethium PlaTinum
      TerBium (1,4) -}

      "B*k Cae [ES]i *w Nio [FM]e N*d Pro Pl Ter",

      {- Boron Carbon Fluorine Hydrogen Nitrogen Oxygen Phosphorous Sulphur
      Uranium Vanadium Yttrium (1) -}

      "Bor Car Flu Hy Io Nit Ox Ph Su [UVY]",
      "*"] -- Everything else (1,2)

-- respective naming patterns for searches
symbol = "Fe ._._. .____. .f .u .n ._____. .___. ._. .__. . .."

-- Translate fake symbols
translate x = case x of
"Sv" -> "Ag" -- SilVer
"Sd" -> "Na" -- SoDium
"Go" -> "Au" -- GOld
"Le" -> "Pb" -- LEad
"Mc" -> "Hg" -- MerCury
"An" -> "Sb" -- ANtimony
"Ps" -> "K" -- PotaSsium
"Tu" -> "W" -- TUngsten
"Tn" -> "Sn" -- TiN
  _  -> x  -- Keep everything else the same

main = interact $ unlines . map (\(a:b) -> let y = (toUpper a) : (map toLower b) in t $ p (snd.head.filter (any (m y) . fst) $ zip (map words e) $ words s) $ y) . lines

Si quelqu'un est intéressé par une explication à ce sujet, n'hésitez pas à demander.

archéphyrryx
la source
2

C # (826)

pas le meilleur mais j’ai pensé que j’essayerais avec le handicap de c #.

using System;class P{static string s="HyHHe1Li1Be1BoBCaCNitNOxOFlFNe1SoNaMaMgAl1Sil1PhPSuSChClAr1PotKCal1Sc1Tit1VaVChrCrManMnIrFeCo1Ni1CopCuZiZnGa1Ge1ArsAsSe1Br1Kr1RuRbStSrYtYZirZrNioNbMo1TecTcRut1Rh1PaPdSiAgCadCdIn1TiSnAnSbTel1IoIXe1CaeCsBa1La1Ce1Pra1NeoNdPrPmSaSmEu1GadGdTeTbDy1Ho1Er1ThTmYttYbLu1HaHfTa1TuWRheReOs1Iri1PlPtGoAuMeHgThaTlLePbBi1Po1AsAtRaRnFr1Rad1Ac1Tho1ProPaUrUNepNpPluPuAm1CuCmBerBkCaliCfEiEsFeFmMenMdNo1LawLrRuthRfDuDbSeaSgBohBhHasHsMeiMtDaDsRoRgCopeCnUnUutFle1UnuUupLivLvUnunUus",n,t,k;static void Main(){var d=new System.Collections.Specialized.StringDictionary();while(s!=""){k=g;d[k]=g;if(d[k]=="1")d[k]=k.Substring(0,2);};t=Console.ReadLine();while(t!=""&!d.ContainsKey(t))t=t.Remove(t.Length-1);Console.Write(d[t]);}static string g{get{n="";do n+=s[0];while((s=s.Remove(0,1))!=""&&s[0]>96);return n;}}}

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.

miethpo
la source
Vous pouvez jouer au golf en modifiant toutes les définitions de type en var. Vous pouvez économiser un peu plus en supprimant les accolades après une instruction unique si elle est bloquée. Si vous attribuez t.Substring(int, int)à un, Func<int, int, string>vous pouvez enregistrer un autre couple.
Brandon
J'ai fait la plupart des définitions "var" variables, mais il me semble que j'en ai oublié une ou deux, et que j'ai aussi complètement oublié les si sans crochets, merci.
miethpo
Vous pouvez raser 5 autres caractères en varing la string[] ret un autre 3 en varing la string t = Console...., enfin, vous gagnerez 7 plus en changeant return new string[]dans return new[]à la fin.
Brandon
Vous pouvez effectuer quelques améliorations mineures, telles que le déplacement de votre if(...) break;logique dans les conditions de sortie de la boucle for. Un certain nombre d'autres inversions logiques peuvent être appliquées, par exemple do { } 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.
Nicholas
1
@ Nicolas je ne suis pas sûr que le code de golf de quelqu'un d'autre soit poli ...
miethpo
1

JavaScript (E6) 1433

Voici une limite supérieure

F=n=>'0H0HYDROGEN0He0HELIUM0Li0LITHIUM0Be0BERYLLIUM0B0BORON0C0CARBON0N0NITROGEN0O0OXYGEN0F0FLUORINE0Ne0NEON0Na0SODIUM0Mg0MAGNESIUM0Al0ALUMINIUM0Si0SILICON0P0PHOSPHORUS0S0SULFUR0Cl0CHLORINE0Ar0ARGON0K0POTASSIUM0Ca0CALCIUM0Sc0SCANDIUM0Ti0TITANIUM0V0VANADIUM0Cr0CHROMIUM0Mn0MANGANESE0Fe0IRON0Co0COBALT0Ni0NICKEL0Cu0COPPER0Zn0ZINC0Ga0GALLIUM0Ge0GERMANIUM0As0ARSENIC0Se0SELENIUM0Br0BROMINE0Kr0KRYPTON0Rb0RUBIDIUM0Sr0STRONTIUM0Y0YTTRIUM0Zr0ZIRCONIUM0Nb0NIOBIUM0Mo0MOLYBDENUM0Tc0TECHNETIUM0Ru0RUTHENIUM0Rh0RHODIUM0Pd0PALLADIUM0Ag0SILVER0Cd0CADMIUM0In0INDIUM0Sn0TIN0Sb0ANTIMONY0Te0TELLURIUM0I0IODINE0Xe0XENON0Cs0CAESIUM0Ba0BARIUM0La0LANTHANUM0Ce0CERIUM0Pr0PRASEODYMIUM0Nd0NEODYMIUM0Pm0PROMETHIUM0Sm0SAMARIUM0Eu0EUROPIUM0Gd0GADOLINIUM0Tb0TERBIUM0Dy0DYSPROSIUM0Ho0HOLMIUM0Er0ERBIUM0Tm0THULIUM0Yb0YTTERBIUM0Lu0LUTETIUM0Hf0HAFNIUM0Ta0TANTALUM0W0TUNGSTEN0Re0RHENIUM0Os0OSMIUM0Ir0IRIDIUM0Pt0PLATINUM0Au0GOLD0Hg0MERCURY0Tl0THALLIUM0Pb0LEAD0Bi0BISMUTH0Po0POLONIUM0At0ASTATINE0Rn0RADON0Fr0FRANCIUM0Ra0RADIUM0Ac0ACTINIUM0Th0THORIUM0Pa0PROTACTINIUM0U0URANIUM0Np0NEPTUNIUM0Pu0PLUTONIUM0Am0AMERICIUM0Cm0CURIUM0Bk0BERKELIUM0Cf0CALIFORNIUM0Es0EINSTEINIUM0Fm0FERMIUM0Md0MENDELEVIUM0No0NOBELIUM0Lr0LAWRENCIUM0Rf0RUTHERFORDIUM0Db0DUBNIUM0Sg0SEABORGIUM0Bh0BOHRIUM0Hs0HASSIUM0Mt0MEITNERIUM0Ds0DARMSTADTIUM0Rg0ROENTGENIUM0Cn0COPERNICIUM0Uut0UNUNTRIUM0Fl0FLEROVIUM0Uup0UNUNPENTIUM0Lv0LIVERMORIUM0Uus0UNUNSEPTIUM0Uuo0UNUNOCTIUM'
.match(RegExp('([^0]+)0+'+n,'i'))[1]

Test dans la console FireFox / FireBug

F('Rutherfordium')

Sortie

Rf
edc65
la source
1

SmileBASIC, 1763 1418 1204 1128 octets

INPUT E$Hro$="H
Hiu$="He
Lhi$="Li
Byl$="Be
Bon$="B
Cbo$="C
Nro$="N
Oge$="O
For$="F
Nn$="Ne
Siu$="Na
Mne$="Mg
Ami$="Al
Sic$="Si
Psp$="P
Sfu$="S
Cor$="Cl
Aon$="Ar
Pas$="K
Cci$="Ca
Snd$="Sc
Tan$="Ti
Vad$="V
Com$="Cr
Mga$="Mn
In$="Fe
Cal$="Co
Nke$="Ni
Cpe$="Cu
Zc$="Zn
Gli$="Ga
Gma$="Ge
Aen$="As
Sen$="Se
Bmi$="Br
Kpt$="Kr
Rid$="Rb
Son$="Sr
Yri$="Y
Zco$="Zr
Nbi$="Nb
Myb$="Mo
Thn$="Tc
Rhe$="Ru
Rdi$="Rh
Pla$="Pd
Sve$="Ag
Cmi$="Cd
Iiu$="In
T$="Sn
Aim$="Sb
Tlu$="Te
Iin$="I
Xon$="Xe
Csi$="Cs
Biu$="Ba
Lth$="La
Pse$="Pr
Ndy$="Nd
Pme$="Pm
Sar$="Sm
Eop$="Eu
Gol$="Gd
Tbi$="Tb
Dpr$="Dy
Hmi$="Ho
Eiu$="Er
Tli$="Tm
Yer$="Yb
Let$="Lu
Hni$="Hf
Tta$="Ta
Tgs$="W
Rni$="Re
Oiu$="Os
Idi$="Ir
Pti$="Pt
Gd$="Au
Mcu$="Hg
Tll$="Tl
Ld$="Pb
Bmu$="Bi
Pon$="Po
Aat$="At
Ron$="Rn
Fnc$="Fr
Riu$="Ra
Ain$="Ac
Tri$="Th
Pta$="Pa
Uni$="U
Ntu$="Np
Pto$="Pu
Ari$="Am
Ciu$="Cm
Bke$="Bk
Cif$="Cf
Est$="Es
Fmi$="Fm
Mde$="Md
Nel$="No
Lre$="Lr
Dni$="Db
Sbo$="Sg
Bri$="Bh
Hsi$="Hs
Mtn$="Mt
Dms$="Ds
Rnt$="Rg
Cer$="Cn
Unt$="Uut
Fro$="Fl
Unp$="Uup
Ler$="Lv
Uns$="Uus
Uno$="Uuo
S$=VAR(E$[0]+MID$(E$,3,2))IF"Cm"==S$*!VAL(".1"+E$[1])THEN S$="Ce
IF LEN(E$)>12THEN S$="Rf
?S$

J'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.

12Me21
la source
0

T-SQL, 900 894 676 octets

SELECT ISNULL((SELECT LEFT(value,3)FROM
STRING_SPLIT('Sb An-As Ars-At Ast-Bk Berk-Bh Boh-B  Bor-Cd Cad-Cs Cae-Cf Cali-C  Car-Cl Chl-Cr Chr-Cn Cope-Cu Copp-Cm Cu-Ds Da-Db Du-Es Ei-Fm Fe-F  Flu-Gd Gad-Au Go-Hf Haf-Hs Has-H  Hy-I  Io-Fe Iro-Lr Law-Pb Le-Lv Liv-Mg Mag-Mn Man-Mt Mei-Md Men-Hg Mer-Nd Neod-Np Nep-Nb Nio-N  Nit-O  Ox-Pd Pa-P  Ph-Pt Pla-Pu Plu-K  Pot-Pm Prom-Pa Prot-Rn Rado-Re Rhe-Rg Ro-Rb Rub-Rf Ruther-Sm Sa-Sg Sea-Ag Silv-Na So-Sr St-S  Su-Tc Tec-Tb Ter-Tl Tha-Tm Thu-Sn Tin-W  Tu-UuoUnuno-UupUnunp-UusUnuns-UutUnunt-U  Ur-V  V-Yb Ytte-Y  Yttr-Zn Zin-Zr Zir'
    ,'-')m,t WHERE e LIKE SUBSTRING(value,4,9)+'%'),
(SELECT UPPER(LEFT(e,1))+LOWER(SUBSTRING(e,2,1))FROM t))

Les 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 ( Xsuffit pour Xenon , mais Rutherfordium nécessite Rutherde 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 ISNULLfonction 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.

BradC
la source