Na podstawie golfa praktycznego - stany USA
Twoim zadaniem jest znalezienie skrótu (symbolu) elementu o nazwie elementu, aż do ununoctium (118). Skorzystaj z układu okresowego na Wikipedii .
Dzięki piskliwemu ossifrage możesz znaleźć pełną listę elementów do skrótów na http://pastebin.com/DNZMWmuf .
Nie możesz używać żadnych zasobów zewnętrznych. Ponadto nie można używać żadnych wbudowanych danych dotyczących elementów układu okresowego. Obowiązują standardowe luki.
Wejście
Wejście może być ze standardowego wejścia, pliku prompt
, input
itd.
Format wejściowy:
Wszystkie poniższe dane są poprawnymi danymi wejściowymi:
Carbon
carbon
CARBON
cArBOn
Zasadniczo nazwa elementu - bez rozróżniania wielkości liter.
Nie musisz obsługiwać błędów pisowni ani żadnych nieprawidłowych nazw elementów. Niepoprawne dane wejściowe to niezdefiniowane zachowanie.
Wyjście :
Symbol elementu. Pierwszy znak musi być aktywowane i reszta muszą być pisane małymi literami.
Przykładowe dane wyjściowe: C
Przypadki testowe:
Carbon -> C
NiTROGen -> N
Sodium -> Na
Gold -> Au
Silver -> Ag
Tin -> Sn
Jest o wiele więcej elementów niż stanów, więc spodziewam się, że trudniej będzie znaleźć ogólną zasadę dla nich.
To jest kod golfowy. Najkrótszy kod wygrywa!
źródło
Au
lub cokolwiek zechcesz. @Paul R Jeśli istnieje wiele sposobów na przeliterowanie elementu (np. Siarka vs siarka lub aluminium vs aluminium), użyj tego, co skraca Twój program. Nie musisz obsługiwać obu przypadków.Odpowiedzi:
CJam,
337297293232220201200 bajtówPowyższy kod używa notacji karetki, ponieważ zawiera znaki kontrolne.
Kosztem 24 dodatkowych bajtów (łącznie 224) można uniknąć tych znaków.
Możesz wypróbować ten kod w interpretatorze CJam .
Przypadki testowe
Jak to działa
Pierwszym krokiem jest odczytanie nazwy elementu ze STDIN i zastosowanie raczej rozbudowanej funkcji skrótu, która mapuje wszystkie nazwy elementów w zakresie [0, 225] :
Wiele symboli elementu składa się z pierwszego i drugiego, pierwszego i trzeciego, pierwszego i czwartego, pierwszego i piątego lub pierwszego i dziesiątego (który jest tylko pierwszym) znaku angielskiej nazwy elementu. Będziemy reprezentować te elementy odpowiednio liczbami od 0 do 4. Wszystkie pozostałe elementy (reprezentowane przez 5) będą wymagać tabeli przeglądowej.
Wynikową tabelę można przekazać w następujący sposób:
Tablica kodów znaków jest konwertowana z bazy 256 na bazę 7, a cyfry 6 są zastępowane seriami trzech zer.
To jest tabela decyzyjna D:
Niezbędne działanie dla elementu z skrótem 1 , np., Odpowiada pierwszemu elementowi tej tablicy. Elementy tablicy, które nie odpowiadają skrótowi żadnego elementu, mają również zero, co pozwala na kompresję (0 0 0) ↦ 6 .
Teraz interpretujemy D dla skrótu H.
Następnie przesuwamy tabelę wyszukiwania. Jeśli będziemy dołączać j do symboli pojedynczych znaków i zastąpić UU z Q , każdy symbol będzie długo dokładnie dwa znaki. Można go popchnąć w następujący sposób:
Tablica kodów znaków jest konwertowana z bazy 256 na bazę 25, kod znaku A jest dodawany do wszystkich cyfr (rzutowanie na znak w procesie), a wynik jest dzielony na części o długości dwa.
To jest tabela L:
Teraz przystępujemy do obliczania potencjalnych nazw elementów.
Stos zawiera teraz
gdzie B to wartość logiczna D [H-1] / 5 , M to nazwa uzyskana z tabeli odnośników, a N to nazwa elementu utworzona przez wybranie znaków z E.
Prawie skończyliśmy:
źródło
C 452
Dobra funkcja skrótu pomaga. Mogą być lepsze. (Ulepszenia sugerowane przez @ugoren i in.)
Niegolfowany z komentarzami:
Użyłem brutalnej siły, aby znaleźć ten skrót; To był jedyny o wielkości skrótu ≤512, który nie miał kolizji. Nie sprawdzałem jednak alternatywnej pisowni i mogą istnieć lepsze funkcje z różnymi algorytmami (np. Używanie XOR zamiast dodawania).
Funkcja skrótu odwzorowuje ciągi tekstowe na wartości od 0 do 440. „Cyna” hash na zero, więc „Sn” znajduje się na początku tabeli. Następne 7 pozycji jest puste. Aby zachować kompaktowy kod, wskazuje na to wartość ASCII 34 + 7 = 41 („)”). Dalej jest „miedź” (8), cztery puste komórki (34 + 4 = 38 = „&”) i „wanad” (13). Po obliczeniu wartości skrótu program przechodzi przez tabelę, odejmując 1 dla każdej dużej litery, a następnie 0 lub więcej małych liter i odejmując (WARTOŚĆ ASCII) -34 dla każdego znaku niebędącego alfabetem. Gdy wartość osiągnie zero, znaleźliśmy poprawny wynik.
źródło
(h+c%32+74)*311%441
.. 2. Upuśćp
i użyjs
. 3.main(c)
zapisuje jeden przecinek.JavaScript ES6, 690
708bajtówPierwsza tablica zawiera symbole, a druga tablica zawiera minimum liter niezbędnych do wskazania, do którego elementu się odnosi. Dzięki core1024 i edc65 za pomoc w skróceniu. Test na stronie http://jsfiddle.net/xjdev4m6/2/ . Nieco bardziej czytelny:
źródło
Neo
zanim trafi,Neon
ponieważ ma mniej liter.if
stwierdzenia (jest to idealnyfor
warunek), a także wstawić lub przesunąć pozycje niektórych zmiennych, aby skrócić kod;)).toLowerCase(
->)[L='toLowerCase'](
potem na końcua.toLowerCase(
->a[L](
powinien wyciąć 4 znakiRuby 1.9+,
565 471 447444Jednowarstwowy. Ponieważ nic nie jest „niemożliwe do wykonania z
wyrażeniami regularnymi ” ... (Zapisałem 94 znaki, dodając kolejne wyrażenie regularne) ((i 24, upraszczając je)
(dodano nowy wiersz za ciągiem „czytelność”, usuń do testu)
użycie:
ruby periodic.rb aluminum
$>Objaśnienie:
Rozdzielenie ciągu na wielkie litery zwraca tablicę wyrażeń regularnych pasujących do nazw elementów. Jedyne dozwolone znaki alfabetu w każdym z nich to te ze skrótu *. Są one uporządkowane w taki sposób, że pierwsze dopasowanie znalezione podczas porównywania z argumentem wiersza poleceń
*$*
jest prawidłowe. Końcowy gsub usuwa przed drukowaniem znaki inne niż alfa.* Dziwne skróty, takie jak „Fe” dla „Iron”, są obsługiwane przez
|
element: „Iro | Fe”. Pierwszym wyborem jest to, co jest właściwie dopasowane; gsub usuwa następnie wszystkie znaki aż do „|”, pozostawiając rzeczywisty skrót.Środowisko testowe (wymaga listy @ squeamish : pobranej jako „table.txt” w katalogu roboczym).
źródło
Rubinowy, 1068 bajtów
Wejście przez STDIN.
Najkrótsze unikatowe podciągi nazw elementów są od drugiego do szóstego znaku (lub końca nazwy, jeśli jest zbyt krótka). Więc po prostu biorę je i szukam w haszu. Skompresowałem również skrót, ponieważ pozwala to zaoszczędzić kolejne 200 bajtów. Oto jak wygląda sam skrót:
źródło
CJam,
462 449 434 401 391 384382Z pomocą Dennisa.
Kod
Zagnieżdżone trójki, jeśli prawdopodobnie nie są dobrym sposobem na zrobienie tego w CJam.
Z wcięciami:
Wiele symboli to tylko dwie pierwsze litery nazwy elementu. Są one obsługiwane w drugiej najgłębszej warstwie zagnieżdżonych instrukcji if. Wiele innych to pierwsza i trzecia litera lub pierwsza i czwarta litera - są one obsługiwane w kolejnych warstwach zewnętrznych. Symbole, w których pojawia się tylko pierwsza litera i pełne nieregularności, są obsługiwane odpowiednio w piątej i trzeciej najgłębszej warstwie.
Jest kilka, w których robi się zagubiony (
TelLurium
vsThaLlium
, lubSILicon
vsSILver
lubRUThenium
vsRUTherfordium
). Są one obsługiwane osobno.Można tu grać w golfa, głównie poprzez ponowne użycie bloków kodu i poprawę obsługi nieregularności.
źródło
"RUTHENIUM"=
używać"RUTHEN"#!
. 2. Nie musisz drukować jawnie (o
) ani niczego usuwać przed faktyczną nazwą elementu (;"Si"
); wystarczy dołączyć]W=
na końcu kodu, aby usunąć wszystko oprócz najwyższego elementu stosu. 3. To powoduje, że kilka bloków jest pustych. JeśliB
jest wartością logicznąB{...}{}?
iB{...}*
osiąga to samo. 4. trójargumentowy jeśli bierze bloki lub elementy stosu, dzięki czemu można skrócić{"Si"}
do"Si"
._
i;
wszędziePHP,
507485476466 znakówZastosowanie: wprowadź nazwę elementu jako parametr GET „0” - elements.php? 0 = węgiel
Algorytm: Przeprowadź ciąg danych, wyciągając podciąg, pary kodów skrótów. Jeśli podłańcuch pasuje do początku przekazywanego elementu, użyj kodu skrótu, aby określić, co ma zostać wyprowadzone: Jeśli kod zaczyna się na literę, wyślij go jako ciąg. Jeśli jest to liczba N, wypisz pierwszą literę elementu + N literę. Elementy Unun są specjalnie opatrzone kodem „|”. Jeśli nie znaleziono podłańcucha pasującego do przekazanej nazwy, wypisz pierwsze dwa znaki nazwy jako skrót.
Czytelny kod:
Skondensowany:
źródło
JavaScript (1100)
Naiwna realizacja lśni w swojej prostocie. Unikalny ciąg podrzędny od początku nazwy jest po prostu mapowany na symbol.
źródło
Python -
652 649637Moja tabela skrótów opiera się na kombinacji każdej sekundy i co trzeciego znaku wielkiej litery:
Oto odpowiedni generator:
Prawdopodobnie jest miejsce na ulepszenia, zwłaszcza kompresję dwóch długich łańcuchów.
Testowane z:
źródło
Golfscript -
1052821Wyjaśnienie:
źródło
n/
Haskell,
920817807776 znakówPo zbyt długiej pracy nad stworzeniem systemu reguł dla tego, jakie znaki nazwy elementu są zawarte w jego symbolu, i trochę majsterkowania, udało mi się napisać skrypt, który łatwo tłumaczy element na symbol. Żelazo było dla mnie problemem, ponieważ mogłem próbkować niektóre znaki z GOld, SilVer, TiN, LEad, SoDium, MerCury, ANtimony, PotaSsium i TUngsten, przekształcając je w nieużywany symbol okresowy (wybrałem dowolne próbkowanie, które ułatwiło integrację je do istniejących reguł), a następnie tłumaczenie po symbolicznej konwersji; Jednak żelazo stanowiło problem, ponieważ Ir, Io i In są już używane. Początkowo było to 920 znaków, ale zdałem sobie sprawę, że ostateczne dopasowanie wzorca (największe) nie musiało tam być, ponieważ albo pozwalało rzeczom przejść (co nie było), albo pasowało do nich wszystkich; w związku z tym, Zamieniłem go na symbol wieloznaczny typu catch-all. Następnie grałem w golfa od 817 do 808, skracając niektóre wzory za pomocą symboli wieloznacznych w taki sposób, że wciąż były unikalne dla tej nazwy elementu (np. Jedynym elementem z literą „w” w nazwie jest Lawrencium, więc „* w ”pasuje do tego o 1 mniej niż znak„ Prawo ”).
Oto mój kod. Przetestowałem go dla wszystkich elementów i zakodowałem go tak, aby automatycznie przekonwertował dane wejściowe na titlecase, więc nie ma problemów z rozróżnianiem wielkości liter.
EDYCJA 1
Ponadto zmniejszyłem go do 776 znaków, zastępując wyrażenie case wt dopasowaniem wzorca (ma to sens, ponieważ wyrażenie case testowało surowy operand w przeciwieństwie do wyrażenia pod względem argumentu), usuwając niepotrzebne nawiasy i ponownie wyrażając
e
jako ciąg rozdzielany znakiem nowej linii zamiast listy ciągów, a następnie dzieląc go w funkcji głównej. Ponieważ zmiany te mają charakter wyłącznie golfowy, nie zmieniłem wersji czytelnej dla człowieka.Wersja czytelna dla człowieka (nowe linie, odstępy, pełne nazwy, komentarze: 2311 znaków)
Jeśli ktoś jest zainteresowany wyjaśnieniem jakiejkolwiek części tego pytania, możesz zapytać.
źródło
C # (826)
nie największy, ale pomyślałem, że spróbuję z handicapem c #.
Napisałem więc program, który przekształca pełną nazwę elementów (np. Węgiel) na najmniejszy, ale wciąż unikalny ciąg i zrobiłem to dla wszystkich elementów w odniesieniu do wszystkich innych unikalnych ciągów. Następnie zszeregowałem to do dużego brzydkiego łańcucha, w którym wielkie litery oznaczają początek „fragmentów”, przy czym fragmenty są naprzemiennie między kluczem a wartością. Jak KeyValueKey2Value2 itp.
Ten skrypt destyluje ten duży ciąg i odcina znak na końcu wprowadzonego ciągu, dopóki nie znajdzie go w słowniku utworzonym z dużego ciągu.
(Powinienem dodać, że moja znajomość języka C # nie jest niesamowita, a pierwotne zgłoszenie polegało na użyciu rzeczy, które znałem, ale później miałem inne sztuczki wskazane mi przez innych.)
źródło
var
. Możesz zaoszczędzić jeszcze kilka, usuwając nawiasy klamrowe po blokach pojedynczej instrukcji. Jeśli przypiszeszt.Substring(int, int)
doFunc<int, int, string>
, możesz zapisać inną parę.var
ingstring[] r
i przez kolejne 3var
ingstring t = Console....
wreszcie, można zaoszczędzić 7 Więcej zmieniającreturn new string[]
sięreturn new[]
na samym końcu.if(...) break;
logiki do warunków wyjścia dla pętli for. Można zastosować szereg innych inwersji logicznych, na przykładdo { } while(..)
w metodzie wyodrębniania. Jest to krótsze niż dodanie oddzielnej operacji logicznej dla przypadku wprowadzania. Opublikowałem w Twoim kodzie edycję, która wciąż wymaga przeglądu / akceptacji z powodu mojej niskiej liczby powtórzeń w tej witrynie. Sprowadziłem go do 870 znaków.JavaScript (E6) 1433
Oto un górny limit
Przetestuj w konsoli FireFox / FireBug
Wynik
źródło
SmileBASIC,
1763141812041128 bajtówWybrałem 3 postacie, które były w większości unikalne (0, 2 i 3), co pozostawia 2 przypadki szczególne: Cerium / Curium to „Ciu”, a Ruthenium / Rutherfordium to „Rhe”. W przypadku Ciu sprawdzam, czy drugim znakiem w nazwie jest „e” lub „E”, aw przypadku „Rhe” sprawdzam długość nazwy.
VAR(name)
zwraca zmienną o tej nazwie. Nazwy zmiennych nie uwzględniają wielkości liter.źródło
T-SQL,
900 894676 bajtówZwroty służą wyłącznie do odczytu, druga linia to jeden bardzo długi ciąg.
STRING_SPLIT
jest obsługiwany w SQL 2016 i nowszych wersjach.Dane wejściowe są pobierane za pomocą wcześniej istniejącej tabeli tz polem varchar e , zgodnie z naszymi standardami IO . Wyjście jest wypełnione spacjami do 3 znaków; zasady były niejasne, czy to było w porządku. W razie potrzeby mogę dodać
TRIM
.Tabela wejściowa jest połączona z tabelą wygenerowaną z listą wszystkich symboli elementów (uzupełnionych do 3 znaków) z najkrótszym unikalnym prefiksem dla każdej nazwy elementu (
X
wystarcza dla Xenon , ale Rutherfordium wymagaRuther
odróżnienia go od rutenu ).EDYCJA 1 : Zapisano 218 znaków, usuwając 44 wpisy z listy, której symbolem są dwie pierwsze litery ich nazwy;
ISNULL
funkcja służy do sprawdzenia, czy pierwsze zapytanie nie zwróci wiersza, a jeżeli tak, generuje symbol (odpowiednio) z powlekanego nazwy elementu wejściowego.źródło