Breaking Bad - taille toute chaîne (compression) [dupliquer]
La série télévisée "Breaking Bad" a remplacé les lettres Br et Ba par un tableau périodique comme la représentation, l'impression [Br35]eaking [Ba56]d
.
Créez un programme qui prend une chaîne d'entrée, effectue un remplacement et imprime une sortie. Le remplacement subventionnera toute sous-chaîne qui correspond à un symbole d'élément avec la notation indiquée dans [Br35]eaking [Ba56]d
. Autrement dit, ajoutez le numéro atomique au symbole de l'élément et placez-le entre crochets.
Tous les éléments commencent par une majuscule et se composent d'une ou deux lettres. L'élément le plus élevé à considérer est Og118. De wikipedia:
1 H, 2 He, 3 Li, 4 Be, 5 B, 6 C, 7 N, 8 O, 9 F, 10 Ne, 11 Na, 12 Mg, 13 Al, 14 Si, 15 P, 16 S, 17 Cl , 18 Ar, 19 K, 20 Ca, 21 Sc, 22 Ti, 23 V, 24 Cr, 25 Mn, 26 Fe, 27 Co, 28 Ni, 29 Cu, 30 Zn, 31 Ga, 32 Ge, 33 As, 34 Se, 35 Br, 36 Kr, 37 Rb, 38 Sr, 39 Y, 40 Zr, 41 Nb, 42 Mo, 43 Tc, 44 Ru, 45 Rh, 46 Pd, 47 Ag, 48 Cd, 49 In, 50 Sn, 51 Sb, 52 Te, 53 I, 54 Xe, 55 Cs, 56 Ba, 57 La, 58 Ce, 59 Pr, 60 Nd, 61 Pm, 62 Sm, 63 Eu, 64 Gd, 65 Tb, 66 Dy, 67 Ho , 68 Er, 69 Tm, 70 Yb, 71 Lu, 72 Hf, 73 Ta, 74 W, 75 Re, 76 Os, 77 Ir, 78 Pt, 79 Au, 80 Hg, 81 Tl, 82 Pb, 83 Bi, 84 Po, 85 At, 86 Rn, 87 Fr, 88 Ra, 89 Ac, 90 Th, 91 Pa, 92 U, 93 Np, 94 Pu, 95 Am, 96 Cm, 97 Bk, 98 Cf, 99 Es, 100 Fm, 101 Md, 102 Non, 103 Lr, 104 Rf, 105 Db, 106 Sg, 107 Bh, 108 Hs, 109 Mt, 110 Ds, 111 Rg, 112 Cn, 113 Nh, 114 Fl, 115 Mc, 116 Lv, 117 Ts , 118 Og
Règles supplémentaires:
- Comme ce défi concerne autant la compression que le code golf, vous devez donc fournir vous-même la liste des éléments. Vous ne devez utiliser aucune compilation dans les tableaux périodiques fournis par notre langage.
- Travaillez en respectant la casse. Cela signifie que "Breaking Bad" a 2 remplacements, "Breaking Bad" en a un. L'entrée peut être arbitraire et ne suivra pas toujours la grammaire anglaise. fOoBar deviendra f [O8] o [Ba56] r.
- Recherche gourmande, [He] a priorité sur [H].
Le code le plus court en octets l'emporte.
Réponses
JavaScript (ES6), 327 octets
s=>s.replace(RegExp([...a="HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg".match(/.[a-z]?/g)].sort(s=>-!!s[1]).join`|`,'g'),s=>`[${s+-~a.indexOf(s)}]`)
Essayez-le en ligne!
Comment?
La chaîne de données se compose de tous les symboles d'éléments concaténés ensemble, du plus petit au plus grand numéro atomique.
"HHeLiBeBCNOFNeNaMg...LvTsOg"
Nous l'avons divisé en une liste a[]
de 118 entrées avec l'expression régulière suivante:
+------> any character (always a capital letter)
| +--> optionally followed by a letter in lower case
| __|_
|/ \
/.[a-z]?/g
Nous créons une copie de a[]
, mettons tous les éléments à un seul caractère à la fin de la liste et joignons avec des tuyaux:
[...a].sort(s => -!!s[1]).join('|')
Qui donne:
"Og|Ts|Lv|Mc|Fl|Nh|...|He|H|B|C|N|O|F|P|S|K|V|Y|I|W|U"
Nous transformons cette chaîne en une expression régulière et l'appliquons à la chaîne d'entrée. Chaque sous-chaîne correspondante s
est remplacée par le modèle:
`[${s + -~a.indexOf(s)}]`
Python 3.8 , 454 \$\cdots\$409 385 octets
Sauvegardé un énorme 38 40 45 69 octets (et correction d'un bug) grâce à ovs !!!
eval("lambda s:_]and_<b][-1]".replace('_',"[(s:=re.sub(f'(?<!\[){b}',f'[{b}{e}]',s))for e,b in p if b[1:]"))
import re
p=[*enumerate(re.split("(?=[A-Z])","HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg"))][1:]
Essayez-le en ligne!
Passe d'abord en revue les deux lettres chimiques, puis celles à une seule lettre.
Fusain , 217 octets
F⪪”}∨"²Q/QH▷⊕Ff←SγG¤º&ρωVφ∨]›¶⁻Nr*Sψ⦄π⁶&U⊞jεJκκH‹ι7◧"↷⌊Rι¦◧◧‽3▷↨↑´^@➙⊙×π+sQ⌈⊙▷TQ|ⅉB{_Π"⪪η(⁵AxQWW/⁻∨8▶u…κ¹*ITλ_⟧‽Hj.⊞;r⬤|›∧7ψjêÞζp⸿⊖¿⊖Q℅↷Hb↨“↔=bY⁵⌈↷¬δ⎚⪫:D₂↓;≦?⁺[‴.t4r±,s^)↗τ”²⊞υΦι›κ ≔⪪⮌S¹θW∧θ⭆⊕№υ⭆²§⮌θκ⊟θ¿№υι«[ιI⊕⌕υι]»ι
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
F⪪”...”²⊞υΦι›κ
Divisez une liste de noms d'éléments en paires de lettres et supprimez les espaces.
≔⪪⮌S¹θ
Inversez l'entrée et divisez-la en caractères.
W∧θ⭆⊕№υ⭆²§⮌θκ⊟θ
Tant qu'il y a encore de l'entrée, supprimez les 2 derniers caractères s'il y a un élément correspondant, sinon supprimez le dernier caractère.
¿№υι«
S'il y a une correspondance dans le tableau, alors ...
[ιI⊕⌕υι]
... affiche la correspondance et son numéro atomique dans []
s.
»ι
Sinon, imprimez simplement le caractère actuel.
05AB1E , 183 181 octets
.œʒ.•2вy>ÖΘZθÒ7ßΩ¨ÑÝ
(Îiþ∍ćf=ÆΛ}’.мιoiFδC¸Γ=¢`Ÿíнp»ΛÑzðÿ®ÄÄ‘Â@Âη+(Óûò‘8нKKK#â<Ù#<“râµ5£”м}ÓæuüåÈZµ-ΔÈ;VzeY¯õnK§ÁÚ¡[θƶη„Gp©6›mðÿāε1ΛÎíγJò~܉cT¢Œƶʒ˜•2ô™ðм©såüαP}Σ€g{ygš}θ®DεN>«…[ÿ]}‡J
Assez lent pour les longues entrées.
Essayez-le en ligne ou vérifiez quelques cas de test plus courts .
Explication:
.œ # Get all partitions of the (implicit) input-string
ʒ # Filter these list of parts by:
.•2вy...ƶʒ˜• # Push compressed string "h helibeb c n o f nenamgalsip s clark casctiv crmnfeconicuzngageassebrkrrbsry zrnbmotcrurhpdagcdinsnsbtei xecsbalaceprndpmsmeugdtbdyhoertmybluhftaw reosirptauhgtlpbbipoatrnfrraacthpau nppuamcmbkcfesfmmdnolrrfdbsgbhhsmtdsrgcnnhflmclvtsog"
2ô # Split it into parts of size 2: ["h ","he","li","be","b "...]
™ # Titlecase each string: ["H ","He","Li","Be","B ",...]
ðм # Remove all spaces from each string: ["H","He","Li","Be","B",...]
© # Store this list in variable `®` (without popping)
s # Swap so the current partition is at the top of the stack
å # Check for each inner part whether it's in the element-list
# (1 if truthy; 0 if falsey)
ü # For each overlapping pair:
α # Get the absolute difference
P # Get the product of those to check if all are truthy (1)
# (partitions in the form of [0,1,0,1,...] or [1,0,1,0,...] are left)
}Σ # After the filter: sort any remaining partition by:
€ # Map each part in the list to:
g # Pop and push its length
{ # Sort this list of lengths
y # Push the current partition again
g # Pop and push its length to get the amount of parts in this partition
š # And prepend it at the front of the other lengths
}θ # After the sort by: only leave the last partition,
# which will have the most parts, as well as the longest individual parts
® # Push the list of elements from variable `®` again
D # Duplicate it
ε # Map the copy to:
N> # Push the 0-based map index, and increase it by 1
« # Append it to the element-string
…[ÿ] # Push string "[ÿ]", where the `ÿ` is automatically filled with the
# element name and number
}‡ # After the map: transliterate all elements to the formatted elements in
# the partition
J # And join it back together to a single string
# (after which it is output implicitly as result)
Voir cette astuce de mes 05AB1E (section Comment chaînes Compresser ne font pas partie du dictionnaire? ) Pour comprendre pourquoi .•2вy>ÖΘZθÒ7ßΩ¨ÑÝ\n(Îiþ∍ćf=ÆΛ}’.мιoiFδC¸Γ=¢`Ÿíнp»ΛÑzðÿ®ÄÄ‘Â@Âη+(Óûò‘8нKKK#â<Ù#<“râµ5£”м}ÓæuüåÈZµ-ΔÈ;VzeY¯õnK§ÁÚ¡[θƶη„Gp©6›mðÿāε1ΛÎíγJò~܉cT¢Œƶʒ˜•
est "h helibeb c n o f nenamgalsip s clark casctiv crmnfeconicuzngageassebrkrrbsry zrnbmotcrurhpdagcdinsnsbtei xecsbalaceprndpmsmeugdtbdyhoertmybluhftaw reosirptauhgtlpbbipoatrnfrraacthpau nppuamcmbkcfesfmmdnolrrfdbsgbhhsmtdsrgcnnhflmclvtsog"
.
Perl 5 -p
, 313 octets
map$k{$_}=++$j,HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg=~/.[a-z]?/g;for$a(sort{$b=~y///c-length$a}keys%k){s/(?<!\[)$a/[$a$k{$a}]/g}
Essayez-le en ligne!