Considere a seguinte string:
Tin Snips
Essa sequência contém vários símbolos atômicos na tabela periódica . Poderíamos reescrever essa sequência para identificar várias delas:
[Ti][N] [Sn][I][P][S]
Claro, também poderíamos escrever desta maneira:
T[In] [S][Ni][P][S]
As regras para reescrever a entrada são as seguintes:
- O caso da entrada não importa em termos de símbolos atômicos correspondentes.
- Se um elemento é usado em um símbolo atômico, sua caixa deve mudar para que o símbolo esteja correto. Ex:
h
se tornaria[H]
. - Todos os símbolos dos elementos estão entre colchetes ASCII
[
e]
. - O espaço em branco é preservado:
Big ego
não é possível combinar o "g" e o "e" em[Ge]
. - Nem todos os caracteres de entrada precisam ser combinados em um símbolo atômico: se um caractere de entrada não for colocado em um símbolo, ele será passado como está (o caso não importa).
- Se um símbolo pode ser criado, ele deve ser criado. Em outras palavras, não é permitido produzir
Tin
no exemplo acima, porque é possível criar pelo menos um símbolo nessa palavra. A única vez que um caractere pode ser passado sem uso é quando ele não pode ser usado para construir um símbolo atômico. - Para os propósitos deste desafio, todos os elementos de Hydrogen (1) a Oganesson (118) são válidos. Nenhum elemento superior é válido.
- Alguns dos elementos superiores têm nomes e símbolos ambíguos: para os fins deste desafio, a versão na Wikipedia deve ser usada. Por conveniência, os símbolos atômicos permitidos estão aqui: H, He, Li, Be, B, C, N, O, 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, Em, Sn, Sb, Te, Eu, Xe, Cs, Ba, La, Ce, Pr, Nd, Pm, Sm, UE, 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, Não, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg, Cn, Nh, Fl, Mc, Lv, Ts, Og.
Escreva um programa ou função que gere todas as saídas possíveis a partir de uma única entrada fornecida. Tanto a entrada como a saída podem estar em qualquer forma que você escolher. Pode ser uma cadeia de caracteres, uma matriz de caracteres ou alguma outra estrutura de dados: o que for conveniente e represente claramente a entrada e a saída. Tanto a entrada quanto a saída podem ser passadas para dentro / fora do seu código, mas você escolhe: entrada / saída padrão, argumento / retorno da função ou outra coisa.
- A entrada deve ser uma sequência (ver parágrafo anterior) de comprimento positivo contendo apenas caracteres ASCII de maiúsculas e minúsculas e o
0x20
caractere espaço ( ). - Seu código deve gerar todas as seqüências de saída que podem ser criadas usando as regras de entrada acima.
- A ordem da saída é definida pela implementação. O único requisito é que todas as seqüências de saída estejam presentes.
- Se apresentado com uma sequência de entrada válida que não contém símbolos atômicos, basta gerar a sequência de entrada.
- Se for apresentada uma sequência de entrada que não é válida de acordo com as regras acima (nulo, zero caracteres, contém caracteres ilegais, etc.), seu programa pode fazer qualquer coisa (falha, saída em branco etc.)
- A saída diferencia maiúsculas de minúsculas, exceto símbolos atômicos, que precisam corresponder à tabela periódica.
- Não são permitidas brechas padrão.
Casos de teste:
Tin Snips
[Ti][N] [Sn][I][P][S]
[Ti][N] [S][Ni][P][S]
[Ti][N] [S][N][I][P][S]
T[In] [Sn][I][P][S]
T[In] [S][Ni][P][S]
T[In] [S][N][I][P][S]
T[I][N] ...
Quack
Q[U][Ac][K]
Q[U]a[C][K]
hehe
[H]e[H]e
[H]e[He]
[He][H]e
[He][He]
Stack Exchange
[S][Ta][C][K] Ex[C][H]a[N][Ge]
[S]t[Ac][K] Ex[C][H]a[N][Ge]
Isso é código de golfe, então deixe-me ver seu código mais curto!
T[I][N]
não[T][I][N]
porque T não é um elemento. Minha pergunta (e possivelmente a de Rassar) é: precisamos apenas fornecer 1. Somente saídas onde é feito o número máximo de sub-substituições de elementos? 2. Apenas a quantidade mínima de desperdício? (O HeHe com hidrogênios indica que a resposta é negativa) 3. Todas as saídas em que as correspondências estão completamente esgotadas? (neste casoT[I][N]
, bem comoT[In]
seria válido.) Acho que a interpretação correta é 3. #Q[U][Ac][K]
eQ[U]a[C][K]
. Direita?Respostas:
Python 3,
289263 bytesEncontrou uma biblioteca mais completa no Pypi:
mendeleev
Resposta antiga:
Usa uma biblioteca
elements.py
de http://www.lfd.uci.edu/~gohlke/code/elements.py.html . Faltam elementos 110 a 118, mas foi a biblioteca mais atualizada que pude encontrar. Custo de 40 bytes para adicionar os elementos ausentes.A parte mais complicada era a lógica de quando um personagem pode ser passado sem fazer parte de um símbolo de elemento.
fonte
mendeleev
um usuário, não era uma biblioteca?Jelly ,
192191 bytes-1 usando
Ɗ
(uma rápida desenvolvida desde então)Experimente online! - Ineficiente demais para a conclusão do caso de teste "Stack Exchange" dentro do limite dos anos 60 (executá-lo offline fornece o resultado correto em 2 minutos).
Quão?
A primeira linha de código é um link niládico para criar uma lista contendo todos os 118 símbolos de elementos. Para isso, concatena duas listas, a primeira contendo todas as 2 listas de caracteres (ou seja, cadeias) e a segunda uma lista de caracteres e o título da lista resultante. As duas listas são criadas principalmente procurando palavras no dicionário de Jelly para criar seqüências únicas.
A primeira dessas compressões é:
que produz
Onde todos, exceto a entrada final (dividida por espaços), são entradas no dicionário de Jelly. Os espaços são filtrados
ḟ⁶
e, em seguida, o resultado é dividido em dois:O segundo,
é formado a partir da concatenação das palavras "tentilhão", "pub", "céu" e "voto" (sem espaços) e, como tal, é uma lista de caracteres:
As duas listas são concatenadas
;
e todas as entradas são maiúsculas de minúsculas usandoŒt
, resultando em:Uma lista contendo todos os 118 símbolos de elementos, conforme necessário (há duplicatas, mas tudo bem).
A segunda linha de código é um link monádico (uma função auxiliar projetada para receber uma entrada) que retorna 1 se a entrada com maiúsculas de minúsculas existir na lista criada acima e 0 caso contrário.
A terceira linha de código é o link principal, uma função monádica que pega uma string e retorna uma lista de listas de caracteres (ou seja, strings) conforme necessário:
fonte
C ++ 11,
944928 bytesAqui está um código realmente terrível, mas deve funcionar. Provavelmente ainda poderia ser muito mais curto.
Ligue para:
fonte