Breaking Bad-ize any string (compression) [duplicate]
TV 시리즈 "Breaking Bad"는 문자 Br과 Ba를 인쇄와 같은 주기율표로 대체했습니다 [Br35]eaking [Ba56]d
.
문자열 입력을 받고 교체를 수행하고 출력을 인쇄하는 프로그램을 만듭니다. 대체는에 설명 된 표기법과 요소 기호와 일치하는 모든 하위 문자열을 보조해야합니다 [Br35]eaking [Ba56]d
. 즉, 원자 번호를 요소 기호에 추가하고 대괄호로 묶습니다.
모든 요소는 대문자로 시작하고 하나 또는 두 개의 문자로 구성됩니다. 고려해야 할 가장 높은 요소는 Og118입니다. 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, 19K, 20 Ca, 21 Sc, 22 Ti, 23V, 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 아니오, 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
추가 규칙 :
- 이 문제는 코드 골프만큼 압축에 관한 것이므로 요소 목록을 직접 제공해야합니다. 당신은 정기적으로 테이블에 어떤 빌드를 사용해서는 안됩니다 우리의 언어로 제공했다.
- 대소 문자를 구분합니다. 즉, "Breaking Bad"에는 2 개의 교체가 있고 "Breaking bad"에는 1 개의 교체가 있습니다. 입력은 임의적 일 수 있으며 항상 영문법을 따르지는 않습니다. fOoBar는 f [O8] o [Ba56] r이됩니다.
- 탐욕스러운 검색, [He]가 [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\$409 385 바이트
ovs 덕분에 무려 38 40 45 69 바이트를 절약 하고 버그를 수정했습니다 !!!
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}
온라인으로 시도하십시오!