약간의 다항식 보간법으로 정말 간단합니다!
먼저 짧은 달 이름 목록을 보았습니다.
["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"]
문자 ASCII 값의 합계를 확인했습니다.
[313,301,320,323,327,333,331,317,328,326,339,300]
그런 다음 여기에서 300을 빼서 내가 다루고있는 것을 파악하고 더 긴 버전의 월 이름을 포함하는 배열을 준비했습니다.
[13,1,20,23,27,33,31,17,28,26,39,0]
mons = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
지금 무슨 일이 일어나고 있는지 알 수 있습니다. 필요한 것은 13 ~ 0, 1 ~ 1, 20 ~ 2 등으로 매핑되는 getIndex 함수입니다.
getMonthName shortname = mons !! (getIndex shortname)
운 좋게 Wolfram | Alpha 는 나를 위해 이것을 할 수 있습니다 ! 숫자는 조금 커지지 만 Haskell은이를 은혜로 처리 할 수 있습니다. 부동 소수점 산술이 약간 부정확하기 때문에 결과를 반올림해야합니다! 빠르고 우아하며 관용적 인 하스켈이 있습니다.
import Data.Char
getIndex x = round $ 11 -
(220797068189915461*x)/11644212222720 +
(184127469431441671621*x^2)/6982771136140800 -
(8800438195450444577647153*x^3)/1013060436431307264000 +
(2826703553741192361967823*x^4)/2026120872862614528000 -
(269098602165195540339443*x^5)/2026120872862614528000 +
(13744405529566098359*x^6)/1692665725031424000 -
(13060656886070844161*x^7)/39727860252208128000 +
(5939638907108115199*x^8)/675373624287538176000 -
(303426664924585177*x^9)/2026120872862614528000 +
(2983240583426137*x^10)/2026120872862614528000 -
(12901227927103*x^11)/2026120872862614528000
mons = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
getMonthName = (mons!!).getIndex.subtract 300.fromIntegral.sum.fmap (ord.toLower)
다음과 같이 간단히 실행하십시오.
λ> getMonthName "DeC"
"December"
λ> getMonthName "jan"
"January"