Biraz toprak pH kimyası öğrenelim!


14

Andrew, çözümlerin asitliği ve tarımla ilgilenen bir kimyagerdir. Aylar süren araştırmalardan sonra (Google arkadaşı değil), pH (Hidrojen potansiyeli) açısından insan tarafından okunabilir asitlik seviyesi ile ilgili aşağıdaki tabloyu * buldu :

         Mezhep | pH aralığı
                             |
    ------------------------- + ------------------------ -----   
    Ultra asidik | 3.5 altı
    ------------------------- + ------------------------ ------
    Aşırı asidik | 3.5 ve 4.4 arasında
    ------------------------- + ------------------------ ------
    Çok kuvvetli asidik | 4.5 ile 5.0 arasında
    ------------------------- + ------------------------ ------
    Kuvvetli asidik | 5.1 ve 5.5 arasında
    ------------------------- + ------------------------ ------
    Orta derecede asidik | 5.6 ile 6.0 arasında
    ------------------------- + ------------------------ ------
    Hafif asidik | 6.1 ve 6.5 arasında
    ------------------------- + ------------------------ ------
    Nötr | 6.6 ile 7.3 arasında
    ------------------------- + ------------------------ ------
    Hafif alkalin | 7.4 ve 7.8 arasında
    ------------------------- + ------------------------ ------
    Orta derecede alkalin | 7.9 ile 8.4 arasında
    ------------------------- + ------------------------ ------
    Güçlü alkalin | 8.5 ile 9.0 arasında
    ------------------------- + ------------------------ ------
    Çok kuvvetli alkalin | 9.0'dan fazla

Bir maddenin pH'ını temsil eden negatif olmayan bir ondalık sayı verildiğinde, onun değerini girin. Herhangi bir standart yöntemle girdi alabilir ve çıktı sağlayabilirsiniz . Girmenize izin verilen veri türleri şunlardır:

  • şamandıra
  • Çift
  • Dilinizin standart ondalık sayı veri türü
  • sicim

Ve mezhebi temsil eden bir String çıkarmalısınız. Kimya ile ilgili yerleşikler yasaktır (Üzgünüm, Mathematica!) .

Yaklaşım Kuralı: Aldığınız pH bir mezhebin üst sınırı ile bir sonrakinin alt sınırı arasındaysa (örneğin 7.8 ve 7.9 arasında), ikisi arasındaki en yakın değere yaklaşırsa: pH'ın ≥ üst Sınırı ilk + 0.5 ise, ikinci mezhebi almalıdır, ancak eğer ilk + 0.5'in pH <üst sınırı ise, ilkini almalıdır (örneğin 7.85, 7.9'a yaklaşık, ancak 7.84999, 7.8'e yaklaşır). Açıklamalar için test senaryolarına bakın.

Test Durumları:

Giriş -> Çıkış

6.40 -> Hafif asidik
8.399 -> Orta derecede alkalin
3.876 -> Aşırı asidik
10.60 -> Çok kuvvetli alkalin     
0.012 -> Ultra asidik
7.30 -> Nötr
7.85 -> Orta derecede alkalin (yaklaşıklama kuralı uygulanır)
7.849 -> Hafif alkalin (yaklaşıklama kuralı uygulanır)
6.55 -> Nötr (yaklaşık kuralı uygulanır)

Bu , bu yüzden en kısa geçerli gönderme (bayt cinsinden) kazanır!

* Andrew bununla gelmedi, Wikipedia'ydı !


Sandbox silinen yayınları görebilir olanlar için.
Bay Xcoder

evet bu gerçek asitlik seviyeleri ile gerçekten işe yaramaz. limon suyundan daha asidik bir şey ultra asidiktir
Yıkılabilir Limon

Limon Suyu Ultra asidik ise, o zaman Fluoroantimonik asit , −31.3'e sahip olmak gibi davranır, tam bir atom bombasıdır :))
Bay Xcoder

oh, nerede yanlış gittiğini anlıyorum. 3.5 ph ultra asidik değildir, ancak bitki yetiştirdiğiniz toprağın 3.5 ph olması ultra asidiktir. Demek istediğim, bu tablo toprak ph anlamına gelir
Tahrip Limon

1
Brownie Python veya Swift'te bir cevap verdi :)
Bay Xcoder

Yanıtlar:


6

Jöle ,  77 73  71 bayt

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

Numarayı alan ve bir karakter listesi döndüren monadik bir bağlantı; veya sonucu yazdıran tam bir program.

Çevrimiçi deneyin!

Nasıl?

“ ... »Ḳµ,Ṛ;€"“¡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

Her zaman 05AB1E ve Jelly arasındaki rekabeti severim ... Sadece 2 bayt uzaklıkta
Bay Xcoder

3
Jöle 05AB1E'yi yeniyor?!?!
Outgolfer Erik

5

PHP , 199 bayt

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

Çevrimiçi deneyin!


4

C # (.NET Core) , 236 bayt

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];}

Çevrimiçi deneyin!

Bu çözüm p14'ten büyük olamaz.


4

T-SQL, 305 299 bayt

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

Girdi, Girdi / Çıktı kurallarımıza göre , a sütunu ile önceden var olan bir t tablosundan yapılır .DECIMAL(4,1)

DECIMAL(4,1)Veri türü nedeniyle , değer giriş tablosuna girildiğinde herhangi bir "yaklaşım kuralı" yuvarlaması gerçekleşir, bu nedenle kodum tarafından açıkça yönetilmesi gerekmez.

Yerden tasarruf REPLACESsağlandıktan sonra, giriş tablomuza değerler listemizle katılan basit bir SQL sorgusudur:

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

Sırayı tersine çeviriyorum, bu yüzden TOP 1ilkini girdi değerimizden daha az alıyor.

Bu form bile (satır sonlarını ve fazladan boşlukları kaldırdıktan sonra) 318 baytta oldukça iyidir . DECLARE, REPLACESVE ek yükü eklemek EXECsadece tüm tekrarlanan ifadeler ile buna değer olur.

DÜZENLEME : Çeşitli değerlerde gereksiz ".0" kaldırarak 6 bayt kaydedin


3

05AB1E , 81 80 79 77 76 74 bayt

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

Çevrimiçi deneyin!

Test odası

açıklama

'Ĉ                   # 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

Bu şaşırtıcı bir şekilde 05AB1E
Bay

Partiye geç, ama yine de meraklı: Herkes doğrudan bu dilde (sadece kod golf için bile) program mı yoksa bu bir çeşit "derleyici" çıktı mı?
avl42

1
@ avl42: Doğrudan bu dilde kod yazıyoruz evet (genellikle sadece golf oynamak için). Birisinin üretim kodunda bunu kullanmasından nefret ederdim;) Bu dilde yazılan kod python koduna yorumlanır.
Emigna

1
@Emigna "yorumlandı" yerine "tercüme edildi" diyebilirim (bu bir tür zıt anlam)
anatolyg

@anatolyg: Evet, orada haklısın. Her zaman bir sebepten dolayı, muhtemelen python'dan dolayı yorumlandığını düşünüyorum. Yorumlanan bir dile
çevrildi

2

Retina , 228 bayt

$
.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

Çevrimiçi deneyin! Bağlantı test paketini içerir. Açıklama:

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

Yedek bir ondalık ayırıcı ve iki sıfır ekleyerek girdiyi 100 ile çarpın, ardından ondalık ayırıcıyı ve sonraki iki basamağı değil tümünü silin.

.+
$*

Tekli'ye dönüştür.

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

Daha sonra genişletilecek kısaltmalara dönüştürerek tüm alkalileri kullanın.

1{655,}
Neutral

Nötr sap.

1$
1 acidic

Geriye kalan her şey asidik olmalıdır. (Fakat pH 0.001 ise 1'i bırakın)

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

Tüm asitleri idare edin.

M
Moderately
V
Very sT
T
trongly
L
lightly
A
 alkaline

Kısaltmaları genişletin.


Vay canına, golf
oynamak

2

Python 2 , 202 bayt

@JonathanAllan sayesinde -15 bayt

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

Çevrimiçi deneyin!


2
Benim kek puanımı aldın.
Bay Xcoder

2

JavaScript (ES6), 192 189 185 184 byte

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':''))

Test senaryoları


1

Excel, 240 bayt

=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, 222209 bayt

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':'')

Hala biraz golf oynuyor

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


Fonksiyonu bir değişkene atamanız gerektiğini düşünmüyorum.
Zacharý
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.