IUPAC w swojej nieznośnej mądrości stworzyli systematyczną nazwę elementu dla każdego nowo utworzonego elementu. Jest to tymczasowa nazwa elementu, dopóki w końcu nie zdecydują się na prawdziwą nazwę. Działa to tak: każda cyfra numeru elementu ma przypisany prefiks na podstawie jego wartości. Prefiksy są łączone z „ium” na końcu. Kiedy to zrobisz i jeśli otrzymasz podwójne i's (ii) lub potrójne n's (nnn), zamień je na pojedyncze i's i podwójne n's. Symbolem elementu jest pierwsza litera każdego użytego prefiksu połączonego i skapitalizowanego wyniku. Użyte prefiksy znajdują się poniżej.
0 nil 5 pent
1 un 6 hex
2 bi 7 sept
3 tri 8 oct
4 quad 9 enn
Więc dla tego golfa twój kod musi wygenerować zarówno nazwę elementu, jak i jego symbol dla danej dodatniej liczby całkowitej. Więc jeśli twój kod otrzymał 137, powinien wypisać na standardowe wyjście lub zwrócić oba untriseptium
i Uts
. Powinien być ważny od co najmniej 118 do 558 . Każda wyższa jest poprawna, jeśli nie zwiększa długości kodu.
Przykład Pythona przedstawiający metodę:
def elename(n):
'''Return name and symbol of new element for given element number.'''
prefixes=['nil','un','bi','tri','quad','pent','hex','sept','oct','enn']
nmeFixes, symFixes = [], []
while n: # each digit of element number is assigned a prefix
n, i = divmod(n, 10)
pf = prefixes[i]
symFixes.append(pf[0]) # symbol uses only first letter of prefix
nmeFixes.append(pf)
# loop assembled prefixes in reverse order
nmeFixes.reverse()
symFixes.reverse()
nmeFixes.append('ium') # suffix
name = ''.join(nmeFixes)
symb = ''.join(symFixes).capitalize()
# apply rule about too many n's or i's
name = name.replace('nnn','nn') # can happen with -90-
name = name.replace('ii','i') # -2ium or -3ium
return name, symb
Eric Towers wygrywa bajtami kadmu!
Odpowiedzi:
Mathematica 10.1,
ind (49)kadm (48)To rozwiązanie wykorzystuje wbudowaną bibliotekę właściwości elementów, w tym nazw i skrótów IUPAC. (Nie widziałem tej techniki, której należy unikać w golfie. Wydaje się to być zachęcane. Ale może to być (być może ponad) akceptowalne - Mathematica implementuje tę bibliotekę (i wiele innych), pobierając dane z Serwery Wolfram przy pierwszym użyciu (i przypuszczam, że czasami sprawdzam aktualizacje).)
Jak by to wyglądało w porównaniu do używania elements.py lub periodictable.py w Pythonie?
Edycja: Kilka miesięcy później: Zauważyłem, że napisałem na maszynie kod wyjściowy 122. Ponownie uruchomiłem kod i sprawdziłem, że popełniłem ten błąd, a nie Mathematica.
źródło
f
sobie czystą funkcję:f=ElementData@@@{{#,"Abbreviation"},{#,"Name"}}&
.Python 3, Unhexseptium (167) bajtów
Są to wyniki, gdy program działa na każdej liczbie od 1 do 999 (włącznie)
źródło
Pip ,
ThoriumActiniumRadon (86)(Nie wdychaj tego wpisu, bo dostaniesz raka płuc.)
Pobiera numer elementu jako argument wiersza polecenia i wyświetla nazwę i skrót w osobnych wierszach.
Objaśnienie (nieco nie golfa):
ii
Innn
obsługi używa regex zastąpienie funkcji wywołania zwrotnego (dodana w najnowszej wersji PIP): dla każdego meczuii|nnn
, podejmie wszelkie ale pierwszy znak i używać jako zamiennik.źródło
GNU sed, 171 (unseptunium)
Zakładam, że nie ma znaczenia, w jakiej kolejności zwracane są nazwa i symbol. Tutaj symbol jest pierwszy:
źródło
g
; jedynymi przypadkami byłybybiium
/triium
iennnil
wszystkie mogą się zdarzyć tylko raz w liczbach poniżej 1000.Mathematica, unhexunium
163161 bajtówteraz wielkie litery symbol
To jest Mathematica bez wbudowanego
ElementData
.Test na 10 liczbach losowych:
źródło
JavaScript (ES6) 164 (unhexquadium)
171Wielkie litery to trudna część. (Test w FireFox)
Edytuj 3 bajty zapisane przez użytkownika 2786485
źródło
*enium
zamiast*ennium
czegokolwiek, co*9
[...n]
nie powiedzie się dla parametru int. Wyzwanie jest okołoa given positive integer
replace(/i(i)|n(nn)/g,'$1$2')
Rubin -
163156147143134 134 (Untriquadium) bajtówMam nadzieję zagrać w golfa w ten sposób
Edycja: Dzięki za @steveverrill za stratę 9 bajtów!
Edit2: Jeszcze raz dziękuję za @steveverrill za kolejne 4 bajty! (Naprawdę sprytne rozwiązanie!)
źródło
each_char
ciebie możesz użyćchars
. Według oficjalnej dokumentacji Rubiego jest to „przestarzałe” (ale nie w codegolf!) Prawdopodobnie lepiej byś to zrobił,each_byte
abytes
potemc.to_i
na przykład stanie sięi%48
. 2. Również przez przypadek\n
ma kod ascii 10, więc może możesz się go pozbyćchop
i dołączyćium
do swojej tablicy (działa świetnie dla nazwy elementu, ale dodaje fałszywyi
symbol elementu).tr_s
następujący sposób:o=u='';gets.bytes{|c|k=%w[Nil un bI trI quad pent hex sept oct enN Ium][c%48];o+=k;u+=k[0]};puts o.tr_s('IN','in'),u[0..-2].downcase.capitalize
u.chop
jest krótszy niżu[0..-2]
. Może powinienem był opublikować własną odpowiedź, ale moim początkowym pomysłem było zrobienie tego dokładnie tak, jak ty to zrobiłeś. Fajnie było grać w golfa. I całkowicie brakowało, że nie trzebadowncase
wcześniejcapitalize
.Pyth, 67 bajtów (Holmium)
Wypróbuj online w Pyth Compiler / Executor .
Jak to działa
źródło
JavaScript (ES6),
210202 bajtów (BiunniliumBinilbium)Minus octium (8) bajtów, dzięki @ edc65!
130 159 147 bajtów (Untrinilium Unpentennium Unquadseptium)Dane wejściowe jak
f(324)
. Ugh, czułem się bardzo golfowo.źródło
CJam,
74727170 7069 bajtów (Thulium)Pamiętaj, że kod zawiera znaki niedrukowalne.
Dzięki @ Sp3000 za wskazanie błędu w mojej początkowej wersji i zasugerowanie
)/
podejścia.Spróbuj go online w tłumacza CJam: .
Jak to działa
źródło
Matlab, 170 (Unseptnilium)
Działa na wszystkich wejściach, które możesz na niego rzucić, od,
nilium
aż do tak daleko, jak chcesz. Udało mi się,ennennennennennennennennennennennennennennennennennennennennennennium
zanim zrezygnowałem z naciskania klawisza 9.I wyjaśnienie:
źródło
TI-BASIC,
223218 bajtówElement o numerze N może mieć potrójne „n”, jeśli kończy się na 90, a może mieć podwójne „i”, jeśli ostatnia cyfra to 2 lub 3. Używamy matematyki do sprawdzania tych przypadków.
Magiczna liczba
1.5154
, która przechowuje długość każdego prefiksu, został znaleziony przy użyciu skryptu Python przeszukać wszystkie dziesiętne długości ≤7 używając funkcjicosh(
,cos(
oraze^(
.Nie skończyłem jeszcze gry w golfa, ale dwubajtowe małe litery TI-BASIC i brak poleceń manipulacji ciągami, jak zwykle, zaszkodzą wynikowi tego programu.
źródło
Python 3, unpentquadium (
156155154) bajtówZamiast wymieniać
ii
zi
my rstrip żadnychi
s zanim przyczepność naium
, ponieważ jest to możliwe jedynie źródłem podwójnychi
s. Podobnie usuwamyn
s, sprawdzającenn/nil
przypadek.źródło
Retina,
206196186179 (Unseptennium) bajtów ( Wypróbuj online )Dzięki @ MartinBüttner ( https://codegolf.stackexchange.com/users/8478/martin-b%C3%BCttner ) za nauczenie mnie tego języka.
Dzięki @FryAmTheEggman za odcięcie 7 bajtów.
Wersja bajtowa: tutaj
Wersja B-bajtowa: tutaj
źródło
CJam, 95 bajtów
Wypróbuj online
To konkuruje w kategorii „języki bez wyrażeń regularnych i tylko przy użyciu znaków do wydrukowania”. ;) Tak naprawdę nie spodziewałam się, że będzie on tak krótki jak niektóre z już opublikowanych rozwiązań, ale byłem ciekawy, jak długo by to się skończyło. A skoro mam go teraz, równie dobrze mogę go opublikować.
Wyjaśnienie:
źródło
Idź, 322 bajtów (tribibium)
Odczytuje trzy znaki ze STDIN, więcej jest ignorowanych, mniej powoduje awarię. Działa to dla każdej liczby między
unnilnilium
iennennennium
.źródło
PowerShell
170168165 (Unhexpentium)Dość proste i bez niespodzianek. Może z wyjątkiem tego, że rozwiązałem problem wielkich liter, odsuwając na bok wszystko oprócz pierwszej części i mając poszczególne części już w tytule. Agresywnie nakreślone do tej pory, aby uniknąć utraty znaków dla przypisań do zmiennej.
Premia po ostatniej zmianie: teraz działa również na dłuższe liczby elementów:
źródło
C na x86, 192 (Unennbium)
Odczytuje cyfry
stdin
i drukuje wynikistdout
. Polega nasizeof(char*) == sizeof(int)
.Wersja bez golfa:
źródło
Haskell, bipentbium (
305271269265261259253252 bajtów)Ogolono 34 bajty dzięki nim.
źródło
nnn
iii
przypadki, wr
, tznr('i':'i':a)='i':r a;r('n':'n':'n':a)="nn"++r a;r(x:a)=x:r a;r x=x
i nazywają go bez argumentów:t=r.m.p
.concatMap
to>>=
znaczyp n=(n>>=(words"..."!!))++"ium "
GNU sed, unhexunium (161 bajtów)
Najpierw generuję symbol, a następnie chowam go do miejsca i tworzę nazwę. Pętla jest bardziej golfowa niż używanie
/g
czterech lub więcej zamienników (możemy mieć tylko jedenii
i / lub jedennnn
, więc nie muszą znajdować się w pętli, ale to nie boli). Na koniec pobierz i dołącz trzymany symbol.(Uwaga: nie widziałem istniejącej odpowiedzi sed, kiedy to napisałem)
Przypadki testowe
Wykonują one
ii
innn
specjalne zasady:I niedorzeczny, pokazujący o ile więcej ten kod daje w porównaniu ze światem fizycznym:
źródło
T-SQL 329 bajtów
Sformatowany:
źródło
PHP, 152
153163bajty, niepentbiumTym razem przynajmniej PHP jest gdzieś średnio.
Działa z wiersza polecenia, takiego jak:
Wynik:
Bez golfa
Edytować
array()
-inicjalizator[]
'ium '
zamiast tego stosując dodatkową konkatenację.' '.
źródło
Perl, 109 (Unnilennium) bajtów
Kod 108 + 1 przełącznik
Pobiera dane wejściowe ze STDIN jako jedną liczbę w wierszu.
źródło
Java 8 216 bajtów
źródło
ii
innn
, jak wyjaśniono w pytaniu. 3. Celem gry w golfa jest uczynienie kodu możliwie jak najkrótszym. Odpowiedź powinna zawierać wynik w tytule. Możesz zmniejszyć swój wynik, eliminując białe znaki i skracając nazwę zmiennej.C #
229 (Bibiennium)198 bajtów unennoctiumSztuczka „n-'0” jest sposobem na konwersję z ascii na int. Char 9 = ASCII 57. Char 0 = ASCII 48, więc 57-48 = 9.
statyczny prywatny ciąg ToText (int v) {return (string.Join ("", v.ToString (). Wybierz ((char n) => "zero bic quad pent hex hex sept oct enn" .Split () [n -'0 '])) + „ium”). Zamień („nnn”, „nn”). Zamień („ii”, „i”) + „” + string.Join („”, v.ToString () .Select ((char n) => "nubtqphsoe" [n-'0 '])); }To podejście przyjmuje int, konwertuje na ciąg, a następnie wykonuje LINQ wybór znaków, które odpalają lambda.
Lambda generuje tablicę w locie (mniej znaków niż ją definiuje), dzieląc ciąg prefiksów. Następnie pobiera indeks prefiksu do użycia, patrząc na wartość int bieżącego znaku (sztuczka n-0 wspomniana powyżej).
Wszystko to jest zawinięte w ciąg. Połącz, który łączy wszystkie wyniki LINQ razem. Tack na „ium”, a następnie kilka .Replace na końcu, aby oczyścić nnn i ii.
Dodano brakujące wyjście symbolu. Myślę, że istnieje bardziej skuteczny sposób, łącząc dwa LINQ, ale jest już za późno, aby się na niego szturchać.
źródło
n-'0'
dlaczego nien-30
?C,
210204unennennium (199) bajtówWymaga to ASCII jako zestawu znaków środowiska wykonawczego.
Wypróbowałem rozwiązanie rekurencyjne (które pozwala uniknąć potrzeby
p
io
), ale okazało się, że było dłużej.Jestem szczególnie dumny / wstydzić dopasowującego do regexp
90|[23]$
, która opiera się9
i0
jest najdalej oddzielone cyfry (a więc tylko parę, które różnią się od 9 -39
w kodzie jest konsekwencjąj
jest liczbą całkowitą i*n
nadal ASCII charakter) i to2
i3
różnią się tylko ostatnim bitem, więc dzielenie przez 2 łączy je.Rozszerzony kod:
Uprząż testowa:
źródło
R, 278 bajtów
Nie najlepsze ... ale wciąż uczę się R, więc pomyślałem, że opublikuję moją próbę. Jakieś sugestie, żeby to poprawić? Teraz, gdy o tym myślę, prawdopodobnie możliwe jest podzbiór wiersza n-1 zamiast marnowania miejsca na tworzenie nazw wierszy.
Przykładowe użycie
Bez golfa
k
0-9
aby ułatwić ich identyfikacjęx
, przekonwertuj na znak, podziel je (np. 137 na „1” „3” „7”)k
oparty na wprowadzonym numerze podzielonym i zwraca wpisy-ium
k
za pomocą podciągów, aby wyciągnąć pierwszą literę dopasowań. Jest to konkatenowane z wynikiem z kroku 5 z pustą przestrzenią między nimisub()
do zastępowania wzorównnn
iii
źródło
JavaScript - 169 bajtów
Dziwnie, moje próby użycia mapy były dłuższe niż pętla for.
EDYCJA: Ups, zapomniałem sprawdzić datę.
źródło
PHP, 131 + 1 bajtów (untriunium)
wciąż okropnie długo:
Uruchom jako potok z
-nR
lub spróbuj online .źródło
Python, 154 bajty
źródło