118を超える要素名


46

IUPACは、耐え難い知恵で、新しく作成された要素の体系的な要素名を作成しました。これは、実際の名前について最終的に決定するまでの要素の一時的な名前です。仕組みは次のとおりです。要素番号の各桁には、その値に基づいてプレフィックスが割り当てられます。プレフィックスは、末尾に「ium」と連結されます。これが完了し、ダブルi(ii)またはトリプルn(nnn)が発生した場合、それらをシングルiおよびダブルnに置き換えます。要素の記号は、連結され、結果が大文字で使用される各プレフィックスの最初の文字です。使用されるプレフィックスは次のとおりです。

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

エリックタワーズはカドミウムバイトで勝利します!


34
IUPACの体系的な要素名でボロンを呼び出し始めます:「ペンティアム」
マイケル


1
正しいケースが必要ですか?
リルトシアスト

6
@BetaDecayしかし、この「5番目の要素」はMultiPassをサポートしてますか?
ダミアンジェリック

回答:


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

これは、Pythonでelements.pyまたはperiodictable.pyを使用するのと比較してどうですか?

編集:数ヶ月後:122の略語の出力をタイプミスしたことに気づいた。コードを再実行し、Mathematicaではなくこのエラーを行ったことを確認した。


9
課題を書き上げていたとき、「組み込み関数を防ぐべきですか?いや、これがどの言語にも組み込まれている可能性は低い。待って、Mathematicaが持っているかもしれない」と思った。しかし、私はそれをチェックする方法を知りませんでした、そしてすぐにそれを忘れました。
ステータス

7
かっこいい、バットマン!その段落は私が書くことができたもののように見えます(私も、私の冗長性を緩和するために括弧として括弧を使用することの罪を犯します-それらは通常このようになります)。
コール

1
内部適用を使用し、fそれ自体を純粋な関数にすることにより、もう1バイトを節約できますf=ElementData@@@{{#,"Abbreviation"},{#,"Name"}}&

問題の要素が正式な名前を取得した場合、このコードは118では無効になりませんか?

1
@ ais523:仕様によると、「このゴルフでは、コードは要素名と特定の正の整数のシンボルの両方を生成する必要があります。」要素に名前または記号がある場合、その名前または記号を報告する必要があります。メトリックにより、原子番号が118以上の要素が体系的なシンボルまたは名前を取得した場合、このページの他のすべての送信は仕様を満たすことができません。
エリックタワーズ

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
@Status聞いて、聞いて。これにより、Pythの人たちは非常に悲しくなります... :)
ビーカー

1
@beakerあなたのプロフィール写真がビーカーではないことに失望します;)
ベータ崩壊

4
@BetaDecay完了。
ビーカー

6
@Status:誰かが112バイト未満でそれを行うことができた場合、タイトルに古典的な要素名を含めることができます:) rutherfordiumのように。または
VSZ

15

ピップトリウム アクチニウムラドン(86)

(このエントリを吸い込まないでください。肺がんになります。)

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

要素番号をコマンドライン引数として受け取り、名前と略語を別々の行に出力します。

説明(やや手付かず):

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)

用途(ピップの最新バージョンで追加)コールバック関数と正規表現の置換取り扱い:のすべての試合のために、すべて取るが、代替としての最初の文字と使用を。iinnnii|nnn


ヒント:他のエントリーを吸入しても肺がんにならない場合がありますが、それでもおそらくあなたの健康には最適ではありません。
チョイス

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

名前とシンボルがどの順序で返されるかは関係ないと思います。ここでは、シンボルが最初に来ます。

$ 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
最後の2つが必要を置き換えるとは思わないg。唯一のケースはbiium/ triiumおよびでennnil、これらはすべて1000未満の数で1回しか発生しません
。– PurkkaKoodari

8

Mathematica、unhexunium 163 161バイト

シンボルを大文字にする

これは組み込みのない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でテスト)

thx user2786485で保存された3バイトを編集

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 = 'nil、un、bi、tri、quad、pent、hex、sept、oct、enn'.split`、 `[ c]、i = c [0]、s = s?s + i:i.toUpperCase()、c)、s = '')。join '' + 'ium')。replace(/ ii | nnn / g 、r => r.slice(1))、s]
ママファンロール

@molarmanful [...n]は、intパラメーターに対して失敗します。課題は約a given positive integer
-edc65

「replace」コールを置き換えると、unhexoctiumを取得replace(/i(i)|n(nn)/g,'$1$2')
できます

@ user2786485 thxキャプチャの使用について考えましたが、正しい方法が見つかりませんでした
-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

私はこの方法でゴルフをしたいと思っています

編集:9バイトを削る@steveverrillをありがとう!

Edit2:もう4バイト、@ steveverrillをありがとう!(本当に賢い解決策!)


1
1.代わりにeach_charを使用できますchars。公式Rubyのドキュメントによれば、これは(ただし、codegolfに!)「非推奨」されたあなたは、おそらくともっと良いと思いますeach_bytebytesその後、c.to_i例えばなりi%48。2.また、偶然\nにasciiコード10があるため、配列を削除して、配列にchop含めることができiumます(要素名には適していますiが、要素シンボルにスプリアスが追加されます)
Level River 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.chopはより短いですu[0..-2]。たぶん私は自分の答えを投稿すべきだったかもしれませんが、私の最初のアイデアはあなたがやったのとまったく同じようにすることでした。しかし、これはあなたがこれをゴルフするのを手伝って楽しかったです。あなたがdowncase以前必要としなかったことを完全に逃しましたcapitalize
レベルリバーセント

7

Pyth、67バイト(ホルミウム)

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

Pyth Compiler / Executorでオンラインで試してください。

使い方

            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)

@ edc65のおかげで、マイナスオクチウム(8)バイト!

130159147バイト(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 3つの問題をすべて修正しました。
コナーオブライエン

1
いいよ さて、テンプレートの文字列を使用して、あなたは、いくつかのブラケットを回避することができ、多分8バイト保存codegolf.stackexchange.com/a/52204/21348
edc65

6

CJam、74 72 71 70 69バイト(ツリウム)

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
おもしろい事実:タングステンは、金に匹敵する極端な密度と比較的安価なため、偽造の金の延べ棒やコインによく使用されます。
リトシアスト

1
ルテチウムは、元素のとてつもなくクールな名前です。
T.サール-復活モニカ

@ThalesPereiraイッテルビウムよりもさらにクールですか?
ベータ崩壊

楽しい事実:エルビウム、テルビウム、イットリウム、イッテルビウムはすべて同じ場所にちなんで命名されています。
リトシアスト

5

Matlab、170(Unseptnilium)

あなたがnilium行きたい限り、あなたがそれに投げることができるすべての入力で動作します。私はennennennennennennennennennennennennennennennennennennennennennennium9キーを押すのをあきらめる前に到達しました。

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は、90で終わる場合はトリプル「n」のみ、最後の桁が2または3の場合はダブル「i」のみを持つことができます。これらのケースをチェックするには数学を使用します。

マジックナンバー1.5154各プレフィックスの長さを格納し、関数を使用して、長さのすべての小数を≤7検索するPythonスクリプトを使用していたcosh(cos(e^(

まだゴルフはしていませんが、TI-BASICの2バイトの小文字と文字列操作コマンドの欠如は、いつものように、このプログラムのスコアを傷つけます。


私はそれを下にゴルフに取り組んでいきます。^ _ ^私が思いついたことをお知らせします。
コナーオブライエン

誰もがこれを118以下に減らすことは不可能だと思いますが、誰かが管理できれば、500人の担当者を派遣します。
リスト管理者

2つの質問:N%とは何ですか? ""と ""とは何ですか?
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ申し訳ありませんが、%は電卓に入力できない2バイトのトークンです。CemetechのSourceCoderまたはTIのツールを使用してソースに編集するか、提供したファイルを使用します。
リルトシアスト

@CᴏɴᴏʀO'Bʀɪᴇɴは添え字10です。私はそれを通常の10に置き換えました
。-リトシアスト

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

代わりに置き換えるiii、我々はすべてのrstrip i我々は上タックする前にSをiumそれは、二重の唯一の可能なソースだから、iS。同様に、ケースをnチェックしてsを取り除きenn/nilます。


2

網膜、206 196 186 179(Unseptennium)バイト(オンラインそれを試してみてください

この言語を教えてくれた@MartinBüttner(https://codegolf.stackexchange.com/users/8478/martin-b%C3%BCttner)に感謝します。

7バイトを切り捨ててくれた@FryAmTheEggmanに感謝します。

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バイトバージョン:こちら


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"

オンラインで試す

これは「正規表現のない言語で、印刷可能な文字のみを使用する」というカテゴリで競合しています。;)すでに投稿されているソリューションのいくつかほど短いとは本当に思っていませんでしたが、とにかくどれだけ長くなるのか興味がありました。そして、私は今それを手に入れたので、私もそれを投稿するかもしれません。

説明:

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

Go、322バイト(トリビビウム)

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から3文字を読み取り、それ以上は無視され、クラッシュの結果は少なくなります。したがって、unnilniliumとの間のすべての数値で機能しennennenniumます。


また、322バイトの要素はトリビビニウムではありませんか?321はトリビウニウムです。
Mateon1

くそー、私は「i」を追加するときにそれを逃した。これですべてが
整う

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

かなり簡単で、驚くことはありません。多分、最初の部分以外のすべてを小文字にし、個々の部分をすでにタイトルケースに入れて、大文字の問題を解決したことを除けば。むき出しの変数の割り当てで文字が失われるのを避けるために、今では積極的にインライン化されています。

最後の変更後のボーナス:より長い要素番号でも機能するようになりました:

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

1

C on 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、結果をに出力しますstdout。に依存していsizeof(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

nimiのおかげで34バイト削られました。


1
あなたは、ハードコーディングすることができます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
さらにいくつかのバイトを保存:concatMapis >>=、すなわちp n=(n>>=(words"..."!!))++"ium "
-nimi

@nimi乾杯。
jkabrg

1

GNU sed、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、4つ以上の置換に使用するよりもゴルファーです(1つiiまたは1 つのみを使用できるnnnため、ループ内にある必要はありませんが、害はありません)。最後に、保持されているシンボルを取得して追加します。

(注:これを書いたとき、既存のsedの回答を見ていませんでした)

テストケース

これらはiinnn特別なルールを行使します。

$ 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

非ゴルフ

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

編集

  • すべて(1つだけでなくduh)を置き換えることで10バイトを節約array()しました。[]
  • 'ium '代わりに追加の連結を使用して空白を追加することで1バイトを節約しました.' '.

0

Perl、109(無制限)バイト

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からの入力を1行に1つの数値として受け取ります。


un n ilseptiumを意味します:)
CompuChip

ああ、指摘してくれてありがとう:)今すぐ修正
svsd

0

Java 8 216バイト

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
プログラミングパズルとコードゴルフへようこそ!1.完全なプログラムまたは関数の形式のコードは、入力として整数を受け入れ、適切な名前を生成する必要があります。2.これは、質問で説明されているように、iiおよびを考慮しませんnnn。3.コードゴルフの目的は、コードをできるだけ短くすることです。回答のタイトルにはスコアが含まれている必要があります。空白を削除して変数名を短くすると、スコアを減らすことができます。
デニス

@デニスありがとう!しかし、なぜ空白を数えるのですか?コードがさらに読みにくくなるだけです。
Rnet

3
@Rnet目標は、コードを読みやすくすることではありません。;)また、一部の空白は重要な場合があるため、どの空白をカウントするか、どの空白をカウントしないかは明らかではありません。したがって、答えはできるだけ多くの空白を削除し、そのバージョンのバイト数を単純にカウントする必要があります。適切なインデントで読み取り可能なバージョンを提供する場合は、カウントされたコードの下でいつでも個別に行うことができます。メタに関する関連するコンセンサスを参照してください。
マーティンエンダー

0

C#229(Bibiennium) 198 unennoctiumバイト

「n-'0 '」トリックは、asciiからintに変換する方法です。Char 9 = ASCII57。Char0 = ASCII 48、したがって57-48 = 9。

static private string ToText(int v){return(string.Join( ""、v.ToString()。Select((char n)=> "nil un bi tri quad pent hex sept oct enn" .Split()[n -'0 ']))+ "ium")。Replace( "nnn"、 "nn")。Replace( "ii"、 "i")+ "" + string.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;
    }

このアプローチでは、intを取得し、文字列に変換してから、ラムダを起動する文字のLINQ選択を実行します。

ラムダは、プレフィックスの文字列を分割することにより、配列をその場で(それを定義するよりも少ない文字数で)生成します。次に、現在の文字のint値(上記のn-'0 'トリック)を参照して、使用するプレフィックスのインデックスを取得します。

これらはすべて文字列にラップされます。すべてのLINQ結果を連結する結合。「ium」をタックしてから、最後に.Replaceステートメントをいくつか追加して、nnnとiiをクリーンアップします。

欠落しているシンボル出力を追加しました。2つのLINQをマージすることにより、より効率的な方法があると思いますが、それを突っ込み続けるのは遅くなります。


代わりにn-'0'、なぜn-30ですか?
地下

良い呼び出しですが、文字セットに依存します。48は私のためにしかし;)
リックウェイ

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

私は再帰的な解決策を試してみました(これはpand の必要性を回避しますo)が、それは長くなりました。

私は、正規表現のマッチャーを特に誇りに思っています/ 90|[23]$それは最も離れた数字に依存し90います(したがって、9だけ異なるペア- 39コード内はj整数値であり、*nまだASCIIの結果です文字)およびthat 23最後のビットのみが異なるため、2で割るとそれらがコンフレートされます。

拡張コード:

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"

非ゴルフ

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()交換するnnniiパターンを

シンボルの最初の文字を大文字にするのを忘れました。例えば、それは118のための「UUO」ではなく、「UUO」、でなければなりません
アレクサンダー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 '+_`)

奇妙なことに、mapを使用する私の試みはforループより長かった

編集:おっと、日付を確認するのを忘れました。



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

このコードは無効な出力を生成します。
アレクサンドル・レボ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.