[Br] eaking Kodu Golf [Ba] d


20

Aşağıdaki dizeyi düşünün:

Tin Snips

Bu dize periyodik tabloda birkaç atomik sembol içerir . Birkaçını tanımlamak için bu dizeyi yeniden yazabiliriz:

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

Tabii ki, bu şekilde de yazabiliriz:

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

Girişi yeniden yazma kuralları aşağıdaki gibidir:

  1. Giriş durumu, eşleşen atom sembolleri açısından önemli değildir.
  2. Atomik bir sembolde bir eleman kullanılıyorsa, sembolü doğru olacak şekilde durumu değişmelidir. Örn: holur [H].
  3. Tüm eleman sembolleri ASCII köşeli parantez içine alınır [ve ].
  4. Boşluk korunur: Big ego"g" ve "e" harflerini birleştiremez [Ge].
  5. Tüm giriş karakterlerinin atomik bir sembolle birleştirilmesi gerekmez: bir giriş karakteri bir sembole konmazsa, olduğu gibi iletilir (büyük / küçük harf önemli değildir).
  6. Bir sembol yapılabilirse, yapılmalıdır . Başka bir deyişle, Tinyukarıdaki örnekte çıktı alınmasına izin verilmez, çünkü bu sözcükte en az bir sembol oluşturmak mümkündür. Bir karakterin kullanılmayandan geçirilebileceği tek zaman, bir atom sembolü oluşturmak için kullanılamadığı zamandır.
  7. Bu zorluğun amaçları doğrultusunda Hidrojen (1) ila Oganesson (118) arasındaki tüm elementler geçerlidir. Daha yüksek hiçbir öğe geçerli değil.
  8. Bazı yüksek unsurların belirsiz isimleri ve simgeleri vardır: bu zorluğun amaçları için Wikipedia'daki versiyon kullanılacaktır. Kolaylık sağlamak için, izin verilen atomik semboller burada: 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, Ab, 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, Hayır, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg, Cn, Nh, Fl, Mc, Lv, Ts, Og.

Sağlanan tek bir girişten tüm olası çıkışları üreten bir program veya işlev yazın. Hem giriş hem de çıkış istediğiniz herhangi bir biçimde olabilir. Bu, bir dize, karakter dizisi veya başka bir veri yapısı olabilir: hem uygun hem de giriş ve çıkışı açıkça temsil eder. Hem giriş hem de çıkış kodunuzun içine / dışına geçirilebilir, ancak siz seçin: standart giriş / çıkış, işlev bağımsız değişkeni / dönüşü veya başka bir şey.

  • Girdi, yalnızca keyfi büyüklüğün ASCII karakterlerini ve space ( 0x20) karakterini içeren pozitif uzunlukta bir dize (önceki paragrafa bakınız ) olmalıdır.
  • Kodunuz, yukarıdaki giriş kuralları kullanılarak oluşturulabilecek tüm çıktı dizelerini oluşturmalıdır.
  • Çıktının sırası uygulama tanımlıdır. Tek gereksinim, tüm çıkış dizelerinin mevcut olmasıdır.
  • Atomik sembol içermeyen geçerli bir giriş dizesi ile sunulursa, giriş dizesini çıktılamanız yeterlidir.
  • Yukarıdaki kurallara uygun olmayan bir giriş dizesi ile sunulursa (boş, sıfır karakter, geçersiz karakterler içerir, vb.) Programınız her şeyi yapabilir (kilitlenme, boş çıktı, vb.)
  • Çıktı, periyodik tabloyla eşleşmesi gereken atomik semboller dışında büyük / küçük harfe duyarlı değildir.
  • Standart boşluklara izin verilmez.

Test senaryoları:

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]

Bu kod golf, bu yüzden en kısa kodunu göreyim!


1
@Rassars Başına yorum Kalay olurdu T[I][N]değil [T][I][N]T unsuru olmadığı için. Sorum (ve muhtemelen Rassar'ın) şudur: sadece 1 vermek zorunda mıyız? Sadece eleman alt sınırlarının maksimum sayısının yapıldığı çıktılar? 2. Sadece asgari miktarda israf? (Hidrojenli HeHe bunun cevabının hayır olduğunu gösterir) 3. Kibritlerin tamamen tükendiği tüm çıktılar? (Bu durumda T[I][N]sıra sıra T[In]geçerli olacaktır.) Bence doğru yorumlama 3'tür
Seviye Nehri St


1
Yani Quack için 2 olasılık var: Q[U][Ac][K]ve Q[U]a[C][K]. Sağ?
Kök İki

1
Tüm vakalar doğrulandı.
CalculatorFeline

1
@ Challenger5 "Kodunuz, yukarıdaki giriş kuralları kullanılarak oluşturulabilecek tüm çıktı dizelerini oluşturmalıdır"
Jonathan Allan

Yanıtlar:


5

Python 3, 289263 bayt

Pypi'de daha eksiksiz bir kütüphane bulundu: 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]

Eski cevap:

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]

Bir kütüphane kullanır elements.pydan http://www.lfd.uci.edu/~gohlke/code/elements.py.html . 110 ila 118 elementleri eksik, ancak bulabildiğim en güncel kütüphane idi. Eksik öğeleri eklemek için 40 bayt maliyeti.

En zor kısım, bir karakterin bir eleman sembolünün parçası olmadan geçirilebildiği mantıktı.


1
Bekle, mendeleevbir kullanıcı değil, bir kütüphane değil miydi?
Matthew Roh

3

Jöle ,  192  191 bayt

-1 kullanılarak Ɗ(o zamandan beri geliştirilen bir hızlı)

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

Çevrimiçi deneyin! - "Yığın Değişimi" test senaryosunun 60s sınırı içinde tamamlanamaması çok fazla (çevrimdışı çalıştırılması 2 dakika içinde doğru sonucu verir).

Nasıl?

İlk kod satırı, 118 eleman sembolünün tümünü içeren bir liste oluşturmak için niladik bir bağlantıdır. Bunu yapmak için iki listeyi birleştirir, birincisi tüm uzunluk 2 karakter listelerini (yani dizeler) içerir, ikincisi bir karakter listesi ve başlık ortaya çıkan liste. İki listenin kendileri çoğunlukla tek tek dizeler yapmak için Jelly'in sözlüğünde kelimeler arayarak oluşturulur.

Bu kompresyonlardan ilki:

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

hangi sonuç verir

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

Son giriş (boşluklara bölünmüş) hariç tümü Jelly'nin sözlüğündeki girişlerdir. Boşluklar ile filtrelenir ḟ⁶ve sonuç ikiye bölünür:

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

İkinci,

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

"ispinoz", "pub", "gökyüzü" ve "yemin" (boşluklar olmadan) kelimelerinin birleşmesinden oluşur ve bu nedenle karakterlerin bir listesi:

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

İki liste bir araya getirilir ;ve her giriş, başlık kullanılarak şu şekilde verilir Œ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"]

Gerektiğinde 118 eleman sembolünün tümünü içeren bir liste (kopyalar var, ancak sorun değil).

İkinci kod satırı, yukarıda oluşturulmuş listede başlıklı giriş varsa 1, aksi halde 0 döndüren monadik bir bağlantıdır (bir giriş almak için tasarlanmış bir yardımcı işlev).

Üçüncü kod satırı, bir dize alan ve gerektiğinde karakter listelerinin (yani dizelerin) bir listesini döndüren monadik bir işlev olan ana bağlantıdır:

ŒṖµ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, 944928 bayt

İşte gerçekten korkunç bir kod parçası, ama işe yarayacak. Yine de muhtemelen çok daha kısa yapılabilir.

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

İle ara:

int main()
{
    F("Tin Snips");cout << "\n";
    F("Quack");cout << "\n";
    F("hehe");cout << "\n";
    F("Stack Exchange");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.