Гольф Диаграмма Растворимости

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». ?Указывает на неопределенное поведение.

soktinpk
источник
1
Мне это нравится, потому что неопределенное поведение ?s дает большую свободу в том, какие алгоритмы можно использовать.
Джо Кинг
1
@FryAmTheEggman Несмотря на kolmogorov-complexityтэг, задача не запрашивает вывод таблицы, но правильное значение для данной пары (катион, анион).
Арно
4
Я удалил тег сложности Колмогорова и добавил тег решения проблемы, поскольку речь идет не о создании фиксированного (или частично фиксированного) вывода, а о том, соответствует ли определенный вход некоторым критериям.
Стьюи Гриффин
Рассматриваете ли вы возможность вывода любых 2 различных последовательных значений, а не просто truthy/ 'S'или falsy/ 'I'?
Арно
Я бы предложил исключить спецификацию «разделенных пробелом» и вместо того, чтобы сказать что-то вроде «в дополнение к значениям по умолчанию для сайта», два входа могут быть приняты как один вход, разделенный последовательным неиспользованным символом (например, пробелом) ». Два входа могут дать больше возможностей для игры в гольф (например, функции карри).
Джонатан Аллан

Ответы:

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 , как символы ASCII в диапазоне [32-126] .

Arnauld
источник
8

Рубин -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

Теперь следующие соединения можно считать растворимыми:

  • raНит ра тэ, Хло ра тэ
  • [SPm]o Так Радиевом, Po калии, Am мо nium
  • ^[^C]*F F фторид, но не C alcium или C opper
  • h.*DЛит ч иум D ichromate

Из оставшихся соединений следующие нерастворимы:

  • Le Le ad
  • [MAIZ]i.*y М agnesium, luminium, я рон (и другие катионы с указанным зарядом), Z , включая дополнительные соединения с блоком анионов , содержащих (Н у droxide-Thioc у anate)y
  • [OPDFbv] О Xide, Р hosphate, D ichromate, F luoride, Автомобильные б Onate, Sil v эр
  • [tr]i.*SСтрон ти мкм и Ва ри ит 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, который опробует целые числа до определенного предела, таким образом, что вычисление по модулю не дает одинаковых результатов для растворимых и неразрешимых входных данных. Повторно запустив этот скрипт. Я получил все эти цифры.
овс
@AlexRacer Я использовал этот сценарий много раз перед этим испытанием, например: codegolf.stackexchange.com/a/115706/64121 . Обычно эти цепочки по модулю немного короче.
овс
3

Python 2 , 180 177 151 149 147 байт

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]

Попробуйте онлайн!

TFeld
источник
Не 17*(b%91%61%17)%272может быть b%91%61%17*17%272?
Джонатан Фрех
2

Паскаль (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.
AlexRacer
источник
1

Желе ,  67 61 60 50 47  44 байта

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

Монадическая ссылка, возвращающая список, для которого пустой Iи непустой S(в Jelly пустые списки ложные, а непустые правдивые).

Попробуйте онлайн! (нижний колонтитул”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]))и использования нескольких циклов модулирующих значений и проверки набора хэш, использованный здесь, был найден.

Нерастворимые ключевые целые числа создаются в коде путем вычисления целого числа, закодированного в 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])
Джонатан Аллан
источник