Considérez la chaîne suivante:
Tin Snips
Cette chaîne contient plusieurs symboles atomiques sur le tableau périodique . Nous pourrions réécrire cette chaîne pour en identifier plusieurs:
[Ti][N] [Sn][I][P][S]
Bien sûr, nous pourrions également l'écrire de cette façon:
T[In] [S][Ni][P][S]
Les règles de réécriture de l'entrée sont les suivantes:
- Le cas de l'entrée n'a pas d'importance en termes de correspondance des symboles atomiques.
- Si un élément est utilisé dans un symbole atomique, sa casse doit changer pour que le symbole soit correct. Ex:
h
deviendrait[H]
. - Tous les symboles d'élément sont placés entre crochets ASCII
[
et]
. - L'espace est préservé:
Big ego
ne peut pas combiner le "g" et le "e" dans[Ge]
. - Tous les caractères d'entrée ne doivent pas être combinés en un symbole atomique: si un caractère d'entrée n'est pas placé dans un symbole, il est transmis tel quel (la casse n'a pas d'importance).
- Si un symbole peut être créé, il doit l' être. En d'autres termes, il n'est pas autorisé à sortir
Tin
dans l'exemple ci-dessus car il est possible de créer au moins un symbole dans ce mot. Le seul moment où un personnage peut passer inutilisé est lorsqu'il ne peut pas être utilisé pour construire un symbole atomique. - Aux fins de ce défi, tous les éléments de l'hydrogène (1) à Oganesson (118) sont valides. Aucun élément supérieur n'est valide.
- Certains des éléments supérieurs ont des noms et des symboles ambigus: aux fins de ce défi, la version sur Wikipedia doit être utilisée. Pour plus de commodité, les symboles atomiques autorisés sont ici: 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, 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, Nh, Fl, Mc, Lv, Ts, Og, Og.
Écrivez un programme ou une fonction qui génère toutes les sorties possibles à partir d'une seule entrée fournie. L'entrée et la sortie peuvent être dans n'importe quelle forme de votre choix. Cela peut être une chaîne, un tableau de caractères ou une autre structure de données: tout ce qui est à la fois pratique et représente clairement l'entrée et la sortie. L'entrée et la sortie peuvent être transmises dans / hors de votre code comme vous le souhaitez: entrée / sortie standard, argument de fonction / retour, ou autre chose.
- L'entrée doit être une chaîne (voir le paragraphe précédent) de longueur positive contenant uniquement des caractères ASCII de casse arbitraire et le caractère espace (
0x20
). - Votre code doit générer toutes les chaînes de sortie qui peuvent être créées à l'aide des règles d'entrée ci-dessus.
- L'ordre de sortie est défini par l'implémentation. La seule exigence est que toutes les chaînes de sortie soient présentes.
- S'il est présenté avec une chaîne d'entrée valide qui ne contient aucun symbole atomique, il suffit de sortir la chaîne d'entrée.
- S'il est présenté avec une chaîne d'entrée qui n'est pas valide selon les règles ci-dessus (null, zéro caractère, contient des caractères illégaux, etc.) votre programme peut faire n'importe quoi (plantage, sortie vide, etc.)
- La sortie est insensible à la casse autre que les symboles atomiques qui doivent correspondre au tableau périodique.
- Les échappatoires standard ne sont pas autorisées.
Cas de test:
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]
C'est le code golf, alors laissez-moi voir votre code le plus court!
T[I][N]
pas[T][I][N]
parce que T n'est pas un élément. Ma question (et peut-être celle de Rassar) est: devons-nous seulement donner 1. Seules les sorties où le nombre maximal de substitutions d'éléments sont effectuées? 2. Seulement la quantité minimale de gaspillage? (Le HeHe avec des hydrogènes indique que la réponse à celle-ci est non) 3. Toutes les sorties où les correspondances sont complètement épuisées? (dans ce casT[I][N]
, ainsi queT[In]
serait valide.) Je pense que l'interprétation correcte est 3.Q[U][Ac][K]
etQ[U]a[C][K]
. Droite?Réponses:
Python 3,
289263 octetsTrouvé une bibliothèque plus complète sur Pypi:
mendeleev
Ancienne réponse:
Utilise une bibliothèque
elements.py
de http://www.lfd.uci.edu/~gohlke/code/elements.py.html . Il manque les éléments 110 à 118, mais c'était la bibliothèque la plus récente que j'ai pu trouver. Coût 40 octets pour ajouter les éléments manquants.La partie la plus délicate était la logique pour quand un personnage peut être traversé sans faire partie d'un symbole d'élément.
la source
mendeleev
un utilisateur, pas une bibliothèque?Gelée ,
192191 octets-1 en utilisant
Ɗ
(un rapide développé depuis)Essayez-le en ligne! - Trop inefficace pour que le scénario de test "Stack Exchange" se termine dans la limite des années 60 (son exécution hors ligne donne le résultat correct dans les 2 minutes).
Comment?
La première ligne de code est un lien niladique pour créer une liste contenant les 118 symboles d'élément. Pour ce faire, il concatène deux listes, la première contenant toutes les listes de caractères de longueur 2 (c'est-à-dire les chaînes), la seconde une liste de caractères et le titre casse la liste résultante. Les deux listes elles-mêmes sont créées principalement en recherchant des mots dans le dictionnaire de Jelly pour créer des chaînes simples.
La première de ces compressions est:
qui donne
Où tous sauf l'entrée finale (divisés par des espaces) sont des entrées dans le dictionnaire de Jelly. Les espaces sont filtrés avec
ḟ⁶
, puis le résultat est divisé en deux:La deuxième,
est formé de la concaténation des mots "pinson", "pub", "ciel" et "vœu" (sans espaces), et en tant que tel est une liste de caractères:
Les deux listes sont concaténées avec
;
et chaque entrée est titrée en utilisantŒt
, ce qui donne:Une liste contenant les 118 symboles d'élément selon les besoins (il y a des doublons, mais ça va).
La deuxième ligne de code est un lien monadique (une fonction d'assistance conçue pour prendre une entrée) qui renvoie un 1 si l'entrée, avec un titre, existe dans la liste créée ci-dessus et un 0 dans le cas contraire.
La troisième ligne de code est le lien principal, une fonction monadique qui prend une chaîne et renvoie une liste de listes de caractères (c'est-à-dire des chaînes) selon les besoins:
la source
C ++ 11,
944928 octetsVoici un morceau de code vraiment terrible, mais cela devrait fonctionner. Pourrait encore être raccourci beaucoup plus probablement.
Appeler avec:
la source