পাগল রাসায়নিক সমীকরণ


10

আপনার ব্যবহারকারীর কাছ থেকে রাসায়নিক সমীকরণের স্ট্রিং (কোনও ফাঁকা স্থান নয়, কেবলমাত্র অক্ষর (আপার-কেস এবং লোয়ার-কেস)), সংখ্যা, বন্ধনী এবং গণিতের লক্ষণ) পাওয়া উচিত এবং সমীকরণটি ভারসাম্যপূর্ণ বা না হলে উত্তর মুদ্রণ করা উচিত (ইতিবাচক / নেতিবাচক উত্তরগুলির জুড়ি) : হ্যাঁ / না, সত্য / মিথ্যা, 1/0) কোডকে সংক্ষিপ্ত করার জন্য আপনি ধরে নিতে পারেন ইনপুট স্ট্রিংগুলিতে কেবল এই উপাদানগুলি থাকতে পারে: আল, আর, বি, বি, সি, সি, সি, সি, সিইউ, ফে, এইচ, হি, কে, এন, ও, এস এবং আরও একটি জিনিস : -লক্ষণ হতে পারে । এটি গণিত সম্পর্কে: +অর্থ সংযোজন, -মানে বিয়োগফল।

উদাহরণ:

ইনপুট:

C6H5COOH-O2=7CO2+3H2O

আউটপুট:

No

ইনপুট:

2Fe(CN)6+2SO2+202=Fe2(SO4)2+6C2N2

আউটপুট:

Yes

ইনপুট:

2SO2=2SO4-2O2

আউটপুট:

Yes

সংক্ষিপ্ততম কোডটি জয়ী।


আপনি একটি ফাংশন খুঁজছেন? বা এমন একটি প্রোগ্রাম যা পাঠ্য ইনপুট নেয় এবং পাঠ্য আউটপুট দেয়? যদি পরে, এটি একাধিক লাইন গ্রহণ এবং প্রক্রিয়া করা উচিত? নাকি প্রতি রান প্রতি একটি সমীকরণ?
এমটিএনভিউমার্ক


@ এমটিএনভিউমার্ক এটি একটি প্রোগ্রাম হওয়ার কথা। এটি রান প্রতি এক সমীকরণ নিতে হবে।
gtcoder

আপনার দ্বিতীয় এবং তৃতীয় উদাহরণগুলি ভুল। আমি মনে করি আপনি (দু'শ দুই) 2O2এর পরিবর্তে টাইপ করতে চেয়েছিলেন 202
r3mainer

@ স্কোয়ামিশোসিফ্রেজ ওহ, হ্যাঁ অবশ্যই। ধন্যবাদ. প্রশ্ন আপডেট করা হয়।
gtcoder

উত্তর:


2

গণিত 152

f=Times@@@Tr@CoefficientRules@ToExpression@(r=StringReplace)[r[
#<>")",{"="->"-(",x:_?LetterQ|")"~~y_?DigitQ:>x<>"^"<>y}],x_?UpperCaseQ:>" "<>x]⋃{}=={0}&

ফলাফল:

f@"C6H5COOH-O2=7CO2+3H2O"
f@"2Fe(CN)6+2SO2+2O2=Fe2(SO4)2+6C2N2"
f@"2SO2=2SO4-2O2"

মিথ্যা

সত্য

সত্য

আমি রাসায়নিক সূত্রকে বহুপদী হিসাবে বিবেচনা করি, যেমন

এখানে চিত্র বর্ণনা লিখুন

তারপরে আমি কেবল সহগকে গণনা করি।


ওটা কিভাবে কাজ করে? আপনার উদাহরণে, প্রতিটি "ভেরিয়েবল" এর সহগগুলি শূন্যকে সরল করে না।
এমটিএনভিউমার্ক

@ এমটিএনভিউমার্ক আরও স্পষ্টভাবে বলতে গেলে, আমি শক্তিগুলি গণনা করি Tr@CoefficientRulesএবং তার সাথে সহগের দ্বারা তাদের গুণ করি Times@@@। জন্য O: 2*2+2*2=4*2জন্য C: 2*6 = 6*2ইত্যাদি
ybeltukov

2

পাইথন 2.7, 316 276 অক্ষর

import re
r=re.sub
x='(^|[=+-])'
y=r'\1+\2'
z='(\w)([A-Z(])'
t=r('=','==',r(z,y,r(z,y,r('([A-Za-z)])(\d)',r'\1*\2',r('([=+-]|$)',r')\1',r(x+'(\d+)',r'\1\2*(',r(x+'([A-Z])',r'\1(\2',raw_input())))))))
E=re.findall('[A-Za-z]+',t)
print all(eval(t,{f:f==e for f in E})for e in E)

ইনপুট সমীকরণকে evalসক্ষম কিছুতে রূপান্তর করতে এটি প্রচুর রেগেক্স-পুনর্লিখন করে । তারপরে এটি পৃথকভাবে প্রতিটি উপাদানগুলির সমীকরণটি পরীক্ষা করে।

উদাহরণস্বরূপ, উদাহরণস্বরূপ সমীকরণগুলি ( tপরিবর্তনশীল) এ পুনরায় লিখুন:

(C*6+H*5+C+O+O+H)-(O*2)==7*(C+O*2)+3*(H*2+O)
2*(Fe+(C+N)*6)+2*(S+O*2)+2*(O*2)==(Fe*2+(S+O*4)*2)+6*(C*2+N*2)
2*(S+O*2)==2*(S+O*4)-2*(O*2)

আমি নিশ্চিত রেইগেক্স অংশে আরও গল্ফ থাকতে হবে।


2

হাস্কেল, 400 351 308 টি অক্ষর

import Data.List
import Text.Parsec
(&)=fmap
r=return
s=string
l f b=(>>=(&b).f)
x=(=<<).replicate
m=sort&chainl1(l x(concat&many1(l(flip x)n i))n)((s"+">>r(++))<|>(s"-">>r(\\)))
i=between(s"(")(s")")m<|>(:[])&(l(:)(many lower)upper)
n=option 1$read&many1 digit
main=getContents>>=parseTest(l(==)(s"=">>m)m)

এটি কেবল সমস্ত গল্ফটি এড়িয়ে গেছে। আমি জানি না যে আর কোনও 100 51 8 টি অক্ষর সংরক্ষণ করতে হবে কিনা!

& echo 'C6H5COOH-O2=7CO2+3H2O' | runhaskell Chemical.hs
False

& echo '2Fe(CN)6+2SO2+2O2=Fe2(SO4)2+6C2N2' | runhaskell Chemical.hs
True

& echo '2SO2=2SO4-2O2' | runhaskell Chemical.hs
True

কেউ যদি অনুসরণ করে অনুসরণ করতে চান তবে এখানে ভার্সনীয় সংস্করণটি রয়েছে। এটি একটি সাধারণ Parsecভিত্তিক পার্সার:

import Control.Applicative ((<$>), (<*>))
import Data.List
import Text.Parsec
import Text.Parsec.String (Parser)

type Atom = String

{- golf'd as x -}
multiple :: Int -> [Atom] -> [Atom]
multiple n = concat . replicate n

{- golf'd as m -}
chemicals :: Parser [Atom]
chemicals = sort <$> chainl1 molecules op
  where
    op :: Eq a => Parser ([a] -> [a] -> [a])
    op = (char '+' >> return (++))
     <|> (char '-' >> return (\\))

    molecules :: Parser [Atom]
    molecules = multiple <$> number <*> terms

    terms :: Parser [Atom]
    terms = concat <$> many1 term

    term :: Parser [Atom]
    term = flip multiple <$> item <*> number

{- gofl'd as i -}
item :: Parser [Atom]
item = between (char '(') (char ')') chemicals
   <|> (:[]) <$> atom
  where
    atom :: Parser Atom
    atom = (:) <$> upper <*> many lower

{- gofl'd as n -}
number :: Parser Int
number = option 1 $ read <$> many1 digit

{- gofl'd as main -}
main :: IO ()
main = getContents >>= parseTest chemEquality
  where
    chemEquality :: Parser Bool
    chemEquality = (==) <$> chemicals <*> (char '=' >> chemicals)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.