元素の周期表-コードゴルフ


47

実用的なゴルフに基づいて-米国

あなたのタスクは、ununoctium(118)までの要素名が与えられた要素の略語(シンボル)を見つけることです。ウィキペディアの周期表を使用してください。

squeamish ossifrageのおかげで、略語の要素の完全なリストを見つけることができます。 http://pastebin.com/DNZMWmuf

外部リソースを使用することはできません。さらに、特に周期表の要素に関する組み込みデータを使用することはできません。標準の抜け穴が適用されます。

入力

入力は、stdin、file、 promptinputなど

入力フォーマット:

以下はすべて有効な入力です。

Carbon
carbon
CARBON
cArBOn

基本的に、要素名-大文字と小文字は区別されません。

スペルミスや無効な要素名を処理する必要はありません。無効な入力は未定義の動作です。

出力

要素のシンボル。最初の文字大文字にし、残りは大文字にする必要あります 小文字にする必要あります。

出力例: C

テストケース:

Carbon -> C
NiTROGen -> N
Sodium -> Na
Gold -> Au
Silver -> Ag
Tin -> Sn

状態よりも多くの要素があるので、これらの一般的なルールを見つけることは難しいと思います。

これはコードゴルフです。最短のコードが勝ちます!


4
@squeamishossifrageありがとう。両方のバージョン(「硫黄」と「硫黄」)が許容されます。プログラムは両方を処理する必要はありませんが、1つだけを処理します。
soktinpk 14年

1
...正規表現を使用することはできません。よかった
ジョサイア・ウィンズロー14年

2
@Xrylite ルールを読んでみてください:「入力 ...要素名-大文字と小文字を区別しない... 出力 ...最初の文字は大文字で、残りは小文字でなければなりません」。
ジムバルター14年

2
適切なつづり(アルミニウム)と米国のつづり(アルミニウム)はどうですか?
ポールR 14年

4
@codebreakerはい、入力が有効でない場合、プログラムはクラッシュ、ハング、印刷Auなど、何でもできます。@Paul R要素を綴る方法が多数ある場合(硫黄と硫黄、またはアルミニウムとアルミニウムなど)、プログラムを短くする方を使用します。両方のケースを処理する必要はありません。
soktinpk 14年

回答:


27

CJam、337の 297 293 232 220 201 200バイト

leu:E2f^3b2+4%_"53N5903CVCT4":i3/=~Ef+b\%]53b"gØâ^ÃP·^À4ξ^ß^E5^W^Ma{áª^B¤±´oòæ»^XÊQÑ»4žDÙÝòÙ 0^ÝþKa6^Ó£,Ûkû¥¡ùh^E"256b7b6a/0a3**<)5md@5a/,(" ¬^GH/N¿·%^U^RU1²Bd
òë^м~í^ÌéáU"256b25b'Af+2/='J-'Q/"UU"*\)_5=)*E%2<?(\el

上記のコードでは、制御文字が含まれているため、キャレット表記を使用しています。

24バイトの追加コスト(合計224)で、これらの文字を回避できます。

leu:E2f^3b2+4%_"53N5903CVCT4":i3/=~Ef+b\%]53b
"' NwEvKv6e8@]jO4G)=b{L!v@hFQ/oCN)*|BRxvNRL+LO7NI(pLs4[d87$Q%8R\t+' M5JU"
{32f-95b}:B~7b6a/0a3**<)5md@5a/,(
"&y.$h*z^t\rQPUc]l8F h$=18C^r|vD~S"
B25b'Af+2/='J-'Q/"UU"*\)_5=)*E%2<?(\el

CJamインタープリターでこのコードを試すことができます。

テストケース

$ base64 -d > elements.cjam <<< bGV1OkUyZl4zYjIrNCVfIjUzTjU5MDNDVkNUNCI6aTMvPX5FZitiXCVdNTNiImfY4oNQt4A0zr6fBTUXDWF74aoCpLG0b/LmuxjKUdG7NMW+RNnd8tmgMJ3+S2E2k6Ms22v7paH5aAUiMjU2YjdiNmEvMGEzKio8KTVtZEA1YS8sKCIgrAdIL06/tyUVElUxskJkCvLrkLx+7Yzp4VUiMjU2YjI1YidBZisyLz0nSi0nUS8iVVUiKlwpXzU9KSpFJTI8PyhcZWw=
$ cksum elements.cjam 
952664534 200 elements.cjam
$ for e in Carbon NiTROGen Sodium Gold Silver Tin; do LANG=en_US cjam elements.cjam <<< $e; echo; done
C                                                                                                       
N                                                                                                       
Na                                                                                                      
Au                                                                                                      
Ag                                                                                                      
Sn

使い方

最初のステップは、STDINから要素名を読み取り、かなり複雑なハッシュ関数を適用することです。これは、範囲[0、225]のすべての要素名をマップします。

l eu :E          " Read a line from STDIN, convert to uppercase and save in E.            ";
2 f^             " XOR each character code with 2.                                        ";
3 b              " Convert to integer; consider the resulting array a base 3 number.      ";
2 + 4 %          " Add 2 and take the result modulo 4. Result: R                          ";
"53N5903CVCT4":i " Push [53 51 78 53 57 48 51 67 86 67 84 52].                            ";
3 / =            " Retrieve the chunk of length 3 that corresponds to R. Result: C        ";
~ E f+           " Add C[2] to all character codes of E.                                  ";
b                " Convert to integer; consider the resulting array a base C[1] number.   ";
\ %              " Take the integer modulo C[0]. Result: M                                ";
] 53 b           " Push H := 53 * R + M.                                                  ";

多くの要素記号は、要素の英語名の1番目と2番目、1番目と3番目、1番目と4番目、1番目と5番目、または1番目と10番目(最初の文字)の文字によって形成されます。これらの要素をそれぞれ0〜4の数字で表します。残りのすべての要素(5で表される)には、ルックアップテーブルが必要です。

結果のテーブルは、次のようにプッシュできます。

"gØâ^ÃP·^À4ξ^ß^E5^W^Ma{áª^B¤±´oòæ»^XÊQÑ»4žDÙÝòÙ 0^ÝþKa6^Ó£,Ûkû¥¡ùh^E"256b7b6a/0a3**

文字コードの配列は、ベース256からベース7に変換され、6が3つの0の実行に置き換えられます。

これは決定表Dです。

[4 0 0 0 1 0 0 0 0 0 0 3 0 2 0 1 0 0 0 0 0 0 0 0 4 1 1 0 0 0 0 2 0 4 0 5 2 0 0 3 4 0 0 0 0 4 0 1 0 0 3 1 0 0 2 1 1 1 0 0 0 1 0 5 5 0 0 2 0 0 0 5 5 0 0 0 5 0 3 0 0 0 0 5 0 0 0 0 0 0 0 0 5 2 3 0 1 0 5 0 4 0 0 0 0 4 0 5 0 0 0 0 0 5 0 0 0 2 5 1 4 1 5 0 0 0 5 0 0 5 1 1 0 0 0 0 0 0 2 0 5 0 0 0 3 1 0 2 0 0 0 2 0 0 0 5 0 0 0 0 1 0 0 0 0 0 4 0 2 2 5 2 0 0 5 1 0 0 0 0 4 0 5 0 0 3 5 0 0 5 0 1 0 0 0 2 0 0 0 0 0 5 0 4 0 0 0 0 0 0 0 0 3 0 4 0 0 1 2 2 0 0 0 0 0]

たとえば、ハッシュ1の要素に必要なアクションは、この配列の最初の要素に対応します。どの要素のハッシュにも対応しない配列要素もゼロであるため、(0 0 0)×6圧縮が可能です。

ここで、ハッシュHのDを解釈します。

< ) 5 md     " Push D[:H-1] (D[H-1] / 5) (D[H-1] % 5).                                    ";
@ 5a / , (   " Count the number of 5's in D[:H-1] (by splitting at [5]). Result: I        ";

次に、ルックアップテーブルをプッシュします。jを1文字のシンボルに追加し、UuQに置き換えると、各シンボルはちょうど2文字の長さになります。次のようにプッシュできます。

" ¬^GH/N¿·%^U^RU1²Bd
òë^м~í^ÌéáU"256b25b'Af+2/

文字コードの配列は、ベース256からベース25、Aの文字コードに変換されますすべての数字に追加され(プロセスでCharacterにキャスト)、結果は長さ2のチャンクに分割されます。

これはルックアップテーブルLです。

["QP" "YB" "PD" "SN" "QO" "QT" "QS" "SB" "KJ" "TM" "FE" "PB" "AU" "WJ" "CN" "SG" "RF" "CM" "CU" "HG" "NA" "RG" "AG"]

次に、潜在的な要素名の計算に進みます。

=                " Push L[I].                                                             ";
'J - 'Q / "UU" * " Remove J's and replace Q's with runs of two U's.                       ";
\ ) _ 5 = ) *    " Push S := (D[H-1] % 5 + 1) * ((D[H-1] % 5 + 1 == 5) + 1).              ";
E %              " Push every Sth character of E.                                         ";
2 <              " Discard all but the first two characters.                              ";

スタックには次が含まれます

B M N

ここで、BはブールD [H-1] / 5Mはルックアップテーブルから取得された名前、NはEから文字を選択して形成された要素名です。

ほぼ完了です。

?                " If B, push M; else, push N.                                            ";
( \              " Extract the first character from the string.                           ";
el               " Convert the rest to lowercase.                                         ";

しかし、それはどのように機能しますか?
クラウディ14年

2
@Claudiu:説明を追加しました。
デニス14年

3
説明の最初の3分の1を読みましたが、これまでのところ私が持っているのは「マジック」です。信じられない
ダックMooing

7
"AcAlAmSbArAsAtBaBkBeBiBhBBrCdCsCaCfCCeClCrCoCnCuCmDsDbDyEsErEuFmFlFFrGdGaGeAuHf HsHeHoHInIIrFeKrLaLrPbLiLvLuMgMnMtMdHgMoNdNeNpNiNbNNoOsOPdPPtPuPoKPrPmPaRaRnReRh RgRbRuRfSmScSgSeSiAgNaSrSTaTcTeTbTlThTmSnTiWUuoUupUusUutUVXeYbYZnZr" = 226の文字。あなたのソリューション= 200文字。ここで適切なブードゥー教が行われています。
squeamish ossifrage 14年

最短のように見えますが、追加の回答を自由に投稿できるため、この回答を受け入れました。
soktinpk 14年

43

C、452

適切なハッシュ関数が役立ちます。より良いものがあるかもしれません。(@ugorenらによって提案された改善点)

h;main(c){char*p="Sn)Cu&V$U#Mo#Rf#Sg&Cs#Y+FTa%Rb)S'Nd#GaK&Mg'Zr$PtPm%ReUuo#SmDy(Ac$Lu%W&CaRa(Cf)EuB#Ds%Md$Uus*NpIn$H&YbIr*BeEs*Tc#I(FlRuC#ThSrBh/NaCoLrKr&Nb$CePb$Ne'Am)At*PdLa#Tl%HgMt,CrTbBk$Rh&Rn4TeZn$HfAg%Fm)Xe$AlScFePo$As'HeO#LvN&DbGe#Ho&Mn$Cd+Ni$Rg$HsBr$AuSi#Pr&Uup#Se*Ti#Tm$Er$Sb&PPu&Cm$GdBa'Cn&UutLiFr#Ar#Bi#NoOs%Pa4Cl";while((c=getchar())>64)h=(h+c%32+74)*311%441;while(h)if(*p<65?h-=*p++-34,0:1)for(h--;*++p>96;);do putchar(*p++);while(*p>96);}

コメントなしでゴルフ:

int h;
main(c) {

  /* Hashed element symbols. Characters #$% etc. are used as padding: */
  char *p="Sn)Cu&V$U#Mo#Rf#Sg&Cs#Y+FTa%Rb)S'Nd#GaK&Mg'Zr$PtPm%ReUuo#SmDy(Ac$Lu%W&C"
          "aRa(Cf)EuB#Ds%Md$Uus*NpIn$H&YbIr*BeEs*Tc#I(FlRuC#ThSrBh/NaCoLrKr&Nb$CeP"
          "b$Ne'Am)At*PdLa#Tl%HgMt,CrTbBk$Rh&Rn4TeZn$HfAg%Fm)Xe$AlScFePo$As'HeO#Lv"
          "N&DbGe#Ho&Mn$Cd+Ni$Rg$HsBr$AuSi#Pr&Uup#Se*Ti#Tm$Er$Sb&PPu&Cm$GdBa'Cn&Uu"
          "tLiFr#Ar#Bi#NoOs%Pa4Cl";

  /* This hash function gives a unique result for each element: */
  while((c=getchar())>64) h=(h+c%32+74)*311%441;

  /* Find the corresponding position in the hashed data */
  while(h) {
    if(*p<65?h-=*p++-34,0:1) {      /* Step over an abbreviation */
      for(h--;*++p>96;);            /* Skip padding */
    }
  }

  /* Output first uppercase character and all following lowercase characters: */
  do {
    putchar(*p++);
  } while(*p>96);
}

このハッシュを見つけるためにブルートフォースを使用しました。これは、衝突がなかったハッシュサイズが512以下の唯一のものでした。私は代替スペルをチェックしませんでしたが、異なるアルゴリズムでより良い機能があるかもしれません(例えば、加算の代わりにXORを使用する)。

ハッシュ関数は、テキスト文字列を0〜440の値にマップします。「Tin」ハッシュはゼロにハッシュされるため、「Sn」はテーブルの先頭にあります。次の7つの位置は空です。コードをコンパクトに保つ​​ために、これはASCII値34 + 7 = 41( ")")で示されます。次に「銅」(8)、4つの空のセル(34 + 4 = 38 = "&")、および「バナジウム」(13)が続きます。ハッシュを計算した後、プログラムはテーブルをステップ実行し、すべての大文字について1を引き、その後に0個以上の小文字を引き、すべての非アルファベット文字について(ASCII VALUE)-34を引きます。値がゼロに達すると、正しい結果が見つかりました。


3
@soktinpk Bruteはそれを強制しました:-)これは、衝突がなかったハッシュサイズが512以下の唯一のものでした。私は代替スペルをチェックしませんでしたが、異なるアルゴリズムでより良い機能があるかもしれません(例えば、加算の代わりにXORを使用する)。
squeamish ossifrage 14年

2
その464を作成します。不要なブレースのペアがあります。
ジムバルター14年

1
文法について考える場合、それは明確であり、許可される必要があります...それは私たちにとって曖昧に見えます。ああ、あなたは私がしなかった別のものをキャッチしました!おめでとうございます...私はアルゴリズムを厳しくしようとしましたが、あなたはすべてを正しくしました。
ジムバルター14年

5
@Harshdeep —ハッシュ関数は、テキスト文字列を0から440までの値にマッピングします。「Tin」ハッシュはゼロになるため、「Sn」はテーブルの先頭にあります。次の7つの位置は空です。コードをコンパクトに保つ​​ために、これはASCII値34 + 7 = 41( ")")で示されます。次に「銅」(8)、4つの空のセル(34 + 4 = 38 = "&")、および「バナジウム」(13)が続きます。ハッシュを計算した後、プログラムはテーブルをステップ実行し、すべての大文字について1を引き、その後に0個以上の小文字を引き、すべての非アルファベット文字について(ASCII VALUE)-34を引きます。値がゼロに達すると、正しい結果が見つかりました。
squeamish ossifrage 14年

2
良いですね。1.でいくつかの文字を保存します(h+c%32+74)*311%441。2.をドロップpして使用しますs。3. main(c)1つのコンマを保存します。
ugoren

13

JavaScript ES6、690 708バイト

for(n=prompt()[l='toLowerCase'](i=0);!(c='HHeLiBeBCNFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'.match(x=/[A-Z][a-z]*/g)['HyHeLitBeryBorCarNitFluNeonSoMagAlSiliPhSuChlArgPotCalcScTitVChrManIroCobNicCoppZinGalGeArsSelBrKRubStYttrZirNioMoTecRuthenRhoPaSilvCadInTinAnTelIoXCaeBaLanCePraNeodPromSaEuGadTerDyHoErThuYtteLuHafTaTuRheOsIriPlaGoMerThaLeBiPolAsRadoFrRadiAcThoProtUrNepPluAmCuBerkCaliEiFeMenNoLawRutherDuSeaBohHasMeiDaRoCopeUnuntFleUnunpLivUnunsUnuno'.match(x).map(a=>a[l]()).indexOf(n.slice(0,i++))]);)
alert(c)

最初の配列はシンボルを保持し、2番目の配列はどの要素が参照されているかを知るために必要な最小限の文字を保持します。core1024とedc65を短縮してくれてありがとう。http://jsfiddle.net/xjdev4m6/2/でテストします。少し読みやすい:

n=prompt().toLowerCase()
e='HyHeLitBeryBorCarNitFluNeonSoMagAlSiliPhSuChlArgPotCalcScTitVChrManIroCobNicCoppZinGalGeArsSelBrKRubStYttrZirNioMoTecRuthenRhoPaSilvCadInTinAnTelIoXCaeBaLanCePraNeodPromSaEuGadTerDyHoErThuYtteLuHafTaTuRheOsIriPlaGoMerThaLeBiPolAsRadoFrRadiAcThoProtUrNepPluAmCuBerkCaliEiFeMenNoLawRutherDuSeaBohHasMeiDaRoCopeUnuntFleUnunpLivUnunsUnuno'.match(x=/[A-Z][a-z]*/g).map(a=>a.toLowerCase())
s='HHeLiBeBCNFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'.match(x)
for(i=0;i<7;i++){
  if(c=s[e.indexOf(n.slice(0,i))]){
    alert(c,i=8) // i=8 breaks out of the loop so the result is only alerted once
  }
}

Neonがリストで渡された場合、NeoがNeodymiumと一致するという事実を使用して、いくつかのバイトを削ることができますか?
ダンクラム14年

1
@Dancrumb残念ながらそうではありません。ループは最も短い部分文字列で始まり、文字数が少ないため、ヒットNeoする前にヒットしNeonます。
NinjaBearMonkey 14年

1
これまでの最短JSに対して+1。けれども、あなたはこれを取り除くことができif声明(それは完璧だfor状態)ともインラインにまたはコードを短くするために、いくつかの変数の位置をずらす;)
core1024

2
開始時).toLowerCase(-> )[L='toLowerCase'](終了時a.toLowerCase(-> a[L](4文字をカットする必要がある
edc65 14年

10

Ruby 1.9 +、565 471 447 444

ワンライナー。何も「正規表現を使用して不可能」ではないため...
(別の正規表現を追加することで94文字を節約しただけです)(および24文字を簡略化して)

p"VAlAmA.sArAcAnt|SbA.tBaB..kBeBiB.hBrBDyD.+sD.bE..sErEuF..mFrFlu|F@FlG.dGaGeG|AuH.fH.sHeHoHInIro|FeIrIKrL.vL.+rLaLiLuL|PbM.gMoM.+dM.nM.+tM|HgC.+sC.dC.+fCeCar|C@C....nCaCu|CmCop|CuCoC.rC.lN.+dN.+pNeN..bNit|N@NoNiOsOP..mPa|PdP...aPrP.uP..tPot|KPoPR.*n$RaR.+gR.eRhR.+bR.+fRuS.mScS.+gSeS..v|AgSiSo|NaS.rSTaT.cT.+bTeThu|TmT..lThTin|SnTiTu|WU.u.oU.u.pU.u.sU.u.tUXeY.+bYZ.nZ.r"
.split(/(?<!\|)(?=[A-Z])/).find{|r|/^#{r}/i.match *$*}.gsub /.*\||\W/,''

(「読みやすさ」のために追加された文字列の後の改行、テストのために削除)

使用法:ruby periodic.rb aluminum$>

説明:
文字列を先頭の大文字で分割すると、要素名と一致する正規表現の配列が返されます。それぞれに使用できるアルファベット文字は、略語*の文字のみです。これらは、コマンドライン引数*$*と比較したときに最初に見つかった一致が正しいものになるように並べられています。末尾のgsubは、印刷前に非アルファ文字を取り除きます。

*「鉄」の「Fe」のような奇数の略語は、|要素「Iro | Fe」によって処理されます。最初の選択肢は、実際に一致するものです。gsubは、「|」までのすべての文字を削除し、実際の略語を残します。

テストフレームワーク(@squeamishのリストが必要:作業ディレクトリに「table.txt」としてダウンロード)。

def testfunc(name) 
  #replace with however you call your code
  return `ruby1.9.3 periodic2.rb #{name}`.chomp()
end

elements= File.new('table.txt').readlines.map{|s|s.chomp}

elements.each{|l|
  a,n=l.split(' ')
  r = testfunc(n)
  print "#{n} => #{a} "
  if r!=a then
    print ("FAIL: gave #{r}\n")
    exit
  else 
    print("\tOK\n")
  end
}
print("PASS: #{elements.size} elements matched\n")

1
すべての100以上のケースで機能する場合のスタンディングオベーション
edc65 14年

もちろん動作します:ideone.com/7FZlAt
AShelly

正規表現ではできないことを述べる大胆さがあります。彼らが間違っていることを証明してくれてありがとう(多くの人が言った、多くの人が考えた):)
マスト14年

4

ルビー、1068バイト

require"zlib"
require"base64"
$><<eval(Zlib::Inflate.inflate(Base64.decode64"eJwlU8tu2zAQ/Bee+QW6CLYTx0FiR7CdtsmNkmhJCEUKfKQViv57Z9YnE+vd2ZnZ0d+1j2Go6oO2bipzpQ5W6SmPU6nU66S0jatzldqiGmLwVb3VJrZ87NAmoyf9Zx0sKm/alRCnqt5riw514lAvqCejtBm8TZU6Dgp984SGjcMuN3WhUhfsGkNaxqpudHG3Eqv6okdHPLVDXxwIuYmAzCalqn7RxnWkuQN2Z3yPxktH8sbjeQWg8QbV+oceY5iJE1kbDICOHpBE3JNka1zG3wHT3ZeF3hOmw7LYiGpB1XeV+sSIcY4rnwydmQn0hPmYLFduEqpOnhdWg4jcYmlclwyRL3iWdiLTc6s07PNYe0E15wjc+kNPsSOrT9Sm0HLXCZ3BrW0P0iBou9FbyIPSkkfYrs6F1vXsPY9C0aC36entNxVs4LjpZ/EKVX8/ybOnLqzHr8/TzCO0FODgvbreb4dV9bO2npx+oWSTzO6g1ER5bnlZn0eDvIgr9wbqN8kCtIEUG/qVKejFFQvRzYyx2fC6FzxLDAuej4VMg8PzqSeYOHAFrTUtEWAPK80QKQeYwf+B+4gVY5HLXGeaicFKfbS0yGaAvRL35mXsJnwNjnwF3+KHlKv6p4aV4iCIp1lQ3yAyTuLrMxY4k2lXk8kABm8KCXY06wCDR0YDmIiqFf+xfUpzgdYtw+QCc9GAdMqGnDZZtPKAzKLxHYp7JvR+nzNjjZVs7XjhKPpGWpgN8tgYGWNu3rVdcuEnt/DjykRtwG/GOdC5EYfvh5nJWjK+/WJYphts3d2YhZQRrMck0eauPXt9z95jz6/EUuEJEszvyOS9xnsIYcH5xmiLhQ9MkWkDqhcYE0YhvmU0U5ITcMWUGeMjTYgzTqAeUA3W5wFgHMPHhxU7prP4DLD3gmZnY/gGNSflxbIMzROCDnWv31JOUk7yDh3fQf37D7D/kWs="))[gets.downcase[1..5].to_sym]

STDINを介した入力。

要素名の最も短い一意の部分文字列は、2番目から6番目の文字(または短すぎる場合は名前の末尾)です。だから私は単にそれらを取得し、ハッシュでそれらを検索しています。ハッシュも圧縮しました。これにより、さらに200バイト節約できます。ハッシュ自体は次のようになります。

{ydrog:?H,elium:"He",ithiu:"Li",eryll:"Be",oron:?B,arbon:?C,itrog:?N,xygen:?O,luori:?F,eon:"Ne",
 odium:"Na",agnes:"Mg",lumin:"Al",ilico:"Si",hosph:?P,ulfur:?S,hlori:"Cl",rgon:"Ar",otass:?K,
 alciu:"Ca",candi:"Sc",itani:"Ti",anadi:?V,hromi:"Cr",angan:"Mn",ron:"Fe",obalt:"Co",ickel:"Ni",
 opper:"Cu",inc:"Zn",alliu:"Ga",erman:"Ge",rseni:"As",eleni:"Se",romin:"Br",rypto:"Kr",ubidi:"Rb",
 tront:"Sr",ttriu:?Y,ircon:"Zr",iobiu:"Nb",olybd:"Mo",echne:"Tc",uthen:"Ru",hodiu:"Rh",allad:"Pd",
 ilver:"Ag",admiu:"Cd",ndium:"In",in:"Sn",ntimo:"Sb",ellur:"Te",odine:?I,enon:"Xe",esium:"Cs",
 arium:"Ba",antha:"La",erium:"Ce",raseo:"Pr",eodym:"Nd",romet:"Pm",amari:"Sm",uropi:"Eu",
 adoli:"Gd",erbiu:"Tb",yspro:"Dy",olmiu:"Ho",rbium:"Er",huliu:"Tm",tterb:"Yb",uteti:"Lu",
 afniu:"Hf",antal:"Ta",ungst:?W,heniu:"Re",smium:"Os",ridiu:"Ir",latin:"Pt",old:"Au",ercur:"Hg",
 halli:"Tl",ead:"Pb",ismut:"Bi",oloni:"Po",stati:"At",adon:"Rn",ranci:"Fr",adium:"Ra",ctini:"Ac",
 horiu:"Th",rotac:"Pa",raniu:?U,eptun:"Np",luton:"Pu",meric:"Am",urium:"Cm",erkel:"Bk",alifo:"Cf",
 inste:"Es",ermiu:"Fm",endel:"Md",obeli:"No",awren:"Lr",uther:"Rf",ubniu:"Db",eabor:"Sg",
 ohriu:"Bh",assiu:"Hs",eitne:"Mt",armst:"Ds",oentg:"Rg",opern:"Cn",nuntr:"Uut",lerov:"Fl",
 nunpe:"Uup",iverm:"Lv",nunse:"Uus",nunoc:"Uuo"}

3

CJam、 462449434 401391384 382

デニスの助けを借りて。

コード

ネストされた三項ifは、おそらく CJamでこれを行う正しい方法ではありません。

rel_"ruthen"#!"Ru"{_"tel"#!"Te"{__5{\_ceu\@=+_}:U~"PdYbRgCmCn"{\#)!}:X~{;__4U"RnPaCfDs"X{;_3U"NbCsNdPmTbPtTlBkEsFmMdLrMt"X{;2U"MgClCrMnZnAsRbSrZrTcCdSmGdHfReAtNpPuDbBhHsLv"X{;__"sili"#{;__ceu\1=@2=++"SodIroCopSilTinAntThuGolMerLeaTunPotRutSeaHydBorCarNitOxyFluPhoSulVanYttIodUra"\#3d/m[)"_NaFeCuAgSnSbTmAuHgPbWKRfSgHBCNOFPSVYIU"S%\=_"_"={;_1U"Un"={;4="Uu"\+}*}*}"Si"?}*}*}*}*}?}?]W=

インデント付き:

rel
_"ruthen"#!"Ru"
{
_"tel"#!"Te"
{
  __5{\_ceu\@=+_}:U~
  "PdYbRgCmCn"{\#)!}:X~
  {
   ;__4U
   "RnPaCfDs"X
   {
    ;_3U
    "NbCsNdPmTbPtTlBkEsFmMdLrMt"X
    {
     ;2U
     "MgClCrMnZnAsRbSrZrTcCdSmGdHfReAtNpPuDbBhHsLv"X
     {

       ;__"sili"#
       {
        ;__ceu\1=@2=++"SodIroCopSilTinAntThuGolMerLeaTunPotRutSeaHydBorCarNitOxyFluPhoSulVanYttIodUra"\#3d/m[)"_ Na Fe Cu Ag Sn Sb Tm Au Hg Pb W K Rf Sg H B C N O F P S V Y I U"S%\=_"_"=
        {;_1U"Un"={;4="Uu"\+}*}*
       }
      "Si"?

     }*
    }*
   }*
  }*
 }?
}?
]W=

シンボルの多くは、要素名の最初の2文字にすぎません。これらは、ネストされたifステートメントの2番目に深いレイヤーで処理されます。他の多くは、1番目と3番目の文字、または1番目と4番目の文字です-これらは連続した外側のレイヤーで処理されます。最初の文字のみが表示され、完全な不規則な記号は、それぞれ5番目と3番目に深いレイヤーで処理されます。

混乱する場所がいくつかあります(TelLuriumvs ThaLlium、またはSILiconvs SILver、またはRUTheniumvs RUTherfordium)。これらは個別に処理されます。

主にコードブロックを再利用し、不正行為の処理を改善することにより、ここで多くのゴルフを行うことができます。


1
いくつかのヒント:1.無効な要素名の動作は未定義の場合があるため、"RUTHENIUM"=を使用することはできません"RUTHEN"#!。2.明示的に印刷する必要はなく(o)、実際の要素名の前に何かを削除する必要もありません(;"Si")。]W=コードの最後に追加するだけで、最上位のスタック要素以外をすべて削除します。3.これにより、いくつかのブロックが空になります。場合はBブール値で、B{...}{}?かつB{...}*同じ達成します。4.三項ifはブロックまたはスタック要素を取得{"Si"}するため、に短縮できます"Si"
デニス14年

私が思う@Dennis私はのそれのすべてを追加したスタック管理はかかわらず、作業が必要- 。あまりにも多くの_;あちこち

@Dennisそして、私は小文字に、デフォルトのケースを変更することで、よりエイリアスのコードブロックを使用して、いくつかの文字が削り取らました

3

PHP、507の 485 476 466文字

使用法:GETパラメーター「0」として要素名を入力します-elements.php?0 = carbon

アルゴリズム:データ文字列を実行し、部分文字列と省略コードのペアを引き出します。部分文字列が、渡された要素の先頭と一致する場合、略語コードを使用して、出力対象を決定します。コードが文字で始まる場合は、文字列として出力します。数値Nの場合、要素の最初の文字+ N番目の文字を出力します。Unun要素は、コード '|'で特殊なケースになっています。渡された名前に一致する部分文字列が見つからない場合は、名前の最初の2文字を略語として出力します。

読み取り可能なコード:

<?
$l=ucfirst(strtolower($_GET[0]));
for(
  $m[3]="AnSbArs2As2Berk3Boh2BoBCad2Cae3Cali4CarCChl2Ch2Cope5CopCuCu5Da4Du2Ei3Fe3FluFGad2GoAuHaf2Ha2HyHIo0IroFeLaw3LePbLiv2Mag2Man2Mei3Men3MeHgNeod3Nep2Nio3NiNOxOPa5PhPPla3Plu2PotKProm3Pro4Rado4Rhe2Roe5Rub2Ruther6Sa2Sea6SilvAgSoNaSt2SuSTec2Ter3Tha3Thu6TinSnTuWUn|UUVVYtte5YYZin2Z2";
  preg_match('/(.[a-z]*)(.[a-z]*)(.*)/',$m[3],$m)
;)
    if(strstr($l,$m[1]))
        echo($x=$m[2][0])>'@'?$x>'{'?"Uu$l[4]":$m[2]:$l[0].$l[$x],die;
echo$l[0],$l[1];

凝縮:

<?$l=ucfirst(strtolower($_GET[0]));for($m[3]="AnSbArs2As2Berk3Boh2BoBCad2Cae3Cali4CarCChl2Ch2Cope5CopCuCu5Da4Du2Ei3Fe3FluFGad2GoAuHaf2Ha2HyHIo0IroFeLaw3LePbLiv2Mag2Man2Mei3Men3MeHgNeod3Nep2Nio3NiNOxOPa5PhPPla3Plu2PotKProm3Pro4Rado4Rhe2Roe5Rub2Ruther6Sa2Sea6SilvAgSoNaSt2SuSTec2Ter3Tha3Thu6TinSnTuWUn|UUVVYtte5YYZin2Z2";preg_match('/(.[a-z]*)(.[a-z]*)(.*)/',$m[3],$m);)if(strstr($l,$m[1]))echo($x=$m[2][0])>'@'?$x>'{'?"Uu$l[4]":$m[2]:$l[0].$l[$x],die;echo$l[0],$l[1];

2

JavaScript(1100)

そのシンプルさに輝く素朴な実装。名前の先頭からの一意のサブ文字列は、単にシンボルにマップされます。

e={hy:"H",he:"He",lit:"Li",bery:"Be",bor:"B",car:"C",nit:"N",ox:"O",flu:"F",neon:"Ne",so:"Na",mag:"Mg",al:"Al",sili:"Si",ph:"P",su:"S",chl:"Cl",arg:"Ar",pot:"K",calc:"Ca",sc:"Sc",tit:"Ti",v:"V",chr:"Cr",man:"Mn",iro:"Fe",cob:"Co",nic:"Ni",copp:"Cu",zin:"Zn",gal:"Ga",ge:"Ge",ars:"As",sel:"Se",br:"Br",k:"Kr",rub:"Rb",st:"Sr",yttr:"Y",zir:"Zr",nio:"Nb",mo:"Mo",tec:"Tc",ruthen:"Ru",rho:"Rh",pa:"Pd",silv:"Ag",cad:"Cd",in:"In",tin:"Sn",an:"Sb",tel:"Te",io:"I",x:"Xe",cae:"Cs",ba:"Ba",lan:"La",ce:"Ce",pra:"Pr",neod:"Nd",prom:"Pm",sa:"Sm",eu:"Eu",gad:"Gd",ter:"Tb",dy:"Dy",ho:"Ho",er:"Er",thu:"Tm",ytte:"Yb",lu:"Lu",haf:"Hf",ta:"Ta",tu:"W",rhe:"Re",os:"Os",iri:"Ir",pla:"Pt",go:"Au",mer:"Hg",tha:"Tl",le:"Pb",bi:"Bi",pol:"Po",as:"At",rado:"Rn",fr:"Fr",radi:"Ra",ac:"Ac",tho:"Th",prot:"Pa",ur:"U",nep:"Np",plu:"Pu",am:"Am",cu:"Cm",berk:"Bk",cali:"Cf",ei:"Es",fe:"Fm",men:"Md",no:"No",law:"Lr",ruther:"Rf",du:"Db",sea:"Sg",boh:"Bh",has:"Hs",mei:"Mt",da:"Ds",ro:"Rg",cope:"Cn",ununt:"Uut",fle:"Fl",ununp:"Uup",liv:"Lv",ununs:"Uus",ununo:"Uuo"}
n=prompt().toLowerCase()
for(i in e)n.indexOf(i)?i:alert(e[i])

2

Python- 652 649 637

私のハッシュテーブルは、大文字の名前の2文字ごとと3文字ごとの組み合わせに基づいています。

import re
def f(s,c='S<8F0FCE;2.ACR;J@W$;BI8>GD*?GnHQ<K>&T\(51IAg/Y?S2=169.,325(F(98?>?=^97DUCITX;SJ`0C<P9iLP/G4B,A(-A?(3QLLZ;81D(.4F;L8GaVP[=\=cOX3U,LQl6:E9/OXdSe(4,TSV/=FN98?K.18Q>R$+<GG[IS-4?;4H;T/IMq9<LXMYH4HG<>>KTT,>IIEM,[Nf<,:Z60(A9fImZTMRTcM?[lVg^qC}',e='HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'):
 U=s.upper();X=lambda x:chr(32+sum(ord(u)-65for u in x))
 return re.findall('[A-Z][a-z]*',e)[zip(c[::2],c[1::2]).index((X(U[1::3]),X(U[:-1:2])))]

対応するジェネレーターは次のとおりです。

table = '''
H     Hydrogen
He    Helium
...
Uuo   Ununoctium
'''

table = map(lambda l: l.split(), table.split('\n')[1:-1])

abbr = []
for name in map(str.upper, zip(*table)[1]):
    abbr.append(chr(32+sum(ord(u)-65 for u in name[1::3]))+
                chr(32+sum(ord(u)-65 for u in name[:-1:2])))
print 'c=' + ''.join(abbr)
print 'e=' + ''.join(zip(*table)[0])
print 'Unique' if len(table) == len(set(abbr)) else 'Duplicates'

おそらく改善の余地があり、特に2つの長い文字列を圧縮する必要があります。

テスト済み:

for short, name in table:
    if f(name) != short:
        print "Wrong result!"

2

Golfscript- 1052 821

{.91<32*+}%:x;'H
He
Li
Be
B
C
N
F
Ne
Na
Mg
Al
Si
P
S
Cl
Ar
K
Ca
Sc
Ti
V
Cr
Mn
Fe
Co
Ni
Cu
Zn
Ga
Ge
As
Se
Br
Kr
Rb
Sr
Y
Zr
Nb
Mo
Tc
Ru
Rh
Pd
Ag
Cd
In
Sn
Sb
Te
I
Xe
Cs
Ba
La
Ce
Pr
Nd
Pm
Sm
Eu
Gd
Tb
Dy
Ho
Er
Tm
Yb
Lu
Hf
Ta
W
Re
Os
Ir
Pt
Au
Hg
Tl
Pb
Bi
Po
At
Rn
Fr
Ra
Ac
Th
Pa
U
Np
Pu
Am
Cm
Bk
Cf
Es
Fm
Md
No
Lr
Rf
Db
Sg
Bh
Hs
Mt
Ds
Rg
Cn
Uut
Fl
Uup
Lv
Uus'n/'hy
he
lit
bery
bor
car
nit
flu
neon
so
mag
al
sili
ph
su
chl
arg
pot
calc
sc
tit
v
chr
man
iro
cob
nic
copp
zin
gal
ge
ars
sel
br
k
rub
st
yttr
zir
nio
mo
tec
ruthen
rho
pa
silv
cad
in
tin
an
tel
io
x
cae
ba
lan
ce
pra
neod
prom
sa
eu
gad
ter
dy
ho
er
thu
ytte
lu
haf
ta
tu
rhe
os
iri
pla
go
mer
tha
le
bi
pol
as
rado
fr
radi
ac
tho
prot
ur
nep
plu
am
cu
berk
cali
ei
fe
men
no
law
ruther
du
sea
boh
has
mei
da
ro
cope
ununt
fle
ununp
liv
ununs
ununo'n/[{x\?)}/]1?=

説明:

{        }%                              Map these ops to the input string:
 .91<32*+                                   Add 32 if less than 91 (convert to lowercase, in essence)
           :x;                           Store to x.
              '...'  '...'               The first array is the symbols, the second is the names.
                                         (stripped down to the minimum necessary)
                   n/     n/             Convert them to arrays.
                             {    }/     For each element in the name array...
                              x\?)          ...return 1 if the element is found in the input.
                            [       ]    Gather every element in an array...
                                     1?  Find the 1 in the array (the only element name match)...
                                       = ...then return that symbol in the symbol array.
                               (implied) Print.

11
OMG、10文字以下ではないGolfscriptの一部!
WallyWest 14年

1
あなたは、セパレータとして改行で1つの文字列を使用して、次に行うことにより、文字列の配列への大規模な改善を得ることができますn/
ピーター・テイラー

前回やったのに、どうしてそんなことを考えなかったの?今すぐ更新。
ジョサイアWinslow 14年

2

Haskell、920 817 807 776文字

要素名のどの文字がそのシンボルに含まれるかというルールのシステムを作成するのに非常に長い時間を費やし、少し手を加えた後、要素をシンボルに簡単に変換するスクリプトを作成しました。GOld、SilVer、TiN、LEad、SoDium、MerCury、ANtimony、PotaSsium、TUngstenから特定のキャラクターをサンプリングし、それらを未使用の定期的なシンボルに変換できるため、アイアンは問題でした(統合を最も簡単にするサンプリングを選択しましたそれらを既存のルールに追加します)、そして記号変換後に翻訳します; ただし、Ir、Io、およびInはすべて既に使用されているため、鉄は問題でした。これは当初920文字でしたが、最終的なパターンマッチ(最大の)が存在する必要はないことに気付きました。したがって、キャッチオールワイルドカードに置き換えました。その後、ワイルドカードを使用して一部のパターンをその要素名に固有になるように省略して、817から808までさらにゴルフを行いました(たとえば、名前に「w」が含まれる唯一の要素はローレンシウムなので、「* w」は、「Law」より1文字少ない文字に一致します)。

これが私のコードです。すべての要素についてテストし、入力を自動的にタイトルケースに変換するようにコーディングしたため、大文字と小文字の区別に問題はありません。

編集1

さらに、tのcase式をパターンマッチに置き換え(オペランドの式ではなくrawオペランドをテストしていたため、これは理にかなっています)、不要な括弧を削除し、e文字列のリストの代わりに改行で区切られた文字列として表現し、後でメイン関数で分割します。これらの変更は純粋にゴルフであるため、人間が読めるバージョンは変更していません。

import Data.Char
m _[]=True;m[]_=False;m k@(c:s)x@(y:z)=case y of{']'->m s x;'['->let(i,(_:j))=break(==']')z in(c`elem`i)&&m s j;'?'->m s z;'*'->null z||m k z||m s z||m s x;_->c==y&&m s z};p(a:t)(x:y)=case a of{'.'->x:p t y;'_'->p t y;_->a:p t y};p[]_=[];e="Iro\nUn\nCu Pa Ro Y*e\nR*r\n*pp\nCop Rado\nSea Thu\nCali Da P*ot Tha\nA*s Boh ?ub Ch [CG]ad [HM]a Liv Nep Plu Rhe S[ato] Tec Tin Z\nB*k Cae [ES]i *w Nio [FM]e N*d Pro Pla Ter\nBor Car Flu Hy Io Nit Ox Ph Su [UVY]\n*";s="Fe ._._. .____. .f .u .n ._____. .___. ._. .__. . ..";t"Sv"="Ag";t"Sd"="Na";t"Go"="Au";t"Le"="Pb";t"Mc"="Hg";t"An"="Sb";t"Ps"="K";t"Tu"="W";t"Tn"="Sn";t x=x;main=interact$unlines.map(\(a:b)->let y=toUpper a:map toLower b in t$p(snd.head.filter(any(m y).fst)$zip(map words$lines e)$words s)y).lines

人間が読めるバージョン(改行、間隔、詳細な名前、コメント:2311文字)

import Data.Char

-- Test against search-pattern strings
match _ [] = True
match [] _ = False
match k@(c:s) x@(y:z) = case y of
']' -> match s x
'[' -> let (i,(_:j)) = break (==']') z in (c `elem` i) && match s j
'?' -> match s z
'*' -> null z || match k z || match s z || match s x
 _  -> c == y && match s z

-- Write according to name-pattern string
pattern (a:t) (x:y) = case a of
'.' -> x : (pattern t y)
'_' -> (pattern t y)
 _  -> a : (pattern t y)
pattern [] _ = []

-- Search-Patterns for the elements
elements=["Iro", -- Iron -> Fe
      "Un", -- UnUn-Blank-ium (1,3,5)
      "Cu Pa Ro Y*e", -- CuriuM PallaDium RoentGenium YtterBium (1,6)
      "R*r", -- Rutherfordium (1,f)
      "*pp", -- Copper (1,u)
      "Cop Rado", -- Copernicium Radon (1,n)
      "Sea Thu", -- SeaborGium ThuliuM (1,7)
      "Cali Da P*ot Tha", -- CaliFornium DarmStadtium ProtActinium PotaSsium (1,5)

      {- AsTatine ArSenic BoHrium DuBnium RuBidium ChLorine ChRome CaDmium
      GaDolinium HaFnium HaSsium MaNganese MaGnesium LiVermorium NePtunium
      PlUtonium RhEnium SaMarium StRontium SoDium TeChnetium TiN ZiNc
      ZiRconium (1,3) -}

      "A*s Boh ?ub Ch [CG]ad [HM]a Liv Nep Plu Rhe S[ato] Tec Tin Z", 

      {- BerKelium CaeSium EinSteinum SilIcon SilVer LawRencium NioBium
      FerMium MenDelevium MeiTnerium MerCury NeoDymium ProMethium PlaTinum
      TerBium (1,4) -}

      "B*k Cae [ES]i *w Nio [FM]e N*d Pro Pl Ter",

      {- Boron Carbon Fluorine Hydrogen Nitrogen Oxygen Phosphorous Sulphur
      Uranium Vanadium Yttrium (1) -}

      "Bor Car Flu Hy Io Nit Ox Ph Su [UVY]",
      "*"] -- Everything else (1,2)

-- respective naming patterns for searches
symbol = "Fe ._._. .____. .f .u .n ._____. .___. ._. .__. . .."

-- Translate fake symbols
translate x = case x of
"Sv" -> "Ag" -- SilVer
"Sd" -> "Na" -- SoDium
"Go" -> "Au" -- GOld
"Le" -> "Pb" -- LEad
"Mc" -> "Hg" -- MerCury
"An" -> "Sb" -- ANtimony
"Ps" -> "K" -- PotaSsium
"Tu" -> "W" -- TUngsten
"Tn" -> "Sn" -- TiN
  _  -> x  -- Keep everything else the same

main = interact $ unlines . map (\(a:b) -> let y = (toUpper a) : (map toLower b) in t $ p (snd.head.filter (any (m y) . fst) $ zip (map words e) $ words s) $ y) . lines

誰かがこの部分の説明に興味があるなら、遠慮なく聞いてください。


2

C#(826)

最高ではありませんが、C#のハンディキャップで試してみようと思いました。

using System;class P{static string s="HyHHe1Li1Be1BoBCaCNitNOxOFlFNe1SoNaMaMgAl1Sil1PhPSuSChClAr1PotKCal1Sc1Tit1VaVChrCrManMnIrFeCo1Ni1CopCuZiZnGa1Ge1ArsAsSe1Br1Kr1RuRbStSrYtYZirZrNioNbMo1TecTcRut1Rh1PaPdSiAgCadCdIn1TiSnAnSbTel1IoIXe1CaeCsBa1La1Ce1Pra1NeoNdPrPmSaSmEu1GadGdTeTbDy1Ho1Er1ThTmYttYbLu1HaHfTa1TuWRheReOs1Iri1PlPtGoAuMeHgThaTlLePbBi1Po1AsAtRaRnFr1Rad1Ac1Tho1ProPaUrUNepNpPluPuAm1CuCmBerBkCaliCfEiEsFeFmMenMdNo1LawLrRuthRfDuDbSeaSgBohBhHasHsMeiMtDaDsRoRgCopeCnUnUutFle1UnuUupLivLvUnunUus",n,t,k;static void Main(){var d=new System.Collections.Specialized.StringDictionary();while(s!=""){k=g;d[k]=g;if(d[k]=="1")d[k]=k.Substring(0,2);};t=Console.ReadLine();while(t!=""&!d.ContainsKey(t))t=t.Remove(t.Length-1);Console.Write(d[t]);}static string g{get{n="";do n+=s[0];while((s=s.Remove(0,1))!=""&&s[0]>96);return n;}}}

そこで、要素の完全な名前(炭素など)を可能な限り最小でありながら一意の文字列に変換するプログラムを作成し、他のすべての一意の文字列に関してすべての要素に対してこれを行いました。次に、それを大きな "い文字列にシリアライズしました。大文字は「チャンク」の始まりを示し、チャンクはキーと値の間で交互になります。KeyValueKey2Value2などと同様

このスクリプトは、その大きな文字列を殺菌し、入力された文字列の末尾の文字を切り取ります。それは、大きな文字列から作成された辞書で文字が見つかるまでです。

(C#の知識は驚くべきものではなく、最初に投稿したものは自分が知っているものだけを使用していましたが、その後、他の人から指摘されたいくつかのトリックがありました。)


すべてのタイプ定義をに変更することにより、これをさらにゴルフできvarます。単一ステートメントのifブロックの後に中括弧を削除すると、さらに節約できます。に割り当てるt.Substring(int, int)と、Func<int, int, string>別のカップルを保存できます。
ブランドン14年

ほとんどの変数定義を「var」にしましたが、1つまたは2つを見逃したようです。
miethpo

あなたはでさらに5つの文字を剃ることができvarするstring[] rことで、さらに3をvarINGのstring t = Console....、最後に、あなたが変更することで、より多くの7を救うreturn new string[]return new[]は非常に終わり。
ブランドン14年

if(...) break;forループの終了条件にロジックを移動するなど、実行できるその他のマイナーな改善点がいくつかあります。do { } while(..)抽出メソッドなど、他の多くの論理反転を適用できます。これは、エントリケースに個別の論理演算を追加するよりも短いです。このサイトの担当者が少ないため、レビュー/承認が必要なコードの編集を投稿しました。870文字になりました。
ニコラス14年

1
私はの編集誰かコードゴルフが丁寧であるかわからない@Nicholas ...
miethpo

1

JavaScript(E6)1433

ここに上限はありません

F=n=>'0H0HYDROGEN0He0HELIUM0Li0LITHIUM0Be0BERYLLIUM0B0BORON0C0CARBON0N0NITROGEN0O0OXYGEN0F0FLUORINE0Ne0NEON0Na0SODIUM0Mg0MAGNESIUM0Al0ALUMINIUM0Si0SILICON0P0PHOSPHORUS0S0SULFUR0Cl0CHLORINE0Ar0ARGON0K0POTASSIUM0Ca0CALCIUM0Sc0SCANDIUM0Ti0TITANIUM0V0VANADIUM0Cr0CHROMIUM0Mn0MANGANESE0Fe0IRON0Co0COBALT0Ni0NICKEL0Cu0COPPER0Zn0ZINC0Ga0GALLIUM0Ge0GERMANIUM0As0ARSENIC0Se0SELENIUM0Br0BROMINE0Kr0KRYPTON0Rb0RUBIDIUM0Sr0STRONTIUM0Y0YTTRIUM0Zr0ZIRCONIUM0Nb0NIOBIUM0Mo0MOLYBDENUM0Tc0TECHNETIUM0Ru0RUTHENIUM0Rh0RHODIUM0Pd0PALLADIUM0Ag0SILVER0Cd0CADMIUM0In0INDIUM0Sn0TIN0Sb0ANTIMONY0Te0TELLURIUM0I0IODINE0Xe0XENON0Cs0CAESIUM0Ba0BARIUM0La0LANTHANUM0Ce0CERIUM0Pr0PRASEODYMIUM0Nd0NEODYMIUM0Pm0PROMETHIUM0Sm0SAMARIUM0Eu0EUROPIUM0Gd0GADOLINIUM0Tb0TERBIUM0Dy0DYSPROSIUM0Ho0HOLMIUM0Er0ERBIUM0Tm0THULIUM0Yb0YTTERBIUM0Lu0LUTETIUM0Hf0HAFNIUM0Ta0TANTALUM0W0TUNGSTEN0Re0RHENIUM0Os0OSMIUM0Ir0IRIDIUM0Pt0PLATINUM0Au0GOLD0Hg0MERCURY0Tl0THALLIUM0Pb0LEAD0Bi0BISMUTH0Po0POLONIUM0At0ASTATINE0Rn0RADON0Fr0FRANCIUM0Ra0RADIUM0Ac0ACTINIUM0Th0THORIUM0Pa0PROTACTINIUM0U0URANIUM0Np0NEPTUNIUM0Pu0PLUTONIUM0Am0AMERICIUM0Cm0CURIUM0Bk0BERKELIUM0Cf0CALIFORNIUM0Es0EINSTEINIUM0Fm0FERMIUM0Md0MENDELEVIUM0No0NOBELIUM0Lr0LAWRENCIUM0Rf0RUTHERFORDIUM0Db0DUBNIUM0Sg0SEABORGIUM0Bh0BOHRIUM0Hs0HASSIUM0Mt0MEITNERIUM0Ds0DARMSTADTIUM0Rg0ROENTGENIUM0Cn0COPERNICIUM0Uut0UNUNTRIUM0Fl0FLEROVIUM0Uup0UNUNPENTIUM0Lv0LIVERMORIUM0Uus0UNUNSEPTIUM0Uuo0UNUNOCTIUM'
.match(RegExp('([^0]+)0+'+n,'i'))[1]

FireFox / FireBugコンソールでテストする

F('Rutherfordium')

出力

Rf

1

SmileBASIC、1763 1418 1204 1128バイト

INPUT E$Hro$="H
Hiu$="He
Lhi$="Li
Byl$="Be
Bon$="B
Cbo$="C
Nro$="N
Oge$="O
For$="F
Nn$="Ne
Siu$="Na
Mne$="Mg
Ami$="Al
Sic$="Si
Psp$="P
Sfu$="S
Cor$="Cl
Aon$="Ar
Pas$="K
Cci$="Ca
Snd$="Sc
Tan$="Ti
Vad$="V
Com$="Cr
Mga$="Mn
In$="Fe
Cal$="Co
Nke$="Ni
Cpe$="Cu
Zc$="Zn
Gli$="Ga
Gma$="Ge
Aen$="As
Sen$="Se
Bmi$="Br
Kpt$="Kr
Rid$="Rb
Son$="Sr
Yri$="Y
Zco$="Zr
Nbi$="Nb
Myb$="Mo
Thn$="Tc
Rhe$="Ru
Rdi$="Rh
Pla$="Pd
Sve$="Ag
Cmi$="Cd
Iiu$="In
T$="Sn
Aim$="Sb
Tlu$="Te
Iin$="I
Xon$="Xe
Csi$="Cs
Biu$="Ba
Lth$="La
Pse$="Pr
Ndy$="Nd
Pme$="Pm
Sar$="Sm
Eop$="Eu
Gol$="Gd
Tbi$="Tb
Dpr$="Dy
Hmi$="Ho
Eiu$="Er
Tli$="Tm
Yer$="Yb
Let$="Lu
Hni$="Hf
Tta$="Ta
Tgs$="W
Rni$="Re
Oiu$="Os
Idi$="Ir
Pti$="Pt
Gd$="Au
Mcu$="Hg
Tll$="Tl
Ld$="Pb
Bmu$="Bi
Pon$="Po
Aat$="At
Ron$="Rn
Fnc$="Fr
Riu$="Ra
Ain$="Ac
Tri$="Th
Pta$="Pa
Uni$="U
Ntu$="Np
Pto$="Pu
Ari$="Am
Ciu$="Cm
Bke$="Bk
Cif$="Cf
Est$="Es
Fmi$="Fm
Mde$="Md
Nel$="No
Lre$="Lr
Dni$="Db
Sbo$="Sg
Bri$="Bh
Hsi$="Hs
Mtn$="Mt
Dms$="Ds
Rnt$="Rg
Cer$="Cn
Unt$="Uut
Fro$="Fl
Unp$="Uup
Ler$="Lv
Uns$="Uus
Uno$="Uuo
S$=VAR(E$[0]+MID$(E$,3,2))IF"Cm"==S$*!VAL(".1"+E$[1])THEN S$="Ce
IF LEN(E$)>12THEN S$="Rf
?S$

私は3つのキャラクターを選択しました。ほとんどが一意であり(0番目、2番目、および3番目)、2つの特別なケースが残っています。Ciuの場合、名前の2番目の文字が「e」または「E」であるかどうかを確認し、「Rhe」の場合、名前の長さを確認します。

VAR(name)その名前の変数を返します。変数名は大文字と小文字を区別しません。


0

T-SQL、900 894 676バイト

SELECT ISNULL((SELECT LEFT(value,3)FROM
STRING_SPLIT('Sb An-As Ars-At Ast-Bk Berk-Bh Boh-B  Bor-Cd Cad-Cs Cae-Cf Cali-C  Car-Cl Chl-Cr Chr-Cn Cope-Cu Copp-Cm Cu-Ds Da-Db Du-Es Ei-Fm Fe-F  Flu-Gd Gad-Au Go-Hf Haf-Hs Has-H  Hy-I  Io-Fe Iro-Lr Law-Pb Le-Lv Liv-Mg Mag-Mn Man-Mt Mei-Md Men-Hg Mer-Nd Neod-Np Nep-Nb Nio-N  Nit-O  Ox-Pd Pa-P  Ph-Pt Pla-Pu Plu-K  Pot-Pm Prom-Pa Prot-Rn Rado-Re Rhe-Rg Ro-Rb Rub-Rf Ruther-Sm Sa-Sg Sea-Ag Silv-Na So-Sr St-S  Su-Tc Tec-Tb Ter-Tl Tha-Tm Thu-Sn Tin-W  Tu-UuoUnuno-UupUnunp-UusUnuns-UutUnunt-U  Ur-V  V-Yb Ytte-Y  Yttr-Zn Zin-Zr Zir'
    ,'-')m,t WHERE e LIKE SUBSTRING(value,4,9)+'%'),
(SELECT UPPER(LEFT(e,1))+LOWER(SUBSTRING(e,2,1))FROM t))

戻り値は読みやすくするためのもので、2行目は1つの非常に長い文字列です。

STRING_SPLIT SQL 2016以降でサポートされています。

入力は、既存のテーブルを経由して取得されトン varchar型のフィールドとE当社IO規格ごと。出力には、3文字までスペースが埋め込まれます。それが大丈夫かどうかに関するルールは不明確でした。必要に応じて、を追加できますTRIM

入力テーブルは、各要素名の一意の最短プレフィックスを持つすべての要素シンボル(3文字にパディング)のリストで生成されたテーブルと結合されます(キセノンXは十分ですが、RutherfordiumRutheniumと区別する必要があります)。Ruther

編集1:シンボルが名前の最初の2文字であるリストから44エントリを削除することにより、218文字を保存しました。このISNULL関数は、最初のクエリが行を返すのに失敗したかどうかを確認するために使用され、もしそうなら、入力要素名からシンボル(適切に大文字と小文字を区別する)を生成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.