让我们学习一些土壤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值的非负十进制数字,请输出其名称。您可以通过任何标准方法获取输入并提供输出。您可以输入的数据类型为:

  • 浮动
  • 您语言的标准十进制数字数据类型

并且您必须输出代表面额的字符串。禁止与化学相关的内置函数(抱歉,Mathematica!)

近似规则:如果您收到的pH值在一个面额的上限与下一个面额的下限之间(例如7.8与7.9之间),则它将近似为两者之间的最接近值:如果pH≥上限值。首先是+ 0.5,然后应该接收第二个面额,但是如果pH <前一个+ 0.5的上限,那么它应该接收第一个面额(例如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->中性(应用近似规则)

这是,因此最短的有效提交(以字节为单位)将获胜!

* 安德鲁没有提出来,那是维基百科


沙盒供那些可以看到已删除帖子的人使用。
Xcoder先生17年

是的,这与实际的酸度水平并没有真正的作用。任何比柠檬汁更酸性的东西都是超酸性的
破坏的柠檬

@DestructibleLemon如果柠檬汁是超酸性的,那么表现为具有-31.3的氟抗亚磺酸是一个总原子弹:))
Xcoder先生17年

哦,我知道你出了错。3.5 ph并非超酸性,但如果您正在种植的土壤为3.5 ph,则它是超酸性的。我的意思是,此表指的是土壤pH值
破坏的柠檬

1
布朗尼指出了使用Python或Swift的答案:)
Xcoder先生于

Answers:


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

我一直很喜欢05AB1E和Jelly之间的竞争...仅2个字节之遥
Xcoder先生,2017年

3
果冻跳动05AB1E?!?!
暴民埃里克(Erik the Outgolfer)'17年

5

PHP,199字节

foreach([35,9.5,6,5,5,5,8,5,6,5.5]as$l)$p+=$argn*10>=$s+=$l;$p-=$argn==9;echo[Ultra,Extremely,"Very strongly",Strongly,Moderately,Slightly][$p>6?12-$p:$p],[" acidic",Neutral," alkaline"][1+($p<=>6)];

在线尝试!


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(@)

根据我们的输入/输出规则,输入是通过预先存在的带有tDECIMAL(4,1)t进行的。

由于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
Xcoder先生

晚会晚了,但仍然很好奇:有人直接用这种语言编程(即使只是为了打高尔夫球)还是这是某种“编译器”的输出?
avl42

1
@ avl42:我们直接使用这种语言进行编码,是的(当然,通常仅用于打高尔夫球)。我不希望有人在生产代码中使用它;)这是一种解释语言,因此您用这种语言编写的代码会被解释为python代码。
Emigna

1
@Emigna我会说“翻译”而不是“解释”(这是相反的意思)
anatolyg

@anatolyg:是的,你是对的。我总是认为解释是出于某种原因,可能是由于python。它被翻译成翻译的语言:)
Emigna

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

通过将备用小数点和两个零作为后缀,将输入乘以100,然后删除小数点及其后面的除两位以外的所有数字。

.+
$*

转换为一元。

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

展开缩写。


哇,我认为花了一些时间
才把

2

Python 2,202字节

-15个字节,感谢@JonathanAllan

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先生17年

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


我认为您不需要将函数分配给变量。
扎卡里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.