[Br] eaking Code Golf [Ba] d


20

次の文字列を検討してください。

Tin Snips

この文字列には、周期表の原子記号がいくつか含まれています。これらのいくつかを識別するために、この文字列を書き換えることができます。

[Ti][N] [Sn][I][P][S]

もちろん、次のように書くこともできます。

T[In] [S][Ni][P][S]

入力を書き換える規則は次のとおりです。

  1. 入力の大文字小文字は、アトミックシンボルの一致に関しては重要ではありません。
  2. 要素がアトミックシンボルで使用される場合、シンボルが正しいように大文字と小文字を変更する必要があります。例:hになり[H]ます。
  3. すべての要素のシンボルはASCII角括弧に包まれ、されている[]
  4. 空白は保持さBig ego[Ge]ます。「g」と「e」をに結合することはできません。
  5. すべての入力文字をアトミックシンボルに結合する必要はありません。入力文字がシンボルに入れられない場合、そのまま渡されます(大文字と小文字は区別されません)。
  6. シンボルを作成できる場合は、作成する必要あります。つまり、Tin上記の例では、その単語に少なくとも1つのシンボルを作成できるため、出力することはできません。未使用の文字を通過できるのは、アトミックシンボルの構築に使用できない場合だけです。
  7. この課題のために、水素(1)からオガネソン(118)までのすべての要素が有効です。有効な上位要素はありません。
  8. 上位の要素のいくつかは、あいまいな名前と記号を持っています。この課題のために、Wikipediaバージョンが使用されます。便宜上、許容される原子記号は次のとおりです。H、He、Li、Be、B、C、N、O、F、Ne、Na、Mg、Al、Si、P、S、Cl、Ar、K、Ca、 Sc、Ti、V、Cr、Mn、Fe、Co、Ni、Cu、Zn、Ga、Ge、As、Se、Br、Kr、Rb、Sr、Y、Zr、Nb、Mo、Tc、Ru、Rh、 Pd、Ag、Cd、In、Sn、Sb、Te、I、Xe、Cs、Ba、La、Ce、Pr、Nd、Pm、Sm、Eu、Gd、Tb、Dy、Ho、Er、Tm、Yb、 Lu、Hf、Ta、W、Re、Os、Ir、Pt、Au、Hg、Tl、Pb、Bi、Po、At、Rn、Fr、Ra、Ac、Th、Pa、U、Np、Pu、Am、 Cm、Bk、Cf、Es、Fm、Md、No、Lr、Rf、Db、Sg、Bh、Hs、Mt、Ds、Rg、Cn、Nh、Fl、Mc、Lv、Ts、Og。

提供された単一の入力からすべての可能な出力を生成するプログラムまたは関数を作成します。入力と出力の両方は、任意の形式にすることができます。これは、文字列、文字の配列、またはその他のデータ構造である可能性があります。便利で入力と出力を明確に表すものであれば何でもかまいません。入力と出力の両方をコードの入出力に渡すことができますが、標準の入出力、関数の引数/戻り値、またはその他の選択を選択できます。

  • 入力は、任意の大文字小文字のASCII文字とスペース(0x20)文字のみを含む正の長さの文字列(前の段落を参照)でなければなりません。
  • コードは、上記の入力ルールを使用して作成できるすべての出力文字列を生成する必要があります。
  • 出力の順序は実装定義です。唯一の要件は、すべての出力文字列が存在することです。
  • アトミックシンボルを含まない有効な入力文字列が提示された場合、単に入力文字列を出力します。
  • 上記のルールに従って無効な入力文字列(null、ゼロ文字、不正な文字が含まれているなど)が提示された場合、プログラムは何でもできます(クラッシュ、空白出力など)。
  • 周期表と一致する必要があるアトミックシンボル以外の出力では、大文字と小文字は区別されません。
  • 標準の抜け穴は許可されていません。

テストケース:

Tin Snips
[Ti][N] [Sn][I][P][S]
[Ti][N] [S][Ni][P][S]
[Ti][N] [S][N][I][P][S]
T[In] [Sn][I][P][S]
T[In] [S][Ni][P][S]
T[In] [S][N][I][P][S]
T[I][N] ...

Quack
Q[U][Ac][K]
Q[U]a[C][K]

hehe
[H]e[H]e
[H]e[He]
[He][H]e
[He][He]

Stack Exchange
[S][Ta][C][K] Ex[C][H]a[N][Ge]
[S]t[Ac][K] Ex[C][H]a[N][Ge]

これはコードゴルフですので、最短のコードを見てみましょう。


1
@Rassarsコメントパー錫はなりT[I][N]ません[T][I][N]Tは要素ではないので。私の質問(そしておそらくRassarのもの)は次のとおりです。1だけを与える必要がありますか?2.最小限の無駄だけですか?(水素を含むHeHeは、これに対する答えが「いいえ」であることを示します)3.一致が完全に使い果たされたすべての出力?(この場合T[I][N]だけでなく、としてT[In]有効となります。)私が思う正しい解釈が3である
レベル川セント


1
Quackには2つの可能性があります:Q[U][Ac][K]Q[U]a[C][K]。右?
-RootTwo

1
すべてのケースが検証されました。
電卓

1
@ Challenger5「上記の入力ルールを使用して作成できるすべての出力文字列をコードで生成する必要があります」
ジョナサンアラン

回答:


5

Python 3、289 263バイト

Pypiでより完全なライブラリを見つけました: mendeleev

from mendeleev import*
Z={element(i).symbol for i in range(1,119)}
L,R='[]'
def f(h,r=''):t=h.title();return((Z&{t[0]}and f(h[1:],r+L+t[0]+R)or[])+(Z>{(t+L)[:2]}and f(h[2:],r+L+t[:2]+R)or[])+(not{(r[-1:]+t[0]).title(),t[0]}&Z and f(h[1:],r+h[0])or[]))if h else[r]

古い答え:

from elements import*
Z={e.symbol for e in ELEMENTS}|{*'Cn Ds Fl Lv Mc Nh Og Rg Ts'.split()}
L,R='[]'
def f(h,r=''):t=h.title();return((Z&{t[0]}and f(h[1:],r+L+t[0]+R)or[])+(Z>{(t+L)[:2]}and f(h[2:],r+L+t[:2]+R)or[])+(not{(r[-1:]+t[0]).title(),t[0]}&Z and f(h[1:],r+h[0])or[]))if h else[r]

http://www.lfd.uci.edu/~gohlke/code/elements.py.htmlのライブラリelements.pyを使用します。要素110から118が欠落していますが、私が見つけることができる最新のライブラリでした。不足している要素を追加するには40バイトかかります。

最もトリッキーな部分は、要素シンボルの一部にならずに文字を通過させることができるロジックです。


1
待てmendeleevよ、ライブラリーじゃなくてユーザーじゃないの?
マシュー盧

3

ゼリー 192191 バイト

-1を使用してƊ(以来開発されたクイック)

“¦UV2ḤF2ı½ṅḶḊ⁼5JI5MẇvẋẊẊ¬Ḥḳ'ƈ<ḷėƤ7*⁾ṾxMæS⁺`?^Ƭb¦ɗDß⁼pþɲOṃ⁽2Ė>,Ḣ(ḞŒƊOGƤ×⁺ṇṂ®ȤT0y°^Ẇ⁺:Þ]ṢṬ¶ịṪḂƇ ñAƬCṫ$wÆĿĖỴỴƇẓƊqḌ@;ẏ`ṃFƥḣ⁽²»ḟ⁶s2;“¤²R.ȯ7ŒL£ɦ»Œt
Œte¢
ŒṖµL€=1oÇ€ṂµÐfµṡ2;€ÇÐfÇ€€S€¬SµÐḟ⁾[]jŒtƊ¹Ç?€€

オンラインでお試しください!-「Stack Exchange」テストケースが60秒の制限内で完了するには非効率的です(オフラインで実行すると、2分以内に正しい結果が得られます)。

どうやって?

コードの最初の行は、118個の要素シンボルすべてを含むリストを作成するためのニラディックリンクです。これを行うには、2つのリストを連結します。最初のリストには、すべての長さ2の文字のリスト(つまり文字列)が含まれ、2番目のリストには文字のリストが含まれます。2つのリスト自体は、主にJellyの辞書で単語を検索して単一の文字列を作成することで作成されます。

これらの圧縮の最初は次のとおりです。

“¦UV2ḤF2ı½ṅḶḊ⁼5JI5MẇvẋẊẊ¬Ḥḳ'ƈ<ḷėƤ7*⁾ṾxMæS⁺`?^Ƭb¦ɗDß⁼pþɲOṃ⁽2Ė>,Ḣ(ḞŒƊOGƤ×⁺ṇṂ®ȤT0y°^Ẇ⁺:Þ]ṢṬ¶ịṪḂƇ ñAƬCṫ$wÆĿĖỴỴƇẓƊqḌ@;ẏ`ṃFƥḣ⁽²»

をもたらす

" biznagas sepmag ratbag catchflies paracmes mdse bharal ramcat monopteros irrepressibilities lunarnauts geniculate hopbinds rutabaga potlache broghs bergamas crossbirth purblind xebecs nonhardy classism fleurets moneybag scarce corf Mg Sr Zr CD HG CF FM Lr SG TM Gd Bk Fr Rh Fe Sn lv cndbmnnbkrmtpdnp"

最後のエントリ(スペースで分割)を除くすべてがJellyの辞書のエントリです。スペースはでフィルタリングされḟ⁶、結果は2つに分割されます。

["bi","zn","ag","as","se","pm","ag","ra","tb","ag","ca","tc","hf","li","es","pa","ra","cm","es","md","se","bh","ar","al","ra","mc","at","mo","no","pt","er","os","ir","re","pr","es","si","bi","li","ti","es","lu","na","rn","au","ts","ge","ni","cu","la","te","ho","pb","in","ds","ru","ta","ba","ga","po","tl","ac","he","br","og","hs","be","rg","am","as","cr","os","sb","ir","th","pu","rb","li","nd","xe","be","cs","no","nh","ar","dy","cl","as","si","sm","fl","eu","re","ts","mo","ne","yb","ag","sc","ar","ce","co","rf","Mg","Sr","Zr","CD","HG","CF","FM","Lr","SG","TM","Gd","Bk","Fr","Rh","Fe","Sn","lv","cn","db","mn","nb","kr","mt","pd","np"]

二番目、

“¤²R.ȯ7ŒL£ɦ»

単語「finch」、「pub」、「sky」、および「vow」(スペースなし)の連結から形成され、文字のリストは次のとおりです。

['f','i','n','c','h','p','u','b','s','k','y','v','o','w']

2つのリストは連結され;、すべてのエントリはを使用してタイトルケースŒtに入れられます。

["Bi","Zn","Ag","As","Se","Pm","Ag","Ra","Tb","Ag","Ca","Tc","Hf","Li","Es","Pa","Ra","Cm","Es","Md","Se","Bh","Ar","Al","Ra","Mc","At","Mo","No","Pt","Er","Os","Ir","Re","Pr","Es","Si","Bi","Li","Ti","Es","Lu","Na","Rn","Au","Ts","Ge","Ni","Cu","La","Te","Ho","Pb","In","Ds","Ru","Ta","Ba","Ga","Po","Tl","Ac","He","Br","Og","Hs","Be","Rg","Am","As","Cr","Os","Sb","Ir","Th","Pu","Rb","Li","Nd","Xe","Be","Cs","No","Nh","Ar","Dy","Cl","As","Si","Sm","Fl","Eu","Re","Ts","Mo","Ne","Yb","Ag","Sc","Ar","Ce","Co","Rf","Mg","Sr","Zr","Cd","Hg","Cf","Fm","Lr","Sg","Tm","Gd","Bk","Fr","Rh","Fe","Sn","Lv","Cn","Db","Mn","Nb","Kr","Mt","Pd","Np","F","I","N","C","H","P","U","B","S","K","Y","V","O","W"]

必要に応じて118個すべての要素シンボルを含むリスト(重複がありますが、それで問題ありません)。

コードの2行目は、上記のリストにタイトル付きの入力が存在する場合は1を返し、そうでない場合は0を返すモナドリンク(1つの入力を受け取るように設計されたヘルパー関数)です。

コードの3行目はメインリンクです。これは、文字列を受け取り、必要に応じて文字のリスト(つまり文字列)のリストを返すモナド関数です。

ŒṖµL€=1oÇ€ṂµÐfµṡ2;€ÇÐfÇ€€S€¬SµÐḟ⁾[]jŒtƊ¹Ç?€€ - Main link: s
ŒṖ                                           - all partitions of s
  µ        µÐf                               - filter keep:
   L€=1                                      -     length €ach equals (vectorises) 1
       o                                     -     or
        ǀ                                   -     last link as a monad (is an element when title-cased)
          Ṃ                                  -     minimum 
                                             - (i.e. all partitions that are all single characters OR are strings that when title-cased are elements)
              µ              µÐḟ             - filter discard:
               ṡ2                            -     slices of length 2
                 ;€                          -     concatenate €ach
                    Ðf                       -     filter keep:
                   Ç                         -         last link as a monad (is an element when title-cased)
                      Ç€€                    -     last link as a monad for €ach for €ach
                         S€                  -     sum €ach
                           ¬                 -     logical not
                            S                -     sum
                                             - (i.e. discard any partitions that contain a run of two that joined together and title-cased ARE an element but separately NEITHER are)
                                         ?€€ - if then else for €ach (partition) for €ach (part):
                                        Ç    -     IF: last link as a monad (is an element when title-cased)
                                             -   THEN:
                                      Ɗ      -         last three links as a monad:
                                ⁾[]                      "[]"
                                   j         -           joined by:
                                    Œt       -           title case the part
                                             -   ELSE:
                                       ¹     -         the part itsef (¹ is the identity atom)

1

C ++ 11、944 928バイト

これは本当にひどいコードですが、動作するはずです。おそらくもっと短くすることができます。

#import<iostream>
#import<set>
using namespace std;int r,i;set<string>O;S(string&s){s[0]-=s[0]>90?32:0;if(s[1])s[1]+=s[1]<91?32:0;char*l="HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnNhFlMcLvTsOg";for(r=0;*l++;)if(*l>90){if(*(l++-1)==s[0]&&*(l-1)==s[1])r=1;}else if(*(l-1)==s[0]&&!s[1])r=1;}P(set<string>*V,string s,string o,int b,int l=0,int m=0){if(!s[b])O.insert(o);else if(l)P(V,s,o,b+1);else if(V[b].size()==0)P(V,s,o+s[b],b+1);else for(auto t:V[b]){P(V,s,o+"["+t+"]",b+1,t.length()-1);if(t.length()>1&&V[b].size()==1&&V[b+1].size()>0&&!m)P(V,s,o+s[b],b+1,0,1);}}F(string s){set<string>V[s.length()];for(i=0;s[i++];){string t="";t+=s[i-1];S(t);if(r)V[i-1].insert(t);t+=s[i];S(t);if(r&&s[i])V[i-1].insert(t);}P(V,s,"",0);for(auto o:O)cout<<o<<"\n";O.clear();}

で呼び出す:

int main()
{
    F("Tin Snips");cout << "\n";
    F("Quack");cout << "\n";
    F("hehe");cout << "\n";
    F("Stack Exchange");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.