ゴルフの溶解度チャート


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

行は上記の順序のカチオンであり、列はアニオンです。たとえば、ヨウ化マグネシウムは可溶性であり、マグネシウムは6番目のカチオンであり、ヨウ化物は4番目のアニオンであるため、6行4列は文字「S」を持ちます。?未定義の動作を示しています。


1
?sの未定義の動作により、使用できるアルゴリズムに多くの自由が与えられるため、これが気に入っています。
ジョーキング

1
@FryAmTheEggman kolmogorov-complexityタグにもかかわらず、チャレンジはテーブルの出力を要求せず、指定された(カチオン、アニオン)ペアの正しい値を要求します。
アーナウルド

4
kolmogorov-complexityタグを削除し、決定問題タグを追加しました。これは、固定(または部分的に固定)出力を作成することではなく、特定の入力が基準を満たすかどうかを判断するためです。
スティーヴィーグリフィン

truthy/ 'S'またはfalsy/ ではなく、2つの異なる一貫した値を出力できるようにすることを検討しますか'I'
アーナウルド

「スペースで区切られた」仕様を削除し、代わりに「サイトのデフォルトに加えて、2つの入力を一貫した未使用文字(スペースなど)で区切られた単一の入力として受け入れることができます」 「。2つの入力により、ここでゴルフの創造性を高めることができます(例:カレー機能)。
ジョナサンアラン

回答:


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番目の文字を抽出し、陽イオンの最初の2つの文字を追加して、キーを作成します。

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

ルビー -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

現在、以下の化合物は可溶性とみなすことができます:

  • raNIT RA TE、Chlo RA
  • [SPm]o だから、 dium、ポー tassium、アムMOニウム
  • ^[^C]*F Fの luorideではなく、Cの alciumまたはC opper
  • h.*D点灯の時間イウムD ichromate

残りの化合物のうち、次のものは不溶性です。

  • Le ルの広告
  • [MAIZ]i.*y Mの agnesium、luminium、Iロン(および指示電荷を有する他の陽イオン)、Zを含有するアニオンのブロックとINC化合物(HのYの droxide-Thioc Y anate)をy
  • [OPDFbv] Oの xide、Pの hosphate、Dの ichromate、Fの luoride、車Bの onate、シルV ER
  • [tr]i.*SSTRON TI UMとBaのええとS ulfates

他のすべては可溶性です。


4

パイソン2166の 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


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‘Ĥ

空のリストを返すモナドリンク Iとのための非空S(空でないものはtruthyありながらゼリーの空のリストにfalseyあるが)。

オンラインでお試しください!(フッター”S”IÇ?if LastLink(x) is Truthy then "S" else "I"

または見る 、OPのグリッドの順序と一致するグリッドとしてフォーマットされたすべてのケースを

どうやって?

入力のセットを作成した後でなければならないSI:と基部10(Pythonのようにこれらの入力を評価dec=lambda s:sum(10**i*ord(c) for i, c in enumerate(s[::d]))し、ここで使用されるハッシュをチェックモジュロINGの値との組の数のループを使用してがわかりました)。

不溶性のキー整数は、ベース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])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.