Elementlerin Periyodik Tablosu - Kod Golf


47

Pratik Golf Üzerine - ABD Devletleri

Senin görevin ununoctium (118) dahil olmak üzere, element adı verilen bir elementin kısaltmasını (sembol) bulmaktır. Wikipedia'daki periyodik tabloyu kullanın .

Pürüzlü ossifrage sayesinde, kısaltmalardaki tüm öğelerin listesini http://pastebin.com/DNZMWmuf adresinde bulabilirsiniz .

Herhangi bir dış kaynak kullanamazsınız. Ayrıca, özellikle periyodik tablonun öğeleriyle ilgili yerleşik verileri kullanamazsınız. Standart boşluklar uygulanır.

Giriş

Giriş, stdin, dosya prompt, inputvb. Olabilir .

Giriş Biçimi:

Aşağıdakilerin tümü geçerli girdilerdir:

Carbon
carbon
CARBON
cArBOn

Temel olarak, eleman adı - büyük / küçük harf duyarsız.

Yanlış yazımları veya geçersiz öğe adlarını işlemeniz gerekmez. Geçersiz giriş tanımsız davranış.

Çıktı :

Elemanın sembolü. İlk karakter olmalıdır harfle olması ve geri kalan olmalıdır küçük harf olması.

Örnek çıktı: C

Test durumları:

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

Devletlerden çok daha fazla unsur var, bu yüzden bunlar için genel bir kural bulmanın daha zor olmasını bekliyorum.

Bu kod golfü. En kısa kod kazanır!


4
@squeamishossifrage Teşekkürler. Her iki versiyon ("kükürt" ve "kükürt") kabul edilebilir. Ancak, programınızın ikisini birden ele alması gerekmez.
soktinpk

1
... regex'lerle yapmak imkansız. Bizi iyi aldın.
Josiah Winslow

2
@ Xrylite Kuralları okumayı deneyin : " Girdi ... öğe adı - büyük / küçük harfe duyarlı değil ... Çıktı ... İlk karakter büyük harfle başlamalı ve geri kalanlar küçük harf olmalıdır".
Jim Balter

2
US yazımına (Alüminyum) karşı doğru yazım (Alüminyum)?
Paul R

4
@codebreaker Evet, giriş geçerli değilse, programınız çökebilir, takılabilir, yazdırılabilir Auveya istediğiniz ne olabilir. @Paul R Bir elementi hecelemek için birçok yol varsa (örn. Kükürt vs kükürt veya alüminyum vs alüminyum) programınızı kısaltmak için kullanın. Her iki durumda da işlem yapmak zorunda değilsiniz.
soktinpk

Yanıtlar:


27

CJam, 337 297 293 232 220 201 200 bayt

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

Yukarıdaki kod, kontrol karakterlerini içerdiğinden, şapka notasyonu kullanır.

24 ek byte (toplam 224) pahasına, bu karakterlerden kaçınılabilir.

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

Bu kodu CJam tercümanında deneyebilirsiniz .

Test durumları

$ 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

Nasıl çalışır

İlk adım, öğe adını STDIN'den okumak ve aralıktaki tüm öğe adlarını eşleyen oldukça ayrıntılı bir karma işlevi uygulamaktır : [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.                                                  ";

Birçok eleman sembolü, birinci ve ikinci, birinci ve üçüncü, birinci ve dördüncü, birinci ve beşinci veya birinci ve elementin İngilizce adının onuncu (sadece ilk olan) karakterinden oluşur. Bu elemanları sırasıyla 0-4 arası sayılarla temsil edeceğiz. Kalan tüm elementler (5 ile temsil edilir) bir arama tablosu gerektirir.

Sonuçta ortaya çıkan tablo aşağıdaki gibi itilebilir:

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

Karakter kodları dizisi, taban 256'dan taban 7'ye dönüştürülür ve 6'lar, üç 0'lık değerler ile değiştirilir.

Bu karar tablosu 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]

Karma 1 olan eleman için gerekli eylem , örneğin, bu dizinin ilk elemanına karşılık gelir. Herhangi bir öğenin karma değerine karşılık gelmeyen dizi öğeleri de sıfırdır, bu da (0 0 0) ↦ 6 sıkıştırmasına izin verir .

Şimdi, H'yi karma H için yorumluyoruz.

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

Sonra, arama masasını iteriz. Biz eklerseniz j tek karakterlik sembollerine ve değiştirme UU ile Q , her sembolün tam iki karakter uzunluğunda olacak. Aşağıdaki gibi itilebilir:

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

Karakter kodları dizisi, taban 256'dan taban 25'e dönüştürülür, A'nın karakter kodu tüm basamaklara eklenir (işlemdeki Karaktere döküm) ve sonuç, iki uzunluklu parçalara bölünür.

Bu arama tablosu L:

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

Şimdi, potansiyel eleman isimlerini hesaplamaya devam ediyoruz.

=                " 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.                              ";

Yığın şimdi içeriyor

B M N

burada B , Boolean D [H-1] / 5'tir , M , arama tablosundan elde edilen addır ve N , E'den karakterleri seçerek oluşturulan eleman adıdır.

Neredeyse tamamız:

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

Ama nasıl çalışır?
Claudiu

2
@ Claudiu: Bir açıklama ekledim.
Dennis,

3
Açıklamanın ilk üçünü okudum ve şu ana kadar elimde "Magic" var. İnanılmaz
Mooing Duck

7
"AcAlAmSbArAsAtBaBkBeBiBhBBrCdCsCaCfCCeClCrCoCnCuCmDsDbDyEsErEuFmFlFFrGdGaGeAuHf HsHeHoHInIIrFeKrLaLrPbLiLvLuMgMnMtMdHgMoNdNeNpNiNbNNoOsOPdPPtPuPoKPrPmPaRaRnReRh RgRbRuRfSmScSgSeSiAgNaSrSTaTcTeTbTlThTmSnTiWUuoUupUusUutUVXeYbYZnZr" = 226 karakter. Çözümünüz = 200 karakter. Burada devam eden uygun bir vudu çiçeği var.
pembemsi ossifrage

Bu cevabı kabul ettim çünkü en kısa gibi görünüyor ama ek cevaplar göndermek için çekinmeyin.
soktinpk

43

C, 452

İyi bir karma işlevi yardımcı olur. Daha iyileri olabilir. ( @Ugoren ve diğerleri tarafından önerilen iyileştirmeler )

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

Yorumsuz Ungolfed:

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

Bu karmaşayı bulmak için kaba kuvvet kullandım; Bu, çakışmayan has512 karma büyüklüğüne sahip olan tek kişiydi. Yine de alternatif yazımları kontrol etmedim ve farklı algoritmalarla daha iyi fonksiyonlar olabilirdi (örneğin, ekleme yerine XOR kullanarak).

Karma işlevi, metin dizelerini 0 ila 440 arasındaki değerlerle eşleştirir. Sonraki 7 pozisyon boş. Kodu küçük tutmak için bu, ASCII değeri 34 + 7 = 41 (")") ile gösterilir. Daha sonra "Bakır" (8), dört boş hücre (34 + 4 = 38 = "&") ve "Vanadyum" (13) geliyor. Bir karma hesapladıktan sonra, program tablo boyunca ilerler, her büyük harf için 1 ve ardından 0 veya daha fazla küçük harf ile çıkarılır ve alfabe olmayan her karakter için (ASCII DEĞER) -34 çıkarılır. Değer sıfıra ulaştığında, doğru sonucu bulduk.


3
@soktinpk Brute zorla :-) Bu, 12512 karma büyüklüğünde çarpışma olmayan tek kişiydi. Yine de alternatif yazımları kontrol etmedim ve farklı algoritmalarla daha iyi fonksiyonlar olabilirdi (örneğin, ekleme yerine XOR kullanarak).
pembemsi ossifrage

2
Şunu yap 464 ... gereksiz yere diş telin var.
Jim Balter

1
Dilbilgisi hakkında düşünürseniz, belirsizdir ve izin verilmesi gerekir ... sadece bize belirsiz görünüyor . Oh, sen de benim yapmadığım birini yakaladın! Bunun için tebrikler ... Algoritmayı daraltmak için çok çalıştım ama her şeyi doğru yaptın.
Jim Balter

5
@Harshdeep - Karma işlevi, metin dizelerini 0 ila 440 arasındaki değerlere eşler. Sonraki 7 pozisyon boş. Kodu küçük tutmak için bu, ASCII değeri 34 + 7 = 41 (")") ile gösterilir. Daha sonra "Bakır" (8), dört boş hücre (34 + 4 = 38 = "&") ve "Vanadyum" (13) geliyor. Bir karma hesapladıktan sonra, program tablo boyunca ilerler, her büyük harf için 1 ve ardından 0 veya daha fazla küçük harf ile çıkarılır ve alfabe olmayan her karakter için (ASCII DEĞER) -34 çıkarılır. Değer sıfıra ulaştığında, doğru sonucu bulduk.
pembemsi ossifrage

2
Güzel. 1.: Bazı karakter kaydet (h+c%32+74)*311%441. 2. Bırak pve kullan s. 3. main(c)bir virgül kaydeder.
ugoren

13

JavaScript ES6, 690 708 bayt

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)

İlk dizi sembolleri tutarken, ikinci dizi hangi öğeye yönlendirildiğini söylemek için gereken minimum harfleri tutar. Kısaltılmasına yardımcı olan core1024 ve edc65 sayesinde. En Testi http://jsfiddle.net/xjdev4m6/2/ . Biraz daha okunaklı:

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’un listeye girmesiyle Neo’nun Neodim ile eşleştiği gerçeğini kullanarak bazı baytları tıraş eder misiniz?
Dancrumb

1
@Dancrumb Ne yazık ki değil. Döngü en kısa alt dize ile başlar, böylece daha az harf içerdiğinden, çarpmadan Neoönce çarpacaktır Neon.
NinjaBearMonkey 7:14

1
Şimdiye kadarki en kısa JS için +1. Bu ifadeden kurtulabilmenize rağmenif (Bu mükemmel bir fordurum) ve ayrıca bazı değişkenlerin konumlarını sıraya koymak veya kaydırmak için, kodu kısaltmak için;)
core1024

2
başında ).toLowerCase(-> )[L='toLowerCase'](sonra sonunda a.toLowerCase(-> a[L](4 karakter
kesmeli

10

Ruby 1.9+, 565 471 447 444

Bir astar. Çünkü hiçbir şey "regex'lerle yapmak imkansız" değil ... ...
(Başka bir regex ekleyerek 94 karakter kurtardım)

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/,''

("okunabilirlik" için dize eklendikten sonra newline, test için kaldır)

kullanım: ruby periodic.rb aluminum$>

Açıklama:
Baştaki büyük harflerden oluşan dizgenin ayrılması, öğe adlarıyla eşleşecek şekilde bir regex dizisi döndürür. Her birinde izin verilen yalnızca alfabetik karakterler, kısaltmadaki karakterlerdir *. Komut satırı argümanı *$*ile karşılaştırırken bulunan ilk eşleşmenin doğru olduğu şekilde sıralanırlar . Sondaki gsub, yazdırmadan önce alfa olmayan karakterleri çıkarır.

* "Demir" için "Fe" gibi tuhaf kısaltmalar bir |öğe tarafından ele alınır : "Iro | Fe". İlk tercih, aslında neyin eşleştirildiğidir; gsub daha sonra gerçek kısaltmayı bırakarak '|' işaretine kadar olan tüm karakterleri kaldırır.

Test çerçevesi ( @ squeamish listesi gerektirir : çalışma dizininde 'table.txt' olarak indirildi).

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
Tüm 100+ vakalarda işe yararsa ayakta alkışlandı
edc65

Tabii ki işe yarıyor: ideone.com/7FZlAt
AShelly

Birinin regex ile yapılamayacağını söyleme cesareti var. Onları kanıtladığınız için teşekkür ederiz (bir tanesi çok düşündüm) yanlış :)
Mast

4

Ruby, 1068 bayt

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 ile giriş.

Öğe adlarının en kısa benzersiz alt dizileri, ikinci ile altıncı karakter arasındadır (veya çok kısa ise adın sonu). Bu yüzden sadece bunları alıyorum ve bir karmaşa içinde arıyorum. Ayrıca başka bir 200 byte tasarrufu sağladığından hash'ı sıkıştırdım. İşte karma'nın kendisi gibi görünüyor:

{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, 462 449 434 401 391 384 382

Dennis'in yardımıyla.

kod

İç içe üçlü ifs, muhtemelen CJam'da bunu yapmanın doğru yolu değildir.

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=

Girintilerle:

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=

Sembollerin çoğu, öğenin adının yalnızca ilk iki harfidir. Bunlar, ifadelerin iç içe geçmiş en derin ikinci katmanında ele alınır. Diğer birçokları birinci ve üçüncü harf veya birinci ve dördüncü harf - bunlar birbirini takip eden dış katmanlarda işlenir. Yalnızca ilk harfin göründüğü ve tam düzensizliklerin olduğu simgeler sırasıyla beşinci ve üçüncü en derin katmanlarda işlenir.

Kafası karışan bir kaç nokta var ( TelLuriumvs ThaLliumveya SILiconvs SILverveya RUTheniumvs RUTherfordium). Bunlar ayrı ayrı ele alınır.

Burada, çoğunlukla kod bloklarını yeniden kullanarak ve düzensizlerin idare edilmesini geliştirerek birçok golf yapılabilir.


1
Birkaç ipucu: 1. Geçersiz öğe adları için davranış "RUTHENIUM"=, kullanmanız yerine tanımsız olabilir "RUTHEN"#!. 2. oAsıl öğe adından ( ;"Si") önce açıkça yazdırmanız ( ) veya hiçbir şeyi kaldırmanız gerekmez ; ]W=en üstteki yığın öğesinden başka her şeyi kaldırmak için kodunuzun sonuna ekleyin . 3. Bu birkaç blok boş yapar. Eğer Bbir Boole olduğunu B{...}{}?ve B{...}*aynı başarmak. Kısaltmanıza böylece 4. üçlü, blok veya yığın elemanlarını alırsa {"Si"}için "Si".
Dennis,

@Dennis Ben hepsini de ekledim. Yığın yönetiminin çalışması gerekiyor - yine de çok fazla _ve ;her yerde

@Dennis Ve varsayılan karakteri küçük harfe

3

PHP, 507 485 476 466 karakter

Kullanım: eleman adını GET parametresi '0' olarak girin - elements.php? 0 = carbon

Algoritma: Veri dizgisini çalıştırın, alt dizgeyi, kısaltma kodu çiftlerini çıkarın. Alt dize, iletilen öğenin başlangıcıyla eşleşiyorsa, ne çıkacağını belirlemek için kısaltma kodunu kullanın: Kod bir harfle başlıyorsa, onu bir dizge olarak çıktılayın. N sayısıysa, öğenin ilk harfini + N'inci harfi çıkar. Unun elemanları '|' kodu ile özel olarak kastedilmiştir. Girilen adla eşleşen bir alt dize bulunamazsa, adın ilk iki karakterini kısaltma olarak çıkarın.

Okunabilir kod:

<?
$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];

Yoğun:

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

Naif uygulama sadeliği içinde parlıyor. Adın başlangıcından itibaren benzersiz alt dize basitçe sembole eşlenir.

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

Karma tablom büyük harf adının her saniyesinin ve her üç karakterinin birleşimine dayanır:

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

İşte ilgili jeneratör:

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'

Muhtemelen iyileştirmelere yer vardır, özellikle iki uzun ipi sıkıştırmak.

Şununla test edildi:

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

2

Golf Betiği - 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?=

Açıklama:

{        }%                              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 veya daha az karakter içermeyen bir Golfscript parçası!
WallyWest

1
Ayırıcı olarak newline ile bir dize kullanarak ve ardından bunu yaparken bu dizi dizisinde büyük bir gelişme elde edersinizn/
Peter Taylor

Bunu geçen sefer yaptım, neden bunu düşünmedim? Şimdi güncelleniyor.
Josiah Winslow

2

Haskell, 920 817 807 776 Chars

Çok uzun bir süre çalıştıktan sonra, bir element adının hangi karakterlerinin sembolüne dahil edildiğine ve bir parça dolaşma özelliğine sahip bir kural sistemi oluşturduktan sonra, elemanı kolayca sembole çeviren bir senaryo yazmayı başardım. Demir benim için bir problemdi, çünkü GOld, SilVer, TiN, LEad, SoDium, MerCury, ANtimony, PotaSsium ve TUngsten'den bazı karakterleri örnekleyebildim, onları kullanılmayan bir periyodik sembole dönüştürebiliyordum. onları mevcut kurallara koyarlar) ve sonra sembolik dönüşümden sonra çeviriler yapar; Ancak demir bir problemdi, çünkü Ir, Io ve In zaten çoktan kullanılıyordu. Bu başlangıçta 920 karakterdi, ancak son desen eşleşmesinin (en büyük) eşleşmesinin, her şeyin düşmesine izin verdiği ya da hepsiyle eşleştiği için orada olması gerekmediğini fark ettim; dolayısıyla, Her şeyi bir joker karakterle değiştirdim. Ondan sonra, 817'den 808'e kadar bazı modelleri joker karakterleri kullanarak hala bu element adına özel olacak şekilde kısaltarak golf oynadım (örneğin, adında 'w' olan tek element Lawrencium, yani "* w "," Kanun "dan 1 karakterden daha düşük olanla eşleşir).

İşte kodum. Tüm elementler için test ettim ve kodunu girdilerini otomatik olarak titlecase'e çevirecek şekilde kodladım, böylece büyük / küçük harf duyarlılığı ile ilgili herhangi bir sorun olmadı.

1 EDIT

Vaka ifadesini t cinsini desen eşleştirmesiyle değiştirerek daha da 776 karaktere düşürdüm (bu durum mantık ifadesinin işlenene göre ifadeye karşılık ham işleci test etmesi, anlam ifade ettiği için gereksiz parantezleri çıkarmak ve yeniden yapmak) eBir dize listesi yerine newline ile ayrılmış bir dize olarak ifade etme ve sonra onu ana işlevde bölme. Bu değişiklikler tamamen golf oynadığı için insan tarafından okunabilir versiyonunu değiştirmedim.

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

İnsan Tarafından Okunabilen Sürüm (yeni satırlar, boşluklar, ayrıntılı adlar, yorumlar: 2311 Karakterler)

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

Herhangi bir bölümü için bir açıklama yapmak isteyen varsa, sormaya çekinmeyin.


2

C # (826)

en iyisi değil ama c # handikapıyla deneyeceğimi düşündüm.

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

Bu yüzden, öğelerin tam adını (örneğin karbon) mümkün olan en küçük ama yine de benzersiz dizgeye dönüştürmek için bir program yazdım ve bunu tüm diğer dizgilere göre tüm öğeler için yaptım. Daha sonra, büyük harflerin "topakların" başlangıcını gösterdiği büyük bir çirkin dizgeye dizilip, parçalar ve değerler arasında değişkenlik gösteriyorum. KeyValueKey2Value2 gibi

Bu betik, büyük dizgenin sersemletir ve girilen dizginin sonundaki bir karakteri büyük dizgeden yapılan sözlükte bulana kadar keser.

(C # bilgimi şaşırtıcı değil ve yaptığım orijinal gönderim sadece bildiğim şeyleri kullanmaktı, fakat daha sonra başkaları tarafından bana işaret edilen bazı numaralar kullandım.)


Tüm tip tanımlarını değiştirerek bunu daha da golf yapabilirsiniz var. Tekli ifadeden sonra bloklar varsa parantezleri kaldırarak birkaç tane daha tasarruf edebilirsiniz. Eğer atarsanız t.Substring(int, int)a Func<int, int, string>başka çift kaydedebilirsiniz.
Brandon

Ben değişken değişkenlerin çoğunu "var" yaptım ama bir ya da iki özlemiştim, ayrıca parantezsiz ifs'i de unuttum, teşekkürler.
miethpo

Sen tarafından daha 5 karakter tıraş edebilirsiniz varing string[] rtarafından ve bir başka 3 varing string t = Console...., son olarak, sen değiştirerek daha 7 tasarruf edersiniz return new string[]içine return new[]en sonunda.
Brandon

if(...) break;Mantığınızı for loop çıkış koşullarına geçirme gibi yapabileceğiniz birçok küçük geliştirme vardır . do { } while(..)Ekstraksiyon yönteminiz gibi bir dizi başka mantık inversiyonu uygulanabilir . Bu, giriş durumu için ayrı bir mantıksal işlem eklemekten daha kısadır. Kodunuzda, bu sitedeki düşük itibarım nedeniyle yine de incelemesi / kabulü gerektiren bir düzenleme yaptım. 870 karaktere indirdim.
nicholas

1
@Nicholas başkasının kodunu düzenlemeyi bilmiyorum golf golf kibar ...
miethpo

1

JavaScript (E6) 1433

İşte un üst sınırı

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

FireFox / FireBug konsolunda test edin

F('Rutherfordium')

Çıktı

Rf

1

SmileBASIC, 1763 1418 1204 1128 bayt

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$

2 özel durum bırakan çoğunlukla benzersiz olan 3 karakter seçtim (0, 2 ve 3): Seryum / Curium'un her ikisi de "Ciu" ve Ruthenium / Rutherfordium'un her ikisi de "Rhe". Ciu için ismin ikinci karakterinin "e" veya "E" olup olmadığını kontrol ediyorum ve "Rhe" için ismin uzunluğunu kontrol ediyorum.

VAR(name)bu ada sahip değişkeni döndürür. Değişken isimleri büyük / küçük harf duyarsızdır.


0

T-SQL, 900 894 676 bayt

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

İadeler sadece okunabilirlik içindir, ikinci satır çok uzun bir dizedir.

STRING_SPLIT SQL 2016 ve daha üstü sürümlerde desteklenir.

Girdi önceden varolan tablo aracılığıyla alınır t varchar alan ile e , bizim IO standartlarına göre . Çıktı boşluklarla 3 karaktere kadar doldurulur; Kurallar bunun iyi olup olmadığı konusunda net değildi. Gerekirse, bir ekleyebilirim TRIM.

Giriş tablosu, her eleman adı kısa karışmayacak (3 karakter dolgulu) her eleman sembollerinin listesi oluşturulacak bir tablo ile birleştirilir ( Xyeterlidir Xenon ancak Rutherfordium gerektirir Rutherayırmak için Rutenyum ).

DÜZENLEME 1 : Sembolleri isimlerinin ilk iki harfi olan listeden 44 girişi silerek 218 karakter kaydedildi; ISNULLişlevi ilk sorgu bir satır dönmek için başarısız olmadığını görmek için kullanılan, ve bu durumda, giriş elemanı adından (uygun şekilde lezzetlendirilmiş) sembolü üretir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.