php元素周期表,元素周期表-代码高尔夫

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

òë^м~í^Ìéá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**

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

许多元素符号由元素英文名称的第一个和第二个,第一个和第三个,第一个和第四个,第一个和第五个或第一个和第十个(仅是第一个)字符组成。我们将分别用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则被三个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压缩。

现在,我们将D解释为哈希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 ";

接下来,我们推查询表。如果我们将j附加到单个字符符号上,并用Q替换Uu,则每个符号将恰好是两个字符长。可以按以下方式推送:

" ¬^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] / 5,M是从查找表中检索的名称,N是通过从E中选择字符形成的元素名称。

我们差不多完成了:

? " If B, push M; else, push N. ";

( \ " Extract the first character from the string. ";

el " Convert the rest to lowercase. ";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值