Golf a Solubility Chart


12

Dato il nome di un catione e un anione, produce "S" (solubile) o "I" (insolubile). La tabella che useremo proviene da wikipedia: https://en.wikipedia.org/wiki/Solubility_chart . Viene copiato alla fine della domanda per riferimento futuro.

Input : il catione, seguito dall'anione, separato da uno spazio. Il catasto sarà uno dei seguenti:

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

e l'anione sarà uno dei seguenti:

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

Ognuno avrà la sua prima lettera maiuscola.

Esempio di input: Sodium Chloride

Output : un valore di verità, o S, se è solubile, falso o Ialtro. Se la pagina di Wikipedia elenca qualcos'altro (ad esempio leggermente solubile, o reagisce con l'acqua) o se l'input non è nella forma "cation anion", il tuo programma potrebbe fare qualsiasi cosa (comportamento indefinito), quindi potrebbe produrre "S", " Io ', o qualsiasi altra cosa.

Tavolo:

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

Le righe sono cationi nell'ordine sopra elencato e le colonne sono anioni. Ad esempio, poiché lo ioduro di magnesio è solubile e il magnesio era il sesto catione e lo ioduro era il 4 ° anione, la sesta fila e la quarta colonna hanno il carattere "S". Il ?indica comportamento non definito.


1
Mi piace questo perché il comportamento indefinito di ?s dà molta libertà in quali algoritmi si possono usare.
Jo King,

1
@FryAmTheEggman Nonostante il kolmogorov-complexitytag, la sfida non richiede l'output della tabella, ma il valore corretto per una data coppia (cation, anion).
Arnauld,

4
Ho rimosso il tag di complessità kolmogorov e aggiunto il tag di problema decisionale, dal momento che non si tratta di creare un output fisso (o parzialmente fisso), ma determinare se un determinato input soddisfa alcuni criteri.
Stewie Griffin,

Considereresti di consentire di produrre 2 valori coerenti distinti anziché solo truthy/ 'S'o falsy/ 'I'?
Arnauld,

Suggerirei di eliminare la specifica "separato da uno spazio" e invece di dire qualcosa in linea con "oltre alle impostazioni predefinite del sito, i due input potrebbero essere accettati come un singolo input separato da un carattere coerente non utilizzato (ad esempio uno spazio) ". Due ingressi possono consentire una maggiore creatività nel golf (ad es. Funzioni al curry).
Jonathan Allan,

Risposte:


8

JavaScript (Node.js) , 143 byte

Restituisce 1 per solubile, 0 per insolubile.

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]

Provalo online!

Come?

Conversione della stringa di input in un indice di ricerca

Per prima cosa costruiamo una chiave estraendo dal 2 ° al 7 ° carattere dell'anione e aggiungendo i due primi caratteri del catione:

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

Esempi:

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

Trasformiamo questo in un indice di ricerca analizzandolo in base-35 e applicando un modulo 1325 seguito da un modulo 508 (valori forzati):

parseInt(key, 35) % 1325 % 508

Compressione della tabella di ricerca

Poiché esistono coppie significativamente più solubili di quelle insolubili , riempiamo tutte le voci non utilizzate nella ricerca con solubili .

Codificando solubile con 1 e insolubile con 0 , la nostra tabella di ricerca consiste essenzialmente di lunghe stringhe di 1 seguite da uno 0 :

11101110011111111111111111111101111111110111111111111111111111101111111111111101111111011111
11111111111011111111111111111111011111111111001111111111111111111111111111111111111111111111
11111111111111111111111111111111011111111111111111111111111011100111111110111111111111111111
11111111111111111111011111111110011111111111111111111111111111111111110110111111111111111011
11011111111111111111111111111101111110111111111111101101111111111111110110111111111111111111
11111011111101110111111111111110111110

Lo comprimiamo memorizzando le lunghezze delle stringhe di 1 come caratteri ASCII nell'intervallo [32-126] .


8

Rubino -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

Provalo online!

Non sono molto bravo a generare hash e tabelle di ricerca, quindi ho optato per sfruttare tutti quei caratteri jolly punto interrogativo per semplificare la struttura logica della tabella e quindi applicare un po 'di pura magia Regex.

Aggiornamento : modifica dell'assegnazione di alcuni punti interrogativi e semplificazione della logica di abbinamento.

Aggiornamento 2 : solo 2 mesi dopo, ho escogitato un altro rinnovamento della tabella per salvare qualche byte in più.

La tabella che stiamo per produrre è simile a questa:

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

Ora, i seguenti composti possono essere considerati solubili:

  • raNit ra te, Chlo ra te
  • [SPm]o Così dium, Po tassium, Am mo nium
  • ^[^C]*F F luoride, ma non C alcium o C opper
  • h.*DLit h IUM D ichromate

Dei restanti composti, i seguenti sono insolubili:

  • Le Le ad
  • [MAIZ]i.*y M agnesium, A luminium, I ron (e altri cationi con carica indicata), composti Z inc con blocco di anioni contenenti y(H y droxide-Thioc y anate)
  • [OPDFbv] O xide, P hosphate, D ichromate, F luoride, Automobile b Onate, Sil v er
  • [tr]i.*SStron ti um e Ba ri um S ulfates

Tutto il resto è solubile.


4

Python 2 , 166 161 131 byte

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

Provalo online!


Come hai trovato così tanti numeri mod?
AlexRacer,

1
@AlexRacer Ho scritto uno script Python che prova numeri interi fino a un certo limite, in modo tale che il calcolo del modulo non produca gli stessi risultati per un input solubile e insolubile. Eseguendo ripetutamente questo script. Ho tutti questi numeri.
Ovs

@AlexRacer Ho usato questo script molte volte prima di questa sfida, es: codegolf.stackexchange.com/a/115706/64121 . Normalmente queste catene di moduli sono un po 'più corte.
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]

Provalo online!


Non 17*(b%91%61%17)%272può essere 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.

Provalo online!

Spiegazione:

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

Gelatina ,  67 61 60 50 47  44 byte

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

Un collegamento monadico che restituisce un elenco che è vuoto per Ie non vuoto per S(in Jelly gli elenchi vuoti sono falsi mentre quelli non vuoti sono veri).

Provalo online! (piè di pagina”S”IÇ?èif LastLink(x) is Truthy then "S" else "I")

Oppure vedi tutti i casi formattati come griglia corrispondente all'ordine della griglia nel PO.

Come?

Dopo aver creato insiemi di input che devono essere Se Ivalutati questi input come base dieci (Python:) dec=lambda s:sum(10**i*ord(c) for i, c in enumerate(s[::d]))e usando alcuni loop di valori di modulo e impostato il controllo dell'hash usato qui è stato trovato.

Gli interi chiave insolubili vengono creati nel codice valutando un intero codificato in base 250, convertendolo in base  25 ... 16  * ... 10 e sommando cumulativamente il risultato ...

* le riduzioni di base sono state ottenute aggiungendo alcune chiavi ridondanti

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])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.