[Br] їде Code Code Golf [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. Деякі з вищих елементів мають неоднозначні назви та символи: для цілей цього виклику використовується версія у Вікіпедії . Для зручності тут дозволені атомні символи: 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, Ні, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg, Cn, Nh, Fl, Mc, Lv, Ts, Og.

Напишіть програму або функцію, яка генерує всі можливі результати з одного наданого входу. І вхід, і вихід можуть бути в будь-якій обраній вами формі. Це може бути рядок, масив символів або якась інша структура даних: все, що є зручним і чітко відображає вхід і вихід. І вхід, і вихід можуть бути передані / вийшли з вашого коду, однак ви обрали: стандартний вхід / вихід, аргумент функції / повернення чи щось інше.

  • Вхідним рядком має бути рядок (див. Попередній абзац) додатної довжини, що містить лише символи ASCII довільного випадку та пробіл ( 0x20).
  • Ваш код повинен генерувати всі вихідні рядки, які можна створити за допомогою введених вище правил.
  • Порядок виводу визначається реалізацією. Єдина вимога - присутні всі вихідні рядки.
  • Якщо він має дійсну вхідну рядок, яка не містить атомних символів, просто виведіть рядок введення.
  • Якщо він представлений рядком введення, який не відповідає дійсним правилам (нуль, нульові символи, містять незаконні символи тощо), ваша програма може робити що завгодно (збій, пустий вихід тощо)
  • Вихід є нечутливим до регістру, крім атомних символів, необхідних для відповідності періодичній таблиці.
  • Стандартні лазівки не допускаються.

Тестові приклади:

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 не є елементом. Моє запитання (а можливо, і Рассара) таке: чи потрібно нам лише дати 1. Тільки виходи, де робиться максимальне число підстановок елементів? 2. Тільки мінімальна кількість відходів? (HeHe з водородами вказує, що відповідь на це - ні) 3. Усі виходи, де сірники повністю вичерпані? (в цьому випадку T[I][N]так само, як і T[In]було б справедливим.) Я думаю, що правильне тлумачення є 3.
Рівень річки Св.

1
Я думаю, що це дубль
Digital Trauma

1
Отже, для Quack є 2 можливості: Q[U][Ac][K]і Q[U]a[C][K]. RIght?
RootTwo

1
Усі справи перевірені.
CalculatorFeline

1
@ Challenger5 "Ваш код повинен генерувати всі вихідні рядки, які можна створити, використовуючи правила введення вище"
Джонатан Аллан

Відповіді:


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користувач, а не бібліотека?
Меттью Рох

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

Спробуйте в Інтернеті! - Занадто неефективно, щоб тестовий випадок "Stack Exchange" завершився в межах 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 символів елементів за потребою (є дублікати, але це нормально).

Другий рядок коду - це монадичне посилання (хелперна функція, призначена для прийому одного входу), яка повертає 1, якщо в списку, створеному вище, введено введений титул-cased, а в іншому випадку 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, 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");
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.