高尔夫溶解度表


12

给定阳离子和阴离子的名称,输出“ S”(可溶)或“ I”(不溶)。我们将使用的表来自维基百科:https : //en.wikipedia.org/wiki/Solubility_chart。将其复制到问题的末尾以备将来参考。

输入:阳离子,后跟阴离子,并用空格分隔。阳离子将是以下之一:

Lithium Sodium Potassium Ammonium Beryllium Magnesium Calcium 
Strontium Barium Zinc Iron(II) Copper(II) Aluminium Iron(III) Lead(II) Silver

阴离子将是以下之一:

Fluoride Chloride Bromide Iodide Carbonate Chlorate Hydroxide Cyanide Cyanate 
Thiocyanate Nitrate Oxide Phosphate Sulfate Dichromate

每个字母的首字母大写。

输入示例: Sodium Chloride

输出:真实值,S如果可溶,假或I其他,则为或。如果维基百科页面上列出了其他任何内容(例如,微溶或与水反应),或者输入内容不是“阳离子阴离子”形式,则您的程序可能会执行任何操作(未定义的行为),因此可能会输出“ S”,“我,或其他。

表:

?,S,S,S,?,S,S,S,?,S,S,?,I,S,S
S,S,S,S,S,S,S,S,S,S,S,?,S,S,S
S,S,S,S,S,S,S,S,S,S,S,?,S,S,S
S,S,S,S,S,S,S,S,?,S,S,?,S,S,S
S,S,S,?,?,?,?,?,?,?,S,?,?,S,?
?,S,S,S,I,S,I,?,?,?,S,I,I,S,I
I,S,S,S,I,S,?,S,?,?,S,?,I,?,I
?,S,S,S,I,S,S,?,?,?,S,?,?,I,?
?,S,S,S,I,S,S,S,?,?,S,?,?,I,?
?,S,S,S,I,S,I,I,?,?,S,I,I,S,I
S,S,S,S,I,S,I,?,?,?,S,I,I,S,I
?,S,S,?,I,S,I,?,?,I,S,I,I,S,I
S,S,S,?,?,S,I,?,?,?,S,I,I,S,I
?,S,S,?,?,S,I,?,?,?,S,I,I,?,I
?,?,?,I,I,S,I,?,?,?,S,I,I,I,?
S,I,I,I,I,S,?,I,I,?,S,?,I,?,I

行是按上面列出的顺序的阳离子,而列是阴离子。例如,由于碘化镁是可溶的,镁是第六种阳离子,碘化物是第四种阴离子,因此第六行第四列的​​字符为“ S”。该?指示未定义行为。


1
我之所以喜欢这样,是因为?s 的不确定行为为人们可以使用的算法提供了很大的自由度。
Jo King

1
@FryAmTheEggman尽管有kolmogorov-complexity标签,但挑战并不要求输出表,而是要求给定(阳离子,阴离子)对的正确值。
Arnauld

4
我删除了kolmogorov-complexity标签,并添加了Decision-problem标签,因为这不是要创建固定(或部分固定)的输出,而是确定某个输入是否满足某些条件。
斯蒂夫·格里芬

你会考虑允许输出的任何2个不同的值一致,而不仅仅是truthy/ 'S'falsy/ 'I'
阿纳尔德

我建议删除“以空格分隔”规范,而不是说“除了站点默认值之外,还可以将两个输入作为单个输入,并用一致的未使用字符(例如,空格)分隔” ”。在这里,两个输入可以允许更多的高尔夫创意(例如,咖喱功能)。
乔纳森·艾伦

Answers:


8

JavaScript(Node.js),143字节

返回1表示可溶,0表示不溶。

s=>Buffer(`## 5)6.'04+ n:# (F* E"/$;&-"/"7&#.%`).map(c=>S+='1'.repeat(c-32)+0,S='')|S[parseInt(s.split` `[1].slice(1,7)+s[0]+s[1],35)%1325%508]

在线尝试!

怎么样?

输入字符串到查找索引的转换

我们首先通过提取阴离子的第2至第7个字符并添加阳离子的前两个字符来构建键:

key = s.split` `[1].slice(1, 7) + s[0] + s[1]

例子:

'Lithium Fluoride'  --> 'luoridLi'
'Sodium Fluoride'   --> 'luoridSo'
'Sodium Dichromate' --> 'ichromSo'
'Calcium Oxide'     --> 'xideCa'

通过在base-35中对其进行解析并应用模1325和模508(强力值),将其转换为查找索引:

parseInt(key, 35) % 1325 % 508

压缩查询表

因为可溶对比不可对要多得多,所以我们用可溶填充查找中所有未使用的条目。

通过将可溶编码为1和不可溶编码为0,我们的查找表基本上由1的长字符串组成,后跟0

11101110011111111111111111111101111111110111111111111111111111101111111111111101111111011111
11111111111011111111111111111111011111111111001111111111111111111111111111111111111111111111
11111111111111111111111111111111011111111111111111111111111011100111111110111111111111111111
11111111111111111111011111111110011111111111111111111111111111111111110110111111111111111011
11011111111111111111111111111101111110111111111111101101111111111111110110111111111111111111
11111011111101110111111111111110111110

我们通过将1的字符串的长度存储为[32-126]范围内的ASCII字符来对其进行压缩。


8

Ruby -n96 92 75 70 69 65字节

p /ra|[SPm]o|^[^C]*F|h.*D/?1:/Le|[MAIZ].*y|[OPDFbv]|[tr]i.*S/?0:1

在线尝试!

我不是很擅长生成哈希表和查找表,因此我选择利用所有这些问号通配符来简化表的逻辑结构,然后应用一些纯正则表达式魔术。

更新:更改了一些问号的分配,并进一步简化了匹配逻辑。

更新2:仅2个月后,我又提出了对该表的另一次修改以节省更多字节。

我们将要生成的表如下所示:

Lithium    111101111110011
Sodium     111111111111111
Potassium  111111111111111
Ammonium   111111111111111
Beryllium  111101111110010
Magnesium  111101000010010
Calcium    011101111110010
Strontium  111101111110000
Barium     111101111110000
Zinc       111101000010010
Iron(II)   111101000010010
Copper(II) 011101000010010
Aluminium  111101000010010
Iron(III)  111101000010010
Lead(II)   100001000010000
Silver     100001000010000

现在,以下化合物可被认为是可溶的:

  • ra尼特RA TE,氯苯RA TE
  • [SPm]o 所以 dium, tassium,AM nium
  • ^[^C]*F ˚F luoride,但不ç alcium或ç奥珀
  • h.*D点亮ħd ichromate

在其余化合物中,以下化合物不溶:

  • Le 广告
  • [MAIZ]i.*y 中号 agnesium, luminium, RON(和其它阳离子用指定的电荷),Ž与含有阴离子的块增量化合物y(H ý droxide-Thioc ÿ anate)
  • [OPDFbv] Ø西德,P hosphate,d ichromate,˚F luoride,租车b奥尼亚特,SIL v
  • [tr]i.*S斯特龙TI UM和Ba 小号 ulfates

其他一切都是可溶的。


4

Python 2中166个 161 131字节

lambda n:chr(hash(n)%1482%737%388%310%295%262%254)not in'gwQFCAkOExUWHJ0gJyicLLKviDK3PEDDxslKztFUV1ja4ukdbe7x9Xd5'.decode('base64')

在线尝试!


您是怎么找到这么多Mod号码的?
AlexRacer

1
@AlexRacer我已经编写了一个Python脚本,该脚本可以尝试将整数限制到一定的极限,以这种方式计算可模和不可溶输入的模数不会产生相同的结果。通过重复运行此脚本。我得到了所有这些数字。
ovs

@AlexRacer在挑战之前,我已经使用了很多次该脚本,例如:codegolf.stackexchange.com/a/115706/64121。通常,这些模链较短。
ovs

3

Python 2中180个 177 151 149 147字节

def f(s):a,b=s.split();return bin(int('7YNQYE3M7HE5OU3HHE71UMXBVRATPSZTSCV0O4WI84X5KTNE92TMLA',36))[(int(a[1:4],35)|int(b[2:6],35))%3419%529%277-6]

在线尝试!


17*(b%91%61%17)%272不能b%91%61%17*17%272
乔纳森·弗雷希

2

帕斯卡(FPC) 387 358 353 348个 341 319 297字节

var s,t:string;j:word;c:array[0..14]of word=(5055,8191,8191,8191,93,63,4143,175,4271,63,127,31,95,3,67);begin read(s);t:=copy(s,pos(' ',s)+1,6);j:=pos(t[1..2],'OxCyCaPhThDiHyFlIoSuBrChChNi')div 2;if'a'=t[6]then j:=12;write(c[pos(s[1..2],'LiSoPoAmBeMaCaStBaZiIrCoAlLeSi')div 2]shr(13-j)mod 2>0)end.

在线尝试!

说明:

var a:string='LiSoPoAmBeMaCaStBaZiIrCoAlLeSi'; //string containing first 2 letters of cations (can also be const)
                                               //luckily, Iron(II) and Iron(III) are compatible, they can have the same outputs
    b:string='OxCyCaPhThDiHyFlIoSuBrChChNi'; //string containing first 2 letters of anions (can also be const)
                                             //the order is different from the Wikipedia chart;
                                             //Chloride and Chlorate are next to each other to find the right index easier
                                             //Cyanide and Cyanate are compatible - 1 column less
                                             //overall, they are ordered to minimize the numbers in c
    s,t:string;
    i,j:word;
    c:array[0..14]of word=(5055,8191,8191,8191,93,63,4143,175,4271,63,127,31,95,3,67);
      //One number for each cation; one bit for solubility of particular combination; the bit for input combination will be found using i and j
begin
  read(s); //put input into s
  t:=copy(s,pos(' ',s)+1,6); //find the 2nd word in s (characters after space), take first 6 letters and copy them into t (6th letter is needed later)
  i:=pos(s[1..2],a)div 2; //position of first 2 letters of cation in a
                          //divided by 2 to get index for c
                          //*in golfed code, expression for i is inserted directly into write function
  j:=pos(t[1..2],b)div 2; //position of first 2 letters of anion in b
                          //divided by 2 to get the particular bit of c[i]
  if(j=11)and(t[6]='a')then j:=j+1; //if the anion is Chlorate, j is wrong and needs to be increased (specifically to 12);
                                    //only Chlorate has 'a' as 6th character, j doesn't need to be checked, but it's here for easier understanding
  writeln((c[i]shr(13-j))mod 2>0); //take i-th element of c, shift it right to put the correct bit at last position,
                                   //extract that bit, check if greater than 0
end.

1

果冻 67 61 60 50 47  44 字节

OḌ%⁽Ƭ%⁽£ṇ%⁽¡ẹ%249ḟ“ıA¬ɲḃẏCċtȯƁƤçȤċŒḲOƲ’D‘Ĥ

Monadic链接返回一个列表,该列表的内容为空I且不为空S(在Jelly中,空列表为假,非空列表为真)。

在线尝试!(页脚”S”IÇ?if LastLink(x) is Truthy then "S" else "I"

或查看所有格式化为与OP中的网格顺序相匹配的网格的案例

怎么样?

创建组输入必须是经过SI作为基地十(Python的:和评估这些输入dec=lambda s:sum(10**i*ord(c) for i, c in enumerate(s[::d]))),并使用模荷兰国际集团的价值观和组检查这里使用的哈希的几圈被发现。

通过评估以250为基数的编码整数,将其转换为以 25 ... 16  * ... 10 为基数,并累加结果,从而在代码中创建不溶键整数。

*基本减少是通过添加一些冗余密钥来实现的

OḌ%⁽Ƭ%⁽£ṇ%⁽¡ẹ%249ḟ“...’D‘Ĥ - Main Link: list of characters   e.g. "Calcium Carbonate"
O                            - cast to a list of ordinals      [67,97,108,99,105,117,109,32,67,97,114,98,111,110,97,116,101]
 Ḍ                           - convert from base ten           778907829795030961
   ⁽Ƭ                       - base 250 literal = 4258
  %                          - modulo                          625
       ⁽£ṇ                   - base 250 literal = 1721
      %                      - modulo                          625
           ⁽¡ẹ               - base 250 literal = 1215
          %                  - modulo                          625
               249           - literal 249
              %              - modulo                          127
                           ¤ - nilad followed by link(s) as a nilad:
                   “...’     -   literal in base 250    = 382193517807860310905428231939605402667395154
                        D    -   convert to decimal     = [3,8,2,1,9,3,5,1,7,8,0,7,8,6,0,3,1,0,9,0,5,4,2,8,2,3,1,9,3,9,6,0,5,4,0,2,6,6,7,3,9,5,1,5,4]
                         ‘   -   increment (vectorises) = [4,9,3,2,10,4,6,2,8,9,1,8,9,7,1,4,2,1,10,1,6,5,3,9,3,4,2,10,4,10,7,1,6,5,1,3,7,7,8,4,10,6,2,6,5]
                          Ä  -   cumulative sum         = [4,13,16,18,28,32,38,40,48,57,58,66,75,82,83,87,89,90,100,101,107,112,115,124,127,131,133,143,147,157,164,165,171,176,177,180,187,194,202,206,216,222,224,230,235]
                             -     ...note the redundant keys are --->            48       66 75                                115                                                     187             216
                  ḟ          - filter discard (implicit wrap)  [] (if 127 was not in the list above this would've been [127])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.