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
, input
etc.
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!
fuente
Au
o 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.Respuestas:
CJam,
337297293232220201200 bytesEl 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.
Puede probar este código en el intérprete de CJam .
Casos de prueba
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] :
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:
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:
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.
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:
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:
Ahora, procedemos a calcular los posibles nombres de elementos.
La pila ahora contiene
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:
fuente
C, 452
Una buena función hash ayuda. Puede haber mejores. (Mejoras sugeridas por @ugoren et al.)
Ungolfed con comentarios:
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.
fuente
(h+c%32+74)*311%441
.. 2. Soltarp
y usars
. 3.main(c)
guarda una coma.JavaScript ES6, 690
708bytesLa 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:
fuente
Neo
antes de golpearNeon
porque tiene menos letras.if
declaración (Es una perfectafor
condición) y también en línea o cambiar las posiciones de algunas variables, para acortar el código;)).toLowerCase(
->)[L='toLowerCase'](
luego al finala.toLowerCase(
->a[L](
debería cortar 4 caracteresRubí 1.9+,
565 471 447444Una 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))
(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).
fuente
Rubí, 1068 bytes
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í:
fuente
CJam,
462 449 434 401 391 384382Con la ayuda de Dennis.
Código
Los ifs ternarios anidados probablemente no son la forma correcta de hacer esto en CJam.
Con sangrías:
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 (
TelLurium
vsThaLlium
, oSILicon
vsSILver
, oRUThenium
vsRUTherfordium
). 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.
fuente
"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. SiB
es un booleano,B{...}{}?
yB{...}*
lograr lo mismo. 4. El ternario toma bloques o elementos de pila, por lo que puede acortar{"Si"}
a"Si"
._
y en;
todas partesPHP,
507485476466 caracteresUso: 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:
Condensado:
fuente
JavaScript (1100)
Implementación ingenua que brilla en su simplicidad. La subcadena única desde el comienzo del nombre simplemente se asigna al símbolo.
fuente
Python -
652 649637Mi tabla hash se basa en la combinación de cada segundo y cada tercer carácter del nombre en mayúscula:
Aquí está el generador correspondiente:
Probablemente haya margen para mejoras, especialmente al comprimir las dos cadenas largas.
Probado con:
fuente
Golfscript -
1052821Explicación:
fuente
n/
Haskell,
920817807776 CaracteresDespué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
e
como 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.Versión legible para humanos (líneas nuevas, espacios, nombres detallados, comentarios: 2311 caracteres)
Si alguien está interesado en una explicación de cualquier parte de esto, no dude en preguntar.
fuente
C # (826)
No es el mejor, pero pensé en probarlo con la desventaja de C #.
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).
fuente
var
. Puede guardar algunos más eliminando llaves después de una sola declaración si se bloquea. Si asignat.Substring(int, int)
a unFunc<int, int, string>
puede salvar a otra pareja.var
con elstring[] r
y otros 3var
con elstring t = Console....
, por último, ahorrará 7 más al cambiarreturn new string[]
alreturn new[]
final.if(...) break;
lógica a las condiciones de salida de bucle. Se pueden aplicar varias otras inversiones lógicas, como unado { } 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.JavaScript (E6) 1433
Aquí hay un límite superior
Prueba en la consola FireFox / FireBug
Salida
fuente
SmileBASIC,
1763141812041128 bytesElegí 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.fuente
T-SQL,
900894676bytesLas 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 (
X
es suficiente para Xenon , pero Rutherfordium requiereRuther
distinguirlo 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
ISNULL
funció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.fuente