Breaking Bad - herhangi bir dizeyi izleyin (sıkıştırma) [çoğaltın]
"Breaking Bad" TV dizisi, Br ve Ba harflerini periyodik tablo benzeri bir temsil, baskı ile değiştirdi [Br35]eaking [Ba56]d
.
Bir dizi girdisi alan, bir değişiklik yapan ve bir çıktı yazdıran bir program oluşturun. Değiştirme, içinde gösterilen gösterimle bir eleman sembolüyle eşleşen herhangi bir alt dizeyi sübvanse edecektir [Br35]eaking [Ba56]d
. Yani, atom numarasını element sembolüne ekleyin ve köşeli parantez içine alın.
Tüm öğeler büyük harfle başlar ve bir veya iki harften oluşur. Dikkate alınması gereken en yüksek unsur Og118'dir. Wikipedia'dan:
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 Sık iğne, 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 Hayır, 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
Ek kurallar:
- Bu zorluk kod golfü kadar sıkıştırma ile ilgili olduğundan, eleman listesini kendiniz sağlamalısınız. Sen periyodik tablodaki herhangi bir yapı kullanmamalıdır dilimizin tarafından sağlanan.
- Büyük / küçük harfe duyarlı çalışın. Bu, "Breaking Bad" in 2 yerine, "Breaking bad" da bir tane olduğu anlamına gelir. Giriş keyfi olabilir ve her zaman İngilizce grameri takip etmez. fOoBar, f [O8] o [Ba56] r olacaktır.
- Açgözlü arama, [O] [H] 'den önceliklidir.
Bayt cinsinden en kısa kod kazanır.
Yanıtlar
JavaScript (ES6), 327 bayt
s=>s.replace(RegExp([...a="HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg".match(/.[a-z]?/g)].sort(s=>-!!s[1]).join`|`,'g'),s=>`[${s+-~a.indexOf(s)}]`)
Çevrimiçi deneyin!
Nasıl?
Veri dizisi, en düşükten en yükseğe atom numarasına kadar birleştirilmiş tüm element sembollerinden oluşur.
"HHeLiBeBCNOFNeNaMg...LvTsOg"
a[]
Aşağıdaki normal ifadeyle 118 girişten oluşan bir listeye ayırdık:
+------> any character (always a capital letter)
| +--> optionally followed by a letter in lower case
| __|_
|/ \
/.[a-z]?/g
Bir kopyasını oluşturuyoruz a[]
, tüm tek karakterli öğeleri listenin sonuna yerleştiriyoruz ve borularla birleştiriyoruz:
[...a].sort(s => -!!s[1]).join('|')
Hangi verir:
"Og|Ts|Lv|Mc|Fl|Nh|...|He|H|B|C|N|O|F|P|S|K|V|Y|I|W|U"
Bu dizgeyi normal bir ifadeye çevirip girdi dizgesine uyguluyoruz. Eşleşen her alt dize s
, şu modelle değiştirilir:
`[${s + -~a.indexOf(s)}]`
Python 3,8 , 454 \$\cdots\$409 385 bayt
Ovs sayesinde büyük bir 38 40 45 69 bayt kurtardı (ve bir hata düzeltildi) !!!
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:]
Çevrimiçi deneyin!
Önce tüm iki harfli kimyasalları ve sonra tek harfli olanları gözden geçirir.
Kömür , 217 bayt
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⊕⌕υι]»ι
Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir. Açıklama:
F⪪”...”²⊞υΦι›κ
Öğe adlarının bir listesini harf çiftlerine bölün ve boşlukları silin.
≔⪪⮌S¹θ
Girişi ters çevirin ve karakterlere bölün.
W∧θ⭆⊕№υ⭆²§⮌θκ⊟θ
Hala girdi varken, eşleşen bir öğe varsa son 2 karakteri kaldırın, aksi takdirde son karakteri kaldırın.
¿№υι«
Dizide bir eşleşme varsa, o zaman ...
[ιI⊕⌕υι]
... eşleşmeyi ve atom numarasını []
s içine yazdırın .
»ι
Aksi takdirde sadece mevcut karakteri yazdırın.
05AB1E , 183 181 bayt
.œʒ.•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
Uzun girdiler için oldukça yavaş.
Çevrimiçi deneyin veya birkaç kısa test durumunu daha doğrulayın .
Açıklama:
.œ # 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)
Neden .•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¢Œƶʒ˜•
olduğunu anlamak için bu 05AB1E ipucuna bakın ( sözlüğün parçası olmayan dizeler nasıl sıkıştırılır? )"h helibeb c n o f nenamgalsip s clark casctiv crmnfeconicuzngageassebrkrrbsry zrnbmotcrurhpdagcdinsnsbtei xecsbalaceprndpmsmeugdtbdyhoertmybluhftaw reosirptauhgtlpbbipoatrnfrraacthpau nppuamcmbkcfesfmmdnolrrfdbsgbhhsmtdsrgcnnhflmclvtsog"
.
Perl 5 -p
, 313 bayt
map$k{$_}=++$j,HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg=~/.[a-z]?/g;for$a(sort{$b=~y///c-length$a}keys%k){s/(?<!\[)$a/[$a$k{$a}]/g}
Çevrimiçi deneyin!