골프 용해도 차트


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

행은 위에 나열된 순서대로 양이온이고 열은 음이온입니다. 예를 들어, 요오드화 마그네슘은 가용성이고, 마그네슘은 6 번째 양이온이고, 요오드화물은 4 번째 음이온이므로, 6 번째 행 및 4 번째 열은 문자 'S'를 갖는다. 은 ?정의되지 않은 동작을 나타냅니다.


1
?s 의 정의되지 않은 동작은 알고리즘이 사용할 수있는 많은 자유를 제공 하기 때문에 이것을 좋아 합니다.
Jo King

1
@FryAmTheEggman kolmogorov-complexity태그 에도 불구하고 문제는 테이블을 출력하도록 요구하지 않고 주어진 (양이온, 음이온) 쌍에 대한 올바른 값을 요구합니다.
Arnauld

4
kolmogorov-complexity 태그를 제거하고 결정 문제 태그를 추가했습니다. 고정 된 (또는 부분적으로 고정 된) 출력을 생성하는 것이 아니라 특정 입력이 일부 기준을 충족하는지 여부를 결정하기 때문입니다.
Stewie Griffin

단지 truthy/ 'S'또는 falsy/가 아닌 2 개의 고유 한 일관성있는 값을 출력하도록 고려 하시겠습니까 'I'?
Arnauld

"공백으로 분리"사양을 삭제하고 대신 "사이트 기본값 외에도 두 입력은 일관되지 않은 문자 (예 : 공백)로 구분 된 단일 입력으로 받아 들여질 수 있습니다. ". 두 가지 입력은 여기서 더 많은 골프 창의성을 허용 할 수 있습니다 (예 : 카레 기능).
Jonathan Allan

답변:


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 번째 문자를 추출하고 양이온의 첫 번째 2 문자를 추가하여 키를 만듭니다.

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

룩업 테이블의 압축

불용성 쌍보다 가용성 쌍이 상당히 많기 때문에 조회에서 사용되지 않은 모든 항목을 soluble로 채 웁니다 .

수용성 부호화 1 과 불용성 0 우리 룩업 테이블은 본질적으로 긴 문자열로 구성 1 a로 하였다 s '를 0 :

11101110011111111111111111111101111111110111111111111111111111101111111111111101111111011111
11111111111011111111111111111111011111111111001111111111111111111111111111111111111111111111
11111111111111111111111111111111011111111111111111111111111011100111111110111111111111111111
11111111111111111111011111111110011111111111111111111111111111111111110110111111111111111011
11011111111111111111111111111101111110111111111111101101111111111111110110111111111111111111
11111011111101110111111111111110111110

1 의 문자열 길이를 [32-126] 범위의 ASCII 문자로 저장하여 압축합니다 .


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 테, Chlo
  • [SPm]o 그래서 전도 매체, tassium, 암의 노보로
  • ^[^C]*F F의 luoride,하지만 C의 alcium 또는 C의 opper
  • h.*D점등 시간D의 ichromate

나머지 화합물 중 다음은 불용성입니다.

  • Le 광고
  • [MAIZ]i.*y M의 agnesium, luminium, I 롱 (및 지정된 전하와 다른 양이온), Z를 포함하는 음이온의 블록 INC 화합물 (H에서 의 Y droxide Thioc- Y의 anate)y
  • [OPDFbv] O xide, P의 포스페이트, D의 ichromate, F의 luoride, 차량 B의 오 네이트, 실루 브이 ER
  • [tr]i.*SStron TI 음과 바 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 스크립트를 작성했습니다. 이 스크립트를 반복해서 실행합니다. 나는이 숫자를 모두 얻었다.
ovs

@AlexRacer 나는이 도전 전에 그 스크립트를 여러 번 사용했습니다 (예 : codegolf.stackexchange.com/a/115706/64121) . 일반적으로 이러한 모듈러스 체인은 약간 짧습니다.
ovs


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")

또는 OP의 그리드 순서와 일치 하는 그리드로 형식이 지정된 모든 사례를 참조하십시오 .

어떻게?

해야 입력 세트를 만든 후 SI와 평가 이러한 입력을 기본 열 (파이썬 :로 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])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.