Biểu đồ hòa tan Golf


12

Đặt tên của cation và anion, đầu ra "S" (hòa tan) hoặc "I" (không hòa tan). Bảng chúng tôi sẽ sử dụng là từ wikipedia: https://en.wikipedia.org/wiki/Solubility_chart . Nó được sao chép vào cuối câu hỏi để tham khảo trong tương lai.

Đầu vào : Các cation, theo sau là anion, cách nhau bởi một khoảng trắng. Các cation sẽ là một trong những điều sau đây:

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

và anion sẽ là một trong những điều sau đây:

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

Mỗi cái sẽ có chữ cái đầu tiên viết hoa.

Ví dụ đầu vào: Sodium Chloride

Đầu ra : Một giá trị trung thực, hoặc S, nếu nó hòa tan, falsey hoặc Icách khác. Nếu trang wikipedia liệt kê bất cứ điều gì khác (ví dụ như hơi hòa tan hoặc phản ứng với nước) hoặc nếu đầu vào không ở dạng "cation anion", chương trình của bạn có thể làm bất cứ điều gì (hành vi không xác định), vì vậy nó có thể xuất ra 'S', ' Tôi ', hoặc bất cứ điều gì khác.

Bàn:

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

Các hàng là cation theo thứ tự được liệt kê ở trên và các cột là anion. Ví dụ, vì Magiê Iodide hòa tan và Magiê là cation thứ 6 và Iodide là anion thứ 4, hàng thứ 6 và cột thứ 4 có ký tự 'S'. Các ?hành vi không xác định.


1
Tôi thích điều này bởi vì hành vi không xác định của ?s mang lại rất nhiều sự tự do trong những thuật toán mà người ta có thể sử dụng.
Jo King

1
@FryAmTheEggman Mặc dù có kolmogorov-complexitythẻ, thử thách không yêu cầu xuất bảng, nhưng giá trị chính xác cho một cặp (cation, anion) nhất định.
Arnauld

4
Tôi đã xóa thẻ độ phức tạp kolmogorov và thêm thẻ vấn đề quyết định, vì đây không phải là về việc tạo đầu ra cố định (hoặc cố định một phần), nhưng xác định liệu một đầu vào nhất định có đáp ứng một số tiêu chí hay không.
Stewie Griffin

Bạn có xem xét cho phép xuất ra bất kỳ 2 giá trị nhất quán riêng biệt nào thay vì chỉ truthy/ 'S'hoặc falsy/ 'I'không?
Arnauld

Tôi khuyên bạn nên bỏ đặc tả "cách nhau bởi khoảng trắng" và thay vào đó nói điều gì đó dọc theo dòng "ngoài mặc định của trang, hai đầu vào có thể được chấp nhận làm đầu vào duy nhất được phân tách bằng ký tự không sử dụng nhất quán (ví dụ: khoảng trắng) ". Hai đầu vào có thể cho phép sáng tạo chơi gôn nhiều hơn ở đây (ví dụ: các hàm được uốn).
Jonathan Allan

Câu trả lời:


8

JavaScript (Node.js) , 143 byte

Trả về 1 cho hòa tan, 0 cho không hòa tan.

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]

Hãy thử trực tuyến!

Làm sao?

Chuyển đổi chuỗi đầu vào thành chỉ mục tra cứu

Trước tiên, chúng tôi xây dựng khóa bằng cách trích xuất các ký tự thứ 2 đến thứ 7 của anion và thêm hai ký tự đầu tiên của cation:

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

Ví dụ:

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

Chúng tôi biến điều này thành một chỉ mục tra cứu bằng cách phân tích nó trong cơ sở-35 và áp dụng một modulo 1325 theo sau là một modulo 508 (giá trị bắt buộc):

parseInt(key, 35) % 1325 % 508

Nén bảng tra cứu

Bởi vì có những cặp hòa tan nhiều hơn đáng kể so với không hòa tan , chúng tôi điền vào tất cả các mục không sử dụng trong tra cứu với hòa tan .

Bằng cách mã hóa hòa tan với 1 và không hòa tan bằng 0 , bảng tra cứu của chúng tôi về cơ bản bao gồm các chuỗi dài 1 's theo sau là 0 :

11101110011111111111111111111101111111110111111111111111111111101111111111111101111111011111
11111111111011111111111111111111011111111111001111111111111111111111111111111111111111111111
11111111111111111111111111111111011111111111111111111111111011100111111110111111111111111111
11111111111111111111011111111110011111111111111111111111111111111111110110111111111111111011
11011111111111111111111111111101111110111111111111101101111111111111110110111111111111111111
11111011111101110111111111111110111110

Chúng tôi nén nó bằng cách lưu trữ độ dài của chuỗi 1 ký tự dưới dạng ký tự ASCII trong phạm vi [32-126] .


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

Hãy thử trực tuyến!

Tôi không giỏi trong việc tạo bảng băm và tra cứu, vì vậy thay vào đó tôi đã chọn tận dụng tất cả các ký tự dấu chấm hỏi để đơn giản hóa cấu trúc logic của bảng, sau đó áp dụng một số phép thuật Regex thuần túy.

Cập nhật : Thay đổi việc gán một số dấu hỏi và đơn giản hóa hơn nữa logic của kết hợp.

Cập nhật 2 : Chỉ 2 tháng sau, tôi đã đưa ra một bản sửa đổi khác của bảng để lưu thêm một vài byte.

Bảng mà chúng tôi sẽ sản xuất trông như thế này:

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

Bây giờ, các hợp chất sau đây có thể được coi là hòa tan:

  • raNit ra te, Chlo ra te
  • [SPm]o Vì vậy , dium, Po tali, Am mo nium
  • ^[^C]*F F luoride, nhưng không phải C alcium hay C opper
  • h.*DLit h ium D ichromate

Trong số các hợp chất còn lại, sau đây là không hòa tan:

  • Le Quảng cáo
  • [MAIZ]i.*y M agiê, A luminium, I ron (và các cation khác có điện tích chỉ định), hợp chất Z inc với khối anion chứa y(H y droxide-Thioc y anate)
  • [OPDFbv] O xide, P hosphate, D ichromate, F luoride, Xe b onate, Sil v er
  • [tr]i.*SStron ti um và Ba ri um S ulfates

Mọi thứ khác đều hòa tan.


4

Python 2 , 166 161 131 byte

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

Hãy thử trực tuyến!


Làm thế nào bạn tìm thấy rất nhiều số mod?
AlexRacer

1
@AlexRacer Tôi đã viết một tập lệnh Python thử các số nguyên đến một giới hạn nhất định, theo cách tính toán modulo không mang lại kết quả tương tự cho đầu vào hòa tan và không hòa tan. Bằng cách liên tục chạy tập lệnh này. Tôi có tất cả những con số này.
OVS

@AlexRacer Tôi đã sử dụng tập lệnh đó rất nhiều lần trước thử thách này, ví dụ: codegolf.stackexchange.com/a/115706/64121 . Thông thường các chuỗi modulo này ngắn hơn một chút.
trứng


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.

Hãy thử trực tuyến!

Giải trình:

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

Thạch ,  67 61 60 50 47  44 byte

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

Một liên kết đơn âm trả về một danh sách trống Ivà không trống cho S(trong danh sách trống Jelly là falsey trong khi các danh sách không trống là sự thật).

Hãy thử trực tuyến! (chân trang”S”IÇ?if LastLink(x) is Truthy then "S" else "I")

Hoặc xem tất cả các trường hợp được định dạng dưới dạng lưới khớp với thứ tự của lưới trong OP.

Làm sao?

Sau khi tạo các bộ đầu vào phải SIvà đánh giá các đầu vào này làm cơ sở mười (Python:dec=lambda s:sum(10**i*ord(c) for i, c in enumerate(s[::d])) ) và sử dụng một vài vòng các giá trị modulo-ing và bộ kiểm tra băm sử dụng ở đây đã được tìm thấy.

Các số nguyên khóa không hòa tan được tạo trong mã bằng cách đánh giá một số nguyên được mã hóa 250 cơ sở, chuyển đổi nó thành cơ sở  25 ... 16  * ... 10 và tổng hợp kết quả ...

* mức giảm cơ sở đã đạt được bằng cách thêm một số khóa dự phòng

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