Tên thành phần trên 118


46

IUPAC trong sự khôn ngoan không thể vượt qua của họ đã tạo ra một tên thành phần hệ thống cho bất kỳ yếu tố mới được tạo. Đây là tên tạm thời của một yếu tố cho đến khi cuối cùng họ quyết định về một tên thực tế. Nó hoạt động như vậy: mỗi chữ số của một số phần tử được gán một tiền tố dựa trên giá trị của nó. Các tiền tố được nối với 'ium' ở cuối. Khi điều này được thực hiện và nếu bạn nhận được gấp đôi i (ii) hoặc gấp ba lần (nnn), hãy thay thế chúng bằng các i đơn và đôi n. Biểu tượng cho phần tử là chữ cái đầu tiên của mỗi tiền tố được sử dụng nối và kết quả là viết hoa. Các tiền tố được sử dụng là dưới đây.

0 nil       5 pent
1 un        6 hex
2 bi        7 sept
3 tri       8 oct
4 quad      9 enn

Vì vậy, đối với môn gôn này, mã của bạn cần tạo cả tên phần tử và ký hiệu của nó cho một số nguyên dương cho trước. Vì vậy, nếu mã của bạn đã được cung cấp 137, nó sẽ in ra thiết bị xuất chuẩn hoặc trả về cả hai untriseptiumUts. Nó phải có giá trị từ ít nhất 118 đến 558 . Bất kỳ giá trị nào cao hơn đều hợp lệ nếu nó không làm tăng độ dài mã của bạn.

Ví dụ Python hiển thị phương thức:

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 chiến thắng với byte cadmium!


34
Tôi sẽ bắt đầu gọi Boron bằng tên thành phần hệ thống IUPAC của nó: "Pentium"
Michael


1
Chúng ta phải có trường hợp chính xác?
lirtosiast

6
@BetaDecay Nhưng "yếu tố thứ năm" này có hỗ trợ MultiPass không?
Damian Yerrick

Câu trả lời:


22

Toán học 10.1, indium (49) cadmium (48)

Giải pháp này sử dụng một thư viện các thuộc tính phần tử tích hợp, bao gồm tên và chữ viết tắt IUPAC. (Tôi chưa thấy đây là một kỹ thuật nên tránh trong Golf. Nó dường như được khuyến khích. Nhưng điều này có thể nằm ở (có lẽ là trên) có thể chấp nhận được - Mathicala thực hiện thư viện này (và nhiều người khác) bằng cách tải xuống dữ liệu từ Máy chủ của Wolfram lần đầu tiên bạn sử dụng nó (và tôi cho rằng thỉnh thoảng kiểm tra các bản cập nhật).)

f=ElementData@@@{{#,"Abbreviation"},{#,"Name"}}&
(* 
Improved by @user5254 from 
f[n_]:=ElementData[n,#]&/@{"Abbreviation","Name"} 
*)

f[48]
(* {"Cd", "cadmium"} *)

f[118]
(* {"Uuo", "ununoctium"} *)

f[122]
(* {"Ubb", "unbibium"} *)

f[190]
(* {"Uen", "unennilium"} *)

f[558]
(* {"Ppo", "pentpentoctium"} *)

f[10^100-1]
(* {"Eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "ennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennennium"} *)

Làm thế nào điều này sẽ so sánh với việc sử dụng yếu tố thành phần

Chỉnh sửa: Nhiều tháng sau: Nhận thấy tôi đã đánh máy đầu ra viết tắt cho 122. Tôi đã chạy lại mã và xác minh rằng tôi đã mắc lỗi này, không phải Mathicala.


9
Khi tôi viết ra thử thách, tôi đã nghĩ rằng "Tôi có nên ngăn chặn các chức năng được tích hợp không? Không, điều này không chắc là nó được tích hợp với bất kỳ ngôn ngữ nào. Đợi đã, Mathicala có thể có nó." Nhưng tôi không biết làm thế nào để kiểm tra và sau đó nhanh chóng quên nó đi.
Trạng thái

7
Thánh phụ huynh, Người dơi! Đoạn đó trông giống như những gì tôi có thể viết (tôi cũng vậy, có tội khi sử dụng các phụ huynh như là một nỗ lực để giảm thiểu sự dài dòng của tôi - mặc dù vậy, chúng thường trở nên như thế này).
cole

1
Bạn có thể lưu thêm một byte bằng cách sử dụng ứng dụng bên trong và biến fnó thành một hàm thuần túy : f=ElementData@@@{{#,"Abbreviation"},{#,"Name"}}&.

Mã này sẽ không hợp lệ đối với 118 nếu phần tử trong câu hỏi có được tên chính thức?

1
@ ais523: Theo thông số kỹ thuật "Vì vậy, đối với môn gôn này, mã của bạn cần tạo cả tên thành phần và ký hiệu của nó cho một số nguyên dương cho trước." Nếu thành phần có tên hoặc ký hiệu, tên hoặc ký hiệu đó phải được báo cáo. Theo số liệu của bạn, sau đó, mọi nội dung gửi khác trên trang này sẽ không đáp ứng được thông số kỹ thuật nếu bất kỳ phần tử nào có số nguyên tử> = 118 có ký hiệu hoặc tên hệ thống.
Tháp Eric

27

Python 3, Unhexseptium (167) byte

h=x='';r=str.replace
for i in input():s=r('nubtqphsoeinirueeecnl  ianxptn    dt t'[int(i)::10],' ','');h+=s;x+=s[0]
print(r(r(h+'ium\n','ii','i'),'nnn','nn')+x.title())

Đây là các kết quả khi chương trình được chạy trên mọi số từ 1 đến 999 (đã bao gồm)


30
Tiêu đề của bạn bây giờ khiến tôi muốn mọi người liệt kê số byte theo cách đó.
Trạng thái

4
@Status Nghe, nghe. Điều này sẽ làm cho những kẻ Pyth đó rất buồn ... :)
beaker

1
@beaker Tôi thất vọng vì ảnh đại diện của bạn không phải là Beaker ;)
Beta Decay

4
@BetaDecay Xong.
cốc

6
@Status: nếu ai đó quản lý để làm điều đó dưới 112 byte, họ có thể có một tên thành phần cổ điển trong tiêu đề :) Giống như rutherfordium . Hoặc vàng .
vsz

15

Pip , Thorium Actonium Radon (86)

(Đừng hít vào mục này, nó sẽ khiến bạn bị ung thư phổi.)

P(aR,tY"nil un bi tri quad pent hex sept oct enn"^s)."ium"R`ii|nnn`_@>1Yy@_@0MaUC:y@0y

Lấy số phần tử làm đối số dòng lệnh và xuất tên & chữ viết tắt trên các dòng riêng biệt.

Giải thích (hơi vô căn cứ):

Y"nil un bi tri quad pent hex sept oct enn"^s  Build list of prefixes & store in y

    ,t                                         Range(10)
 (aR  y)                                       Replace each digit in input with
                                                 corresponding element in prefix list
        ."ium"                                 Append "ium"
              R`ii|nnn`_@>1                    Reduce too-long runs of letters
P                                              Print

 {y@a@0}Ma                                     For each digit in input, get first character
                                                 of corresponding prefix
Y                                              Store that list in y
          UC:y@0                               Uppercase the first item of y in place
                y                              Print y (items concatenated)

Việc xử lý iinnnsử dụng thay thế regex bằng chức năng gọi lại (được thêm vào trong phiên bản mới nhất của Pip): cho mọi trận đấu ii|nnn, lấy tất cả trừ ký tự đầu tiên và sử dụng thay thế.


Protip: Mặc dù hít phải các loại thuốc khác có thể không gây ung thư phổi , nhưng chúng vẫn không phải là tốt nhất cho sức khỏe của bạn.
Cyoce

14

GNU sed, 171 (unseptunium)

s/0/Nil/g
s/1/Un/g
s/2/Bi/g
s/3/Tri/g
s/4/Quad/g
s/5/Pent/g
s/6/Hex/g
s/7/Sept/g
s/8/Oct/g
s/9/Enn/g
s/$/ium/
h
s/[a-z]//g
G
s/./\L&/g
s/./\U&/
s/\n/ /
s/ii/i/g
s/nnn/nn/g

Tôi cho rằng không quan trọng thứ tự tên và biểu tượng được trả về. Ở đây, biểu tượng xuất hiện trước:

$ seq 180 190 | sed -f iupac.sed 
Uon unoctnilium
Uou unoctunium
Uob unoctbium
Uot unocttrium
Uoq unoctquadium
Uop unoctpentium
Uoh unocthexium
Uos unoctseptium
Uoo unoctoctium
Uoe unoctennium
Uen unennilium
$ 

4
Tôi không nghĩ rằng hai sự thay thế cuối cùng cần g; trường hợp duy nhất sẽ là biium/ triiumennnil, tất cả chỉ có thể xảy ra một lần với số lượng dưới 1000.
PurkkaKoodari

8

Mathicala, unsexunium 163 161 byte

bây giờ viết hoa

Đây là Mathicala không có tích hợp ElementData.

f=StringReplace[##<>"ium, "<>{ToUpperCase@#1,##2}~StringTake~1&@@ToString/@nil[un,bi,tri,quad,pent,hex,sept,oct,enn][[IntegerDigits@#]],{"ii"->"i","nnn"->"nn"}]&

Kiểm tra trên 10 số ngẫu nhiên:

# -> f[#]& /@ RandomInteger[{118, 558}, 10] // ColumnForm

155->unpentpentium, Upp
338->tritrioctium, Tto
477->quadseptseptium, Qss
261->bihexunium, Bhu
158->unpentoctium, Upo
164->unhexquadium, Uhq
266->bihexhexium, Bhh
331->tritriunium, Ttu
404->quadnilquadium, Qnq
389->trioctennium, Toe

8

JavaScript (ES6) 164 (không chính xác) 171

Viết hoa là phần khó khăn. (Thử nghiệm trong FireFox)

Chỉnh sửa 3 byte lưu thx user2786485

f=n=>[([...n+(l='')].map(c=>(c='nil,un,bi,tri,quad,pent,hex,sept,oct,enn'.split`,`[c],n=l?n+c[0]:c[0].toUpperCase(),l+=c)),l+'ium').replace(/i(i)|n(nn)/g,'$1$2'),n]

function test() { O.innerHTML=f(+I.value) }

test()

for(o='',i=99;i++<999;)o+=i+' '+f(i)+'\n';P.innerHTML=o
<input id=I onchange="test()" value="164"><span id=O></span><pre id=P></pre>


Trả về *eniumthay vì *enniumcho bất cứ điều gì*9
DankMeme

Phiên bản Unhexhexium: n => [([... n] .map (c => (c = 'nil, un, bi, tri, quad, pent, hex, sept, oct, enn'.split`, `[ c], i = c [0], s = s? s + i: i.toUpperCase (), c), s = ''). tham gia`` + 'ium'). thay thế (/ ii | nnn / g , r => r.slice (1)), s]
Mama Fun Roll

@molarmanful [...n]sẽ thất bại cho một tham số int. Thử thách là vềa given positive integer
edc65

Bạn có thể nhận được unexoctium nếu bạn thay thế cuộc gọi 'thay thế' của mìnhreplace(/i(i)|n(nn)/g,'$1$2')
Hy vọng tôi có thể giúp đỡ vào

@ user2786485 thx Tôi đã nghĩ đến việc sử dụng ảnh chụp nhưng không tìm đúng cách
edc65

7

Ruby - 163 156 147 143 134 (Untriquadi) byte

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].capitalize

Tôi hy vọng chơi golf theo cách này

Chỉnh sửa: Cảm ơn @steveverrill vì đã loại bỏ 9 byte!

Edit2: Cảm ơn vì @steveverrill một lần nữa vì 4 byte nữa! (Giải pháp thực sự thông minh!)


1
1. Thay vì each_charbạn có thể sử dụng chars. Theo tài liệu chính thức của Ruby, đây là "không dùng nữa" (nhưng không phải trong codegolf!) Bạn có thể sẽ làm tốt hơn với each_bytehoặc bytessau đó c.to_itrở thành ví dụ i%48. 2. Ngoài ra, tình cờ \ncó mã ascii 10, vì vậy có lẽ bạn có thể thoát khỏi chopvà bao gồm iumtrong mảng của mình (hoạt động tuyệt vời cho tên thành phần, nhưng thêm iký hiệu giả vào ký hiệu phần tử.)
Level River St

1
Bạn có thể lưu thêm 5 byte tr_snhư thế này: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
Level River St

u.chopngắn hơn u[0..-2]. Có lẽ tôi nên đăng câu trả lời của riêng mình, nhưng ý tưởng ban đầu của tôi là làm nó chính xác như bạn đã làm. Thật là vui khi giúp bạn chơi gôn này. Tôi hoàn toàn nhớ rằng bạn không cần downcasetrước đây capitalize.
Cấp sông St

7

Pyth, 67 byte (Holmium)

rshMJ@Lcs@LGjC"]ß!âÿeóÑiSÑA¼R¬HE"24\fjQT3-"ium"epj"nn"csJ*\n3

Dùng thử trực tuyến trong Trình biên dịch / thực thi Pyth .

Làm thế nào nó hoạt động

            jC"…"24       Convert the string from base 256 to base 24.
        s@LG              Select the letter that corresponds to each digit.
       c           \f     Split at 'f'.
     @L              jQT  Select the chunk that corresponds to each input digit.
    J                     Save in J.
 shM                      Form a string of the first letters of the chunks.
r                       3 Capitalize the first character.
                          Print. (implicit)

             csJ*\n3      Split the flattened J at "nnn".
        j"nn"             Join, separating by "nn".
       p                  Print.
-"ium"e                   Remove the last character ('i'?) from "ium".
                          Print. (implicit)

6

JavaScript (ES6), 210 202 byte ( Biunnilium Binilbium)

Trừ đi octium (8) byte, nhờ @ edc65!

130 159 147 Byte (Untrinilium Unpent thiên niên kỷ)

f=z=>(c=(b=(z+"").split``.map(x=>"nil.un.bi.tri.quad.pent.hex.sept.oct.enn".split`.`[+x])).join``.replace(/nnn/g,"n"))+(c[c.length-1]!="i"?"i":"")+"um,"+(a=b.map(x=>x[0])).shift().toUpperCase()+a.join``

Đầu vào như thế nào f(324). Ugh, tôi cảm thấy rất golf-y.


@ edc65 Đã sửa cả ba vấn đề.
Conor O'Brien

1
Khỏe. Bây giờ, bằng cách sử dụng chuỗi mẫu, bạn có thể tránh một số dấu ngoặc và lưu có thể 8 byte codegolf.stackexchange.com/a/52204/21348
edc65

6

CJam, 74 72 71 70 69 byte (Thulium)

r:i"ؾaÈÁaÎE<Ä+&:¬úD±"380b24b'af+)/f=_:c(euoS@s'n3*/"nn"*)"ium"|

Lưu ý rằng mã chứa các ký tự không thể in được.

Cảm ơn @ Sp3000 đã chỉ ra một lỗi trong lần sửa đổi ban đầu của tôi và đề xuất )/cách tiếp cận.

Hãy thử trực tuyến trong trình thông dịch CJam : .

Làm thế nào nó hoạt động

r:i     e# Read a token and push the array of its character codes.
"…"     e# Push a string of unprintable characters.
380b24b e# Convert it from base 380 to base 24.
'af+    e# Add the character 'a' to each base-24 digit.
        e# This pushes "bijtrijquadjpentjhexjseptjoctjennjniljunj".
)/      e# Pop the last character and split the string at the remaining occurrences.
f=      e# For each character code in the input, select the correspoding chunk.
_:c     e# Push a copy and cast each string to character.
(euo    e# Shift out the first character, convert to uppercase, and print.
S@      e# Push a space and rotate the array of string on top of it.
s       e# Flatten the array of string.
'n3*/   e# Split at occurrences of "nnn". 
"nn"*   e# Join, using "nn" as separator.
)"ium"| e# Pop the last character and perform setwise union with "ium".
        e# If the last character is, e.g., 't', this pushes "tium".
        e# If the last character is 'i', this pushes "ium".

3
Sự thật thú vị: Vonfram thường được sử dụng trong các thỏi vàng và tiền giả, do mật độ cực lớn của nó tương đương với vàng và giá rẻ tương đối của nó.
lirtosiast

1
Lutetium là một tên mát mẻ vô lý cho một yếu tố.
T. Sar - Phục hồi Monica

@ThalesPereira Thậm chí còn tuyệt hơn Ytterbium?
Beta Decay

Sự thật thú vị: Erbium, terbium, yttri và ytterbium đều được đặt tên theo cùng một địa điểm .
lirtosiast

5

Matlab, 170 (Unseptnilium)

Hoạt động trên tất cả các đầu vào bạn có thể ném vào nó, từ niliumlên đến, cũng như xa như bạn quan tâm để đi. Tôi đã nhận được ennennennennennennennennennennennennennennennennennennennennennenniumtrước khi tôi từ bỏ với việc nhấn phím 9.

l=['nubtqphsoe';'inirueeecn';'l  ianxptn';'    dt t  '];i=input('','s')-47;s=l(1,i);s(1)=s(1)-32;a=l(:,i);disp([strrep(strrep([a(a>32)' 'ium '],'nnn','nn'),'ii','i') s]);

Và một lời giải thích:

%Create a 2D array of the prefixes transposed
l=['nubtqphsoe';'inirueeecn';'l  ianxptn';'    dt t  '];
%Grab the input number
i=input('','s')     %Request the input and convert to string
               -47; %Convert from ASCII into an array of indecies (1 indexed)
%Generate the short form
s=l(1,i);
%Capitalise first letter in short form
s(1)=s(1)-32;
%Extract required prefixes for long form
a=l(:,i);
%Now the fun bit:
                     a(a>32)'                                    %Combine the prefixes removing spaces and transpose into a string
                    [         'ium ']                            %Append 'ium ' to the string (the space is to separate the short form)
             strrep(                 ,'nnn','nn')                %Replace 'nnn' with 'nn'
      strrep(                                    ,'ii','i')      %Replace 'ii' with 'i'
disp([                                                     s]); %And display both full and short form strings together

5

TI-BASIC, 223 218 byte

Input N
"nil un  bi  tri quadpenthex septoct enn→Str4
"int(10fPart(N/10^(X→Y₁
"sub(Str4,1+4Y₁,int(3fPart(e^(Y₁)1.5154)+2^not(X=2 and .9=fPart(N%) or X=1 and 1=int(5fPart(.1N→Y₂
"ium,"+sub("UBTQP",int(N%),1
For(X,1,3
Y₂+Ans+sub(Y₂(3-X),1,1
End
sub(Ans,1,length(Ans)-1

Số phần tử N chỉ có thể có ba "n" nếu nó kết thúc bằng 90 và chỉ có thể có một số "i" nếu chữ số cuối cùng là 2 hoặc 3. Chúng tôi sử dụng toán học để kiểm tra các trường hợp đó.

Các con số kỳ diệu 1.5154, mà các cửa hàng độ dài của mỗi tiền tố, đã được tìm thấy bằng cách sử dụng kịch bản Python để tìm kiếm tất cả các số thập phân có độ dài ≤7 sử dụng các chức năng cosh(, cos(e^(.

Chưa chơi gôn, nhưng các chữ cái viết thường hai byte của TI-BASIC và thiếu các lệnh thao tác chuỗi, như mọi khi, sẽ làm tổn thương điểm số của chương trình này.


Tôi sẽ làm việc trên sân golf. ^ _ ^ Tôi sẽ cho bạn biết những gì tôi nghĩ ra.
Conor O'Brien

Tôi không nghĩ ai đó có thể giảm xuống còn 118 hoặc ít hơn, nhưng nếu ai đó quản lý, tôi sẽ cho 500 đại diện.
lirtosiast

Hai câu hỏi: N% là gì và "" và "" là gì?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Xin lỗi,% là mã thông báo hai byte mà bạn không thể nhập vào máy tính của mình. Sử dụng công cụ SourceCoder hoặc TI của Cemetech để chỉnh sửa nó thành nguồn hoặc sử dụng tệp tôi cung cấp.
lirtosiast

@ CᴏɴᴏʀO'Bʀɪᴇɴ là chỉ mục 10; Tôi đã thay thế nó bằng một 10. thông thường
lirtosiast

2

Python 3, unpentquadi ( 156 155 154) byte

n=e=""
for c in input():s="nil un bi tri quad pent hex sept oct enn".split()[int(c)];n+=s[c<"1"<"nn"==n[-2:]:];e+=s[0]
print(n.strip("i")+"ium",e.title())

Thay vì thay thế iibằng ichúng tôi rstrip bất kỳ is trước khi chúng tôi giải quyết ium, vì đó là nguồn kép duy nhất có thể i. Tương tự, chúng tôi tước ns bằng cách kiểm tra một enn/niltrường hợp.


2

Retina, 206 196 186 179 (Unsept thiên niên) byte ( Dùng thử trực tuyến )

Cảm ơn @ MartinBüttner ( https://codegolf.stackexchange.com/users/8478/martin-b%C3%BCttner ) đã dạy tôi ngôn ngữ này.

Cảm ơn @FryAmTheEggman đã cắt 7 byte.

T`d`nubtq\p\hs\oe
.+
$&, $&
(?<=,.*n)
il
(?<=,.*e)n?
nn
(?<=,.*u)
n
(?<=,.*b)
i
(?<=,.*t)
ri
(?<=,.*q)
uad
(?<=,.*p)
ent
(?<=,.*h)
ex
(?<=,.*s)
ept
(?<=,.*o)
ct
r`i?$
ium
T`l`L`^.

Phiên bản Ueh-byte: tại đây

Phiên bản Bnh-byte: tại đây


2

CJam, 95 byte

liAbA,"nil un bi tri quad pent hex sept oct enn"S/er_:c(eu\+_1>"en"={\W"il"t\}&S@:+)_'i=!*"ium"

Dùng thử trực tuyến

Điều này cạnh tranh trong danh mục "ngôn ngữ không có regex và chỉ sử dụng các ký tự có thể in được." ;) Không thực sự mong đợi nó sẽ ngắn như một số giải pháp đã được đăng, nhưng tôi tò mò không biết nó sẽ kết thúc trong bao lâu. Và vì tôi đã nhận được nó bây giờ, tôi cũng có thể đăng nó.

Giải trình:

li      Get input and convert to int.
Ab      Encode in decimal.
A,      Build list [0 .. 9].
"..."   String with prefixes.
S/      Split at spaces.
er      Transliterate. We now have a list of the prefix for each digit.
_:c     Copy and take first character of each, for short form.
(       Pop off first character.
eu      Convert it to upper case.
\+      Put it back in place. Done with short form.
_1>     Remove first character.
"en"=   Compare with "en", corresponding to the 90 special case.
{       Handle 90 case, replace 
  \       Swap full prefix list to top.
  W"il"t  Replace "nil" by "il" to avoid "nnn".
  \       Swap short form back to top.
}&      End of 90 case.
S       Push space between short form and full name.
@       Swap prefix list to top.
:+      Concatenate all the prefixes.
)       Pop off the last letter.
_'i=    Compare it with 'i.
!*      Multiply letter with comparison result. This gets rid of letter if it's 'i.
"ium"   Add the final part of the output.

1
Chỉ để tham khảo, Dennis chỉ lưu 6 byte với tất cả mã hóa cơ sở đó: P
Sp3000

1

Đi, 322 Byte (Tribibium)

package main
import("os"
"strings"
"fmt")
func main(){p,n,s:="nil un  bi  tri quadpenthex septoct enn ","",make([]byte,0)
b:=make([]byte,3)
os.Stdin.Read(b)
var d byte=32
for _,r:=range b{i:=r-48
n+=p[4*i:4*i+4]
s,d=append(s,p[4*i]-d),0}
fmt.Printf("%sium %s",strings.NewReplacer(" ","","ii","i","nnn","nn").Replace(n),s)}

Đọc ba ký tự từ STDIN, nhiều hơn bị bỏ qua, ít dẫn đến sự cố. Vì vậy, nó hoạt động cho mọi số giữa unnilniliumennennennium.


Ngoài ra, không phải phần tử cho 322 byte là Tribibinium? 321 là tribiunium.
Mateon1

Chết tiệt, tôi đã bỏ lỡ cái đó khi thêm "i". Bây giờ mọi thứ nên theo thứ tự
Fabian Schmengler

1

PowerShell, 170 168 165 (Chưa khai thác)

-join($a="$input"[0..9]|%{(($x=(-split'Nil Un Bi Tri Quad Pent Hex Sept Oct Enn')["$_"]).ToLower(),$x)[!($y++)]})+'ium'-replace'(nn)n|(i)i','$1$2'
-join($a|%{$_[0]})

Khá đơn giản và không có bất ngờ ở đây. Ngoại trừ có lẽ tôi đã giải quyết vấn đề viết hoa bằng cách viết mọi thứ trừ phần đầu tiên và có các phần riêng lẻ đã có trong trường hợp tiêu đề. Bây giờ được nhấn mạnh để tránh mất ký tự cho các bài tập biến trần.

Phần thưởng sau lần thay đổi cuối cùng: Bây giờ cũng hoạt động với số phần tử dài hơn:

> echo 1337| powershell -noprofile -file "element.ps1"
Untritriseptium
Utts

1

C trên x86, 192 (Unennbium)

int c,s,a[8],x,main(){while((c=getchar()-48)>=0)x="nil\0un\0\0bi\0\0tri\0quadpenthex\0septoct\0enn"+4*c,strncat(a,x+(c<s-8),4),strncat(a+5,x,1),s=c;printf("%s%s %s",a,"ium"+((s&14)==2),a+5);}

Đọc các chữ số từ stdinvà in kết quả đến stdout. Dựa vào sizeof(char*) == sizeof(int).

Phiên bản bị đánh cắp:

int c, s, // Current and last digit, initially zero (0-9, not '0'-'9')
    a[8], // Buffer to write to (type doesn't matter when passed by pointer)
    x; // Int-pointer into lookup table

main() {
    while ((c = getchar() - 48) >= 0) { // 48 == '0'
        x = "nil\0un\0\0bi\0\0tri\0quadpenthex\0septoct\0enn" + 4*c;
        strncat(a, x+(c<s-8), 4); // Write digit, skip first char if c==0 && s==9
        strncat(a+5, x, 1); // Write first digit character somewhere else
        s = c;
    }
    printf("%s%s %s", a, "ium"+((s&14)==2), a+5); // Append "ium" (or "um" if s==2||s==3)
}

1

Haskell, bipentbium ( 305 271 269 265 261 259 253 252 byte)

import Data.Char
main=getLine>>=putStr.a
m=map toLower
a n=(r.m$p)++(k.filter isUpper$p)where p=(n>>=(words"Nil Un Bi Tri Quad Pent Hex Sept Oct Enn"!!).digitToInt)++"ium "
r('n':'n':'n':x)="nn"++r x
r('i':'i':x)='i':r x
r(x:z)=x:r z
r x=x 
k(h:t)=h:m t

Cạo 34 byte nhờ nimi.


1
Bạn có thể mã hóa cứng nnniicác trường hợp thành r, tức là r('i':'i':a)='i':r a;r('n':'n':'n':a)="nn"++r a;r(x:a)=x:r a;r x=xvà gọi nó mà không cần đối số : t=r.m.p.
nimi

@nimi Chúc mừng cho điều đó!
jkabrg

1
Một số byte khác để lưu: concatMap>>=, tức làp n=(n>>=(words"..."!!))++"ium "
nimi

@nimi Chúc mừng lần nữa.
jkabrg

1

GNU sed, unsexunium (161 byte)

h
y/0123456789/nubtqphsoe/
s/./\u&/
x
s/$/ium/
:
s/0/nil/
s/1/un/
s/2/bi/
s/3/tri/
s/4/quad/
s/5/pent/
s/6/hex/
s/7/sept/
s/8/oct/
s/9/enn/
s/nnn/nn/
s/ii/i/
t
G

Tôi tạo biểu tượng đầu tiên, sau đó bỏ nó vào khoảng trống và tạo tên. Một vòng lặp là tốt hơn so với việc sử dụng /gcho bốn hoặc nhiều thay thế (chúng ta chỉ có thể có một iivà / hoặc một nnn, vì vậy họ không cần phải ở trong vòng lặp, nhưng điều đó không gây hại). Cuối cùng, lấy và nối biểu tượng được giữ.

(NB Tôi đã không thấy câu trả lời sed hiện có khi tôi viết bài này)

Các trường hợp thử nghiệm

Những bài tập này iinnncác quy tắc đặc biệt:

$ seq 100 89 1000 | ./60208.sed
unnilnilium
Unn
unoctennium
Uoe
biseptoctium
Bso
trihexseptium
Ths
quadpenthexium
Qph
pentquadpentium
Pqp
hextriquadium
Htq
septbitrium
Sbt
octunbium
Oub
ennilunium
Enu
ennennilium
Een

Và một điều nực cười, cho thấy mã này mang lại bao nhiêu, so với thế giới vật lý:

$ ./60208.sed <<<281039817
bioctunniltriennoctunseptium
Bounteous

1

T-SQL 329 byte

creat proc x(@a char(3))as select replace(replace((select a.b as[text()]from(select left(@a,1)a union select substring(@a,2,1)union select right(@a,1))z join(values(0,'nil'),(1,'un'),(2,'bi'),(3,'tri'),(4,'quad'),(5,'pent'),(6,'hex'),(7,'sept'),(8,'oct'),(9,'enn'))a(a,b)on z.a=a.a for xml path(''))+'ium','ii','i'),'nnn','nn')

Định dạng:

create proc x(@a char(3))as 
select replace(replace(
(select a.b as[text()]from
    (
    select left(@a,1)a 
    union select substring(@a,2,1)
    union select right(@a,1))z 
join(values(0,'nil'),(1,'un'),(2,'bi'),(3,'tri'),(4,'quad'),(5,'pent'),(6,'hex'),(7,'sept'),(8,'oct'),(9,'enn')
    )a(a,b)on z.a=a.a 
for xml path('')
)+'ium','ii','i'),'nnn','nn')

1

PHP, 152 153 163 byte, unpentbium

Chà, ít nhất PHP ở đâu đó khoảng trung bình lần này.

while(null!=$x=$argv[1][$i++]){$a.=$y=[nil,un,bi,tri,quad,pent,hex,sept,oct,enn][$x];$b.=$y[0];}echo str_replace([ii,nnn],[i,nn],$a.'ium ').ucfirst($b);

Chạy dòng lệnh biểu mẫu như:

pentium.php 163

Đầu ra:

unhextrium Uht

Ung dung

$y = array('nil','un','bi','tri','quad','pent','hex','sept','oct','enn');

while (null != ($x = $argv[1][$i++])) {
    $a .= $y[$x];
    $b .= $y[$x][0];
}

echo str_replace(
        array('ii','nnn'),
        array('i','nn'),
        $a . 'ium ')
     .ucfirst($b);

Biên tập

  • đã lưu 10 byte bằng cách thay thế tất cả (không chỉ một, duh ) array()-initializer bằng[]
  • đã lưu 1 byte bằng cách thêm khoảng trắng cùng với 'ium 'thay vào đó bằng cách sử dụng phép nối thêm.' '.

0

Perl, 109 (Unnil thiên niên kỷ) byte

108 mã + 1 công tắc

perl -pe 's!.!qw{Nil Un Bi Tri Quad Pent Hex Sept Oct Enn}[$&]!ge;s!nnN!nN!g;s!i?$!ium!;$_=lc$_.y!a-z!!dr;s!\b.!\U$&!g'

Lấy đầu vào từ STDIN là một số trên mỗi dòng.


Bạn có nghĩa là un n ilseptium :)
CompuChip

À, cảm ơn vì đã chỉ ra điều đó :) Đã sửa nó ngay bây giờ
svsd

0

Java 8 216Bytes

String f(int i){
String[] s = {"nil","un","bi","tri","quad","pent","hex","sept","oct","enn"};
return ((""+i).chars().mapToObj(y->s[y-48]).collect(Collectors.joining())+"ium").replace("ii","i").replace("nnn","n");
}

3
Chào mừng bạn đến với Câu đố lập trình & Code Golf! 1. Mã của bạn, dưới dạng một chương trình đầy đủ hoặc một hàm, nên chấp nhận một số nguyên làm đầu vào và tạo tên thích hợp. 2. Điều này không giải thích iinnn, như được giải thích trong câu hỏi. 3. Mục tiêu của mã golf là làm cho mã càng ngắn càng tốt. Câu trả lời nên chứa điểm của nó trong tiêu đề. Bạn có thể giảm điểm của mình bằng cách loại bỏ khoảng trắng và rút ngắn tên biến.
Dennis

@Dennis Cảm ơn! nhưng tại sao lại tính khoảng trắng? nó chỉ làm cho mã thậm chí không thể đọc được.
Rnet

3
@Rnet Mục tiêu không phải là làm cho mã có thể đọc được. ;) Ngoài ra một số khoảng trắng có thể có ý nghĩa, vì vậy không rõ khoảng trắng nào được tính và không phải khoảng trắng. Do đó, câu trả lời nên loại bỏ càng nhiều khoảng trắng càng tốt và chỉ cần đếm số byte của phiên bản đó. Nếu bạn muốn cung cấp một phiên bản có thể đọc được với thụt lề thích hợp, bạn luôn có thể làm điều đó một cách riêng biệt bên dưới mã được tính. Xem sự đồng thuận có liên quan về meta.
Martin Ender

0

C # 229 (Bibiennium) 198 byte unennoctium

Thủ thuật "n-'0 '" là một cách để chuyển đổi từ ascii sang int. Char 9 = ASCII 57. Char 0 = ASCII 48, vì vậy 57-48 = 9.

chuỗi riêng tĩnh ToText (int v) {return (string.Join ("", v.ToString (). Chọn ((char n) => "nil un bi tri quad pent hex sept oct enn" .Split () [n -'0 '])) + "ium"). Thay thế ("nnn", "nn"). Thay thế ("ii", "i") + "" + chuỗi.Join ("", v.ToString () .Select ((char n) => "nubtqphsoe" [n-'0 '])); }

    static private string ToText(int  v)
    {
        string u,r="",t="";
        return v.ToString().Select((char n)=>{u="nil un bi tri quad pent hex sept oct enn".Split()[n-48];r+=u;t+=u[0];return r;}).Last()+"ium".Replace("nnn","nn").Replace("ii","i")+" "+t;
    }

Cách tiếp cận này lấy int, chuyển đổi thành một chuỗi, sau đó thực hiện một lựa chọn LINQ của các ký tự bắn ra lambda.

Lambda tạo ra một mảng khi đang bay (ít ký tự hơn xác định nó) bằng cách tách chuỗi tiền tố. Sau đó, nó kéo chỉ mục của tiền tố để sử dụng bằng cách xem giá trị int của ký tự hiện tại (mẹo n-'0 'được đề cập ở trên).

Tất cả được gói gọn trong một chuỗi.Join kết hợp tất cả các kết quả LINQ lại với nhau. Giải quyết "ium", sau đó là một vài câu lệnh .Replace ở cuối để dọn sạch nnn 'và ii.

Đã thêm đầu ra ký hiệu bị thiếu. Tôi nghĩ có một cách hiệu quả hơn bằng cách hợp nhất hai LINQ, nhưng đó là cách muộn để tiếp tục chọc vào nó.


Thay vì n-'0', tại sao không n-30?
undergroundmonorail

Cuộc gọi tốt, nhưng nó phụ thuộc vào bộ ký tự. 48 công việc cho tôi mặc dù;)
Rick Way

0

C, 210 204 byte thiên niên kỷ (199)

Điều này đòi hỏi ASCII là bộ ký tự thời gian chạy.

f(char*n,char*s){char*c="NilUnBiTriQuadPentHexSeptOctEnn",*p,*o=n,i,j;for(;*n;){for(j=i=*n-48,p=c;*p&32||i--;++p);for(*s++=*n=*p+32;*++p&32;)*s++=*p;s-=*n++-j==39||j/2-*n==1;}*o-=32;strcpy(s,"ium");}

Tôi đã thử một giải pháp đệ quy (tránh sự cần thiết po) nhưng điều đó hóa ra lâu hơn.

Tôi đặc biệt tự hào / xấu hổ về công cụ đối sánh cho biểu thức chính quy 90|[23]$, dựa trên 90là các chữ số tách biệt xa nhất (và do đó, cặp duy nhất khác nhau 9 - 39trong mã là kết quả của jgiá trị nguyên và *nvẫn là ASCII ký tự) và điều đó 23chỉ khác nhau ở bit cuối cùng, do đó chia cho 2 liên kết chúng.

Mã mở rộng:

void f(char *n,                 /* input number / output symbol */
       char *s)                 /* output name */
{
    char *c = "NilUnBiTriQuadPentHexSeptOctEnn", /* digit names */
        *p,
        *o = n,                 /* first char of input */
        i, j;                   /* current digit value */
    for (;*n;) {
        j = i = *n-48;
        for (p=c;  *p&32 || i--;  ++p) /* Find the i'th capital letter in c */
                ;
        for (*s++ = *n++ = *p++ + 32;  *p&32;  ) /* Downcase and copy following lowercase */
            *s++ = *p++;
        s -= *n-j==39 || j/2-*n==1;   /* backup one if 9 is followed by 0, or if 2 or 3 is at end of input */
    }
    *o -= 32;                   /* Capitalise symbol */
    strcpy(s,"ium");            /* Finish name */
}

Khai thác thử nghiệm:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char buf[1024];
    while (*++argv) {
        f(*argv, buf);
        printf("%s %s\n", *argv, buf);
    }
    return EXIT_SUCCESS;
}

0

R, 278 byte

g<-function(x){k<-data.frame(c("nil","un","bi","tri","quad","pent","hex","sept","oct","enn"));row.names(k)<-0:9;n<-unlist(strsplit(as.character(x),""));return(sub("nnn","nn",sub("ii","i",paste(c(as.vector(k[n,]),"ium"," ",sapply(k[n,],function(x)substr(x,1,1))),collapse=""))))}

Không phải là tốt nhất ... nhưng tôi vẫn đang học R nên tôi nghĩ tôi sẽ đăng nỗ lực của mình. Bất kỳ đề xuất để làm cho nó tốt hơn? Bây giờ tôi nghĩ về nó, có lẽ có thể tập hợp con trên hàng thứ 1 thay vì lãng phí không gian tạo tên hàng.

Ví dụ sử dụng

> g(118)
[1] "ununoctium uuo"
> g(999)
[1] "ennennennium eee"
> g(558)
[1] "pentpentoctium ppo"
> g(118)
[1] "ununoctium uuo"
> g(90)
[1] "ennilium en"
> g(2)
[1] "bium b"

Ung dung

g <- function(x) {
    k <- data.frame(c("nil","un","bi","tri","quad","pent","hex","sept","oct","enn"))
    row.names(k) <- 0:9
    n <- unlist(strsplit(as.character(x),""))
    return(
        sub("nnn", "nn", sub("ii", "i", paste(c(as.vector(k[n,]),"ium"," ", sapply(k[n, ],function(x)substr(x,1,1))), collapse = ""))))
}
  1. Tạo khóa, chuyển đổi thành khung dữ liệu và đặt làm biến k
  2. Đặt tên hàng như 0-9để dễ nhận biết
  3. Lấy đầu vào x, chuyển đổi thành ký tự, tách nó ra (ví dụ: 137 thành "1" "3" "7")
  4. Tập hợp con kdựa trên đầu vào số tách và trả về các mục
  5. Nối chúng lại với nhau và thêm -ium
  6. Ngoài ra tập hợp con ksử dụng chuỗi con để kéo chữ cái đầu tiên của trận đấu. Điều này được nối với đầu ra của bước 5 với một khoảng trống giữa chúng
  7. Sử dụng sub()để thay thế nnniicác mẫu

Bạn quên viết hoa chữ cái đầu tiên của biểu tượng. Ví dụ: nó phải là "Uuo", không phải "uuo", cho 118.
Alexander Revo

0

Javascript - 169 byte

n=>eval(`q='nil0un0bi0tri0quad0pent0hex0sept0oct0enn'.split(0);for(b of (_=$='')+n){c=q[b];$+=q[b];_+=(_?c:c.toUpperCase())[0]}$.replace(/i$()|n(nn)/g,'$1$2')+'ium '+_`)

Kỳ lạ thay, những nỗ lực sử dụng bản đồ của tôi dài hơn vòng lặp for.

EDIT: Rất tiếc, quên kiểm tra ngày.


0

PHP, 131 + 1 byte (unriunium)

vẫn còn rất lâu

for(;~$c=$argn[$i];print$i++?$n[0]:$n&_)$r.=$n=[nil,un,bi,tri,quad,pent,hex,sept,oct,enn][$c];echo strtr(_.$r.ium,[ii=>i,nnn=>nn]);

Chạy như ống với -nRhoặc thử trực tuyến .


-1

Python, 154 byte

import re
n=input('')
for c in n:
 print(re.sub('ii','i',re.sub('nnn','nn',['nil','un','bi','tri','quad','pent','hex','sept','oct','enn'][int(c)]+'ium')))

Mã này tạo đầu ra không hợp lệ.
Alexander Revo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.