Golf a Bagan Kelarutan

12

Diberi nama kation dan anion, menghasilkan "S" (larut) atau "I" (tidak larut). Tabel yang akan kita gunakan adalah dari wikipedia: https://en.wikipedia.org/wiki/Solubility_chart . Itu disalin di akhir pertanyaan untuk referensi di masa depan.

Input : Kation, diikuti oleh anion, dipisahkan oleh spasi. Kation akan menjadi salah satu dari yang berikut:

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

dan anion akan menjadi salah satu dari yang berikut:

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

Masing-masing akan memiliki huruf pertama dikapitalisasi.

Input Contoh: Sodium Chloride

Output : Nilai kebenaran, atau S, jika larut, falsey atau Isebaliknya. Jika halaman wikipedia mencantumkan hal lain (misalnya sedikit larut, atau bereaksi dengan air) atau jika input tidak dalam bentuk "kation anion," program Anda dapat melakukan apa saja (perilaku tidak terdefinisi), sehingga dapat menghasilkan 'S', ' Aku, atau yang lainnya.

Meja:

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

Barisnya adalah kation dalam urutan yang tercantum di atas dan kolomnya adalah anion. Misalnya, karena Magnesium Iodide larut, dan Magnesium adalah kation ke-6 dan Iodide adalah anion ke-4, baris ke-6 dan ke-4 memiliki karakter 'S'. The ?menunjukkan perilaku undefined.

soktinpk
sumber
1
Saya suka ini karena perilaku undefined dari ?s memberikan banyak kebebasan dalam algoritma apa yang dapat digunakan.
Jo King
1
@FryAmTheEggman Meskipun memiliki kolmogorov-complexitytag, tantangannya tidak meminta untuk menampilkan tabel, tetapi nilai yang benar untuk pasangan (kation, anion) yang diberikan.
Arnauld
4
Saya menghapus tag kompleksitas-kolmogorov dan menambahkan tag masalah-keputusan, karena ini bukan tentang membuat output tetap (atau sebagian diperbaiki), tetapi menentukan apakah input tertentu memenuhi beberapa kriteria.
Stewie Griffin
Apakah Anda mempertimbangkan untuk mengeluarkan 2 nilai konsisten berbeda daripada hanya truthy/ 'S'atau falsy/ 'I'?
Arnauld
Saya sarankan menjatuhkan spesifikasi "dipisahkan oleh spasi" dan alih-alih mengatakan sesuatu di sepanjang baris "di samping default situs, kedua input dapat diterima sebagai input tunggal yang dipisahkan oleh karakter yang tidak digunakan secara konsisten (misalnya spasi) ". Dua input memungkinkan lebih banyak kreativitas bermain golf di sini (mis. Fungsi kari).
Jonathan Allan

Jawaban:

8

JavaScript (Node.js) , 143 byte

Mengembalikan 1 untuk larut, 0 untuk tidak larut.

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]

Cobalah online!

Bagaimana?

Konversi string input ke indeks pencarian

Kami pertama-tama membangun kunci dengan mengekstraksi karakter anion ke-2 dan ke-7 dan menambahkan dua karakter pertama dari kation:

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

Contoh:

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

Kami mengubahnya menjadi indeks pencarian dengan menguraikannya dalam basis-35 dan menerapkan modulo 1325 diikuti oleh modulo 508 (nilai-nilai kasar):

parseInt(key, 35) % 1325 % 508

Kompresi dari tabel pencarian

Karena ada pasangan yang jauh lebih mudah larut daripada yang tidak larut , kami mengisi semua entri yang tidak digunakan dalam pencarian dengan larut .

Dengan mengkodekan terlarut dengan 1 dan tidak larut dengan 0 , tabel pencarian kami pada dasarnya terdiri dari string panjang 1 diikuti oleh 0 :

11101110011111111111111111111101111111110111111111111111111111101111111111111101111111011111
11111111111011111111111111111111011111111111001111111111111111111111111111111111111111111111
11111111111111111111111111111111011111111111111111111111111011100111111110111111111111111111
11111111111111111111011111111110011111111111111111111111111111111111110110111111111111111011
11011111111111111111111111111101111110111111111111101101111111111111110110111111111111111111
11111011111101110111111111111110111110

Kami mengompresnya dengan menyimpan panjang string 1 sebagai karakter ASCII dalam rentang [32-126] .

Arnauld
sumber
8

Ruby -n , 96 92 75 70 69 65 byte

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

Cobalah online!

Saya tidak terlalu pandai menghasilkan hash dan tabel pencarian, jadi alih-alih saya memilih untuk mengambil keuntungan dari semua wildcard tanda tanya itu untuk menyederhanakan struktur logis tabel, dan kemudian menerapkan sihir Regex murni.

Pembaruan : Penugasan yang diubah dari beberapa tanda tanya dan selanjutnya menyederhanakan logika pencocokan.

Pembaruan 2 : Hanya 2 bulan kemudian, saya telah datang dengan mengubah tabel lain untuk menghemat beberapa byte lagi.

Tabel yang akan kita hasilkan terlihat seperti ini:

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

Sekarang, senyawa berikut dapat dianggap larut:

  • raNit ra te, Chlo ra te
  • [SPm]o Jadi dium, Po tassium, Am mo nium
  • ^[^C]*F F luoride, tetapi bukan C alcium atau C opper
  • h.*DLit h ium D ichromate

Dari senyawa yang tersisa, berikut ini tidak dapat larut:

  • Le Iklan Le
  • [MAIZ]i.*y M agnesium, A luminium, saya ron (dan kation lain dengan biaya yang ditunjukkan), Z senyawa inc dengan blok anion yang mengandung y(H y droxide-Thioc y anate)
  • [OPDFbv] O xide, P hosphate, D ichromate, F luoride, Car b onate, Sil v er
  • [tr]i.*SStron ti um dan Ba ri um S ulfates

Yang lainnya larut.

Kirill L.
sumber
4

Python 2 , 166 161 131 byte

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

Cobalah online!

ovs
sumber
Bagaimana Anda menemukan begitu banyak nomor mod?
AlexRacer
1
@AlexRacer Saya telah menulis skrip Python yang mencoba bilangan bulat hingga batas tertentu, sedemikian rupa sehingga menghitung modulo tidak menghasilkan hasil yang sama untuk input yang larut dan tidak larut. Dengan berulang kali menjalankan skrip ini. Saya mendapat semua nomor ini.
Ovs
@AlexRacer Saya telah menggunakan script itu beberapa kali sebelum tantangan ini, mis: codegolf.stackexchange.com/a/115706/64121 . Biasanya rantai modulo ini sedikit lebih pendek.
Ovs
3

Python 2 , 180 177 151 149 147 byte

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]

Cobalah online!

TFeld
sumber
Tidak 17*(b%91%61%17)%272bisa b%91%61%17*17%272?
Jonathan Frech
2

Pascal (FPC) , 387 358 353 348 341 319 297 byte

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.

Cobalah online!

Penjelasan:

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.
AlexRacer
sumber
1

Jelly ,  67 61 60 50 47  44 byte

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

Tautan monadik yang mengembalikan daftar yang kosong untuk Idan yang tidak kosong untuk S(dalam daftar kosong Jelly adalah falsey sedangkan yang non-kosong adalah benar).

Cobalah online! (footer”S”IÇ?adalahif LastLink(x) is Truthy then "S" else "I")

Atau lihat semua case yang diformat sebagai kisi yang cocok dengan urutan kisi di OP.

Bagaimana?

Setelah membuat set input yang harus Sdan Idan mengevaluasi input ini sebagai basis sepuluh (Python:) dec=lambda s:sum(10**i*ord(c) for i, c in enumerate(s[::d]))dan menggunakan beberapa loop nilai modulo-ing dan mengatur memeriksa hash yang digunakan di sini ditemukan.

Integer kunci tidak larut dibuat dalam kode dengan mengevaluasi basis 250 integer yang dikodekan, mengubahnya menjadi basis  25 ... 16  * ... 10 dan secara kumulatif menjumlahkan hasilnya ...

* pengurangan basis dicapai dengan menambahkan beberapa kunci yang berlebihan

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])
Jonathan Allan
sumber