กอล์ฟแผนภูมิการละลาย


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 ให้อิสระมากมายในสิ่งที่อัลกอริทึมสามารถใช้ได้
Jo King

1
@FryAmTheEggman แม้จะมีkolmogorov-complexityแท็กความท้าทายไม่ได้ขอให้ส่งออกตาราง แต่ค่าที่ถูกต้องสำหรับคู่ (ไอออนบวก, ไอออน) ที่กำหนด
Arnauld

4
ฉันลบแท็ก kolmogorov-complex และเพิ่มแท็กการตัดสินใจปัญหาเนื่องจากสิ่งนี้ไม่ได้เกี่ยวกับการสร้างผลลัพธ์คงที่ (หรือบางส่วนคงที่) แต่พิจารณาว่าอินพุตบางตัวมีคุณสมบัติตรงตามเกณฑ์หรือไม่
Stewie Griffin

คุณจะพิจารณาอนุญาตให้ส่งออกค่าที่สอดคล้องกัน 2 ค่าใด ๆ แทนที่จะเป็นเพียงแค่truthy/ 'S'หรือfalsy/ 'I'?
Arnauld

ฉันขอแนะนำให้วางข้อกำหนด "คั่นด้วยช่องว่าง" และแทนที่จะพูดอะไรบางอย่างตามบรรทัด "นอกเหนือจากค่าเริ่มต้นของไซต์ทั้งสองอินพุตอาจได้รับการยอมรับว่าเป็นอินพุตเดี่ยวคั่นด้วยอักขระที่ไม่ได้ใช้ที่สอดคล้องกัน (เช่นช่องว่าง) " อินพุตสองช่องอาจทำให้ความคิดสร้างสรรค์ของกอล์ฟเพิ่มขึ้นที่นี่ (เช่นฟังก์ชั่น curried)
Jonathan Allan

คำตอบ:


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 's เป็นตัวอักษร ASCII ในช่วง[32-126]


8

Ruby -n , 96 92 75 70 69 65 ไบต์

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

ลองออนไลน์!

ฉันไม่เก่งในการสร้างแฮชและตารางการค้นหาดังนั้นฉันเลือกที่จะใช้ประโยชน์จากสัญลักษณ์ตัวแทนทั้งหมดเพื่อทำให้โครงสร้างเชิงตรรกะของตารางง่ายขึ้นจากนั้นจึงใช้เวทมนตร์ Regex บริสุทธิ์

อัปเดต : แก้ไขการมอบหมายเครื่องหมายคำถามและปรับปรุงตรรกะของการจับคู่ให้ง่ายขึ้น

อัปเดต 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 te
  • [SPm]o ดังนั้น dium, ปอ tassium, Am โม nium
  • ^[^C]*F F luoride แต่ไม่ใช่C alcium หรือC opper
  • h.*DLit h ium D ichromate

สารประกอบที่เหลือมีส่วนประกอบดังนี้:

  • Le เลอโฆษณา
  • [MAIZ]i.*y M agnesium, A luminium, I ron (และไอออนบวกอื่น ๆ ที่มีประจุที่ระบุ), Z inc สารประกอบที่มีกลุ่มของประจุลบที่มีy(H y droxide-Thioc y anate)
  • [OPDFbv] O xide, P hosphate, D ichromate, F luoride, รถยนต์b onate, Sil v er
  • [tr]i.*SStron ti um และ Ba ri um S ulfates

ทุกอย่างอื่นสามารถละลายได้


4

Python 2 , 166 161 131 ไบต์

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

ลองออนไลน์!


คุณหาหมายเลขตัวดัดแปลงมากมายได้อย่างไร?
AlexRacer

1
@AlexRacer ฉันได้เขียนสคริปต์ Python ที่พยายามใช้จำนวนเต็มจนถึงขีด จำกัด ที่กำหนดในวิธีการคำนวณ modulo นั้นไม่ได้ผลลัพธ์เหมือนกันสำหรับอินพุตที่ละลายน้ำและไม่ละลายน้ำ โดยการเรียกใช้สคริปต์นี้ซ้ำ ๆ ฉันได้ตัวเลขเหล่านี้หมดแล้ว
ovs

@AlexRacer ผมเคยใช้ว่าสคริปต์จำนวนมากครั้งก่อนหน้านี้ความท้าทายอดีต: codegolf.stackexchange.com/a/115706/64121 โดยปกติแล้วโซ่โมดูโล่เหล่านี้จะสั้นกว่าเล็กน้อย
OVS


2

Pascal (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(ในรายการวุ้นว่างเปล่าจะเป็นเท็จในขณะที่รายการที่ไม่ว่างเปล่าเป็นจริง)

ลองออนไลน์! (ส่วนท้าย”S”IÇ?คือif LastLink(x) is Truthy then "S" else "I")

หรือดูทุกกรณีที่ฟอร์แมตเป็นกริดที่ตรงกับคำสั่งของกริดใน OP

อย่างไร?

หลังจากสร้างชุดของอินพุตที่ต้องเป็นSและIประเมินค่าอินพุตเหล่านี้เป็นฐานสิบ (Python:) dec=lambda s:sum(10**i*ord(c) for i, c in enumerate(s[::d]))และใช้ค่า modulo-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.