Breaking Bad - ize string apa pun (kompresi) [duplikat]
Serial TV "Breaking Bad" mengganti huruf Br dan Ba dengan tabel periodik seperti representasi, pencetakan [Br35]eaking [Ba56]d
.
Buat program yang mengambil input string, melakukan penggantian, dan mencetak output. Penggantian harus mensubsidi setiap substring yang cocok dengan simbol elemen dengan notasi yang ditunjukkan dalam [Br35]eaking [Ba56]d
. Artinya, tambahkan nomor atom ke simbol unsur dan masukkan dalam tanda kurung siku.
Semua elemen dimulai dengan huruf kapital dan terdiri dari satu atau dua huruf. Elemen tertinggi untuk dipertimbangkan adalah Og118. Dari 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 Tidak, 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
Aturan tambahan:
- Karena tantangan ini adalah tentang kompresi dan juga tentang kode golf, jadi Anda harus menyediakan daftar elemen sendiri. Anda tidak boleh menggunakan build apa pun dalam tabel periodik yang disediakan oleh bahasa kami.
- Bekerja peka huruf besar kecil. Itu berarti "Breaking Bad" memiliki 2 pengganti, "Breaking bad" memiliki satu pengganti. Masukan dapat berubah-ubah dan tidak selalu mengikuti tata bahasa Inggris. fOoBar akan menjadi f [O8] o [Ba56] r.
- Cari serakah, [Dia] diutamakan daripada [H].
Kode terpendek dalam byte menang.
Jawaban
JavaScript (ES6), 327 byte
s=>s.replace(RegExp([...a="HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg".match(/.[a-z]?/g)].sort(s=>-!!s[1]).join`|`,'g'),s=>`[${s+-~a.indexOf(s)}]`)
Cobalah secara online!
Bagaimana?
Data string terdiri dari semua simbol elemen yang digabungkan, dari nomor atom terendah hingga tertinggi.
"HHeLiBeBCNOFNeNaMg...LvTsOg"
Kami membaginya menjadi daftar a[]
118 entri dengan ekspresi reguler berikut:
+------> any character (always a capital letter)
| +--> optionally followed by a letter in lower case
| __|_
|/ \
/.[a-z]?/g
Kami membuat salinan a[]
, meletakkan semua elemen karakter tunggal di akhir daftar dan bergabung dengan pipa:
[...a].sort(s => -!!s[1]).join('|')
Pemberian yang mana:
"Og|Ts|Lv|Mc|Fl|Nh|...|He|H|B|C|N|O|F|P|S|K|V|Y|I|W|U"
Kami mengubah string ini menjadi ekspresi reguler dan menerapkannya ke string input. Setiap sub-string yang cocok s
diganti dengan pola:
`[${s + -~a.indexOf(s)}]`
Python 3.8 , 454 \$\cdots\$409 385 byte
Menyimpan 38 40 45 69 byte kekalahan (dan memperbaiki bug) berkat 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:]
Cobalah secara online!
Pertama melewati semua bahan kimia dua huruf dan kemudian satu huruf.
Arang , 217 byte
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⊕⌕υι]»ι
Cobalah secara online! Tautan adalah untuk verbose versi kode. Penjelasan:
F⪪”...”²⊞υΦι›κ
Pisahkan daftar nama elemen menjadi pasangan huruf dan hapus spasi.
≔⪪⮌S¹θ
Balikkan masukan dan bagi menjadi karakter.
W∧θ⭆⊕№υ⭆²§⮌θκ⊟θ
Selama masih ada masukan, hilangkan 2 karakter terakhir jika ada elemen yang cocok, jika tidak hapus karakter terakhir.
¿№υι«
Jika ada kecocokan dalam array, maka ...
[ιI⊕⌕υι]
... cetak korek api dan nomor atomnya di dalam []
s.
»ι
Jika tidak, cetak saja karakter saat ini.
05AB1E , 183 181 byte
.œʒ.•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
Cukup lambat untuk input yang lama.
Cobalah secara online atau verifikasi beberapa kasus pengujian singkat lainnya .
Penjelasan:
.œ # 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)
Lihat ini 05AB1E ujung tambang (bagian Cara string kompres bukan bagian dari kamus? ) Untuk memahami mengapa .•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¢Œƶʒ˜•
adalah "h helibeb c n o f nenamgalsip s clark casctiv crmnfeconicuzngageassebrkrrbsry zrnbmotcrurhpdagcdinsnsbtei xecsbalaceprndpmsmeugdtbdyhoertmybluhftaw reosirptauhgtlpbbipoatrnfrraacthpau nppuamcmbkcfesfmmdnolrrfdbsgbhhsmtdsrgcnnhflmclvtsog"
.
Perl 5 -p
, 313 byte
map$k{$_}=++$j,HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg=~/.[a-z]?/g;for$a(sort{$b=~y///c-length$a}keys%k){s/(?<!\[)$a/[$a$k{$a}]/g}
Cobalah secara online!