Гольф діаграми розчинності


12

Давши назву катіона та аніона, виведіть "S" (розчинний) або "I" (нерозчинний). Таблиця, яку ми будемо використовувати, - із wikipedia: 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

Рядки є катіонами у зазначеному вище порядку, а стовпці - аніонами. Наприклад, оскільки йодид магнію є розчинним, а магній - шостим катіоном, а йодид - 4-м аніоном, 6-й рядок та 4-й стовпчик мають символ "S". ?Вказує на невизначений поведінка.


1
Мені це подобається, тому що невизначена поведінка ?s дає багато свободи в тому, якими алгоритмами можна користуватися.
Джо Кінг

1
@FryAmTheEggman Незважаючи на kolmogorov-complexityтег, завдання не вимагає вивести таблицю, а правильне значення для даної пари (катіон, аніон).
Арнольд

4
Я видалив тег kolmogorov-складності та додав тег-проблему рішення, оскільки мова не йде про створення фіксованого (або частково фіксованого) виводу, а визначення того, чи відповідає певний вхід деяким критеріям.
Стюі Гріффін

Чи могли б ви дозволити виводити будь-які 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 's як символи ASCII в діапазоні [32-126] .


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

Тепер такі сполуки можна вважати розчинними:

  • raNit ra te, Chlo ra te
  • [SPm]o Так Радиевом, Po калії, Am мо nium
  • ^[^C]*F F луорид, але не C- кальцій або C- опер
  • h.*DЛіт ч ІУМ D ichromate

З інших сполук такі нерозчинні:

  • Le Le ad
  • [MAIZ]i.*y М- агнезій, A люміній, I ron (та інші катіони з зазначеним зарядом), Z inc сполуки з блоком аніонів, що містять y(H y дроксид-Тіок y анат)
  • [OPDFbv] Про Xide, Р hosphate, D ichromate, F luoride, Автомобільні б Onate, Sil v ер
  • [tr]i.*SStron ti um та Ba ri um S ulfates

Все інше є розчинним.


4

Пітон 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 . Зазвичай ці модульні ланцюги трохи коротші.
ов


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.

1

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

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

Монадійне посилання, що повертає список, який є порожнім Iі не порожнім для S(у порожніх списках «Желе» порожні списки є фальси, а непусті - правдивими).

Спробуйте в Інтернеті! (колонтитул”S”IÇ?єif LastLink(x) is Truthy then "S" else "I")

Або дивіться всі випадки, відформатовані як сітка, що відповідає порядку сітки в ОП.

Як?

Після створення наборів входів, які повинні бути, 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])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.