[Br] membuat Kode Golf [Ba] d

20

Pertimbangkan string berikut:

Tin Snips

String ini berisi beberapa simbol atom pada tabel periodik . Kami dapat menulis ulang string ini untuk mengidentifikasi beberapa di antaranya:

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

Tentu saja, kita juga bisa menulis seperti ini:

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

Aturan untuk menulis ulang input adalah sebagai berikut:

  1. Kasus input tidak masalah dalam hal pencocokan simbol atom.
  2. Jika sebuah elemen digunakan dalam simbol atom, kasingnya harus berubah sehingga simbolnya benar. Mis: hakan menjadi [H].
  3. Semua simbol elemen terbungkus dalam kurung siku ASCII, [dan ].
  4. Ruang kosong dipertahankan: Big egotidak dapat menggabungkan "g" dan "e" ke dalam [Ge].
  5. Tidak semua karakter input perlu digabungkan menjadi simbol atom: jika karakter input tidak dimasukkan ke dalam simbol, ia dilewatkan apa adanya (case tidak masalah).
  6. Jika simbol dapat dibuat, itu harus dibuat. Dengan kata lain, itu tidak diperbolehkan untuk menghasilkan Tindalam contoh di atas karena dimungkinkan untuk membuat setidaknya satu simbol di kata itu. Satu-satunya waktu karakter dapat dilewati tidak digunakan adalah ketika itu tidak dapat digunakan untuk membangun simbol atom.
  7. Untuk keperluan tantangan ini, semua elemen dari Hidrogen (1) hingga Oganesson (118) valid. Tidak ada elemen yang lebih tinggi yang valid.
  8. Beberapa elemen yang lebih tinggi memiliki nama dan simbol yang ambigu: untuk tujuan tantangan ini, versi di Wikipedia akan digunakan. Untuk kenyamanan, simbol atom yang diijinkan ada di sini: 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, Dalam, Sn, Sb, Te, I, Xe, Cs, Ba, La, Ce, Pr, Nd, Pm, Sm, Uni Eropa, 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, Tidak, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg, Cn, Nh, Fl, Mc, Lv, Ts, Og.

Tulis program atau fungsi yang menghasilkan semua kemungkinan keluaran dari satu input yang disediakan. Baik input maupun output dapat dalam bentuk apa pun yang Anda pilih. Ini bisa berupa string, array karakter, atau struktur data lainnya: apa pun yang nyaman dan jelas mewakili input dan output. Baik input dan output dapat dikeluarkan / dikeluarkan dari kode Anda namun Anda memilih: standar masuk / keluar, argumen fungsi / kembali, atau sesuatu yang lain.

  • Input harus berupa string (lihat paragraf sebelumnya) dengan panjang positif yang hanya mengandung karakter ASCII dari kasus arbitrer dan karakter spasi ( 0x20).
  • Kode Anda harus menghasilkan semua string keluaran yang dapat dibuat menggunakan aturan input di atas.
  • Urutan output ditentukan oleh implementasi. Satu-satunya persyaratan adalah bahwa semua string keluaran hadir.
  • Jika disajikan dengan string input yang valid yang tidak mengandung simbol atom, cukup output string input.
  • Jika disajikan dengan string input yang tidak valid sesuai aturan di atas (nol, nol karakter, berisi karakter ilegal, dll.) Program Anda dapat melakukan apa saja (macet, output kosong, dll.)
  • Output adalah case-insensitive selain simbol atom yang perlu cocok dengan tabel periodik.
  • Tidak ada celah standar.

Kasus uji:

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]

Ini golf kode, jadi biarkan saya melihat kode terpendek Anda!

Jonathan Allan
sumber
1
Komentar Per @Rassars Tin T[I][N]bukan [T][I][N]karena T bukan elemen. Pertanyaan saya (dan mungkin pertanyaan Rassar) adalah: apakah kita hanya perlu memberikan 1. Hanya keluaran di mana jumlah maksimum dari penggantian elemen dibuat? 2. Hanya jumlah minimum pemborosan? (HeHe dengan hidrogen menunjukkan jawaban untuk yang ini adalah tidak) 3. Semua output di mana kecocokan benar-benar habis? (dalam hal ini T[I][N]dan juga T[In]akan berlaku.) Saya pikir interpretasi yang benar adalah 3.
Level River St
1
Saya pikir ini adalah dup
Digital Trauma
1
Jadi ada 2 kemungkinan untuk Quack: Q[U][Ac][K]dan Q[U]a[C][K]. Kanan?
RootTwo
1
Semua kasus diverifikasi.
CalculatorFeline
1
@ Challenger5 "Kode Anda harus menghasilkan semua string keluaran yang dapat dibuat menggunakan aturan input di atas"
Jonathan Allan

Jawaban:

5

Python 3, 289 263 byte

Temukan pustaka yang lebih lengkap di 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]

Jawaban lama:

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]

Menggunakan perpustakaan elements.pydari http://www.lfd.uci.edu/~gohlke/code/elements.py.html . Ada elemen yang hilang 110 hingga 118, tapi itu adalah perpustakaan paling mutakhir yang bisa kutemukan. Biaya 40 byte untuk menambahkan elemen yang hilang.

Bagian tersulit adalah logika ketika sebuah karakter dapat dilewati tanpa menjadi bagian dari simbol elemen.

RootTwo
sumber
1
Uhh tunggu, bukan mendeleevpengguna, bukan perpustakaan?
Matius Roh
3

Jelly ,  192  191 byte

-1 dengan menggunakan Ɗ(cepat sejak dikembangkan)

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

Cobalah online! - Terlalu tidak efisien untuk menyelesaikan uji "Stack Exchange" dalam batas 60an (menjalankannya secara offline memberikan hasil yang benar dalam waktu 2 menit).

Bagaimana?

Baris pertama kode adalah tautan nilad untuk membuat daftar yang berisi semua 118 elemen simbol. Untuk melakukannya terdiri dari dua daftar, yang pertama berisi semua panjang 2 daftar karakter (yaitu string) yang kedua daftar karakter dan judul kasus daftar yang dihasilkan. Dua daftar itu sendiri sebagian besar dibuat dengan mencari kata-kata dalam kamus Jelly untuk membuat string tunggal.

Yang pertama dari kompresi ini adalah:

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

yang menghasilkan

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

Di mana semua kecuali entri terakhir (dibagi dengan spasi) adalah entri dalam kamus Jelly. Spasi disaring dengan ḟ⁶, dan kemudian hasilnya dibagi menjadi dua:

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

Kedua,

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

dibentuk dari gabungan kata "finch", "pub", "sky", dan "sumpah" (tanpa spasi), dan dengan demikian adalah daftar karakter:

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

Kedua daftar tersebut digabungkan dengan ;dan setiap entri dituliskan menggunakan judul Œt, menghasilkan:

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

Daftar yang memuat semua 118 simbol elemen sesuai kebutuhan (ada duplikat, tapi tidak masalah).

Baris kedua kode adalah tautan monadik (fungsi pembantu yang dirancang untuk mengambil satu input) yang mengembalikan 1 jika input, yang diberi judul ada di daftar yang dibuat di atas dan 0 jika tidak.

Baris ketiga kode adalah tautan utama, fungsi monadik yang mengambil string dan mengembalikan daftar daftar karakter (yaitu string) seperti yang diperlukan:

ŒṖµ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)
Jonathan Allan
sumber
1

C ++ 11, 944 928 bytes

Berikut ini sepotong kode yang benar-benar mengerikan, tetapi harus berhasil. Mungkin masih bisa dibuat jauh lebih pendek.

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

Telepon dengan:

int main()
{
    F("Tin Snips");cout << "\n";
    F("Quack");cout << "\n";
    F("hehe");cout << "\n";
    F("Stack Exchange");
}
Steadybox
sumber