ブレイキング・バッド-任意の文字列をサイズ化(圧縮)[複製]

Aug 17 2020

テレビシリーズ「ブレイキング・バッド」は、BrとBaの文字を周期表のような表現、印刷に置き換えました[Br35]eaking [Ba56]d

文字列入力を受け取り、置換を行い、出力を出力するプログラムを作成します。置換は、で示されている表記法で要素記号に一致するすべての部分文字列を助成するものとし[Br35]eaking [Ba56]dます。つまり、元素記号に原子番号を追加し、角かっこで囲みます。

すべての要素は大文字で始まり、1文字または2文字で構成されます。考慮すべき最も高い要素は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 Fl、115 Mc、116 Lv、117 Ts 、118 Og

追加のルール:

  • この課題はコードゴルフと同じくらい圧縮に関するものなので、要素リストを自分で提供する必要があります。あなたは定期的にテーブル内の任意のビルドを使用してはならない私たちの言語で提供します。
  • 大文字と小文字が区別されます。つまり、「ブレイキング・バッド」には2つの代替品があり、「ブレイキング・バッド」には1つあります。入力は任意であり、常に英語の文法に従うとは限りません。fOoBarはf [O8] o [Ba56] rになります。
  • 貪欲な検索、[彼]は[H]よりも優先されます。

バイト単位の最短コードが優先されます。

回答

6 Arnauld Aug 17 2020 at 22:57

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[]すべての1文字の要素をリストの最後に配置して、パイプで結合します。

[...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)}]`
4 Noodle9 Aug 17 2020 at 23:20

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:]

オンラインでお試しください!

最初に2文字の化学物質すべてを調べ、次に1文字の化学物質を調べます。

4 Neil Aug 18 2020 at 03:17

チャコール、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内に出力します。

»ι

それ以外の場合は、現在の文字を出力するだけです。

1 KevinCruijssen Aug 20 2020 at 18:56

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"

Xcali Aug 21 2020 at 02:20

Perl -p 5、313バイト

map$k{$_}=++$j,HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg=~/.[a-z]?/g;for$a(sort{$b=~y///c-length$a}keys%k){s/(?<!\[)$a/[$a$k{$a}]/g}

オンラインでお試しください!