土壌のpH化学を学びましょう!


14

アンドリューは化学者であり、溶液の酸性度と農業に興味があります。数か月の研究の後(Googleは彼の友人ではありません)、彼はpH(水素の可能性)に関して人間が読めるレベルの酸性度に関する次の表*を思いつきました。

         宗派| pH範囲
                             |
    ------------------------- + ------------------------ -----   
    超酸性| 3.5未満
    ------------------------- + ------------------------ ------
    強酸性| 3.5と4.4の間
    ------------------------- + ------------------------ ------
    非常に強い酸性| 4.5と5.0の間
    ------------------------- + ------------------------ ------
    強酸性| 5.1と5.5の間
    ------------------------- + ------------------------ ------
    中程度の酸性| 5.6と6.0の間
    ------------------------- + ------------------------ ------
    弱酸性| 6.1と6.5の間
    ------------------------- + ------------------------ ------
    ニュートラル| 6.6と7.3の間
    ------------------------- + ------------------------ ------
    弱アルカリ| 7.4と7.8の間
    ------------------------- + ------------------------ ------
    中程度のアルカリ| 7.9と8.4の間
    ------------------------- + ------------------------ ------
    強アルカリ| 8.5と9.0の間
    ------------------------- + ------------------------ ------
    非常に強いアルカリ| 9.0以上

物質のpHを表す負でない10進数を指定すると、その種類を出力します。任意の標準的な方法で入力を受け取り、出力を提供できます。入力できるデータタイプは次のとおりです。

  • 浮く
  • ダブル
  • 言語の標準の10進数データ型
  • ストリング

そして、金種を表す文字列を出力する必要があります。化学に関連するビルトインは禁止されています(申し訳ありませんが、Mathematica!)

概算ルール:受け取るpHが額面の上限と次の額面の下限(例:7.8〜7.9)の間にある場合、2つの値の間の最も近い値に近似されます。最初の+ 0.5、次に2番目の額面を受け取りますが、最初の+ 0.5のpH <upperBoundの場合、最初のものを受け取ります(たとえば、7.85は7.9に近似しますが、7.84999は7.8に近似します)。詳細については、テストケースを参照してください。

テストケース:

入力->出力

6.40->わずかに酸性
8.399->適度にアルカリ性
3.876->極端に酸性
10.60->非常に強アルカリ性     
0.012->超酸性
7.30->ニュートラル
7.85->中アルカリ(近似ルールが適用されます)
7.849->わずかにアルカリ性(近似ルールが適用されます)
6.55->ニュートラル(近似ルールが適用されます)

これはなので、最短の有効な送信(バイト単位)が勝ちます!

* アンドリューはそれを思いつきませんでした、それはウィキペディアでした!


削除された投稿を見ることができる人のためのサンドボックス
Mr Xcoder

ええ、これは実際の酸性度レベルでは実際には機能しません。レモン汁よりも酸性のものは、超酸性である
破壊可能なレモン

@DestructibleLemonレモンジュースが超酸性である場合、-31.3のように振る舞うフルオロアンチモン酸は全原子爆弾です:))
Xcoder氏

ああ、どこがおかしいのかわかります。3.5 phは超酸性ではありませんが、植物を栽培している土壌が3.5 phであれば超酸性です。私の言いたいことは、この表は土壌のpHを指します
破壊可能なレモン

1
ブラウニーはPythonまたはSwiftで回答を求めています:)
Xcoder氏

回答:


6

ゼリー 77 73  71 バイト

“£RĿÐƭðṚ°ƲṂṾẒ=ʂXḣsịɠ<»Ḳµ,Ṛ;€"“¡D⁺“a&»j“¿<z»W¤ṙ3
×20<“FYeoy³ƓɗʋṆ‘Sị¢⁾. y

数値を取得して文字のリストを返すモナドリンク。または結果を印刷する完全なプログラム。

オンラインでお試しください!

どうやって?

“ ... »Ḳµ,Ṛ;€"“¡D⁺“a&»j“¿<z»W¤ṙ3 - Link 1, name list: no arguments
“ ... »                          - compression of "Ultra Extremely Very.strongly Strongly Moderately Slightly"
       Ḳ                         - split at spaces
        µ                        - monadic chain separation, call that adjectives
          Ṛ                      - reverse adjectives
         ,                       - pair these two lists
              “¡D⁺“a&»           - compression of [" alkaline"," acidic"]
             "                   - zip with:
           ;€                    -   concatenate for €ach
                             ¤   - nilad followed by links as a nilad
                       “¿<z»     -   compression of "Neutral"
                            W    -   wrap in a list
                      j          - join
                              ṙ3 - rotate left by 3: ["Strongly alkaline","Moderately alkaline","Slightly alkaline","Neutral","Slightly acidic","Moderately acidic","Strongly acidic","Very.strongly acidic","Extremely acidic","Ultra acidic","Ultra alkaline","Extremely alkaline","Very.strongly alkaline"]

×20<“FYeoy³ƓɗʋṆ‘Sị¢⁾. y - Main link: number, pH
×20                     - multiply by 20
    “FYeqy³ƓɗʋṆ‘        - code-page indexes = [70,89,101,111,121,131,147,157,169,180]
   <                    - less than? (vectorises)
                        -   i.e.: pH < [3.5,4.45,5.05,5.55,6.05,6.55,7.35,7.85,8.45,9]
                S       - sum
                  ¢     - call last link (1) as a nilad
                 ị      - index into (1-indexed and modular)
                        - ...note that the sum is never 11 or 12, so "Ultra alkaline" and
                        -    "Extremely alkaline" wont be fetched, but that a sum of 0
                        -    fetches "Very.strongly alkaline", as required.
                   ⁾.   - literal list of characters ['.', ' ']
                      y - translate (replace any '.' with a ' ' i.e. for "Very.strongly")
                        - if running as a full program, implicit print

私はいつも2バイトしか離れ05AB1Eとゼリー...間の競争を楽しむ
氏Xcoder

3
ゼリーが05AB1Eを破った?!?!
エリックアウトゴルファー


4

C#(.NET Core)、236バイト

p=>{var l=new[]{70,89,101,111,121,131,147,157,169,180,280};var a="Ultra,Extremely,Very strongly,Strongly,Moderately,Slighty, acidic,Neutral, alkaline".Split(',');int i=0;for(;p*20>=l[i];i++);return i==6?a[7]:i<6?a[i]+a[6]:a[12-i]+a[8];}

オンラインでお試しください!

このソリューションでは、pそれが14を超えることはできないと考えています。


4

T-SQL、305 299バイト

DECLARE @ char(999)=REPLACE(REPLACE(REPLACE(REPLACE('SELECT TOP 1i FROM(VALUES(''Very s$#9&S$#8.4&Moderately#7.8&Slightly#7.3&Neutral'',6.5&Slightly@6&Moderately@5.5&S$@5&Very s$@4.4&Extremely@3.4&Ultra@-1))x(i,j),t WHERE j<a','#',' alkaline'','),'@',' acidic'','),'&','),('''),'$','trongly')EXEC(@)

入力は、入出力ルールに従って、列aを持つ既存のテーブルtを介して行われますDECIMAL(4,1)

のために DECIMAL(4,1)データ型の、値が入力テーブルに入力されるときに「近似規則」の丸めが行われるため、コードで明示的に管理する必要はありません。

スペース節約REPLACESが実行された後、これは入力テーブルと値のリストを結合する簡単なSQLクエリです。

SELECT TOP 1 i
FROM(VALUES
    ('Very strongly alkaline',9),
    ('Strongly alkaline',8.4),
    ('Moderately alkaline',7.8),
    ('Slightly alkaline',7.3),
    ('Neutral',6.5),
    ('Slightly acidic',6),
    ('Moderately acidic',5.5),
    ('Strongly acidic',5),
    ('Very strongly acidic',4.4),
    ('Extremely acidic',3.4),
    ('Ultra acidic',-1)
) x(i,j), t
WHERE j<a

順序を逆にしてTOP 1、入力値よりも小さい最初のものを選択します。

改行と余分なスペースを削除した後のこのフォームでさえ、318バイトでかなり良好です。オーバーヘッドを追加するDECLAREREPLACESEXECだけ繰り返されるすべての句とそれだけの価値になります。

編集:いくつかの値で不要な「.0」を削除して6バイトを節約


3

05AB1E81 80 79 77 76 74 バイト

'Ĉ“¢³¿™ly³¾‚Òw““³¾§ÓªÅ“«#¦¦’šÉaƒ£’«Š’w¡Îic’«)˜™'wð:I•t{~À•ST+.¥70+20/‹Oè

オンラインでお試しください!

テストスイート

説明

'Ĉ                   # push the string "neutral"
“¢³¿™ly³¾‚Òw“         # push the string "slightly moderately strongly veryw"
“³¾§ÓªÅ“              # push the string "strongly extremely ultra"
«                     # concatenate the top 2 items on the stack
 #                    # split on spaces
  Â                   # push a reversed copy
   ¦¦                 # remove the first 2 elements of the copy ("ultra", "extremely")
’šÉaƒ£’«              # append the string "walkaline" to each ("walk"+"a"+"line")
        Š             # move down 2 places on the stack
’w¡Îic’«              # append the string "wacidic" to each ("w"+"acid"+"ic")
        )˜            # wrap stack in a list and flatten
          ™           # title case each
           'wð:       # replace each instance of "w" with a space
I                     # push input
 •t{~À•               # push the base 255 compressed number 920006021
       ST+            # split to list of digits and add 10 to each
          .¥          # undelta (compute increments from 0)
            70+       # add 70 to each
               20/    # divide each by 20
                  ‹   # compute input less than for each
                   O  # sum
                    è # use this to index into list of strings

05AB1Eの場合、これは驚くほど長い
Mr. Xcoder

パーティーに遅れたが、それでも好奇心が強い:誰かがこの言語で直接プログラムしますか(コードゴルフ専用の場合でも)、またはこれは何らかの「コンパイラ」の出力ですか?
avl42

1
@ avl42:はい、この言語で直接コーディングします(一般的にはゴルフのためだけです)。私は誰かが本番コードでこれを使用するのを嫌います;)これはインタプリタ言語なので、この言語で書いたコードはpythonコードに解釈されます。
エミグナ

1
@Emigna私は「解釈された」ではなく「翻訳された」と言います(それは一種の反対の意味です)
アナトリグ

@anatolyg:はい、あなたはそこで正しいです。おそらく何らかの理由で、おそらくpythonが原因で解釈されると思います。通訳言語に翻訳されています:)
エミグナ

2

網膜、228バイト

$
.00
\.(.)\.?(.).*
$1$2
.+
$*
1{900,}
VA
1{845,}
STA
1{785,}
MA
1{735,}
SLA
1{655,}
Neutral
1$
1 acidic
1{605,}
SL
1{555,}
M
1{505,}
ST
1{445,}
V
1{350,}
Extremely
1+
Ultra
M
Moderately
V
Very sT
T
trongly
L
lightly
A
 alkaline

オンラインでお試しください!リンクにはテストスイートが含まれています。説明:

$
.00
\.(.)\.?(.).*
$1$2

予備の小数点と2つのゼロを接尾辞として入力に100を掛け、小数点とその後の2桁を除くすべての桁を削除します。

.+
$*

単項に変換します。

1{900,}
VA
1{845,}
STA
1{785,}
MA
1{735,}
SLA

すべてのアルカリを処理し、後で拡張される略語に変換します。

1{655,}
Neutral

ニュートラルハンドル。

1$
1 acidic

残っているものは酸性でなければなりません。(ただし、pHが0.001の場合は1のままにします)

1{605,}
SL
1{555,}
M
1{505,}
ST
1{445,}
V
1{350,}
Extremely
1+
Ultra

すべての酸を処理します。

M
Moderately
V
Very sT
T
trongly
L
lightly
A
 alkaline

略語を展開します。


うわー、私はそれがゴルフにそれをダウン...にしばらく時間がかかったと思います
氏Xcoder

2

Python 2、202バイト

@JonathanAllanのおかげで-15バイト

lambda k:'Neutral_Slightly_Moderately_Strongly_Very strongly_Extremely_Ultra'.split('_')[abs(sum(round(k*10)>ord(i)for i in'",27<AINT')+(k>9)-(3.45<k<3.5)-6)]+(' acidic'*(k<6.55)or' alkaline'*(k>=7.35))

オンラインでお試しください!


2
あなたは私のブラウニーポイントを取りました。
ミスターXcoder

2

JavaScript(ES6)、192 189 185 184バイト

k=>([...'09544474540'].some(n=>(i--,k-=++n)<0,i=7,k=k*10-33.5),'Neutral,Slightly,Moderately,Strongly,Very strongly,Extremely,Ultra'.split`,`[i<0?-i:i]+(i?i>0?' acidic':' alkaline':''))

テストケース


1

Excel、240バイト

=CHOOSE((A1<6.55)+(A1<6.05)+(A1<5.55)+(A1<5.05)+(A1<4.45)+(A1<3.5)+(A1>=7.35)+(A1>=7.85)+(A1>=8.45)+(A1>9)+1,"Neutral","Slightly","Moderately","Strongly","Very Strongly","Extremely","Ultra")&IF(A1<6.55," acidic",IF(A1>=7.35," alkaline",""))

0

Javascript、222 209バイト

x=>'Very strongly,Strongly,Moderately,Slightly,Neutral,Extremely,Ultra'.split(',',7,x-=0.049)[x>9?0:x>8.4?1:x>7.8?2:x>7.3?3:x>6.5?4:x>6?3:x>5.5?2:x>5?1:x>4.4?0:x>3.5?5:6]+(x<6.5?' acidic':x>7.3?' alkaline':'')

まだ少しゴルフ

var f = x=>'Very strongly,Strongly,Moderately,Slightly,Neutral,Extremely,Ultra'.split(',',7,x-=0.049)[x>9?0:x>8.4?1:x>7.8?2:x>7.3?3:x>6.5?4:x>6?3:x>5.5?2:x>5?1:x>4.4?0:x>3.5?5:6]+(x<6.5?' acidic':x>7.3?' alkaline':'')

console.log(f(6.40));
console.log(f(8.399));
console.log(f(3.876));
console.log(f(10.60));
console.log(f(0.012));
console.log(f(7.30));
console.log(f(7.85));
console.log(f(7.849));
console.log(f(6.55));


関数を変数に割り当てる必要はないと思います。
ザカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.