[Br] eaking Code Golf [Ba] d

20

Rozważ następujący ciąg:

Tin Snips

Ten ciąg zawiera kilka atomowych symboli w układzie okresowym pierwiastków . Możemy przepisać ten ciąg, aby zidentyfikować kilka z nich:

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

Oczywiście możemy to również napisać w ten sposób:

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

Reguły przepisywania danych wejściowych są następujące:

  1. Przypadek wejścia nie ma znaczenia pod względem dopasowania symboli atomowych.
  2. Jeśli element jest używany w symbolu atomowym, jego wielkość musi się zmienić, aby symbol był poprawny. Np .: hstałby się [H].
  3. Wszystkie symbole elementów są umieszczone w nawiasach kwadratowych ASCII [i ].
  4. Biała spacja jest zachowana: Big egonie można łączyć „g” i „e” w [Ge].
  5. Nie wszystkie znaki wejściowe muszą być łączone w symbol atomowy: jeśli znak wejściowy nie zostanie umieszczony w symbolu, jest on przekazywany w niezmienionej postaci (wielkość liter nie ma znaczenia).
  6. Jeśli można stworzyć symbol, należy go wykonać. Innymi słowy, Tinw powyższym przykładzie nie można generować danych wyjściowych, ponieważ w tym słowie można utworzyć co najmniej jeden symbol. Jedyny raz, przez który znak może przejść nieużywany, jest to, że nie można go użyć do budowy symbolu atomowego.
  7. Do celów tego wyzwania wszystkie pierwiastki od wodoru (1) do Oganesson (118) są ważne. Żadne wyższe elementy nie są prawidłowe.
  8. Niektóre z wyższych elementów mają niejednoznaczne nazwy i symbole: do celów tego wyzwania należy użyć wersji z Wikipedii . Dla wygody są tutaj dozwolone symbole atomowe: 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.

Napisz program lub funkcję, która generuje wszystkie możliwe wyjścia z jednego dostarczonego wejścia. Zarówno dane wejściowe, jak i wyjściowe mogą być dowolne. Może to być ciąg znaków, tablica znaków lub inna struktura danych: cokolwiek jest zarówno wygodne, jak i wyraźnie reprezentuje dane wejściowe i wyjściowe. Zarówno dane wejściowe, jak i wyjściowe mogą być przekazywane / wychodzące z twojego kodu, niezależnie od tego, co wybierzesz: standardowe wejście / wyjście, argument / powrót funkcji lub coś innego.

  • Dane wejściowe powinny być łańcuchem (patrz poprzedni akapit) o ​​długości dodatniej, zawierającym tylko znaki ASCII o dowolnej wielkości i 0x20znak spacji ( ).
  • Twój kod musi generować wszystkie ciągi wyjściowe, które można utworzyć przy użyciu powyższych reguł wejściowych.
  • Kolejność danych wyjściowych jest zdefiniowana w implementacji. Jedynym wymaganiem jest obecność wszystkich ciągów wyjściowych.
  • Jeśli podano prawidłowy ciąg wejściowy, który nie zawiera żadnych atomowych symboli, po prostu wyślij ciąg wejściowy.
  • Jeśli zostanie wyświetlony ciąg wejściowy, który jest nieprawidłowy zgodnie z powyższymi regułami (zero, zero znaków, zawiera niedozwolone znaki itp.), Twój program może zrobić wszystko (awaria, puste dane wyjściowe itp.)
  • W danych wyjściowych rozróżniana jest wielkość liter, inne niż symbole atomowe, które muszą pasować do układu okresowego.
  • Standardowe luki są niedozwolone.

Przypadki testowe:

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]

To jest kod golfowy, więc pozwól mi zobaczyć twój najkrótszy kod!

Jonathan Allan
źródło
1
Za @Rassars komentarza Tin byłoby T[I][N]nie [T][I][N]bo T nie jest elementem. Moje pytanie (i ewentualnie Rassara) brzmi: czy musimy tylko dać 1. Tylko wyniki, w których dokonano maksymalnej liczby podstawień elementów? 2. Tylko minimalna ilość marnotrawstwa? (HeHe z wodorami wskazuje, że odpowiedź brzmi „nie”) 3. Wszystkie wyjścia, w których dopasowania są całkowicie wyczerpane? (w tym przypadku, T[I][N]jak również, T[In]byłoby ważne.) Myślę, że poprawna interpretacja to 3.
Level River St
1
Myślę, że to dup
Digital Trauma
1
Istnieją więc 2 możliwości Quack: Q[U][Ac][K]i Q[U]a[C][K]. Dobrze?
RootTwo
1
Wszystkie przypadki zweryfikowane.
CalculatorFeline,
1
@ Challenger5 „Twój kod musi wygenerować wszystkie ciągi wyjściowe, które można utworzyć przy użyciu powyższych reguł wprowadzania”
Jonathan Allan

Odpowiedzi:

5

Python 3, 289 263 bajtów

Znaleziono bardziej kompletną bibliotekę na 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]

Stara odpowiedź:

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]

Korzysta z biblioteki elements.pyz http://www.lfd.uci.edu/~gohlke/code/elements.py.html . Brakuje elementów od 110 do 118, ale była to najbardziej aktualna biblioteka, jaką mogłem znaleźć. Koszt 40 bajtów, aby dodać brakujące elementy.

Najtrudniejszą częścią była logika, w której znak można przepuścić bez bycia częścią symbolu elementu.

RootTwo
źródło
1
Chwila, czy mendeleevużytkownik nie był biblioteką?
Matthew Roh
3

Galaretka ,  192  191 bajtów

-1 przy użyciu Ɗ(od czasu szybkiego opracowania)

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

Wypróbuj online! - Zbyt mało wydajny, aby przypadek testowy „Wymiana stosu” zakończył się w granicach 60. (uruchomienie go offline daje poprawny wynik w ciągu 2 minut).

W jaki sposób?

Pierwszy wiersz kodu jest linkiem niladycznym, aby utworzyć listę zawierającą wszystkie 118 symboli elementów. Aby to zrobić, łączy dwie listy, pierwsza zawierająca wszystkie listy o długości 2 znaków (tzn. Łańcuchy), druga lista znaków i tytuły w wynikowej liście. Same dwie listy są tworzone głównie przez wyszukiwanie słów w słowniku Jelly w celu utworzenia pojedynczych ciągów.

Pierwsza z tych kompresji to:

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

co daje

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

Gdzie wszystkie oprócz ostatniego wpisu (podzielone spacjami) są wpisami w słowniku Jelly. Spacje są filtrowane za pomocą ḟ⁶, a następnie wynik jest dzielony na dwie części:

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

Drugi,

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

powstaje z połączenia słów „zięba”, „pub”, „niebo” i „ślub” (bez spacji) i jako taka jest listą znaków:

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

Te dwie listy są połączone ;i każda pozycja jest opatrzona tytułem tytułowym Œt, co daje:

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

Lista zawierająca wszystkie 118 symboli elementów zgodnie z wymaganiami (są duplikaty, ale nic nie szkodzi).

Drugi wiersz kodu to łącze monadyczne (funkcja pomocnicza zaprojektowana tak, aby pobierać jedno wejście), które zwraca 1, jeśli dane wejściowe, zatytułowane, występuje na liście utworzonej powyżej, a 0 w przeciwnym razie.

Trzeci wiersz kodu to główny link, funkcja monadyczna, która pobiera ciąg znaków i zwraca listę list znaków (tzn. Ciągów znaków) zgodnie z wymaganiami:

ŒṖµ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
źródło
1

C ++ 11, 944 928 bajtów

Oto fragment naprawdę okropnego kodu, ale powinien działać. Prawdopodobnie nadal może być znacznie krótszy.

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

Zadzwoń z:

int main()
{
    F("Tin Snips");cout << "\n";
    F("Quack");cout << "\n";
    F("hehe");cout << "\n";
    F("Stack Exchange");
}
Steadybox
źródło