[Br] รับโค้ดกอล์ฟ [Ba] d


20

พิจารณาสตริงต่อไปนี้:

Tin Snips

สายนี้มีสัญลักษณ์อะตอมหลายในตารางธาตุ เราสามารถเขียนข้อความนี้อีกครั้งเพื่อระบุหลาย ๆ ข้อความ

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

แน่นอนเราสามารถเขียนได้ด้วยวิธีนี้:

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

กฎสำหรับการเขียนอินพุตใหม่มีดังนี้:

  1. กรณีของการป้อนข้อมูลไม่สำคัญในแง่ของการจับคู่สัญลักษณ์อะตอม
  2. หากมีการใช้องค์ประกอบในสัญลักษณ์อะตอมกรณีของมันจะต้องเปลี่ยนเพื่อให้สัญลักษณ์นั้นถูกต้อง Ex: จะกลายเป็นh[H]
  3. สัญลักษณ์องค์ประกอบทั้งหมดจะถูกห่อหุ้มอยู่ในวงเล็บ ASCII, และ[]
  4. ช่องว่างจะถูกรักษาไว้: Big egoไม่สามารถรวม "g" และ "E" [Ge]ลงใน
  5. ไม่จำเป็นต้องรวมอักขระอินพุตทั้งหมดเข้ากับสัญลักษณ์อะตอมมิก: หากอักขระอินพุตไม่ได้ใส่ไว้ในสัญลักษณ์จะถูกส่งผ่านตามที่เป็น (กรณีไม่สำคัญ)
  6. หากสามารถทำสัญลักษณ์ได้ก็ต้องทำ กล่าวอีกนัยหนึ่งมันไม่ได้รับอนุญาตให้ส่งออกTinในตัวอย่างข้างต้นเพราะมันเป็นไปได้ที่จะสร้างสัญลักษณ์อย่างน้อยหนึ่งสัญลักษณ์ในคำนั้น ครั้งเดียวที่ตัวละครอาจถูกส่งผ่านไปยังที่ไม่ได้ใช้คือเมื่อไม่สามารถใช้เพื่อสร้างสัญลักษณ์อะตอมมิก
  7. สำหรับวัตถุประสงค์ของการท้าทายองค์ประกอบทั้งหมดจากไฮโดรเจน (1) ถึง Oganesson (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, ที่, Rn, Fr, Ra, Ac, Th, Pa, U, Np, Pu, Am, Cm, Bk, Cf, Es, Fm, Md, ไม่, 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 Tin จะT[I][N]ไม่ได้[T][I][N]เพราะ T ไม่ใช่องค์ประกอบ คำถามของฉัน (และอาจเป็นของ Rassar) คือ: เราเพียงแค่ต้องให้ 1 เท่านั้นเอาท์พุทที่จำนวนสูงสุดองค์ประกอบย่อยขององค์ประกอบ? 2. จำนวนการสูญเสียขั้นต่ำเท่านั้น? (HeHe with hydrogens ระบุว่าคำตอบสำหรับคำถามนี้ไม่มี) 3. เอาท์พุททั้งหมดที่ตรงกับการแข่งขันหมด? (ในกรณีนี้T[I][N]เช่นเดียวกับT[In]จะใช้ได้) ฉันคิดว่าการตีความที่ถูกต้องคือ 3
ระดับแม่น้ำเซนต์


1
ดังนั้นจึงมีความเป็นไปได้ 2 ประการสำหรับการต้มตุ๋น: Q[U][Ac][K]และ Q[U]a[C][K]ขวา?
RootTwo

1
ยืนยันทุกกรณี
CalculatorFeline

1
@ Challenger5 "รหัสของคุณจะต้องสร้างสตริงเอาต์พุตทั้งหมดที่สามารถสร้างขึ้นได้โดยใช้กฎการป้อนข้อมูลด้านบน"
Jonathan Allan

คำตอบ:


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]

ใช้ห้องสมุดelements.pyจากhttp://www.lfd.uci.edu/~gohlke/code/elements.py.html มันหายไปจากองค์ประกอบ 110 ถึง 118 แต่มันเป็นห้องสมุดที่ทันสมัยที่สุดที่ฉันสามารถหาได้ ราคา 40 ไบต์เพื่อเพิ่มองค์ประกอบที่ขาดหายไป

ส่วนที่ยากที่สุดคือตรรกะเมื่ออักขระสามารถถูกส่งผ่านได้โดยไม่ต้องเป็นส่วนหนึ่งของสัญลักษณ์องค์ประกอบ


1
เอ่อรอไม่ใช่mendeleevผู้ใช้ไม่ใช่ห้องสมุดใช่ไหม
Matthew Roh

3

เยลลี่ ,  192  191 ไบต์

-1 โดยการใช้Ɗ(a นับตั้งแต่พัฒนาอย่างรวดเร็ว)

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

ลองออนไลน์! - ไม่มีประสิทธิภาพสำหรับกรณีทดสอบ "การแลกเปลี่ยนสแต็ค" ที่จะทำให้เสร็จภายในระยะเวลา 60 วินาที (การเรียกใช้แบบออฟไลน์จะให้ผลลัพธ์ที่ถูกต้องภายใน 2 นาที)

อย่างไร?

บรรทัดแรกของโค้ดคือลิงก์ niladic เพื่อสร้างรายการที่มีสัญลักษณ์องค์ประกอบทั้งหมด 118 ตัว ในการทำเช่นนั้นจะต่อกันสองรายการรายการแรกที่มีรายการอักขระทั้งหมด 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 ช่องว่างจะถูกกรองออกḟ⁶แล้วผลที่ได้จะแบ่งออกเป็นสอง:

["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£ɦ»

ถูกสร้างขึ้นจากการต่อคำว่า "ฟินช์", "ผับ", "ท้องฟ้า" และ "คำสาบาน" (ไม่มีช่องว่าง) และเช่นนี้เป็นรายการของตัวละคร:

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

รายการทั้งสองจะถูกต่อกัน;และทุกรายการจะมีการใส่หัวเรื่องโดยŒ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 รายการตามต้องการ (มีรายการซ้ำกัน แต่ก็ไม่เป็นไร)

บรรทัดที่สองของโค้ดคือลิงก์ monadic (ฟังก์ชันตัวช่วยที่ออกแบบมาเพื่อรับหนึ่งอินพุต) ที่ส่งคืน 1 หากอินพุตมีการใส่ตัวบรรดาศักดิ์อยู่ในรายการที่สร้างขึ้นด้านบนและเป็นอย่างอื่น 0

บรรทัดที่สามของรหัสคือลิงค์หลักฟังก์ชั่น monadic ที่รับสตริงและส่งคืนรายการของอักขระ (เช่นสตริง) ตามต้องการ:

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