Tabla periódica de elementos - Code Golf


47

Basado en Golf Práctico - Estados Unidos

Su tarea es encontrar la abreviatura (símbolo) de un elemento dado el nombre del elemento, hasta e incluido ununoctium (118). Use la tabla periódica en Wikipedia .

Gracias al ossifrage aprensivo, puede encontrar una lista completa de elementos para abreviaturas en http://pastebin.com/DNZMWmuf .

No puede usar ningún recurso externo. Además, no puede utilizar ningún dato incorporado específicamente sobre los elementos de la tabla periódica. Se aplican lagunas estándar.

Entrada

La entrada puede ser de stdin, archivo prompt, inputetc.

Formato de entrada

Todos los siguientes son entradas válidas:

Carbon
carbon
CARBON
cArBOn

Esencialmente, el nombre del elemento - mayúsculas y minúsculas.

No tiene que manejar errores ortográficos ni ningún nombre de elemento no válido. La entrada no válida es un comportamiento indefinido.

Salida :

El símbolo del elemento. El primer carácter debe estar en mayúscula y el resto debe estar en minúscula.

Salida de ejemplo: C

Casos de prueba:

Carbon -> C
NiTROGen -> N
Sodium -> Na
Gold -> Au
Silver -> Ag
Tin -> Sn

Hay muchos más elementos que estados, por lo que espero que sea más difícil encontrar una regla general para estos.

Este es el código de golf. ¡El código más corto gana!


44
@squeamishossifrage Gracias. Ambas versiones ("azufre" y "azufre") son aceptables. Su programa no tiene que manejar ambos, sin embargo, solo uno.
soktinpk

1
... imposible de hacer con expresiones regulares. Nos tienes bien.
Josiah Winslow

2
@Xrylite Intente leer las reglas: " Entrada ... el nombre del elemento - sin distinción entre mayúsculas y minúsculas ... Salida ... El primer carácter debe estar en mayúscula y el resto debe estar en minúscula".
Jim Balter

2
¿Qué pasa con la ortografía adecuada (aluminio) versus la ortografía estadounidense (aluminio)?
Paul R

44
@codebreaker Sí, si la entrada no es válida, su programa puede bloquearse, bloquearse, imprimir Auo lo que desee. @Paul R Si hay muchas formas de deletrear un elemento (por ejemplo, azufre vs azufre o aluminio vs aluminio), use el que acorte su programa. No tiene que manejar ambos casos.
soktinpk

Respuestas:


27

CJam, 337 297 293 232 220 201 200 bytes

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

El código anterior usa notación de intercalación, ya que contiene caracteres de control.

Con el costo de 24 bytes adicionales (para un total de 224), se pueden evitar esos caracteres.

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

Puede probar este código en el intérprete de CJam .

Casos de prueba

$ 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

Cómo funciona

El primer paso es leer el nombre del elemento de STDIN y aplicar una función hash bastante elaborada, que asigna todos los nombres de elementos en el rango [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.                                                  ";

Muchos símbolos de elementos están formados por los caracteres primero y segundo, primero y tercero, primero y cuarto, primero y quinto o primero y décimo (que es solo el primero) del nombre en inglés del elemento. Vamos a representar estos elementos por números del 0 al 4 respectivamente. Todos los elementos restantes (representados por 5) requerirán una tabla de búsqueda.

La tabla resultante se puede empujar de la siguiente manera:

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

El conjunto de códigos de caracteres se convierte de la base 256 a la base 7 y los 6 se reemplazan por series de tres ceros.

Esta es la tabla de decisión 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]

La acción necesaria para el elemento con hash 1 , por ejemplo, corresponde al primer elemento de esta matriz. Los elementos de matriz que no corresponden al hash de ningún elemento también son cero, lo que permite la compresión (0 0 0) ↦ 6 .

Ahora, interpretamos D para el 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        ";

A continuación, empujamos la tabla de búsqueda. Si agregamos j a los símbolos de un solo carácter y reemplazamos Uu con Q , cada símbolo tendrá exactamente dos caracteres de longitud. Se puede presionar de la siguiente manera:

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

La matriz de códigos de caracteres se convierte de la base 256 a la base 25, el código de caracteres de A se agrega a todos los dígitos ( se convierte en carácter en el proceso) y el resultado se divide en fragmentos de longitud dos.

Esta es la tabla de búsqueda L:

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

Ahora, procedemos a calcular los posibles nombres de elementos.

=                " 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 pila ahora contiene

B M N

donde B es el booleano D [H-1] / 5 , M es el nombre recuperado de la tabla de búsqueda y N es el nombre del elemento formado al seleccionar caracteres de E.

Ya casi hemos terminado:

?                " If B, push M; else, push N.                                            ";
( \              " Extract the first character from the string.                           ";
el               " Convert the rest to lowercase.                                         ";

pero como funciona?
Claudiu

2
@Claudiu: He agregado una explicación.
Dennis

3
He leído el primer tercio de la explicación, y hasta ahora lo que tengo es "Magia". Increíble
Mooing Duck

77
"AcAlAmSbArAsAtBaBkBeBiBhBBrCdCsCaCfCCeClCrCoCnCuCmDsDbDyEsErEuFmFlFFrGdGaGeAuHf HsHeHoHInIIrFeKrLaLrPbLiLvLuMgMnMtMdHgMoNdNeNpNiNbNNoOsOPdPPtPuPoKPrPmPaRaRnReRh RgRbRuRfSmScSgSeSiAgNaSrSTaTcTeTbTlThTmSnTiWUuoUupUusUutUVXeYbYZnZr" = 226 caracteres. Su solución = 200 caracteres. Hay algo de vudú apropiado aquí.
aprensivo ossifrage

He aceptado esta respuesta porque parece ser la más corta, pero no dudes en publicar respuestas adicionales.
soktinpk

43

C, 452

Una buena función hash ayuda. Puede haber mejores. (Mejoras sugeridas por @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 con comentarios:

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);
}

Usé la fuerza bruta para encontrar este hash; Este fue el único con un tamaño de hash de ≤512 que no tuvo colisiones. Sin embargo, no revisé la ortografía alternativa, y podría haber mejores funciones con diferentes algoritmos (por ejemplo, usar XOR en lugar de la suma).

La función hash asigna las cadenas de texto a valores de 0 a 440. "Tin" cambia a cero, por lo que "Sn" se encuentra al comienzo de la tabla. Las siguientes 7 posiciones están vacías. Para mantener el código compacto, esto se indica mediante el valor ASCII 34 + 7 = 41 (")"). Luego viene "Cobre" (8), cuatro celdas vacías (34 + 4 = 38 = "&") y "Vanadio" (13). Después de calcular un hash, el programa recorre la tabla, restando 1 por cada letra mayúscula seguida de 0 o más letras minúsculas, y restando (VALOR ASCII) -34 por cada carácter que no sea del alfabeto. Cuando el valor llega a cero, hemos encontrado el resultado correcto.


3
@soktinpk Brute lo forzó :-) Este fue el único con un tamaño de hash de ≤512 que no tuvo colisiones. Sin embargo, no revisé la ortografía alternativa, y podría haber mejores funciones con diferentes algoritmos (por ejemplo, usando XOR en lugar de la suma).
aprensivo ossifrage

2
Haz que 464 ... tengas un par de llaves innecesarias.
Jim Balter

1
Si se piensa en la gramática, es ambigua y tiene que ser permitido ... sólo se ve ambigua para nosotros . ¡Ah, y atrapaste otro que yo no! Felicidades por esto ... Intenté apretar el algoritmo pero lo entendiste todo bien.
Jim Balter

55
@Harshdeep: la función hash asigna las cadenas de texto a valores de 0 a 440. "Tin" se convierte en hash a cero, por lo que "Sn" se encuentra al comienzo de la tabla. Las siguientes 7 posiciones están vacías. Para mantener el código compacto, esto se indica mediante el valor ASCII 34 + 7 = 41 (")"). Luego viene "Cobre" (8), cuatro celdas vacías (34 + 4 = 38 = "&") y "Vanadio" (13). Después de calcular un hash, el programa recorre la tabla, restando 1 por cada letra mayúscula seguida de 0 o más letras minúsculas, y restando (VALOR ASCII) -34 por cada carácter que no sea del alfabeto. Cuando el valor llega a cero, hemos encontrado el resultado correcto.
aprensivo ossifrage

2
Buena esa. Guarde algunos caracteres con: 1 (h+c%32+74)*311%441.. 2. Soltar py usar s. 3. main(c)guarda una coma.
ugoren

13

JavaScript ES6, 690 708 bytes

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)

La primera matriz contiene los símbolos, y la segunda matriz contiene las letras mínimas necesarias para indicar a qué elemento se hace referencia. Gracias a core1024 y edc65 por ayudar a acortarlo. Prueba en http://jsfiddle.net/xjdev4m6/2/ . Ligeramente más legible:

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
  }
}

¿Puede reducir algunos bytes utilizando el hecho de que Neo coincide con el neodimio, dado que Neon ha sido aprobado en la lista?
Dancrumb

1
@Dancrumb Lamentablemente no. El bucle comienza con la subcadena más corta, por lo que golpeará Neoantes de golpear Neonporque tiene menos letras.
NinjaBearMonkey

1
+1 para el JS más corto hasta ahora. Aunque usted puede deshacerse de esta ifdeclaración (Es una perfecta forcondición) y también en línea o cambiar las posiciones de algunas variables, para acortar el código;)
core1024

2
al principio ).toLowerCase(-> )[L='toLowerCase'](luego al final a.toLowerCase(-> a[L](debería cortar 4 caracteres
edc65

10

Rubí 1.9+, 565 471 447 444

Una línea. Porque nada es "imposible de hacer con expresiones regulares" ...
(Acabo de guardar 94 caracteres agregando otra expresión regular) ((y 24 simplificándolas))

p"VAlAmA.sArAcAnt|SbA.tBaB..kBeBiB.hBrBDyD.+sD.bE..sErEuF..mFrFlu|F@FlG.dGaGeG|AuH.fH.sHeHoHInIro|FeIrIKrL.vL.+rLaLiLuL|PbM.gMoM.+dM.nM.+tM|HgC.+sC.dC.+fCeCar|C@C....nCaCu|CmCop|CuCoC.rC.lN.+dN.+pNeN..bNit|N@NoNiOsOP..mPa|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/,''

(nueva línea después de la cadena agregada para "legibilidad", eliminar para la prueba)

uso: ruby periodic.rb aluminum$>

Explicación:
dividir la cadena en mayúsculas principales devuelve una matriz de expresiones regulares para que coincida con los nombres de los elementos. Los únicos caracteres alfabéticos permitidos en cada uno son los de la abreviatura *. Están ordenados de tal manera que la primera coincidencia encontrada al comparar con el argumento de la línea de comando *$*es la correcta. El gsub final elimina los caracteres no alfa antes de imprimir.

* Las abreviaturas extrañas como "Fe" para "Hierro" se manejan mediante un |elemento: "Iro | Fe". La primera opción es lo que realmente coincide; el gsub luego elimina todos los caracteres hasta el '|', dejando la abreviatura real.

Marco de prueba (requiere la lista de @ squeamish : descargada como 'table.txt' en el directorio de trabajo).

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

1
Ovación de pie si funciona para todos los más de 100 casos
edc65

Por supuesto que funciona: ideone.com/7FZlAt
AShelly

Uno tiene la audacia de afirmar que algo no se puede hacer con regex. Gracias por demostrar que (uno dijo, muchos pensaron) mal :)
Mástil

4

Rubí, 1068 bytes

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]

Entrada a través de STDIN.

Las subcadenas únicas más cortas de los nombres de elementos son del segundo al sexto carácter (o el final del nombre si es demasiado corto). Así que simplemente estoy obteniendo esos y buscándolos en un hash. También comprimí el hash porque eso ahorra otros 200 bytes. Así es como se ve el hash en sí:

{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"}

3

CJam, 462 449 434 401 391 384 382

Con la ayuda de Dennis.

Código

Los ifs ternarios anidados probablemente no son la forma correcta de hacer esto en 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=

Con sangrías:

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=

Muchos de los símbolos son solo las dos primeras letras del nombre del elemento. Estos se manejan en la segunda capa más profunda de sentencias if anidadas. Muchas otras son la primera y la tercera letra, o la primera y la cuarta, se manejan en capas externas sucesivas. Los símbolos donde solo aparece la primera letra, y los irregulares completos, se manejan en la quinta y tercera capas más profundas, respectivamente.

Hay algunos donde se confunde ( TelLuriumvs ThaLlium, o SILiconvs SILver, o RUTheniumvs RUTherfordium). Estos se manejan por separado.

Aquí se podría practicar mucho golf, principalmente reutilizando bloques de código y mejorando el manejo de los irregulares.


1
Algunos consejos: 1. El comportamiento de los nombres de elementos no válidos puede ser indefinido, por lo que en lugar de "RUTHENIUM"=usarlo "RUTHEN"#!. 2. No necesita imprimir explícitamente ( o) ni eliminar nada antes del nombre real del elemento ( ;"Si"); simplemente agregue ]W=al final de su código para eliminar todo menos el elemento de la pila superior. 3. Eso hace que algunos bloques estén vacíos. Si Bes un booleano, B{...}{}?y B{...}*lograr lo mismo. 4. El ternario toma bloques o elementos de pila, por lo que puede acortar {"Si"}a "Si".
Dennis

@ Dennis Creo que he agregado todo eso. Sin embargo, la administración de la pila necesita trabajo, demasiados _y en ;todas partes

@Dennis Y eliminé algunos caracteres cambiando el caso predeterminado a minúsculas y usando más los bloques de código con alias

3

PHP, 507 485 476 466 caracteres

Uso: ingrese el nombre del elemento como parámetro GET '0' - elements.php? 0 = carbon

Algoritmo: ejecutar a través de la cadena de datos, sacando pares de códigos de abreviatura y subcadena. Si la subcadena coincide con el inicio del elemento pasado, use el código de abreviatura para determinar qué generar: si el código comienza con una letra, escríbalo como una cadena. Si es un número N, muestra la primera letra del elemento + la enésima letra. Los elementos Unun están en mayúsculas especiales con el código '|'. Si no se encuentra ninguna subcadena que coincida con el nombre que se pasó, muestre los dos primeros caracteres del nombre como abreviatura.

Código legible:

<?
$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];

Condensado:

<?$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];

2

JavaScript (1100)

Implementación ingenua que brilla en su simplicidad. La subcadena única desde el comienzo del nombre simplemente se asigna al símbolo.

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

2

Python - 652 649 637

Mi tabla hash se basa en la combinación de cada segundo y cada tercer carácter del nombre en mayúscula:

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

Aquí está el generador correspondiente:

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'

Probablemente haya margen para mejoras, especialmente al comprimir las dos cadenas largas.

Probado con:

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

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?=

Explicación:

{        }%                              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.

11
¡Dios mío, una pieza de Golfscript que no tiene 10 caracteres o menos!
WallyWest

1
Puede obtener una mejora masiva en ese conjunto de cadenas utilizando una cadena con nueva línea como separador y luego haciendon/
Peter Taylor

Lo hice la última vez, ¿por qué diablos no pensé en eso? Actualizando ahora.
Josiah Winslow

2

Haskell, 920 817 807 776 Caracteres

Después de trabajar demasiado tiempo creando un sistema de reglas para qué caracteres de un nombre de elementos están incluidos en su símbolo, y un poco de retoques, logré escribir un script que traduce fácilmente el elemento en símbolo. El hierro fue un problema para mí, porque pude muestrear ciertos caracteres de GOld, SilVer, TiN, LEad, SoDium, MerCury, ANtimony, PotaSsium y TUngsten, convirtiéndolos en un símbolo periódico no utilizado (elegí el muestreo que hiciera más fácil la integración ellos en las reglas existentes), y luego traducir después de la conversión simbólica; El hierro, sin embargo, fue un problema, porque Ir, Io e In ya están en uso. Inicialmente se trataba de 920 caracteres, pero me di cuenta de que la coincidencia de patrón final (la más grande) no necesitaba estar allí, ya que dejaba pasar las cosas (lo que no sucedía) o coincidía con todos ellos; por lo tanto, Lo reemplacé con un comodín general. Después de eso, seguí jugando golf de 817 a 808 abreviando algunos patrones usando comodines de tal manera que todavía eran únicos para el nombre de ese elemento (por ejemplo, el único elemento con una 'w' en su nombre es Lawrencium, así que "* w "coincide con eso en 1 carácter menos que" Ley ").

Aquí está mi código. Lo probé para todos los elementos, y lo codifiqué para que convirtiera automáticamente su entrada a título, para que no haya problemas con mayúsculas y minúsculas.

EDITAR 1

Lo reduje aún más a 776 caracteres al reemplazar la expresión de caso en t con una coincidencia de patrón (esto tiene sentido porque la expresión de caso estaba probando el operando sin procesar en lugar de una expresión en términos del operando), eliminando paréntesis innecesarios y expresándose ecomo una cadena delimitada por una nueva línea en lugar de una lista de cadenas, y luego dividiéndola en la función principal. Debido a que estos cambios son puramente golf, he dejado la versión legible para los humanos sin cambios.

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

Versión legible para humanos (líneas nuevas, espacios, nombres detallados, comentarios: 2311 caracteres)

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 alguien está interesado en una explicación de cualquier parte de esto, no dude en preguntar.


2

C # (826)

No es el mejor, pero pensé en probarlo con la desventaja 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;}}}

Así que escribí un programa para convertir el nombre completo de los elementos (por ejemplo, carbono) en la cadena más pequeña pero aún única posible e hice esto para todos los elementos con respecto a todas las otras cadenas únicas. Luego lo serialicé en una gran cadena fea donde las letras mayúsculas denotan el comienzo de "fragmentos", con fragmentos que se alternan entre ser claves y valores. Como KeyValueKey2Value2 etc.

Este script desteriliza esa cadena grande y corta un carácter del final de la cadena ingresada hasta que lo encuentra en el diccionario hecho a partir de la cadena grande.

(Debo agregar que mi conocimiento de C # no es sorprendente y la presentación original que hice solo estaba usando cosas que sabía, pero posteriormente tuve otros trucos que otros me señalaron).


Puede seguir jugando al golf cambiando todas las definiciones de tipo a var. Puede guardar algunos más eliminando llaves después de una sola declaración si se bloquea. Si asigna t.Substring(int, int)a un Func<int, int, string>puede salvar a otra pareja.
Brandon

Hice la mayoría de las defs variables "var" pero parece que me perdí una o dos, también me olvidé por completo de los ifs sin corchetes, gracias.
miethpo

Puede depilar otros 5 caracteres varcon el string[] ry otros 3 varcon el string t = Console...., por último, ahorrará 7 más al cambiar return new string[]al return new[]final.
Brandon

Hay un puñado de otras mejoras menores que puede realizar, como mover su if(...) break;lógica a las condiciones de salida de bucle. Se pueden aplicar varias otras inversiones lógicas, como una do { } while(..)en su método de extracción. Esto es más corto que agregar una operación lógica separada para el caso de entrada. He publicado una edición en su código que todavía necesita revisión / aceptación debido a mi baja reputación en este sitio. Lo bajé a 870 caracteres.
Nicholas

1
@Nicholas, no estoy seguro de que editar el código de alguien más sea cortés ...
miethpo

1

JavaScript (E6) 1433

Aquí hay un límite superior

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

Prueba en la consola FireFox / FireBug

F('Rutherfordium')

Salida

Rf

1

SmileBASIC, 1763 1418 1204 1128 bytes

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$

Elegí 3 personajes que en su mayoría eran únicos (el 0º, 2º y 3º), lo que deja 2 casos especiales: Cerium / Curium son ambos "Ciu", y Ruthenium / Rutherfordium son ambos "Rhe". Para Ciu, verifico si el segundo carácter del nombre es "e" o "E", y para "Rhe", verifico la longitud del nombre.

VAR(name)devuelve la variable con ese nombre. Los nombres de las variables no distinguen entre mayúsculas y minúsculas.


0

T-SQL, 900894676 bytes

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

Las devoluciones son solo para legibilidad, la segunda línea es una cadena muy larga.

STRING_SPLIT es compatible con SQL 2016 y superior.

La entrada se toma a través de una tabla t preexistente con campo varchar e , según nuestros estándares IO . La salida se rellena con espacios para 3 caracteres; las reglas no estaban claras sobre si eso estaba bien. Si es necesario, puedo agregar un TRIM.

La tabla de entrada se une con una tabla generada con una lista de todos los símbolos de elementos (rellenados con 3 caracteres) con el prefijo único más corto para cada nombre de elemento ( Xes suficiente para Xenon , pero Rutherfordium requiere Rutherdistinguirlo de Rutenio ).

EDITAR 1 : salvó 218 caracteres al eliminar las 44 entradas de la lista cuyo símbolo son las dos primeras letras de su nombre; la ISNULLfunción se usa para ver si la primera consulta no puede devolver una fila, y si es así, genera el símbolo (en mayúscula) del nombre del elemento de entrada.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.