[Br] 어려운 코드 골프 [Ba] d


20

다음 문자열을 고려하십시오.

Tin Snips

이 문자열은 주기율표 에 여러 개의 원자 기호를 포함 합니다 . 이 문자열을 다시 작성하여 몇 가지를 식별 할 수 있습니다.

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

물론 다음과 같이 작성할 수도 있습니다.

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

입력을 다시 쓰는 규칙은 다음과 같습니다.

  1. 원자 기호 일치와 관련하여 입력의 경우는 중요하지 않습니다.
  2. 원자 기호에 요소를 사용하는 경우 기호가 정확하도록 대소 문자를 변경해야합니다. 예 : h될 것 [H]입니다.
  3. 모든 원소 기호는 ASCII 대괄호로 쌌다있다 [].
  4. 공백은 유지됩니다. Big ego"g"와 "e"를로 결합 할 수 없습니다 [Ge].
  5. 모든 입력 문자를 원자 기호로 결합 할 필요는 없습니다. 입력 문자를 기호에 넣지 않으면 그대로 전달됩니다 (대소 문자는 중요하지 않음).
  6. 기호를 만들 수 있으면 만들어야 합니다. 즉, Tin위의 예에서는 해당 단어에 하나 이상의 기호를 만들 수 있으므로 출력 할 수 없습니다 . 문자가 미사용을 통과 할 수있는 유일한 시간은 원자 기호를 구성하는 데 사용될 수없는 경우입니다.
  7. 이 도전의 목적을 위해, 수소 (1)에서 오가네 손 (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, 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.

제공된 단일 입력에서 가능한 모든 출력을 생성하는 프로그램 또는 함수를 작성하십시오. 입력과 출력은 모두 원하는 형태 일 수 있습니다. 이것은 문자열, 문자 배열 또는 기타 데이터 구조 일 수 있습니다. 편리하고 명확하게 입력과 출력을 나타내는 것은 무엇이든 가능합니다. 입력 및 출력 모두 코드에서 전달 될 수 있지만 표준 입력 / 출력, 함수 인수 / 반환 또는 다른 항목을 선택할 수 있습니다.

  • 입력은 임의의 대소 문자의 ASCII 문자와 공백 ( 0x20) 문자 만 포함하는 양의 길이의 문자열 (이전 단락 참조)이어야합니다 .
  • 코드는 위의 입력 규칙을 사용하여 만들 수있는 모든 출력 문자열을 생성해야합니다.
  • 출력 순서는 구현 정의입니다. 유일한 요구 사항은 모든 출력 문자열 이 있어야한다는 입니다.
  • 원자 기호를 포함하지 않는 유효한 입력 문자열이 표시되면 입력 문자열을 출력하십시오.
  • 위의 규칙에 따라 유효하지 않은 입력 문자열 (널 (NULL), 0 자, 불법 문자 포함 등)이 제공되는 경우 프로그램은 어떤 작업 (충돌, 공백 출력 등)을 수행 할 수 있습니다.
  • 주기율표와 일치해야하는 원자 기호 이외의 결과는 대소 문자를 구분하지 않습니다.
  • 표준 허점은 허용되지 않습니다.

테스트 사례 :

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 코멘트 당 주석이 될 T[I][N]수 없습니다 [T][I][N]T가 요소가 아니기 때문에. 내 질문 (그리고 아마도 Rassar 's)은 ​​다음과 같습니다. 우리는 단지 1을 주어야합니다. 최대 수의 원소 대체가 이루어지는 출력 만? 2. 최소한의 낭비 만? (수소가있는 HeHe는 이것에 대한 답이 '아니오'임을 나타냄) 3. 경기가 완전히 소진 된 모든 출력? (이 경우 T[I][N]에도 T[In]유효 할 것입니다.) 정확한 해석은 3이라고 생각합니다.
Level River St


1
그래서이 꽥 2 가능성은 다음과 같습니다 Q[U][Ac][K]Q[U]a[C][K]. 권리?
RootTwo

1
모든 사례가 확인되었습니다.
CalculatorFeline

1
@ Challenger5 "코드는 위의 입력 규칙을 사용하여 만들 수있는 모든 출력 문자열을 생성해야합니다"
Jonathan Allan

답변:


5

파이썬 3, 289263 바이트

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]

http://www.lfd.uci.edu/~gohlke/code/elements.py.html 의 라이브러리 elements.py를 사용합니다 . 110에서 118까지의 요소가 누락되었지만 내가 찾을 수있는 최신 라이브러리였습니다. 누락 된 요소를 추가하는 데 40 바이트가 소요됩니다.

가장 까다로운 부분은 요소 기호의 일부가 아닌 문자를 통과 할 수있는 논리입니다.


1
잠깐만 요, mendeleev도서관 이 아니라 사용자 가 아니 었나요 ?
Matthew Roh

3

젤리 ,  192  191 바이트

(진심으로 Ɗ개발 된 퀵) 을 사용하여 -1

“¦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 분 내에 올바른 결과가 제공됨).

방법?

첫 번째 코드 줄은 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£ɦ»

"finch", "pub", "sky"및 "vow"(공백없이)의 연결로 구성되며 문자 목록입니다.

['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 개의 요소 기호가 모두 포함 된 목록입니다 (중복 항목은 있지만 괜찮습니다).

코드의 두 번째 줄은 위에 나열된 목록에 제목이 지정된 입력이 있으면 1을 반환하고 그렇지 않으면 0을 반환하는 모나드 링크 (하나의 입력을 취하도록 설계된 도우미 함수)입니다.

세 번째 코드 줄은 문자열을 가져와 필요에 따라 문자 목록 (예 : 문자열) 목록을 반환하는 모나드 함수 인 기본 링크입니다.

ŒṖµ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 바이트

정말 끔찍한 코드가 있지만 작동해야합니다. 아마 훨씬 더 짧아 질 수 있습니다.

#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.