Breaking Bad - เพิ่มขนาดสตริงใด ๆ (การบีบอัด) [ซ้ำ]
ทีวีซีรีส์ "ร้ายทำลาย" แทนที่ตัวอักษร Br [Br35]eaking [Ba56]d
และบริติชแอร์เวย์ที่มีระยะ-ตารางเช่นการเป็นตัวแทนการพิมพ์
สร้างโปรแกรมที่รับอินพุตสตริงทำการแทนที่และพิมพ์เอาต์พุต แทนจะอุดหนุนย่อยใด ๆ [Br35]eaking [Ba56]d
ที่ตรงกับสัญลักษณ์องค์ประกอบที่มีสัญกรณ์แสดงให้เห็นใน นั่นคือเพิ่มเลขอะตอมให้กับสัญลักษณ์องค์ประกอบและใส่ในวงเล็บเหลี่ยม
องค์ประกอบทั้งหมดเริ่มต้นด้วยอักษรตัวใหญ่และประกอบด้วยตัวอักษรหนึ่งหรือสองตัว องค์ประกอบสูงสุดที่ต้องพิจารณาคือ Og118 จากวิกิพีเดีย:
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 No, 103 Lr, 104 Rf, 105 Db, 106 Sg, 107 Bh, 108 Hs, 109 Mt, 110 Ds, 111 Rg, 112 Cn, 113 Nh, 114 ชั้น, 115 Mc, 116 Lv, 117 Ts , 118 Og
กฎเพิ่มเติม:
- เนื่องจากความท้าทายนี้เกี่ยวกับการบีบอัดข้อมูลมากพอ ๆ กับโค้ดกอล์ฟดังนั้นคุณจึงต้องจัดเตรียมรายการองค์ประกอบด้วยตัวคุณเอง คุณต้องไม่ใช้บิลด์ใด ๆ ในตารางธาตุที่จัดทำโดยภาษาของเรา
- พิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ นั่นหมายความว่า "Breaking Bad" มีการแทนที่ 2 รายการ "Breaking bad" มี 1 รายการ การป้อนข้อมูลอาจเป็นไปตามอำเภอใจและจะไม่เป็นไปตามไวยากรณ์ภาษาอังกฤษเสมอไป fOoBar จะกลายเป็น f [O8] o [Ba56] r
- ค้นหาโลภ [เขา] มีความสำคัญเหนือ [H]
รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
คำตอบ
JavaScript (ES6), 327 ไบต์
s=>s.replace(RegExp([...a="HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg".match(/.[a-z]?/g)].sort(s=>-!!s[1]).join`|`,'g'),s=>`[${s+-~a.indexOf(s)}]`)
ลองออนไลน์!
อย่างไร?
สตริงข้อมูลประกอบด้วยสัญลักษณ์องค์ประกอบทั้งหมดเรียงต่อกันตั้งแต่เลขอะตอมต่ำสุดไปจนถึงสูงสุด
"HHeLiBeBCNOFNeNaMg...LvTsOg"
เราแบ่งออกเป็นรายการa[]
118 รายการด้วยนิพจน์ทั่วไปดังต่อไปนี้:
+------> any character (always a capital letter)
| +--> optionally followed by a letter in lower case
| __|_
|/ \
/.[a-z]?/g
เราสร้างสำเนาa[]
ใส่องค์ประกอบอักขระเดี่ยวทั้งหมดที่ท้ายรายการและเข้าร่วมกับไพพ์:
[...a].sort(s => -!!s[1]).join('|')
ซึ่งจะช่วยให้:
"Og|Ts|Lv|Mc|Fl|Nh|...|He|H|B|C|N|O|F|P|S|K|V|Y|I|W|U"
เราเปลี่ยนสตริงนี้ให้เป็นนิพจน์ทั่วไปและนำไปใช้กับสตริงอินพุต แต่ละสตริงย่อยที่ตรงกันs
จะถูกแทนที่ด้วยรูปแบบ:
`[${s + -~a.indexOf(s)}]`
Python 3.8 , 454 \$\cdots\$409385ไบต์
บันทึกมหันต์38 40 45 69 ไบต์ (และแก้ไขข้อผิดพลาด) ด้วย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:]
ลองออนไลน์!
ขั้นแรกจะต้องผ่านสารเคมีทั้งสองตัวอักษรและตัวอักษรเดี่ยว
ถ่าน 217 ไบต์
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⊕⌕υι]»ι
ลองออนไลน์! ลิงก์คือรหัสเวอร์ชันที่ละเอียด คำอธิบาย:
F⪪”...”²⊞υΦι›κ
แยกรายชื่อองค์ประกอบออกเป็นคู่ของตัวอักษรและลบช่องว่าง
≔⪪⮌S¹θ
ย้อนกลับอินพุตและแยกเป็นอักขระ
W∧θ⭆⊕№υ⭆²§⮌θκ⊟θ
ในขณะที่ยังมีอินพุตอยู่ให้ลบอักขระ 2 ตัวสุดท้ายออกหากมีองค์ประกอบที่ตรงกันมิฉะนั้นให้ลบอักขระสุดท้ายออก
¿№υι«
หากมีการจับคู่ในอาร์เรย์แสดงว่า ...
[ιI⊕⌕υι]
... พิมพ์การจับคู่และเลขอะตอมภายใน[]
s
»ι
มิฉะนั้นให้พิมพ์อักขระปัจจุบัน
05AB1E , 183 181 ไบต์
.œʒ.•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
ค่อนข้างช้าสำหรับอินพุตที่ยาว
ลองมันออนไลน์หรือตรวจสอบบางกรณีการทดสอบระยะสั้นมากขึ้น
คำอธิบาย:
.œ # 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)
ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดสตริงไม่ใช่ส่วนหนึ่งของพจนานุกรม? )จะเข้าใจว่าทำไมเป็น.•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¢Œƶʒ˜•
"h helibeb c n o f nenamgalsip s clark casctiv crmnfeconicuzngageassebrkrrbsry zrnbmotcrurhpdagcdinsnsbtei xecsbalaceprndpmsmeugdtbdyhoertmybluhftaw reosirptauhgtlpbbipoatrnfrraacthpau nppuamcmbkcfesfmmdnolrrfdbsgbhhsmtdsrgcnnhflmclvtsog"
Perl 5 -p
, 313 ไบต์
map$k{$_}=++$j,HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg=~/.[a-z]?/g;for$a(sort{$b=~y///c-length$a}keys%k){s/(?<!\[)$a/[$a$k{$a}]/g}
ลองออนไลน์!