Baseado no golfe prático - Estados dos EUA
Sua tarefa é encontrar a abreviação (símbolo) de um elemento com o nome do elemento, até ununoctium (118). Use a tabela periódica na Wikipedia .
Graças à ossifração sensível, você pode encontrar uma lista completa de elementos para abreviações em http://pastebin.com/DNZMWmuf .
Você não pode usar nenhum recurso externo. Além disso, você não pode usar nenhum dado interno especificamente sobre os elementos da tabela periódica. Aplicam-se brechas padrão.
Entrada
Entrada pode ser de stdin, arquivo prompt
, input
etc.
Formato de entrada:
Todos os seguintes são entradas válidas:
Carbon
carbon
CARBON
cArBOn
Essencialmente, o nome do elemento - não diferencia maiúsculas de minúsculas.
Você não precisa lidar com erros de ortografia ou qualquer nome de elemento inválido. Entrada inválida é um comportamento indefinido.
Saída :
O símbolo para o elemento O primeiro caractere deve ser capitalizado eo resto deve estar em letras minúsculas.
Exemplo de saída: C
Casos de teste:
Carbon -> C
NiTROGen -> N
Sodium -> Na
Gold -> Au
Silver -> Ag
Tin -> Sn
Existem muitos outros elementos além dos estados, portanto, espero que seja mais difícil encontrar uma regra geral para eles.
Isso é código de golfe. O código mais curto vence!
fonte
Au
ou o que você quiser. @Paul R Se houver muitas maneiras de soletrar um elemento (por exemplo, enxofre x enxofre ou alumínio x alumínio), use o que reduzir o tempo do programa. Você não precisa lidar com os dois casos.Respostas:
CJam,
337297293232220201200 bytesO código acima usa notação de sinal de intercalação, pois contém caracteres de controle.
Ao custo de 24 bytes adicionais (para um total de 224), esses caracteres podem ser evitados.
Você pode tentar esse código no intérprete CJam .
Casos de teste
Como funciona
O primeiro passo é ler o nome do elemento em STDIN e aplicar uma função hash bastante elaborada, que mapeia todos os nomes de elementos no intervalo [0, 225] :
Muitos símbolos de elementos são formados pelo primeiro e segundo, primeiro e terceiro, primeiro e quarto, primeiro e quinto ou primeiro e décimo (que é apenas o primeiro) caractere do nome em inglês do elemento. Vamos representar esses elementos por números de 0 a 4, respectivamente. Todos os elementos restantes (representados por 5) exigirão uma tabela de pesquisa.
A tabela resultante pode ser pressionada da seguinte maneira:
A matriz de códigos de caracteres é convertida da base 256 para a base 7 e 6 e é substituída por execuções de três zeros.
Esta é a tabela de decisão D:
A ação necessária para o elemento com o hash 1 , por exemplo, corresponde ao primeiro elemento dessa matriz. Os elementos da matriz que não correspondem ao hash de nenhum elemento também são zero, o que permite a compressão (0 0 0) ↦ 6 .
Agora, interpretamos D para o hash H.
Em seguida, pressionamos a tabela de pesquisa. Se anexarmos j aos símbolos de um caractere e substituir Uu por Q , cada símbolo terá exatamente dois caracteres. Pode ser pressionado da seguinte maneira:
A matriz de códigos de caracteres é convertida da base 256 para a base 25, o código de caracteres A é adicionado a todos os dígitos (conversão para Caractere no processo) e o resultado é dividido em partes de comprimento dois.
Esta é a tabela de pesquisa L:
Agora, passamos a calcular nomes de elementos em potencial.
A pilha agora contém
onde B é o booleano D [H-1] / 5 , M é o nome recuperado da tabela de pesquisa e N é o nome do elemento formado pela seleção de caracteres de E.
Estamos quase terminando:
fonte
C, 452
Uma boa função de hash ajuda. Pode haver melhores. (Melhorias sugeridas por @ugoren et al.)
Ungolfed com comentários:
Usei força bruta para encontrar esse hash; Este foi o único com um tamanho de hash ≤512 que não teve colisões. Porém, não verifiquei ortografia alternativa e pode haver funções melhores com algoritmos diferentes (por exemplo, usando XOR em vez de adição).
A função hash mapeia seqüências de caracteres de texto para valores de 0 a 440. "Tin" hashes para zero, portanto "Sn" está no início da tabela. As próximas 7 posições estão vazias. Para manter o código compacto, isso é indicado pelo valor ASCII 34 + 7 = 41 (")"). Em seguida, vem "Cobre" (8), quatro células vazias (34 + 4 = 38 = "&") e "Vanádio" (13). Depois de calcular um hash, o programa percorre a tabela, subtraindo 1 para cada letra maiúscula seguida por 0 ou mais letras minúsculas e subtraindo (ASCII VALUE) -34 para cada caractere que não seja do alfabeto. Quando o valor chega a zero, encontramos o resultado correto.
fonte
(h+c%32+74)*311%441
.. 2. Soltep
e uses
. 3.main(c)
salva uma vírgula.JavaScript ES6, 690
708bytesA primeira matriz contém os símbolos e a segunda matriz contém as letras mínimas necessárias para dizer a qual elemento está sendo referido. Agradecemos a core1024 e edc65 por ajudar a reduzi-lo. Teste em http://jsfiddle.net/xjdev4m6/2/ . Um pouco mais legível:
fonte
Neo
antes de ser atingidoNeon
porque possui menos letras.if
declaração (É uma perfeitafor
condição) e também para inline ou mudar as posições de algumas variáveis, para encurtar o código;)).toLowerCase(
->)[L='toLowerCase'](
, em seguida, no finala.toLowerCase(
->a[L](
deve cortar 4 caracteresRuby 1.9+,
565 471 447444Um one-liner. Porque nada é "impossível de fazer com regexes" ...
(Apenas salvei 94 caracteres adicionando outra regex) ((e 24 simplificando-os))
(nova linha após sequência adicionada para "legibilidade", remova para teste)
uso:
ruby periodic.rb aluminum
$>Explicação:
Dividir a cadeia de caracteres nas maiúsculas iniciais retorna uma matriz de regex para corresponder aos nomes dos elementos. Os únicos caracteres alfabéticos permitidos em cada um são os da abreviação *. Eles são ordenados de forma que a primeira correspondência encontrada ao comparar com o argumento da linha de comandos
*$*
seja a correta. O gsub à direita retira os caracteres não-alfa antes da impressão.* Abreviações estranhas como "Fe" para "Iron" são tratadas por um
|
elemento: "Iro | Fe". A primeira escolha é o que realmente corresponde; o gsub remove todos os caracteres até o '|', deixando a abreviação real.Estrutura de teste (requer a lista do @ squeamish : baixada como 'table.txt' no diretório de trabalho).
fonte
Ruby, 1068 bytes
Entrada via STDIN.
As subseqüências únicas mais curtas dos nomes dos elementos são do segundo ao sexto caractere (ou o final do nome, se for muito curto). Então, eu estou simplesmente pegando e pesquisando em um hash. Eu também compactou o hash porque isso economiza outros 200 bytes. Aqui está a aparência do hash:
fonte
CJam,
462 449 434 401 391 384382Com a ajuda de Dennis.
Código
Ifs ternários aninhados provavelmente não são a maneira correta de fazer isso no CJam.
Com recuos:
Muitos dos símbolos são apenas as duas primeiras letras do nome do elemento. Eles são tratados na segunda camada mais profunda das instruções if aninhadas. Muitas outras são a primeira e a terceira letra, ou a primeira e a quarta letra - elas são tratadas em camadas externas sucessivas. Os símbolos onde apenas a primeira letra aparece e os irregulares completos são tratados na quinta e terceira camadas mais profundas, respectivamente.
Existem alguns onde fica confuso (
TelLurium
vsThaLlium
, ouSILicon
vsSILver
, ouRUThenium
vsRUTherfordium
). Estes são tratados separadamente.Muito golfe poderia ser feito aqui, principalmente reutilizando blocos de código e melhorando o manuseio de irregularidades.
fonte
"RUTHENIUM"=
você pode usá-lo"RUTHEN"#!
. 2. Você não precisa imprimir explicitamente (o
) nem remover nada antes do nome real do elemento (;"Si"
); basta anexar]W=
ao final do seu código para remover tudo, exceto o elemento de pilha mais alto. 3. Isso deixa alguns quarteirões vazios. SeB
for um booleano,B{...}{}?
eB{...}*
consiga o mesmo. 4. O ternário se leva blocos ou elementos da pilha, de modo que você pode encurtar{"Si"}
a"Si"
._
e;
em todo o lugarPHP,
507485476466 caracteresUso: insira o nome do elemento como parâmetro GET '0' - elements.php? 0 = carbon
Algoritmo: Execute a sequência de dados, retirando substring, pares de códigos de abreviação. Se a substring corresponder ao início do elemento transmitido, use o código de abreviação para determinar o que produzir: Se o código começar com uma letra, produza-o como uma string. Se for um número N, imprima a primeira letra do elemento + a enésima letra. Os elementos Unun são diferenciados com o código '|'. Se nenhuma substring for encontrada que corresponda ao nome passado, imprima os dois primeiros caracteres do nome como abreviação.
Código legível:
Condensado:
fonte
JavaScript (1100)
Implementação ingênua brilhando em sua simplicidade. Uma sub string única desde o início do nome é simplesmente mapeada para o símbolo.
fonte
Python -
652 649637Minha tabela de hash é baseada na combinação de cada segundo e terceiro caractere do nome em maiúsculas:
Aqui está o gerador correspondente:
Provavelmente, há espaço para melhorias, especialmente compactando as duas seqüências longas.
Testado com:
fonte
Golfscript -
1052821Explicação:
fonte
n/
Haskell,
920817807776 CaracteresDepois de trabalhar muito tempo criando um sistema de regras para quais caracteres de um nome de elemento estão incluídos em seu símbolo e um pouco de ajustes, consegui escrever um script que traduz facilmente elemento em símbolo. O ferro era um problema para mim, porque eu pude amostrar certos caracteres de GOld, SilVer, TiN, LEAD, SoDium, MerCury, ANtimony, PotaSsium e TUngsten, convertendo-os em um símbolo periódico não utilizado (eu escolhi a amostragem que fosse mais fácil de integrar) nas regras existentes) e depois traduzindo após a conversão simbólica; O ferro, no entanto, era um problema, porque Ir, Io e In já são usados. Inicialmente, eram 920 caracteres, mas percebi que a correspondência final de padrões (a maior) não precisava estar lá, pois deixava as coisas passarem (que não eram) ou correspondia a todas elas; Portanto, Substituí-o por um curinga genérico. Depois disso, joguei de 817 a 808, abreviando alguns padrões usando caracteres curinga, de forma que eles ainda fossem exclusivos para o nome desse elemento (por exemplo, o único elemento com um 'w' em seu nome é Lawrencium, então "* w "corresponde a isso em 1 caractere a menos que" Lei ").
Aqui está o meu código. Testei-o para todos os elementos e codifiquei-o para que ele convertesse automaticamente sua entrada em titlecase, para não haver problemas com a distinção entre maiúsculas e minúsculas.
EDIT 1
Reduzi ainda mais a 776 caracteres, substituindo a expressão de caso em t por uma correspondência de padrão (isso faz sentido porque a expressão de caso estava testando o operando bruto em oposição a uma expressão em termos do operando), removendo parênteses desnecessários e retornando expressando
e
como uma sequência delimitada por nova linha em vez de uma lista de sequências, e posteriormente dividindo-a na função principal. Como essas mudanças são meramente golfe, deixei a versão legível por humanos inalterada.Versão legível por humanos (novas linhas, espaçamento, nomes detalhados, comentários: 2311 caracteres)
Se alguém estiver interessado em uma explicação para qualquer parte disso, não hesite em perguntar.
fonte
C # (826)
não é o melhor, mas pensei em tentar com o handicap do c #.
Então, escrevi um programa para transformar o nome completo dos elementos (por exemplo, carbono) na menor, mas ainda única, string possível e fiz isso para todos os elementos com relação a todas as outras strings exclusivas. Eu, então, serializei isso em uma grande e feia cadeia de caracteres em que letras maiúsculas denotam o início de "pedaços", com pedaços alternando entre chaves e valores. Como KeyValueKey2Value2 etc.
Esse script desestiliza essa string grande e corta um caractere no final da string inserida até encontrá-lo no dicionário criado a partir da string grande.
(Devo acrescentar que meu conhecimento de C # não é incrível e o envio original que fiz foi apenas usar coisas que eu sabia, mas posteriormente tive alguns truques apontados por outras pessoas.)
fonte
var
. Você pode economizar um pouco mais removendo chaves depois de blocos de instrução única. Se você atribuirt.Substring(int, int)
a um,Func<int, int, string>
poderá salvar outro casal.var
ing dostring[] r
e mais 3 porvar
ing ostring t = Console....
, por fim, você vai economizar 7 mais alterandoreturn new string[]
emreturn new[]
no final.if(...) break;
lógica para as condições de saída do loop for. Várias outras inversões lógicas podem ser aplicadas, comodo { } while(..)
no método de extração. Isso é mais curto do que adicionar uma operação lógica separada para o caso de entrada. Publiquei uma edição no seu código que ainda precisa de revisão / aceitação devido ao meu baixo representante neste site. Reduziu para 870 caracteres.JavaScript (E6) 1433
Aqui está um limite superior
Teste no console do FireFox / FireBug
Resultado
fonte
SmileBASIC,
1763141812041128 bytesEu escolhi três caracteres que eram em sua maioria únicos (o 0º, o 2º e o 3º), o que deixa dois casos especiais: Cerium / Curium são "Ciu" e Ruthenium / Rutherfordium são "Rhe". Para Ciu, verifico se o segundo caractere do nome é "e" ou "E" e, para "Rhe", verifico o tamanho do nome.
VAR(name)
retorna a variável com esse nome. Os nomes de variáveis não diferenciam maiúsculas de minúsculas.fonte
T-SQL,
900 894676 bytesOs retornos são apenas para legibilidade, a segunda linha é uma sequência muito longa.
STRING_SPLIT
é suportado no SQL 2016 e superior.A entrada é obtida por meio de uma tabela preexistente t com o campo varchar e , de acordo com nossos padrões de IO . A saída é preenchida com espaços para 3 caracteres; as regras não estavam claras sobre se estava tudo bem. Se necessário, posso adicionar um
TRIM
.A tabela de entrada é associada a uma tabela gerada com uma lista de todos os símbolos de elementos (preenchidos com 3 caracteres) com o prefixo exclusivo mais curto para cada nome de elemento (
X
é suficiente para o Xenon , mas o Rutherfordium exigeRuther
distingui-lo do Ruthenium ).EDIÇÃO 1 : salvou 218 caracteres removendo as 44 entradas da lista cujo símbolo são as duas primeiras letras do nome; a
ISNULL
função é usada para verificar se a primeira consulta falha ao retornar uma linha e, em caso afirmativo, gera o símbolo (encaixado corretamente) a partir do nome do elemento de entrada.fonte