Bảng tuần hoàn các yếu tố - Code Golf


47

Dựa trên thực tế Golf - Hoa Kỳ

Nhiệm vụ của bạn là tìm chữ viết tắt (ký hiệu) của một phần tử được đặt tên phần tử, tối đa và bao gồm ununoctium (118). Sử dụng bảng tuần hoàn trên Wikipedia .

Nhờ ossifrage squeamish, bạn có thể tìm thấy một danh sách đầy đủ các yếu tố để viết tắt tại http://pastebin.com/DNZMWmuf .

Bạn không thể sử dụng bất kỳ tài nguyên bên ngoài. Ngoài ra, bạn không được sử dụng bất kỳ dữ liệu tích hợp cụ thể nào về các yếu tố của bảng tuần hoàn. Tiêu chuẩn áp dụng.

Đầu vào

Đầu vào có thể từ stdin, tập tin prompt, inputv.v.

Định dạng đầu vào:

Tất cả những điều sau đây là đầu vào hợp lệ:

Carbon
carbon
CARBON
cArBOn

Về cơ bản, tên thành phần - trường hợp không nhạy cảm.

Bạn không phải xử lý lỗi chính tả hoặc bất kỳ tên thành phần không hợp lệ nào. Đầu vào không hợp lệ là hành vi không xác định.

Đầu ra :

Biểu tượng cho yếu tố. Ký tự đầu tiên phải được viết hoa và phần còn lại phải là chữ thường.

Ví dụ đầu ra: C

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

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

Có nhiều yếu tố hơn các tiểu bang, vì vậy tôi hy vọng sẽ khó tìm ra quy tắc chung cho những điều này.

Đây là mã golf. Mã ngắn nhất sẽ thắng!


4
@squeamishossifrage Cảm ơn. Cả hai phiên bản ("lưu huỳnh" và "lưu huỳnh") đều được chấp nhận. Chương trình của bạn không phải xử lý cả hai, tuy nhiên, chỉ có một.
soktinpk

1
... Không thể làm gì với regexes. Bạn đã cho chúng tôi tốt.
Josiah Winslow

2
@Xrylite Hãy thử đọc các quy tắc: " Nhập ... tên thành phần - không phân biệt chữ hoa chữ thường ... Đầu ra ... Ký tự đầu tiên phải được viết hoa và phần còn lại phải viết thường".
Jim Balter

2
Thế còn cách viết đúng (Nhôm) so với chính tả Hoa Kỳ (Nhôm) thì sao?
Paul R

4
@codebreaker Có, nếu đầu vào không hợp lệ, chương trình của bạn có thể bị sập, treo, in Auhoặc bất cứ điều gì bạn muốn. @Paul R Nếu có nhiều cách để đánh vần một yếu tố (ví dụ lưu huỳnh so với lưu huỳnh hoặc nhôm so với nhôm), hãy sử dụng bất kỳ cách nào làm cho chương trình của bạn ngắn hơn. Bạn không phải xử lý cả hai trường hợp.
soktinpk

Câu trả lời:


27

CJam, 337 297 293 232 220 201 200 byte

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

Đoạn mã trên sử dụng ký hiệu dấu mũ, vì nó chứa các ký tự điều khiển.

Với chi phí là 24 byte bổ sung (với tổng số là 224), những ký tự đó có thể tránh được.

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

Bạn có thể thử mã này trong trình thông dịch CJam .

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

$ 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

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

Bước đầu tiên là đọc tên thành phần từ STDIN và áp dụng hàm băm khá phức tạp, ánh xạ tất cả các tên thành phần trong phạm vi [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.                                                  ";

Nhiều ký hiệu phần tử được hình thành bởi ký tự thứ nhất và thứ hai, thứ nhất và thứ ba, thứ nhất và thứ tư, thứ nhất và thứ năm hoặc thứ nhất và thứ mười (chỉ là ký tự đầu tiên) của tên tiếng Anh của phần tử. Chúng ta sẽ biểu diễn các phần tử này bằng các số từ 0 đến 4 tương ứng. Tất cả các yếu tố còn lại (đại diện bởi 5) sẽ yêu cầu bảng tra cứu.

Bảng kết quả có thể được đẩy như sau:

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

Mảng mã ký tự được chuyển đổi từ cơ sở 256 sang cơ sở 7 và 6 được thay thế bằng các lần chạy ba số 0.

Đây là bảng quyết định 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]

Hành động cần thiết cho phần tử có hàm băm 1 , ví dụ, tương ứng với phần tử đầu tiên của mảng này. Các phần tử mảng không tương ứng với hàm băm của bất kỳ phần tử nào cũng bằng 0, cho phép nén (0 0 0) 6 .

Bây giờ, chúng tôi giải thích D cho băm H.

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

Tiếp theo, chúng tôi đẩy bảng tra cứu. Nếu chúng ta nối j vào các ký hiệu một ký tự và thay thế Uu bằng Q , mỗi ký hiệu sẽ dài chính xác hai ký tự. Nó có thể được đẩy như sau:

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

Mảng mã ký tự được chuyển đổi từ cơ sở 256 sang cơ sở 25, mã ký tự của A được thêm vào tất cả các chữ số (chuyển thành Ký tự trong quá trình) và kết quả được chia thành các đoạn có độ dài hai.

Đây là bảng tra cứu L:

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

Bây giờ, chúng tôi tiến hành tính toán các tên phần tử tiềm năng.

=                " 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ây giờ ngăn xếp chứa

B M N

Trong đó B là Boolean D [H-1] / 5 , M là tên được lấy từ bảng tra cứu, N là tên thành phần được hình thành bằng cách chọn các ký tự từ E.

Chúng ta sắp hoàn thành:

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

Nhưng làm thế nào nó hoạt động?
Claudiu

2
@Claudiu: Tôi đã thêm một lời giải thích.
Dennis

3
Tôi đã đọc phần thứ ba của lời giải thích và cho đến nay cái tôi có là "Phép thuật". Thật đáng kinh ngạc
Vịt Mooing

7
"AcAlAmSbArAsAtBaBkBeBiBhBBrCdCsCaCfCCeClCrCoCnCuCmDsDbDyEsErEuFmFlFFrGdGaGeAuHf HsHeHoHInIIrFeKrLaLrPbLiLvLuMgMnMtMdHgMoNdNeNpNiNbNNoOsOPdPPtPuPoKPrPmPaRaRnReRh RgRbRuRfSmScSgSeSiAgNaSrSTaTcTeTbTlThTmSnTiWUuoUupUusUutUVXeYbYZnZr" = 226 ký tự. Giải pháp của bạn = 200 ký tự. Có một số voodoo thích hợp đang diễn ra ở đây.
squossish ossifrage

Tôi đã chấp nhận câu trả lời này vì nó có vẻ ngắn nhất nhưng thoải mái đăng câu trả lời bổ sung.
soktinpk

43

C, 452

Một hàm băm tốt giúp. Có thể có những cái tốt hơn. (Những cải tiến được đề xuất bởi @ugoren và cộng sự)

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

Ungolfed với ý kiến:

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

Tôi đã sử dụng vũ lực để tìm ra hàm băm này; Đây là chiếc duy nhất có kích thước băm ≤512 không có va chạm. Tôi đã không kiểm tra cách viết thay thế, và có thể có các chức năng tốt hơn với các thuật toán khác nhau (ví dụ: sử dụng XOR thay vì bổ sung).

Hàm băm ánh xạ các chuỗi văn bản thành các giá trị từ 0 đến 440. "Tin" băm thành 0, vì vậy "Sn" nằm ở đầu bảng. 7 vị trí tiếp theo đều trống. Để giữ cho mã nhỏ gọn, giá trị này được biểu thị bằng giá trị ASCII 34 + 7 = 41 (")"). Tiếp đến là "Đồng" (8), bốn ô trống (34 + 4 = 38 = "&") và "Vanadi" (13). Sau khi tính toán một hàm băm, chương trình bước qua bảng, trừ 1 cho mỗi chữ in hoa theo sau bằng 0 hoặc nhiều chữ cái viết thường và trừ (ASCII VALUE) -34 cho mỗi ký tự không phải là bảng chữ cái. Khi giá trị bằng 0, chúng tôi đã tìm thấy kết quả chính xác.


3
@soktinpk Brute buộc nó :-) Đây là người duy nhất có kích thước băm ≤512 không có va chạm. Tôi đã không kiểm tra cách viết thay thế, và có thể có các chức năng tốt hơn với các thuật toán khác nhau (ví dụ: sử dụng XOR thay vì bổ sung).
squossish ossifrage

2
Làm cho 464 ... bạn có một cặp niềng răng không cần thiết.
Jim Balter

1
Nếu bạn nghĩ về ngữ pháp, nó không rõ ràng và phải được cho phép ... nó chỉ có vẻ mơ hồ đối với chúng tôi . Ồ, và bạn đã bắt được một người khác tôi đã không! Xin chúc mừng về điều này ... Tôi đã cố gắng hết sức để thắt chặt thuật toán nhưng bạn đã làm mọi thứ đúng.
Jim Balter

5
@Harshdeep - Hàm băm ánh xạ các chuỗi văn bản thành các giá trị từ 0 đến 440. "Tin" băm thành 0, vì vậy "Sn" nằm ở đầu bảng. 7 vị trí tiếp theo đều trống. Để giữ cho mã nhỏ gọn, giá trị này được biểu thị bằng giá trị ASCII 34 + 7 = 41 (")"). Tiếp đến là "Đồng" (8), bốn ô trống (34 + 4 = 38 = "&") và "Vanadi" (13). Sau khi tính toán một hàm băm, chương trình bước qua bảng, trừ 1 cho mỗi chữ in hoa theo sau bằng 0 hoặc nhiều chữ cái viết thường và trừ (ASCII VALUE) -34 cho mỗi ký tự không phải là bảng chữ cái. Khi giá trị bằng 0, chúng tôi đã tìm thấy kết quả chính xác.
squossish ossifrage

2
Đẹp một. Lưu một số ký tự với: 1 (h+c%32+74)*311%441.. 2. Thả pvà sử dụng s. 3. main(c)lưu một dấu phẩy.
ugoren

13

JavaScript ES6, 690 708 byte

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)

Mảng đầu tiên chứa các ký hiệu và mảng thứ hai chứa các chữ cái tối thiểu cần thiết để cho biết phần tử nào đang được nhắc đến. Cảm ơn core1024 và edc65 đã giúp rút ngắn nó. Kiểm tra tại http://jsfiddle.net/xjdev4m6/2/ . Hơi dễ đọc hơn:

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

Bạn có thể loại bỏ một số byte bằng cách sử dụng thực tế là Neo khớp với Neodymium, với điều kiện là neon đã được thông qua trong danh sách?
Dancrumb

1
@Dancrumb Thật không may. Vòng lặp bắt đầu với chuỗi con ngắn nhất, vì vậy nó sẽ nhấn Neotrước khi nhấn Neonbởi vì nó có ít chữ cái hơn.
NinjaBearMonkey

1
+1 cho JS ngắn nhất cho đến nay. Mặc dù bạn có thể thoát khỏi iftuyên bố này (Đó là một forđiều kiện hoàn hảo ) và cũng để nội tuyến hoặc thay đổi vị trí của một số biến, để rút ngắn mã;)
core1024

2
ở đầu ).toLowerCase(-> )[L='toLowerCase'](sau đó ở cuối a.toLowerCase(-> a[L](nên cắt 4 ký tự
edc65

10

Ruby 1.9+, 565 471 447 444

Một lớp lót. Bởi vì không có gì là "không thể thực hiện với regexes" ...
(Chỉ lưu 94 ký tự bằng cách thêm một biểu thức chính khác) ((và 24 bằng cách đơn giản hóa chúng))

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

(dòng mới sau khi thêm chuỗi cho "khả năng đọc", xóa để kiểm tra)

sử dụng: ruby periodic.rb aluminum$>

Giải thích:
Việc tách chuỗi trên các thủ đô hàng đầu trả về một mảng regex để khớp với các tên phần tử. Các ký tự chữ cái duy nhất được phép trong mỗi ký tự là từ viết tắt *. Chúng được sắp xếp sao cho khớp đầu tiên được tìm thấy khi so sánh với đối số dòng lệnh *$*là đối số chính xác. Các gsub trailing loại bỏ các ký tự không phải alpha trước khi in.

* Các chữ viết tắt kỳ lạ như "Fe" cho "Sắt" được xử lý bởi một |yếu tố: "Iro | Fe". Sự lựa chọn đầu tiên là những gì thực sự phù hợp; gsub sau đó xóa tất cả các ký tự cho đến '|', để lại chữ viết tắt thực sự.

Khung kiểm tra (yêu cầu danh sách của @ squeamish : được tải xuống dưới dạng 'table.txt' trong thư mục làm việc).

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


Tất nhiên nó hoạt động: ideone.com/7FZlAt
AShelly

Người ta có sự táo bạo để nói điều gì đó không thể được thực hiện với regex. Cảm ơn cho minh họ (ai nói, nhiều người nghĩ) sai :)
Mast

4

Ruby, 1068 byte

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]

Nhập thông qua STDIN.

Các chuỗi con duy nhất ngắn nhất của các tên thành phần là từ ký tự thứ hai đến ký tự thứ sáu (hoặc cuối tên nếu quá ngắn). Vì vậy, tôi chỉ đơn giản là nhận được chúng và tìm kiếm chúng trong một hàm băm. Tôi cũng nén băm vì điều đó tiết kiệm thêm 200 byte. Đây là những gì bản thân hàm băm trông như sau:

{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

Camam 462 449 434 401 391 384 382

Với sự giúp đỡ từ Dennis.

Ifs ternary lồng nhau có lẽ không phải là cách đúng đắn để làm điều này trong 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=

Với thụt lề:

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=

Nhiều biểu tượng chỉ là hai chữ cái đầu tiên của tên của thành phần. Chúng được xử lý trong lớp sâu thứ hai của các câu lệnh if lồng nhau. Nhiều chữ cái khác là chữ cái thứ nhất và thứ ba, hoặc chữ cái thứ nhất và thứ tư - chúng được xử lý trong các lớp bên ngoài liên tiếp. Các biểu tượng chỉ xuất hiện chữ cái đầu tiên và các thông số hoàn chỉnh, được xử lý ở lớp sâu thứ năm và thứ ba tương ứng.

Có một vài nơi mà nó bị lẫn lộn ( TelLuriumvs ThaLlium, hoặc SILiconvs SILver, hoặc RUTheniumvs RUTherfordium). Chúng được xử lý riêng.

Rất nhiều môn đánh gôn có thể được thực hiện ở đây, chủ yếu bằng cách sử dụng lại các khối mã và cải thiện việc xử lý các quy định.


1
Một số mẹo: 1. Hành vi cho tên thành phần không hợp lệ có thể không được xác định, thay vì "RUTHENIUM"=bạn có thể sử dụng "RUTHEN"#!. 2. Bạn không cần in rõ ràng ( o) cũng như không xóa bất cứ thứ gì trước tên thành phần thực tế ( ;"Si"); chỉ cần thêm ]W=vào cuối mã của bạn để loại bỏ mọi thứ trừ phần tử ngăn xếp trên cùng. 3. Điều đó làm cho một vài khối trống. Nếu Blà một Boolean, B{...}{}?B{...}*đạt được như vậy. 4. ternary nếu mất khối hoặc các yếu tố ngăn xếp, vì vậy bạn có thể rút ngắn {"Si"}tới "Si".
Dennis

@Dennis Tôi nghĩ rằng tôi đã thêm tất cả những thứ đó vào. Tuy nhiên, việc quản lý ngăn xếp cần có công việc - quá nhiều _và ở ;khắp mọi nơi

@Dennis Và tôi đã loại bỏ một vài ký tự bằng cách thay đổi trường hợp mặc định thành chữ thường và bằng cách sử dụng các khối mã bí danh nhiều hơn

3

PHP, 507 485 476 466 ký tự

Cách sử dụng: nhập tên thành phần dưới dạng tham số GET '0' - Elements.php? 0 = carbon

Thuật toán: Chạy qua chuỗi dữ liệu, rút ​​ra chuỗi con, cặp mã viết tắt. Nếu chuỗi con khớp với phần bắt đầu của phần tử được truyền vào, hãy sử dụng mã viết tắt để xác định những gì sẽ xuất: Nếu mã bắt đầu bằng một chữ cái, hãy xuất nó dưới dạng một chuỗi. Nếu là số N, hãy xuất chữ cái đầu tiên của phần tử + chữ Nth. Các phần tử Unun được đặt đặc biệt với mã '|'. Nếu không tìm thấy chuỗi con nào khớp với tên được truyền vào, hãy xuất hai ký tự đầu tiên của tên dưới dạng viết tắt.

Mã có thể đọc được:

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

Ngưng tụ:

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

Thực hiện ngây thơ tỏa sáng trong sự đơn giản của nó. Chuỗi phụ duy nhất từ ​​đầu tên chỉ được ánh xạ tới biểu tượng.

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

Con trăn - 652 649 637

Bảng băm của tôi dựa trên sự kết hợp của mỗi giây và mỗi ký tự thứ ba của tên chữ hoa:

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

Đây là trình tạo tương ứng:

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'

Có lẽ có chỗ cho những cải tiến, đặc biệt là nén hai chuỗi dài.

Đã thử nghiệm với:

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?=

Giải trình:

{        }%                              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, Một mảnh của Golfscript không phải là 10 ký tự hoặc ít hơn!
WallyWest

1
Bạn có thể nhận được một cải tiến lớn cho mảng chuỗi đó bằng cách sử dụng một chuỗi với dòng mới làm dấu phân cách và sau đó thực hiệnn/
Peter Taylor

Tôi đã làm điều đó lần trước, tại sao tôi không nghĩ về điều đó? Cập nhật ngay.
Josiah Winslow

2

Haskell, 920 817 807 776 Chars

Sau khi làm việc quá lâu, tạo ra một hệ thống quy tắc cho các ký tự của tên thành phần được bao gồm trong biểu tượng của nó và một chút mày mò, tôi đã xoay sở để viết một kịch bản có thể dịch yếu tố thành biểu tượng một cách dễ dàng. Sắt là một vấn đề đối với tôi, vì tôi có thể lấy mẫu một số ký tự từ GOld, SilVer, TiN, LEad, SoDium, MerCury, ANtimony, PotaSsium và TUngsten, chuyển đổi chúng thành biểu tượng định kỳ không sử dụng (tôi chọn cách lấy mẫu đơn giản nhất để tích hợp chúng vào các quy tắc hiện có), và sau đó dịch sau khi chuyển đổi biểu tượng; Tuy nhiên, Iron là một vấn đề, bởi vì Ir, Io và In đều đã được sử dụng. Đây ban đầu là 920 ký tự, nhưng tôi nhận ra rằng mẫu phù hợp cuối cùng (lớn nhất) không cần phải ở đó, vì nó để mọi thứ trôi qua (mà nó không) hoặc khớp với tất cả chúng; vì thế, Tôi đã thay thế nó bằng một ký tự đại diện. Sau đó, tôi tiếp tục chơi golf từ 817 đến 808 bằng cách viết tắt một số mẫu bằng cách sử dụng các ký tự đại diện theo cách mà chúng vẫn duy nhất cho tên thành phần đó (ví dụ: phần tử duy nhất có 'w' trong tên của nó là Lawrencium, vì vậy "* w "khớp với 1 ký tự ít hơn" Luật ").

Đây là mã của tôi. Tôi đã thử nghiệm nó cho tất cả các yếu tố và tôi đã mã hóa nó để nó tự động chuyển đổi đầu vào của nó thành Titlecase, do đó không có vấn đề với độ nhạy trường hợp.

CHỈNH SỬA 1

Tôi tiếp tục giảm nó xuống 776 ký tự bằng cách thay thế biểu thức trường hợp trong t bằng khớp mẫu (điều này có ý nghĩa vì biểu thức trường hợp đang kiểm tra toán hạng thô trái với biểu thức về toán hạng), loại bỏ các dấu ngoặc đơn không cần thiết và tái biểu thị edưới dạng một chuỗi phân tách dòng mới thay vì một danh sách các chuỗi và sau đó phân tách nó trong hàm chính. Bởi vì những thay đổi này hoàn toàn là chơi golf, tôi đã giữ nguyên phiên bản có thể đọc được của con người.

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

Phiên bản có thể đọc được của con người (dòng mới, khoảng cách, tên dài dòng, nhận xét: 2311 Chars)

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

Nếu bất cứ ai quan tâm đến một lời giải thích cho bất kỳ phần nào của điều này, hãy hỏi.


2

C # (826)

không phải là tốt nhất nhưng tôi nghĩ tôi sẽ thử nó với điểm chấp của 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;}}}

Vì vậy, tôi đã viết một chương trình để biến tên đầy đủ của các phần tử (ví dụ carbon) thành chuỗi nhỏ nhất nhưng vẫn duy nhất có thể và đã làm điều này cho tất cả các phần tử đối với tất cả các chuỗi duy nhất khác. Sau đó, tôi đã tuần tự hóa nó thành một chuỗi lớn xấu xí trong đó chữ in hoa biểu thị sự bắt đầu của "khối", với các đoạn xen kẽ giữa là khóa và giá trị. Giống như KeyValueKey2Value2, v.v.

Kịch bản này hủy bỏ chuỗi lớn đó và cắt một ký tự khỏi phần cuối của chuỗi được nhập cho đến khi tìm thấy nó trong từ điển được tạo từ chuỗi lớn.

(Tôi nên bổ sung kiến ​​thức về C # không đáng kinh ngạc và bài dự thi ban đầu tôi thực hiện chỉ là sử dụng những thứ tôi biết nhưng sau đó tôi đã có một số thủ thuật được người khác chỉ ra cho tôi.)


Bạn có thể đánh gôn này hơn nữa bằng cách thay đổi tất cả các định nghĩa loại thành var. Bạn có thể tiết kiệm thêm một vài chi tiết bằng cách xóa dấu ngoặc nhọn sau câu lệnh đơn. Nếu bạn chỉ định t.Substring(int, int)cho một Func<int, int, string>bạn có thể lưu một cặp vợ chồng khác.
Brandon

Tôi đã thực hiện hầu hết các defs "var" nhưng dường như tôi đã bỏ lỡ một hoặc hai, cũng hoàn toàn quên mất ifs không dấu ngoặc, cảm ơn.
miethpo

Bạn có thể cạo thêm 5 nhân vật bởi varing string[] rvà thêm 3 bởi varing string t = Console...., cuối cùng, bạn sẽ tiết kiệm 7 hơn bằng cách thay đổi return new string[]thành return new[]vào cuối.
Brandon

Có một số cải tiến nhỏ khác mà bạn có thể thực hiện như chuyển if(...) break;logic của mình vào các điều kiện thoát vòng lặp for. Một số nghịch đảo logic khác có thể được áp dụng, chẳng hạn như do { } while(..)trong phương pháp trích xuất của bạn. Điều này ngắn hơn so với việc thêm một hoạt động logic riêng cho trường hợp nhập. Tôi đã đăng một chỉnh sửa mã của bạn vẫn cần xem xét / chấp nhận do đại diện thấp của tôi trên trang web này. Có tới 870 ký tự.
nicholas

1
@Nicholas Tôi không chắc chắn việc chỉnh sửa mã golf của người khác là lịch sự ...
miethpo

1

JavaScript (E6) 1433

Đây là giới hạn trên

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

Thử nghiệm trong bảng điều khiển FireFox / FireBug

F('Rutherfordium')

Đầu ra

Rf

1

SmileBASIC, 1763 1418 1204 1128 byte

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$

Tôi đã chọn 3 ký tự hầu hết là duy nhất (0, 2 và 3), trong đó có 2 trường hợp đặc biệt: Cerium / Curium đều là "Ciu" và Ruthenium / Rutherfordium đều là "Rô". Đối với Ciu, tôi kiểm tra xem ký tự thứ hai của tên là "e" hay "E" và đối với "Rhe", tôi kiểm tra độ dài của tên.

VAR(name)trả về biến có tên đó Tên biến là trường hợp không nhạy cảm.


0

T-SQL, 900 894 676 byte

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

Trả về chỉ dành cho khả năng đọc, dòng thứ hai là một chuỗi rất dài.

STRING_SPLIT được hỗ trợ trong SQL 2016 trở lên.

Đầu vào được lấy thông qua một bảng t có sẵn với trường varchar e , theo các tiêu chuẩn IO của chúng tôi . Đầu ra được đệm với khoảng trắng đến 3 ký tự; các quy tắc không rõ ràng về việc đó là ok. Nếu cần, tôi có thể thêm một TRIM.

Bảng đầu vào được nối với một bảng được tạo với một danh sách tất cả các ký hiệu phần tử (được đệm thành 3 ký tự) với tiền tố duy nhất ngắn nhất cho mỗi tên thành phần ( Xđủ cho Xenon , nhưng Rutherfordium yêu cầu Rutherphải phân biệt với Ruthenium ).

EDIT 1 : Đã lưu 218 ký tự bằng cách xóa 44 mục khỏi danh sách có ký hiệu là hai chữ cái đầu tiên của tên chúng; các ISNULLchức năng được sử dụng để xem nếu truy vấn đầu tiên thất bại trong việc trở lại liên tiếp, và nếu như vậy, tạo ra các biểu tượng (cased đúng) từ tên yếu tố đầu vào.

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