Impariamo un po 'di chimica del pH del suolo!


14

Andrew è un chimico, interessato all'acidità delle soluzioni e all'agricoltura. Dopo mesi di ricerche (Google non è suo amico), ha elaborato la seguente tabella * relativa al livello di acidità leggibile dall'uomo in termini di pH (potenziale di idrogeno) :

         Denominazione | intervallo di pH
                             |
    ------------------------- + ------------------------ -----   
    Ultra acido | inferiore a 3.5
    ------------------------- + ------------------------ ------
    Estremamente acido | tra 3.5 e 4.4
    ------------------------- + ------------------------ ------
    Molto fortemente acido | tra 4.5 e 5.0
    ------------------------- + ------------------------ ------
    Fortemente acido | tra 5.1 e 5.5
    ------------------------- + ------------------------ ------
    Moderatamente acido | tra 5.6 e 6.0
    ------------------------- + ------------------------ ------
    Leggermente acido | tra 6.1 e 6.5
    ------------------------- + ------------------------ ------
    Neutro | tra 6.6 e 7.3
    ------------------------- + ------------------------ ------
    Leggermente alcalino | tra 7.4 e 7.8
    ------------------------- + ------------------------ ------
    Moderatamente alcalino | tra 7.9 e 8.4
    ------------------------- + ------------------------ ------
    Fortemente alcalino | tra 8.5 e 9.0
    ------------------------- + ------------------------ ------
    Molto fortemente alcalino | oltre 9.0

Dato un numero decimale non negativo che rappresenta il pH di una sostanza, produce la sua denominazione. Puoi prendere input e fornire output con qualsiasi metodo standard . I tipi di dati con cui è consentito inserire input sono:

  • Galleggiante
  • Doppio
  • Il tipo di dati del numero decimale standard della tua lingua
  • Corda

E devi produrre una stringa che rappresenti la denominazione. Sono vietati gli incorporamenti relativi alla chimica (Siamo spiacenti, Mathematica!) .

Regola di approssimazione: se il pH che ricevi è compreso tra un limite superiore di una denominazione e il limite inferiore di quello successivo (ad esempio tra 7,8 e 7,9), viene approssimato al valore più vicino tra i due: se il pH ≥ upperBound del prima + 0,5, quindi dovrebbe ricevere la seconda denominazione, ma se il pH <upperBound del primo + 0,5, allora dovrebbe ricevere la prima (ad es. 7,85 è approssimato a 7,9, ma 7,84999 è approssimato a 7,8). Vedere i casi di test per chiarimenti.

Casi test:

Ingresso -> Uscita

6.40 -> Leggermente acido
8.399 -> Moderatamente alcalino
3.876 -> Estremamente acido
10.60 -> Molto fortemente alcalino     
0,012 -> Ultra acido
7.30 -> Neutro
7.85 -> Moderatamente alcalino (viene applicata la regola di approssimazione)
7.849 -> Leggermente alcalino (viene applicata la regola di approssimazione)
6.55 -> Neutro (viene applicata la regola di approssimazione)

Questo è , quindi vince l'invio valido più breve (in byte)!

* Andrew non è venuto fuori con quello, era Wikipedia !


Sandbox per coloro che possono vedere i post eliminati.
Mr. Xcoder,

sì, questo non funziona davvero con i livelli di acidità reali. qualcosa di più acido del succo di limone è ultra acido
Destructible Lemon

@DestructibleLemon Se il succo di limone è ultra acido, quindi l' acido fluoroantimonico , che si comporta come se −31,3 sia una bomba atomica totale :))
Mr. Xcoder

oh, vedo dove hai sbagliato. 3,5 ph non è ultra acido, ma è ultra acido se il terreno in cui coltivi le piante è 3,5 ph. ciò che intendo è che questa tabella si riferisce al ph del suolo
Limone distruttibile

1
Brownie indica una risposta in Python o Swift :)
Mr. Xcoder,

Risposte:


6

Gelatina ,  77 73  71 byte

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

Un collegamento monadico che prende il numero e restituisce un elenco di caratteri; o un programma completo che stampa il risultato.

Provalo online!

Come?

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

Mi piace sempre la competizione tra 05AB1E e Jelly ... A soli 2 byte di distanza
Mr. Xcoder,

3
Jelly batte 05AB1E?!?!
Erik the Outgolfer,

5

PHP , 199 byte

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

Provalo online!


4

C # (.NET Core) , 236 byte

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

Provalo online!

Questa soluzione considera che pnon può essere maggiore di 14.


4

T-SQL, 305 299 byte

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

L'input avviene tramite una tabella preesistente t con DECIMAL(4,1)colonna a , secondo le nostre regole Input / Output .

A causa del DECIMAL(4,1)tipo di dati, qualsiasi arrotondamento per "regola di approssimazione" ha luogo quando il valore viene inserito nella tabella di input, quindi non è necessario che sia esplicitamente gestito dal mio codice.

Dopo aver REPLACESeseguito il risparmio di spazio , questa è una semplice query SQL che unisce la nostra tabella di input al nostro elenco di valori:

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

Invertisco l'ordine così TOP 1 scegliere il primo in meno del nostro valore di input.

Anche questo modulo (dopo aver rimosso le interruzioni di riga e gli spazi extra) è abbastanza buono, a 318 byte . Aggiunta dell'overhead di DECLARE, REPLACESANDEXEC diventa valsa la pena solo con tutte le frasi ripetute.

EDIT : Salva 6 byte rimuovendo "0" non necessari su più valori


3

05AB1E , 81 80 79 77 76 74 byte

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

Provalo online!

Suite di test

Spiegazione

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

Questo è sorprendentemente lungo per 05AB1E
Mr. Xcoder,

In ritardo alla festa, ma ancora curioso: qualcuno programma direttamente in questa lingua (anche se solo per giocare a golf) o è l'output di una sorta di "compilatore"?
avl42,

1
@ avl42: codifichiamo direttamente in questa lingua sì (generalmente solo per giocare a golf). Odio vedere qualcuno che lo usa nel codice di produzione;) È un linguaggio interpretato, quindi il codice che scrivi in ​​questo linguaggio viene interpretato in codice Python.
Emigna,

1
@Emigna direi "tradotto" piuttosto che "interpretato" (è un po 'di significato opposto)
anatolyg

@anatolyg: Sì, hai ragione lì. Penso sempre interpretato per qualche motivo, probabilmente a causa di Python. È tradotto in una lingua interpretata :)
Emigna,

2

Retina , 228 byte

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

Provalo online! Il link include la suite di test. Spiegazione:

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

Moltiplicare l'input per 100 aggiungendo un punto decimale di riserva e due zeri, quindi eliminando il punto decimale e tutte le cifre tranne due.

.+
$*

Converti in unario.

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

Gestisci tutti gli alcali, convertendoli in abbreviazioni che verranno espanse in seguito.

1{655,}
Neutral

Maneggiare in folle.

1$
1 acidic

Tutto ciò che resta deve essere acido. (Ma lascia l'1 nel caso in cui il pH sia 0,001)

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

Gestisci tutti gli acidi.

M
Moderately
V
Very sT
T
trongly
L
lightly
A
 alkaline

Espandi le abbreviazioni.


Wow, penso che ci sia voluto un po 'per giocare a golf ...
Mr. Xcoder,

2

Python 2 , 202 byte

-15 byte grazie a @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))

Provalo online!


2
Hai preso i miei punti brownie.
Mr. 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':''))

Casi test


1

Excel, 240 byte

=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 byte

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

Continuo a giocare a golf un po '

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


Non penso che tu debba assegnare la funzione a una variabile.
Zacharý,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.