Golf bir Çözünürlük Tablosu


12

Bir katyon ve anyon adı verildiğinde, çıktı "S" (çözünür) veya "I" (çözünmez). Kullanacağımız tablo wikipedia'dan: https://en.wikipedia.org/wiki/Solubility_chart . Daha sonra başvurmak üzere sorunun sonunda kopyalanır.

Girdi : Katyon, ardından anyon, bir boşlukla ayrılır. Katyon aşağıdakilerden biri olacaktır:

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

ve anyon aşağıdakilerden biri olacaktır:

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

Her birinin ilk harfi büyük olacak.

Örnek Giriş: Sodium Chloride

Çıktı : Gerçek bir değer, ya Sda çözünür ise, falsey ya da Ibaşka türlü. Wikipedia sayfası başka bir şey listeliyorsa (örneğin, biraz çözünür veya su ile reaksiyona giriyorsa) veya girdi "katyon anyonu" biçiminde değilse, programınız herhangi bir şey yapabilir (tanımlanmamış davranış), bu nedenle 'S', Ben, ya da başka bir şey.

Tablo:

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

Satırlar yukarıda sıralanan katyonlardır ve sütunlar anyonlardır. Örneğin, Magnezyum İyodür çözünür olduğu ve Magnezyum 6. katyon olduğu ve İyodür 4. anyon olduğu için 6. sıra ve 4. sütun 'S' karakterine sahiptir. ?Tanımsız davranış gösterir.


1
Bunu beğendim çünkü ?s'nin tanımlanmamış davranışı, hangi algoritmaların kullanılabileceği konusunda çok fazla özgürlük veriyor.
Jo King

1
@FryAmTheEggman Etikete rağmen, kolmogorov-complexityzorluk tablonun çıktısını istemez, ancak belirli bir (katyon, anyon) çifti için doğru değeri verir.
Arnauld

4
Kolmogorov-karmaşıklık etiketini kaldırdım ve karar-problem etiketini ekledim, çünkü bu sabit (veya kısmen sabit) bir çıktı oluşturmak değil, belirli bir girdinin bazı kriterleri karşılayıp karşılamadığını belirlemekle ilgili.
Stewie Griffin

Sadece truthy/ 'S'veya falsy/ yerine 2 farklı tutarlı değer çıkarmaya izin verir misiniz 'I'?
Arnauld

"Bir boşlukla ayrılmış" belirtimini bırakmayı ve bunun yerine site varsayılanlarına ek olarak "satırları boyunca bir şey söylemeyi" öneririm, iki giriş tutarlı kullanılmayan bir karakterle (ör. Boşluk) ayrılmış tek bir giriş olarak kabul edilebilir ". İki giriş burada daha fazla golf yaratıcılığına izin verebilir (örn. Curried fonksiyonlar).
Jonathan Allan

Yanıtlar:


8

JavaScript (Node.js) , 143 bayt

Çözünür için 1 , çözünmez için 0 döndürür .

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]

Çevrimiçi deneyin!

Nasıl?

Giriş dizesinin arama dizinine dönüştürülmesi

İlk önce anyonun 2. ila 7. karakterlerini çıkararak ve katyonun ilk iki karakterini ekleyerek bir anahtar oluşturuyoruz:

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

Örnekler:

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

Bunu, taban-35'te ayrıştırarak ve bir modulo 1325 ve ardından bir modulo 508 (kaba-zorlanmış değerler) uygulayarak arama dizinine dönüştürüyoruz:

parseInt(key, 35) % 1325 % 508

Arama tablosunun sıkıştırılması

Çözünmeyen çiftlerden önemli ölçüde daha fazla çözünür çift ​​olduğundan, aramadaki kullanılmayan tüm girişleri çözünür ile doldururuz .

Çözünürlüğü 1 ile ve çözünmez ile 0 arasında kodlayarak , arama tablonuz temel olarak 1 'in uzun dizelerinden sonra bir 0'dan oluşur :

11101110011111111111111111111101111111110111111111111111111111101111111111111101111111011111
11111111111011111111111111111111011111111111001111111111111111111111111111111111111111111111
11111111111111111111111111111111011111111111111111111111111011100111111110111111111111111111
11111111111111111111011111111110011111111111111111111111111111111111110110111111111111111011
11011111111111111111111111111101111110111111111111101101111111111111110110111111111111111111
11111011111101110111111111111110111110

Biz şeritlerinin uzunlukları saklayarak onu sıkıştırmak 1 aralığında ASCII karakter olarak 's [32-126] .


8

Yakut -n , 96 92 75 70 69 65 bayt

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

Çevrimiçi deneyin!

Karma ve arama tabloları oluşturma konusunda çok iyi değilim, bu yüzden masanın mantıksal yapısını basitleştirmek ve daha sonra bazı saf Regex büyüsünü uygulamak için tüm bu soru işareti joker karakterlerinden yararlanmayı seçtim.

Güncelleme : Bazı soru işaretlerinin atanması değiştirildi ve eşleştirme mantığı daha da basitleştirildi.

Güncelleme 2 : Sadece 2 ay sonra, birkaç bayt tasarruf etmek için tablonun başka bir yenilemesini yaptım.

Üreteceğimiz tablo şöyle:

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

Şimdi, aşağıdaki bileşiklerin çözünür olduğu düşünülebilir:

  • raNit ra te, Chlo ra te
  • [SPm]o Yani dium, Po tassium, Am mo nium
  • ^[^C]*F F luoride değil C alcium veya C Opper
  • h.*DLit h yum D ichromate

Geri kalan bileşiklerden aşağıdakiler çözünmez:

  • Le Le ad
  • [MAIZ]i.*y M agnesium, bir parşömen, I ron (ve belirtilen yük ile diğer katyonlar), Z içeren anyonların blok inc bileşikler y(H -Y droxide-Thioc y güçlü oksidantlar)
  • [OPDFbv] O xide, p hosphate, D ichromate, F luoride, Araba b onat, Sil v er
  • [tr]i.*SStron ti um ve Ba ri um S ulfates

Geri kalan her şey çözünür.


4

Python 2 , 166 161 131 bayt

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

Çevrimiçi deneyin!


Bu kadar çok mod numarasını nasıl buldunuz?
AlexRacer

1
@AlexRacer Modulo hesaplaması, çözünür ve çözünmez bir girdi için aynı sonuçları vermeyecek şekilde, belirli bir sınıra kadar tamsayıları deneyen bir Python betiği yazdım. Bu komut dosyasını tekrar tekrar çalıştırarak. Tüm bu numaraları aldım.
ovs

@AlexRacer Bu senaryoyu bu meydan okumadan önce birçok kez kullandım, örneğin: codegolf.stackexchange.com/a/115706/64121 . Normalde bu modulo zincirleri biraz daha kısadır.
ovs

3

Python 2 , 180 177 151 149 147 bayt

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]

Çevrimiçi deneyin!


Can 17*(b%91%61%17)%272olmaz b%91%61%17*17%272?
Jonathan Frech

2

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

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.

Çevrimiçi deneyin!

Açıklama:

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

Jöle ,  67 61 60 50 47  44 bayt

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

Boş Ive boş olmayan bir liste döndüren monadik bir bağlantı S(Jelly boş listelerde boş, boş olmayanlar doğrudur).

Çevrimiçi deneyin! (altbilgi”S”IÇ?olduğuif LastLink(x) is Truthy then "S" else "I" )

Veya ızgara şeklinde biçimlendirilmiş tüm vakaları görün sırasıyla eşleşen .

Nasıl?

Olmalı girdilerin setleri oluşturduktan sonra Sve I(Python ve baz on olarak bu girdileri değerlendiren:dec=lambda s:sum(10**i*ord(c) for i, c in enumerate(s[::d])) ) modül-ing değerler ve burada kullanılan karma kontrol kümesinin birkaç döngüler ve kullanıldığı tespit edildi.

Çözülemeyen anahtar tamsayıları kodda bir baz 250 kodlanmış tamsayıyı değerlendirerek,  25 ... 16  tabanına dönüştürerek oluşturulur. * ... 10 ve sonucu birikimli olarak toplayarak oluşturulur ...

* bazı redundant anahtarları ekleyerek baz azaltma sağlandı

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])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.