[Br] eaking Golf Golf [Ba] d


20

Hãy xem xét chuỗi sau:

Tin Snips

Chuỗi này chứa một số ký hiệu nguyên tử trên bảng tuần hoàn . Chúng tôi có thể viết lại chuỗi này để xác định một vài trong số chúng:

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

Tất nhiên, chúng ta cũng có thể viết nó theo cách này:

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

Các quy tắc để viết lại đầu vào như sau:

  1. Trường hợp của đầu vào không quan trọng về mặt phù hợp với các ký hiệu nguyên tử.
  2. Nếu một yếu tố được sử dụng trong một biểu tượng nguyên tử, trường hợp của nó phải thay đổi để biểu tượng là chính xác. Vd: hsẽ trở thành [H].
  3. Tất cả các ký hiệu phần tử được đặt trong dấu ngoặc vuông ASCII [].
  4. Khoảng trắng được giữ nguyên: Big egokhông thể kết hợp "g" và "e" vào [Ge].
  5. Không phải tất cả các ký tự đầu vào cần được kết hợp thành một ký hiệu nguyên tử: nếu một ký tự đầu vào không được đặt vào một ký hiệu, thì nó được chuyển qua nguyên trạng (trường hợp không quan trọng).
  6. Nếu một biểu tượng có thể được thực hiện, nó phải được thực hiện. Nói cách khác, không được phép xuất ra Tintrong ví dụ trên vì có thể tạo ít nhất một ký hiệu trong từ đó. Lần duy nhất một nhân vật có thể được chuyển qua không sử dụng là khi nó không thể được sử dụng để xây dựng một biểu tượng nguyên tử.
  7. Đối với mục đích của thử thách này, tất cả các yếu tố từ Hydrogen (1) đến Oganesson (118) đều hợp lệ. Không có yếu tố cao hơn là hợp lệ.
  8. Một số yếu tố cao hơn có tên và ký hiệu mơ hồ: cho mục đích của thử thách này, phiên bản tại Wikipedia sẽ được sử dụng. Để thuận tiện, các ký hiệu nguyên tử được phép ở đây: 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, Không, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg, Cn, Nh, Fl, Mc, Lv, Ts, Og.

Viết chương trình hoặc hàm tạo ra tất cả các đầu ra có thể từ một đầu vào được cung cấp. Cả đầu vào và đầu ra có thể ở bất kỳ hình thức nào bạn chọn. Đây có thể là một chuỗi, mảng ký tự hoặc một số cấu trúc dữ liệu khác: bất cứ điều gì vừa thuận tiện vừa thể hiện rõ ràng đầu vào và đầu ra. Cả đầu vào và đầu ra có thể được truyền vào / ra khỏi mã của bạn, tuy nhiên bạn chọn: vào / ra tiêu chuẩn, đối số / trả về hàm hoặc một cái gì đó khác.

  • Đầu vào phải là một chuỗi (xem đoạn trước) có độ dài dương chỉ chứa các ký tự ASCII của trường hợp tùy ý và 0x20ký tự khoảng trắng ( ).
  • Mã của bạn phải tạo ra tất cả các chuỗi đầu ra có thể được tạo bằng các quy tắc đầu vào ở trên.
  • Thứ tự của đầu ra được xác định thực hiện. Yêu cầu duy nhất là tất cả các chuỗi đầu ra đều có mặt.
  • Nếu được trình bày với một chuỗi đầu vào hợp lệ không chứa bất kỳ ký hiệu nguyên tử nào, chỉ cần xuất chuỗi đầu vào.
  • Nếu được trình bày với một chuỗi đầu vào không hợp lệ theo các quy tắc ở trên (null, ký tự không, chứa các ký tự không hợp lệ, v.v.), chương trình của bạn có thể làm bất cứ điều gì (sự cố, đầu ra trống, v.v.)
  • Đầu ra không phân biệt chữ hoa chữ thường, trừ các ký hiệu nguyên tử cần khớp với bảng tuần hoàn.
  • Sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm:

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]

Đây là mã golf, vì vậy hãy để tôi xem mã ngắn nhất của bạn!


1
Mỗi bình luận @Rassars Tin sẽ T[I][N]không phải [T][I][N]vì T không phải là một yếu tố. Câu hỏi của tôi (và có thể là của Rassar) là: chúng ta chỉ phải đưa ra 1. Chỉ những kết quả đầu ra trong đó số lượng tối đa của các phần tử phần tử được thực hiện? 2. Chỉ có lượng chất thải tối thiểu? (HeHe với hydrogens chỉ ra câu trả lời cho câu hỏi này là không) 3. Tất cả các kết quả đầu ra trong đó các trận đấu đã hoàn toàn cạn kiệt? (trong trường hợp này T[I][N]cũng như T[In]sẽ hợp lệ.) Tôi nghĩ cách giải thích chính xác là 3.
Level River St


1
Vì vậy, có 2 khả năng cho Quack: Q[U][Ac][K]Q[U]a[C][K]. Đúng?
RootTwo

1
Tất cả các trường hợp được xác minh.
Máy

1
@ Challenger5 "Mã của bạn phải tạo ra tất cả các chuỗi đầu ra có thể được tạo bằng các quy tắc đầu vào ở trên"
Jonathan Allan

Câu trả lời:


5

Python 3, 289 263 byte

Tìm thấy một thư viện đầy đủ hơn trên 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]

Câu trả lời cũ:

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]

Sử dụng một thư viện elements.pytừ http://www.lfd.uci.edu/~gohlke/code/elements.py.html . Nó thiếu các yếu tố 110 đến 118, nhưng nó là thư viện cập nhật nhất mà tôi có thể tìm thấy. Chi phí 40 byte để thêm các yếu tố còn thiếu.

Phần khó nhất là logic khi một nhân vật có thể được thông qua mà không phải là một phần của biểu tượng yếu tố.


1
Uhh chờ đã, không phải mendeleevlà người dùng, không phải thư viện?
Matthew Roh

3

Thạch ,  192  191 byte

-1 bằng cách sử dụng Ɗ(một cách nhanh chóng được phát triển)

“¦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Ɗ¹Ç?€€

Hãy thử trực tuyến! - Quá kém hiệu quả để trường hợp thử nghiệm "Trao đổi ngăn xếp" hoàn thành trong giới hạn 60 giây (chạy ngoại tuyến sẽ cho kết quả chính xác trong vòng 2 phút).

Làm sao?

Dòng mã đầu tiên là một liên kết niladic để tạo một danh sách chứa tất cả 118 ký hiệu phần tử. Để làm như vậy, nó nối hai danh sách, danh sách thứ nhất chứa tất cả 2 danh sách các ký tự (tức là chuỗi) thứ hai một danh sách các ký tự và trường hợp tiêu đề danh sách kết quả. Bản thân hai danh sách được tạo ra chủ yếu bằng cách tra cứu các từ trong từ điển của Jelly để tạo các chuỗi đơn.

Việc nén đầu tiên là:

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

mang lại

" 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"

Trong đó tất cả trừ mục cuối cùng (chia theo dấu cách) là các mục trong từ điển của Jelly. Các khoảng trắng được lọc ra ḟ⁶và sau đó kết quả được chia thành hai phần:

["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"]

Thư hai,

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

được hình thành từ việc ghép các từ "finch", "pub", "sky" và "vow" (không có khoảng trắng), và như vậy là một danh sách các ký tự:

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

Hai danh sách được nối với nhau ;và mọi mục nhập đều được sử dụng theo tiêu đề Œt, mang lại:

["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"]

Một danh sách chứa tất cả 118 ký hiệu phần tử theo yêu cầu (có các bản sao, nhưng điều đó tốt).

Dòng mã thứ hai là một liên kết đơn (một hàm trợ giúp được thiết kế để nhận một đầu vào) trả về 1 nếu đầu vào, có tiêu đề được đặt trong danh sách được tạo ở trên và 0 khác.

Dòng mã thứ ba là liên kết chính, một hàm đơn âm lấy một chuỗi và trả về một danh sách các danh sách các ký tự (tức là các chuỗi) theo yêu cầu:

ŒṖµ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 byte

Đây là một đoạn mã thực sự khủng khiếp, nhưng nó sẽ hoạt động. Vẫn có thể được thực hiện ngắn hơn rất nhiều có lẽ.

#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();}

Gọi với:

int main()
{
    F("Tin Snips");cout << "\n";
    F("Quack");cout << "\n";
    F("hehe");cout << "\n";
    F("Stack Exchange");
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.