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:
- Przypadek wejścia nie ma znaczenia pod względem dopasowania symboli atomowych.
- Jeśli element jest używany w symbolu atomowym, jego wielkość musi się zmienić, aby symbol był poprawny. Np .:
h
stałby się[H]
. - Wszystkie symbole elementów są umieszczone w nawiasach kwadratowych ASCII
[
i]
. - Biała spacja jest zachowana:
Big ego
nie można łączyć „g” i „e” w[Ge]
. - 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).
- Jeśli można stworzyć symbol, należy go wykonać. Innymi słowy,
Tin
w 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. - Do celów tego wyzwania wszystkie pierwiastki od wodoru (1) do Oganesson (118) są ważne. Żadne wyższe elementy nie są prawidłowe.
- 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
0x20
znak 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!
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.Q[U][Ac][K]
iQ[U]a[C][K]
. Dobrze?Odpowiedzi:
Python 3,
289263 bajtówZnaleziono bardziej kompletną bibliotekę na Pypi:
mendeleev
Stara odpowiedź:
Korzysta z biblioteki
elements.py
z 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.
źródło
mendeleev
użytkownik nie był biblioteką?Galaretka ,
192191 bajtów-1 przy użyciu
Ɗ
(od czasu szybkiego opracowania)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:
co daje
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:Drugi,
powstaje z połączenia słów „zięba”, „pub”, „niebo” i „ślub” (bez spacji) i jako taka jest listą znaków:
Te dwie listy są połączone
;
i każda pozycja jest opatrzona tytułem tytułowymŒt
, co daje: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:
źródło
C ++ 11,
944928 bajtówOto fragment naprawdę okropnego kodu, ale powinien działać. Prawdopodobnie nadal może być znacznie krótszy.
Zadzwoń z:
źródło