Golf a Tabela rozpuszczalności

12

Biorąc pod uwagę nazwę kationu i anionu, wyjmij „S” (rozpuszczalny) lub „I” (nierozpuszczalny). Stół, którego będziemy używać, pochodzi z wikipedii: https://en.wikipedia.org/wiki/Solubility_chart . Jest on kopiowany na końcu pytania do wykorzystania w przyszłości.

Wkład : kation, po nim anion, oddzielone spacją. Kation będzie jednym z następujących:

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

a anion będzie jednym z następujących:

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

Każda litera będzie pisana wielką literą.

Przykładowe dane wejściowe: Sodium Chloride

Wyjście : wartość truthy, albo S, jeżeli jest rozpuszczalna falsey lub Iinaczej. Jeśli na stronie wikipedii znajduje się coś jeszcze (np. Słabo rozpuszczalny lub reaguje z wodą) lub jeśli dane wejściowe nie są w postaci „kationu anionowego”, twój program może zrobić cokolwiek (niezdefiniowane zachowanie), więc może wypisać „S”, „ Ja ”lub cokolwiek innego.

Stół:

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

Rzędy są kationami w podanej wyżej kolejności, a kolumny to aniony. Na przykład, ponieważ jodek magnezu jest rozpuszczalny, a magnez był 6. kationem, a jodek był 4. anionem, 6. rząd i 4. kolumna mają znak „S”. ?Wskazuje niezdefiniowanej zachowanie.

soktinpk
źródło
1
Podoba mi się to, ponieważ niezdefiniowane zachowanie ?s daje dużą swobodę w wyborze algorytmów.
Jo King,
1
@FryAmTheEggman Pomimo kolmogorov-complexityznacznika wyzwanie nie wymaga podania tabeli, ale prawidłową wartość dla danej pary (kation, anion).
Arnauld,
4
Usunąłem znacznik złożoności kolmogorowa i dodałem znacznik problemu decyzyjnego, ponieważ nie chodzi tu o utworzenie stałego (lub częściowo naprawionego) wyniku, ale o ustalenie, czy określone dane wejściowe spełniają pewne kryteria.
Stewie Griffin,
Czy rozważysz zezwolenie na wyprowadzenie 2 dowolnych spójnych wartości zamiast tylko truthy/ 'S'lub falsy/ 'I'?
Arnauld,
Proponuję porzucić specyfikację „oddzielone spacją” i zamiast powiedzieć coś w stylu „oprócz domyślnych ustawień witryny”, dwa dane wejściowe można zaakceptować jako jedno wejście oddzielone spójnym nieużywanym znakiem (np. Spacją) „. Dwa wejścia mogą tu pozwolić na większą kreatywność golfa (np. Funkcje curry).
Jonathan Allan,

Odpowiedzi:

8

JavaScript (Node.js) , 143 bajty

Zwraca 1 dla rozpuszczalnego, 0 dla nierozpuszczalnego.

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]

Wypróbuj online!

W jaki sposób?

Konwersja ciągu wejściowego na indeks wyszukiwania

Najpierw budujemy klucz, wyodrębniając od 2 do 7 znaków anionu i dodając dwie pierwsze postacie kationu:

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

Przykłady:

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

Przekształcamy to w indeks wyszukiwania, analizując go w bazie 35 i stosując modulo 1325, a następnie modulo 508 (wartości wymuszone metodą brute):

parseInt(key, 35) % 1325 % 508

Kompresja tabeli odnośników

Ponieważ istnieje znacznie więcej par rozpuszczalnych niż nierozpuszczalnych , wypełniamy wszystkie nieużywane wpisy w wyszukiwaniu rozpuszczalnym .

Kodując rozpuszczalne z 1 i nierozpuszczalne z 0 , nasza tabela odnośników składa się zasadniczo z długich ciągów 1 , po których następuje 0 :

11101110011111111111111111111101111111110111111111111111111111101111111111111101111111011111
11111111111011111111111111111111011111111111001111111111111111111111111111111111111111111111
11111111111111111111111111111111011111111111111111111111111011100111111110111111111111111111
11111111111111111111011111111110011111111111111111111111111111111111110110111111111111111011
11011111111111111111111111111101111110111111111111101101111111111111110110111111111111111111
11111011111101110111111111111110111110

Kompresujemy go, przechowując długości ciągów 1 jako znaki ASCII w zakresie [32-126] .

Arnauld
źródło
8

Rubin -n , 96 92 75 70 69 65 bajtów

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

Wypróbuj online!

Nie jestem zbyt dobry w generowaniu skrótów i tabel odnośników, więc zamiast tego zdecydowałem się skorzystać ze wszystkich symboli wieloznacznych ze znakiem zapytania, aby uprościć logiczną strukturę tabeli, a następnie zastosować czystą magię Regex.

Aktualizacja : zmienione przypisanie niektórych znaków zapytania i jeszcze bardziej uprościło logikę dopasowywania.

Aktualizacja 2 : Zaledwie 2 miesiące później wymyśliłem kolejną zmianę tabeli, aby zaoszczędzić jeszcze kilka bajtów.

Tabela, którą będziemy produkować, wygląda następująco:

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

Teraz następujące związki można uznać za rozpuszczalne:

  • raNit ra te, Chlo ra te
  • [SPm]o Więc DIUM, Po tassium Am mo nium
  • ^[^C]*F F luoride, nie C alcium lub C opper
  • h.*DLit h ium D ichromate

Z pozostałych związków nierozpuszczalne są:

  • Le Le ad
  • [MAIZ]i.*y M agnesium, luminium, że Ron (i innych kationów ze wskazanym za), Z związki inc z bloku anionów zawierających (H r droxide-Thioc Y anate)y
  • [OPDFbv] O xide , P hosphate, D ichromate, F luoride, Car b onate, Sil v er
  • [tr]i.*SStron ti um i Ba ri um S ulfates

Wszystko inne jest rozpuszczalne.

Kirill L.
źródło
4

Python 2 , 166 161 131 bajtów

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

Wypróbuj online!

ovs
źródło
Jak znalazłeś tyle numerów modów?
AlexRacer,
1
@AlexRacer Napisałem skrypt w języku Python, który wypróbowuje liczby całkowite do pewnego limitu, w taki sposób, że obliczanie modulo nie daje takich samych wyników dla danych wejściowych rozpuszczalnych i nierozpuszczalnych. Przez wielokrotne uruchamianie tego skryptu. Mam wszystkie te liczby.
ovs
@AlexRacer Użyłem tego skryptu wiele razy przed tym wyzwaniem, np .: codegolf.stackexchange.com/a/115706/64121 . Zwykle te łańcuchy modulo są nieco krótsze.
ovs
3

Python 2 , 180 177 151 149 147 bajtów

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]

Wypróbuj online!

TFeld
źródło
Może 17*(b%91%61%17)%272nie być b%91%61%17*17%272?
Jonathan Frech,
2

Pascal (FPC) , 387 358 353 348 341 319 297 bajtów

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.

Wypróbuj online!

Wyjaśnienie:

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
źródło
1

Galaretka ,  67 61 60 50 47  44 bajtów

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

Monadyczny link zwracający listę, która jest pusta dla Ii niepusta dla S(w Galaretce puste listy są falsey, podczas gdy niepuste są prawdziwe).

Wypróbuj online! (stopka”S”IÇ?toif LastLink(x) is Truthy then "S" else "I" )

Lub zobacz wszystkie przypadki sformatowane jako siatka pasująca do kolejności siatki w PO.

W jaki sposób?

Po utworzeniu zestawów danych wejściowych, które muszą być, Si Iocenieniu tych danych wejściowych jako podstawy dziesięciu (Python:) dec=lambda s:sum(10**i*ord(c) for i, c in enumerate(s[::d]))oraz użyciu kilku pętli wartości modulowania i sprawdzania zestawu znaleziono tu używany skrót.

Nierozpuszczalne kluczowe liczby całkowite są tworzone w kodzie przez oszacowanie liczby całkowitej zakodowanej w podstawie 250, przekształcając ją w podstawę  25 ... 16  * ... 10 i sumowanie wyniku łącznie ...

* podstawowe redukcje zostały osiągnięte poprzez dodanie niektórych redundantnych kluczy

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
źródło