ชื่อองค์ประกอบด้านบน 118


46

IUPACในภูมิปัญญาที่ไม่สามารถทำได้ของพวกเขาได้สร้างชื่อองค์ประกอบที่เป็นระบบสำหรับองค์ประกอบที่สร้างขึ้นใหม่ นี่คือชื่อชั่วคราวขององค์ประกอบจนกว่าพวกเขาจะตัดสินใจเกี่ยวกับชื่อจริง มันทำงานได้เช่น: แต่ละหลักของหมายเลของค์ประกอบจะถูกกำหนดคำนำหน้าตามค่าของมัน คำนำหน้าจะถูกรวมเข้ากับ 'ium' ในตอนท้าย เมื่อดำเนินการเสร็จแล้วและหากคุณได้รับ double i's (ii) หรือ triple n's (nnn) ให้แทนที่พวกเขาด้วย single i's และ double n's สัญลักษณ์สำหรับองค์ประกอบคือตัวอักษรตัวแรกของคำนำหน้าแต่ละคำที่ใช้ต่อกันและผลลัพธ์เป็นตัวพิมพ์ใหญ่ คำนำหน้าใช้อยู่ด้านล่าง

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

ดังนั้นสำหรับกอล์ฟนี้รหัสของคุณจำเป็นต้องสร้างทั้งชื่อองค์ประกอบและสัญลักษณ์ของมันสำหรับจำนวนเต็มบวกที่กำหนด ดังนั้นหากรหัสของคุณได้รับ 137 ก็ควรพิมพ์ที่ stdout หรือกลับทั้งสองและuntriseptium Utsมันควรจะถูกต้องอย่างน้อยที่จะ 118 558 สิ่งที่สูงกว่านั้นใช้ได้หากไม่เพิ่มความยาวรหัส

ตัวอย่าง Python แสดงวิธีการ:

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ชนะด้วยแคดเมียมไบต์!


34
ฉันจะเริ่มโทรโบรอนโดยชื่อองค์ประกอบของระบบ IUPAC: "Pentium"
Michael


1
เราจะต้องมีกรณีที่ถูกต้อง?
lirtosiast

6
@BetaDecay "องค์ประกอบที่ห้า" นี้รองรับMultiPassหรือไม่
Damian Yerrick

คำตอบ:


22

Mathematica 10.1, อินเดียม (49)แคดเมียม (48)

โซลูชันนี้ใช้ไลบรารีองค์ประกอบคุณสมบัติขององค์ประกอบรวมถึงชื่อ IUPAC และตัวย่อ (ฉันไม่ได้เห็นสิ่งนี้เป็นเทคนิคที่ควรหลีกเลี่ยงในกอล์ฟดูเหมือนจะได้รับการสนับสนุน แต่นี่อาจเป็น (อาจจะมากกว่า) ขอบที่ยอมรับได้ - Mathematica ใช้ห้องสมุดนี้ (และอื่น ๆ อีกมากมาย) โดยการดาวน์โหลดข้อมูลจาก เซิร์ฟเวอร์ของ Wolfram ในครั้งแรกที่คุณใช้งาน (และฉันเชื่อว่าจะตรวจสอบการอัปเดตเป็นครั้งคราว)

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"} *)

สิ่งนี้จะเปรียบเทียบกับการใช้ elements.py หรือ periodictable.py ใน Python ได้อย่างไร

แก้ไข: เดือนต่อมา: สังเกตเห็นว่าฉันได้พิมพ์ตัวย่อผลลัพธ์ของ 122 ฉันได้เรียกใช้รหัสอีกครั้งและตรวจสอบว่าฉันทำผิดพลาดนี้ไม่ใช่ Mathematica


9
เมื่อฉันเขียนถึงความท้าทายฉันคิดว่า "ฉันควรป้องกันไม่ให้มีฟังก์ชั่นในตัวใช่ไหมมันไม่น่าเป็นไปได้ที่ภาษานี้จะมีอยู่ภายในตัวเครื่องรอสักครู่ Mathematica อาจมี" แต่ฉันไม่รู้วิธีตรวจสอบแล้วลืมมันไปทันที
สถานะ

7
แบทแมน! ย่อหน้านั้นดูเหมือนสิ่งที่ฉันสามารถเขียนได้ (เช่นกันฉันมีความผิดในการใช้ parentheticals เป็น asides ในความพยายามที่จะลดการใช้คำฟุ่มเฟื่อยของฉัน - พวกเขามักจะเป็นเช่นนี้)
โคล

1
คุณสามารถบันทึกหนึ่งไบต์มากขึ้นโดยใช้ภายในนำมาใช้และทำให้ตัวเองฟังก์ชั่นบริสุทธิ์f f=ElementData@@@{{#,"Abbreviation"},{#,"Name"}}&

รหัสนี้จะไม่ถูกต้องสำหรับ 118 หากองค์ประกอบของคำถามได้รับชื่ออย่างเป็นทางการหรือไม่

1
@ ais523: ตามข้อกำหนด "ดังนั้นสำหรับกอล์ฟนี้รหัสของคุณจำเป็นต้องสร้างทั้งชื่อองค์ประกอบและสัญลักษณ์ของมันสำหรับจำนวนเต็มบวกที่กำหนด" หากองค์ประกอบมีชื่อหรือสัญลักษณ์ควรรายงานชื่อหรือสัญลักษณ์นั้น จากการวัดของคุณการส่งอื่น ๆ ในหน้านี้จะไม่เป็นไปตามข้อกำหนดหากองค์ประกอบใดที่มีหมายเลขอะตอม> = 118 ได้รับสัญลักษณ์หรือชื่อระบบ
Eric Towers

27

Python 3, Unhexseptium (167) ไบต์

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())

เหล่านี้คือผลลัพธ์เมื่อโปรแกรมทำงานบนทุกหมายเลขตั้งแต่ 1 ถึง 999 (รวม)


30
ส่วนหัวของคุณทำให้ฉันต้องการให้ทุกคนแสดงรายการจำนวนไบต์ในแบบนั้น
สถานะ

4
@ สถานะได้ยินได้ยิน นี่จะทำให้พวกพี ธ เศร้ามาก ... :)
บีกเกอร์

1
@beaker ฉันผิดหวังที่รูปโปรไฟล์ของคุณไม่ใช่Beaker ;)
Beta Decay

4
@BetaDecay เรียบร้อยแล้ว
บีกเกอร์

6
@ สถานะ: ถ้ามีคนจัดการที่จะทำในน้อยกว่า 112 ไบต์พวกเขาสามารถมีชื่อองค์ประกอบคลาสสิกในชื่อ :) ชอบรัทเธอร์เฟิร์ม หรือทอง
vsz

15

Pip , ทอเรียมแอ คติเนียมเรเดียม (86)

(อย่าสูดดมรายการนี้มันจะทำให้คุณเป็นมะเร็งปอด)

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

รับหมายเลของค์ประกอบเป็นอาร์กิวเมนต์บรรทัดคำสั่งและส่งออกชื่อและตัวย่อในบรรทัดแยกต่างหาก

คำอธิบาย (ค่อนข้าง ungolfed):

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)

The iiand nnnhandling ใช้การแทนที่ regex ด้วยฟังก์ชั่นการโทรกลับ (เพิ่มใน Pip เวอร์ชันล่าสุด): สำหรับทุกคู่ที่ตรงกันii|nnnให้เลือกทั้งหมดยกเว้นตัวอักษรตัวแรกและใช้แทน


Protip: แม้ว่าการสูดดมไอเท็มอื่นอาจไม่ทำให้คุณเป็นมะเร็งปอดแต่ก็อาจจะไม่ดีที่สุดสำหรับสุขภาพของคุณ
Cyoce

14

รุ่น GNU, 171 (ไม่ถูกต้อง)

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

ฉันถือว่ามันไม่สำคัญว่าชื่อและสัญลักษณ์จะถูกส่งกลับมาที่นี่ลำดับสัญลักษณ์มาก่อน:

$ 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
ฉันไม่คิดว่าสองสิ่งสุดท้ายที่ต้องการแทนที่g; กรณีที่จะอยู่ที่biium/ triiumและennnilซึ่งทั้งหมดนี้สามารถเกิดขึ้นครั้งเดียวในจำนวนภายใต้ 1000
PurkkaKoodari

8

Mathematica, unhexunium 163 161 bytes

ตอนนี้ใช้สัญลักษณ์เป็นตัวพิมพ์ใหญ่

นี่คือ Mathematica โดยไม่ต้องมีใน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"}]&

ทดสอบเลขสุ่ม 10 ตัว:

# -> 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 (ไม่ จำกัด ) 171

การใช้อักษรตัวพิมพ์ใหญ่เป็นส่วนที่ยุ่งยาก (ทดสอบใน FireFox)

แก้ไข 3 ไบต์บันทึก 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>


ส่งคืน*eniumแทน*enniumสิ่งใดก็ตามที่*9
DankMemes

รุ่น Unhexhexium: n => [([... n] .map) (c => (c = 'ไม่มี, ไม่, สอง, สาม, สี่, ถูกคุมขัง, ตุลาคม, enn'.split`, `[ C] ฉัน = c [0], s = s s + i:?. i.toUpperCase () c), s = ''.) join`` + 'ium) แทนที่ (/ II | nnn / g , r => r.slice (1)), s]
Mama Fun Roll

@molarmanful [...n]จะล้มเหลวสำหรับพารามิเตอร์ int ความท้าทายเป็นเรื่องเกี่ยวกับa given positive integer
edc65

คุณสามารถรับ unhexoctium หากคุณแทนที่ 'replace` call เพื่อreplace(/i(i)|n(nn)/g,'$1$2')
หวังว่าฉันสามารถช่วย

@ user2786485 ขอบคุณฉันคิดเกี่ยวกับการใช้การจับภาพ แต่ไม่พบวิธีที่ถูกต้อง
edc65

7

ทับทิม - 163 156 147 143 134 (Untriquadium) ไบต์

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

ฉันหวังว่าจะลงเล่นกอล์ฟแบบนี้

แก้ไข: ขอบคุณสำหรับ @steveverrill สำหรับการลบขนาด 9 ไบต์!

แก้ไข 2: ขอบคุณสำหรับ @steveverrill อีกครั้งสำหรับอีก 4 ไบต์! (ทางออกที่ฉลาดจริงๆ!)


1
1. แทนที่จะคุณสามารถใช้each_char charsตามเอกสารทับทิมอย่างเป็นทางการคือ "เลิก" ( แต่ไม่ได้อยู่ใน codegolf!) คุณอาจจะทำอย่างไรดีกับeach_byteหรือbytesแล้วจะกลายเป็นตัวอย่างc.to_i i%482. โดยบังเอิญ\nมีรหัส ASCII 10 ดังนั้นบางทีคุณสามารถกำจัดchopและรวมiumไว้ในอาร์เรย์ของคุณ (ใช้งานได้ดีสำหรับชื่อองค์ประกอบ แต่เพิ่มเสแสร้งiเป็นสัญลักษณ์องค์ประกอบ)
ระดับแม่น้ำ St

1
คุณสามารถบันทึกอีก 5 ไบต์ด้วยtr_sเช่นนี้: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.chopu[0..-2]จะสั้นกว่า บางทีฉันควรจะโพสต์คำตอบของฉันเอง แต่ความคิดเริ่มต้นของฉันคือทำอย่างที่คุณทำ มันสนุกมากที่ได้ช่วยคุณเล่นกอล์ฟ ฉันสมบูรณ์พลาดที่คุณไม่จำเป็นต้องมาก่อนdowncase capitalize
เลเวลริเวอร์เซนต์

7

Pyth, 67 ไบต์ (Holmium)

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

ลองใช้ออนไลน์ในPyth คอมไพเลอร์

มันทำงานอย่างไร

            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 ไบต์ ( Biunnilium Binilbium)

ลบด้วย octium (8) ไบต์ขอบคุณ @ edc65!

130 159 147 Bytes (Untrinilium Unpentennium Unquadseptium)

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``

f(324)การป้อนข้อมูลเช่น ฮึฉันรู้สึกกอล์ฟจัง


@ edc65 แก้ไขปัญหาทั้งสามข้อ
Conor O'Brien

1
ละเอียด. ตอนนี้การใช้เทมเพลตสตริงคุณสามารถหลีกเลี่ยงวงเล็บและบันทึก 8 ไบต์codegolf.stackexchange.com/a/52204/21348
edc65

6

CJam, 74 72 71 70 69 ไบต์ (Thulium)

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

โปรดทราบว่ารหัสมีอักขระที่ไม่สามารถพิมพ์ได้

ขอบคุณ @ Sp3000 ที่ชี้ให้เห็นข้อผิดพลาดในการแก้ไขครั้งแรกของฉันและแนะนำ)/วิธีการ

ลองใช้ออนไลน์ในล่าม CJam:

มันทำงานอย่างไร

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
ความจริงแล้วสนุก: ทังสเตนมักใช้ในทองคำแท่งและเหรียญปลอมเนื่องจากมีความหนาแน่นสูงที่สุดเมื่อเทียบกับทองคำและราคาถูกสัมพัทธ์
lirtosiast

1
Lutetium เป็นชื่อที่เจ๋งมากสำหรับองค์ประกอบ
T. Sar - Reinstate Monica

@ThalesPereira ถึงจะเย็นกว่า Ytterbium เหรอ?
Beta Decay

สนุกจริง: เออร์เบียม, เทอร์เบียม, อิตเทรียมและอิตเทอร์เบียมทั้งหมดตั้งชื่อตามสถานที่เดียวกัน
lirtosiast

5

Matlab, 170 (Unseptnilium)

ใช้งานได้กับอินพุตทั้งหมดที่คุณสามารถโยนได้ไม่ว่าจะniliumสูงหรือไกลก็ตาม ฉันไปถึงennennennennennennennennennennennennennennennennennennennennennenniumก่อนที่ฉันจะยอมแพ้ด้วยการกดปุ่ม 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]);

และคำอธิบาย:

%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 ไบต์

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

หมายเลของค์ประกอบ N สามารถมี "n" สามเท่าได้ถ้ามันลงท้ายด้วย 90 และสามารถมี "i" สองเท่าหากหลักสุดท้ายคือ 2 หรือ 3 เราใช้คณิตศาสตร์เพื่อตรวจสอบกรณีเหล่านั้น

จำนวนมายากล1.5154ที่เก็บความยาวของแต่ละคำนำหน้าถูกพบโดยใช้สคริปต์ Python เพื่อค้นหาทศนิยมทั้งหมดของความยาว≤7โดยใช้ฟังก์ชั่นcosh(, และcos(e^(

ยังไม่เสร็จกอล์ฟ แต่ตัวอักษรตัวพิมพ์เล็กสองไบต์ของ TI-BASIC และการขาดคำสั่งการจัดการสตริงเช่นเคยจะทำให้คะแนนของโปรแกรมนี้เสียหาย


ฉันจะเล่นกอล์ฟลง ^ _ ^ ฉันจะบอกให้คุณรู้ว่าฉันเกิดอะไรขึ้น
Conor O'Brien

ฉันไม่คิดว่ามันจะเป็นไปได้สำหรับทุกคนที่จะลดลงถึง 118 หรือน้อยกว่านี้ แต่ถ้ามีคนจัดการฉันจะให้ 500 ตัวแทน
lirtosiast

คำถามสองข้อ: N% คืออะไรและ "" และ "" คืออะไร?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴขออภัย% เป็นโทเค็นสองไบต์ที่คุณไม่สามารถพิมพ์ลงในเครื่องคิดเลขของคุณได้ ใช้SourceCoderหรือเครื่องมือของ TI เพื่อแก้ไขลงในซอร์สหรือใช้ไฟล์ที่ฉันให้ไว้
lirtosiast

@ CᴏɴᴏʀO'Bʀɪᴇɴเป็นตัวห้อย 10 ฉันได้ทำการแทนที่ด้วยค่าปกติ 10
lirtosiast

2

Python 3, unpentquadium ( 156 155 154) ไบต์

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())

แทนที่จะแทนที่iiด้วยiเราจะหยุดยั้งis ก่อนที่เราจะจับiumมันเพราะมันเป็นแหล่งเดียวของ double is ในทำนองเดียวกันเราจะตัดns โดยตรวจสอบenn/nilกรณีและปัญหา


2

Retina, 206 196 186 179 (Unseptennium) ไบต์ ( ลองออนไลน์ )

ขอบคุณ @ MartinBüttner ( https://codegolf.stackexchange.com/users/8478/martin-b%C3%BCttner ) สำหรับการสอนภาษานี้ให้ฉัน

ขอบคุณ@FryAmTheEggman ที่ตัดออกได้ 7 ไบต์

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`^.

รุ่น Ueh-byte: ที่นี่

รุ่น Bnh-byte: ที่นี่


2

CJam, 95 ไบต์

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

ลองออนไลน์

สิ่งนี้จะแข่งขันในหมวดหมู่ "ภาษาที่ไม่มี regex และใช้อักขระที่พิมพ์ได้เท่านั้น" ;) ไม่ได้คาดหวังว่ามันจะสั้นเท่ากับโซลูชันที่โพสต์ไปแล้วบางส่วน แต่ฉันอยากรู้ว่ามันจะจบลงนานเท่าไหร่ และตั้งแต่ฉันได้รับตอนนี้ฉันก็อาจโพสต์ได้

คำอธิบาย:

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
เพื่อการอ้างอิงเท่านั้นเดนนิสบันทึกได้เพียง 6 ไบต์ด้วยการเข้ารหัสพื้นฐานทั้งหมด: P
Sp3000

1

ไป, 322 ไบต์ (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)}

อ่านอักขระสามตัวจาก STDIN และจะถูกละเว้นมากกว่าส่งผลให้เกิดความผิดพลาดน้อยลง ดังนั้นการทำงานสำหรับตัวเลขระหว่างทุกและunnilniliumennennennium


นอกจากนี้องค์ประกอบของ 322 ไบต์ไม่ควรเป็น Tribibinium 321 คือ tribiunium
Mateon1

ประณามฉันคิดถึงอันนั้นเมื่อเพิ่ม "i" ตอนนี้ทุกอย่างควรเป็นระเบียบ
Fabian Schmengler

1

PowerShell, 170 168 165 (ไม่ได้ขยาย)

-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]})

ค่อนข้างตรงไปตรงมาและไม่น่าประหลาดใจที่นี่ ยกเว้นบางทีฉันอาจแก้ไขปัญหาการใช้อักษรตัวพิมพ์ใหญ่โดยการใส่ทุกอย่างให้ต่ำลง แต่ส่วนแรกและมีแต่ละส่วนอยู่ในชื่อเรื่องแล้ว ตอนนี้ Inline อย่างระมัดระวังเพื่อหลีกเลี่ยงการสูญเสียตัวละครสำหรับการกำหนดตัวแปรเปล่า

โบนัสหลังจากการเปลี่ยนแปลงครั้งล่าสุด: ตอนนี้ใช้ได้กับหมายเลของค์ประกอบที่ยาวขึ้นเช่นกัน

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

1

C ใน 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);}

อ่านตัวเลขจากและพิมพ์ผลให้stdin อาศัยstdoutsizeof(char*) == sizeof(int)

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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 ไบต์)

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

ลดการโกน 34 ไบต์ด้วย nimi


1
คุณสามารถ hardcode nnnและiiกรณีเข้าrเช่นและเรียกมันโดยไม่ขัดแย้ง:r('i':'i':a)='i':r a;r('n':'n':'n':a)="nn"++r a;r(x:a)=x:r a;r x=x t=r.m.p
nimi

@nimi ไชโยสำหรับสิ่งนั้น!
jkabrg

1
จำนวนไบต์ที่จะบันทึกเพิ่มเติม: concatMapคือ>>=คือp n=(n>>=(words"..."!!))++"ium "
nimi

@nimi Cheers อีกครั้ง
jkabrg

1

รุ่น GNU, unhexunium (161 ไบต์)

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

ฉันสร้างสัญลักษณ์ก่อนจากนั้นซ่อนไว้ในพื้นที่พักและสร้างชื่อ การวนซ้ำนั้นง่ายกว่าการใช้/gสำหรับการแทนที่สี่ครั้งขึ้นไป (เราสามารถมีได้เพียงหนึ่งiiและ / หรือหนึ่งnnnเท่านั้นดังนั้นพวกเขาจึงไม่จำเป็นต้องอยู่ในวง แต่มันไม่เจ็บ) ในที่สุดเรียกและผนวกสัญลักษณ์ที่ถืออยู่

(NB ฉันไม่เห็นคำตอบที่มีอยู่เมื่อฉันเขียนสิ่งนี้)

กรณีทดสอบ

แบบฝึกหัดเหล่านี้iiและnnnกฎพิเศษ:

$ 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

และหนึ่งที่ไร้สาระแสดงให้เห็นว่ารหัสนี้ให้มากขึ้นเมื่อเทียบกับโลกทางกายภาพ:

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

1

T-SQL 329 ไบต์

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')

จัดรูปแบบ:

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ไบต์, ไม่มีการควบคุม

อย่างน้อย PHP ก็อยู่ที่ประมาณเวลานี้

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);

เรียกใช้บรรทัดคำสั่งแบบฟอร์มเช่น:

pentium.php 163

เอาท์พุท:

unhextrium Uht

Ungolfed

$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);

แก้ไข

  • บันทึก 10 ไบต์โดยแทนที่ทั้งหมด (ไม่เพียงหนึ่งduh ) array()-initializer ด้วย[]
  • บันทึก 1 ไบต์โดยการเพิ่มช่องว่างพร้อมด้วย'ium 'แทนการใช้การเชื่อมต่อพิเศษ.' '.

0

Perl, 109 (Unnilennium) ไบต์

108 รหัส + 1 สวิตช์

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'

รับอินพุตจาก STDIN เป็นหนึ่งหมายเลขต่อบรรทัด


คุณหมายถึง un n ilseptium :)
CompuChip

อ่าขอบคุณที่บอกให้ทราบ :) แก้ไขเดี๋ยวนี้
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
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! 1. รหัสของคุณในรูปแบบของโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นควรยอมรับจำนวนเต็มเป็นอินพุตและสร้างชื่อที่เหมาะสม 2. สิ่งนี้ไม่ได้คำนึงถึงiiและnnnตามที่อธิบายไว้ในคำถาม 3. วัตถุประสงค์ของการเขียนโค้ดคือการทำให้รหัสสั้นที่สุด คำตอบควรมีคะแนนอยู่ในชื่อเรื่อง คุณสามารถลดคะแนนของคุณโดยกำจัดช่องว่างและทำให้ชื่อตัวแปรสั้นลง
เดนนิส

@ เดนนิสขอบคุณ! แต่ทำไมต้องนับช่องว่าง? มันทำให้โค้ดไม่สามารถอ่านได้มากขึ้น
Rnet

3
@Rnet เป้าหมายไม่ทำให้โค้ดอ่านได้ ;) ช่องว่างบางช่องอาจมีความสำคัญด้วยดังนั้นจึงไม่ชัดเจนว่าช่องว่างที่จะนับและที่ไม่ ดังนั้นคำตอบควรลบช่องว่างให้มากที่สุดและนับจำนวนไบต์ของเวอร์ชันนั้น หากคุณต้องการให้รุ่นที่อ่านได้มีการเยื้องที่เหมาะสมคุณสามารถแยกจากด้านล่างของรหัสที่นับได้เสมอ ดูฉันทามติที่เกี่ยวข้องใน meta
Martin Ender

0

C # 229 (Bibiennium) 198 unennoctium ไบต์

เคล็ดลับ "n-'0" "เป็นวิธีการแปลงจาก ascii เป็น int ถ่าน 9 = ASCII 57. Char 0 = ASCII 48, ดังนั้น 57-48 = 9

สตริงส่วนตัวแบบคงที่ ToText (int v) {return (string.Join ("", v.ToString (). เลือก ((ถ่าน n) => "ไม่มีสองสามรูปสี่เหลี่ยมจัตุรัสฐานสิบหกหกเหลี่ยมตุลาคม enn". แยก () [n -'0 '])) + "ium") แทนที่ ("nnn", "nn") แทนที่ ("ii", "i") + "" + สตริง.Join ("", v.ToString () .Select ((ถ่าน 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;
    }

วิธีการนี้ใช้ค่า int แปลงเป็นสตริงจากนั้นทำการเลือก LINQ ของอักขระที่ไล่แลมบ์ดา

แลมบ์ดาสร้างอาร์เรย์ขึ้นมาทันที (ตัวอักษรน้อยกว่าที่กำหนดไว้) โดยแยกสตริงของส่วนนำหน้า จากนั้นจะดึงดัชนีของส่วนนำหน้าเพื่อใช้โดยดูที่ค่า int ของอักขระปัจจุบัน (เคล็ดลับ n-'0 'ที่กล่าวถึงข้างต้น)

ทั้งหมดที่รวมอยู่ในสตริงเข้าร่วมซึ่งเชื่อมผลลัพธ์ LINQ ทั้งหมดเข้าด้วยกัน ยึดติดกับ "ium" จากนั้นสองสามคำสั่งแทนที่ในตอนท้ายเพื่อทำความสะอาด nnn 'และ ii's

เพิ่มเอาต์พุตสัญลักษณ์ที่หายไป ฉันคิดว่ามันมีวิธีที่มีประสิทธิภาพมากขึ้นด้วยการรวม LINQ สองตัวเข้าด้วยกัน


แทนที่จะn-'0'ทำไมไม่n-30?
undergroundmonorail

การโทรที่ดี แต่ขึ้นอยู่กับชุดอักขระ 48 ใช้ได้สำหรับฉัน;)
Rick Way

0

C, 210 204 unennennium (199) ไบต์

สิ่งนี้ต้องการ ASCII เป็นชุดอักขระรันไทม์

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");}

ฉันลองใช้โซลูชันแบบเรียกซ้ำ (ซึ่งหลีกเลี่ยงความต้องการpและo) แต่กลับกลายเป็นอีกต่อไป

ฉันภาคภูมิใจโดยเฉพาะอย่างยิ่ง / ละอายใจของการจับคู่สำหรับ regexp 90|[23]$ซึ่งอาศัย9และ0เป็นตัวเลขที่แยกกันมากที่สุด (และดังนั้นคู่เท่านั้นที่แตกต่างกัน 9 - 39ในรหัสเป็นผลมาจากjการเป็นค่าจำนวนเต็มและ*nยังเป็น ASCII ตัวอักษร) และที่2และ3แตกต่างกันในบิตสุดท้ายดังนั้นการหารด้วย 2 conflates พวกเขา

รหัสขยาย:

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 */
}

สายรัดทดสอบ:

#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 ไบต์

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=""))))}

ไม่ใช่สิ่งที่ดีที่สุด ... แต่ฉันยังคงเรียนรู้ R ดังนั้นฉันคิดว่าฉันโพสต์ความพยายามของฉัน ข้อเสนอแนะใด ๆ ที่จะทำให้ดีขึ้น? ตอนนี้ฉันคิดว่ามันอาจเป็นไปได้ที่จะเซตย่อยในแถว nth-1 แทนที่จะเสียพื้นที่ในการสร้างชื่อแถว

ตัวอย่างการใช้งาน

> 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"

Ungolfed

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. สร้างคีย์แปลงเป็นเฟรมข้อมูลและตั้งเป็นตัวแปร k
  2. ตั้งชื่อแถว0-9เพื่อให้ระบุได้ง่าย
  3. นำเข้าxแปลงเป็นตัวละครแยกมันออกมา (เช่น 137 ถึง "1" "3" "7")
  4. เซ็ตย่อยkขึ้นอยู่กับการป้อนตัวเลขแยกและส่งคืนรายการ
  5. เชื่อมต่อพวกเขาเข้าด้วยกันและเพิ่ม -ium
  6. ส่วนย่อยยังkใช้สตริงย่อยเพื่อดึงตัวอักษรตัวแรกของการแข่งขัน สิ่งนี้เชื่อมต่อกับเอาต์พุตของขั้นตอนที่ 5 โดยมีช่องว่างระหว่างทั้งสอง
  7. ใช้sub()เพื่อแทนที่nnnและiiรูปแบบ

คุณลืมใช้อักษรตัวแรกของสัญลักษณ์ ตัวอย่างเช่นควรเป็น "Uuo" ไม่ใช่ "uuo" สำหรับ 118.
Alexander Revo

0

Javascript - 169 ไบต์

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 '+_`)

จริงๆแล้วความพยายามในการใช้แผนที่ของฉันนั้นนานกว่าการวนซ้ำ

แก้ไข:โอ๊ะลืมตรวจสอบวันที่


0

PHP, 131 + 1 ไบต์ (untriunium)

ยังคงยาวมาก:

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]);

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


-1

Python ขนาด 154 ไบต์

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')))

รหัสนี้สร้างผลลัพธ์ที่ไม่ถูกต้อง
Alexander Revo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.