ကျွန်ုပ်၏အမြင်အရ၊ အင်တာနက်၏ရုရှားဘာသာစကားကဏ္ဍတွင်၊ တရားဝင်အတည်ပြုခြင်းခေါင်းစဉ်သည် လုံလောက်စွာအကျုံးမဝင်ပါ၊ အထူးသဖြင့် ရိုးရှင်းပြီး ရှင်းလင်းသောဥပမာများမရှိခြင်း။
နိုင်ငံခြားရင်းမြစ်တစ်ခုမှ ဥပမာတစ်ခုပြောပြပြီး မြစ်တစ်ဖက်ကမ်းသို့ ဝံပုလွေတစ်ကောင်၊ ဆိတ်တစ်ကောင်နှင့် ဂေါ်ဖီထုပ်ကို ဖြတ်ကူးခြင်း၏ နာမည်ကြီးပြဿနာအတွက် ကျွန်ုပ်၏ကိုယ်ပိုင်ဖြေရှင်းချက်ကို ပေါင်းထည့်ပါမည်။
သို့သော် ဦးစွာ၊ တရားဝင်အတည်ပြုခြင်းဆိုသည်မှာ မည်သည့်အတွက်ကြောင့် လိုအပ်ကြောင်း အကျဉ်းချုံးဖော်ပြပါမည်။
တရားဝင်အတည်ပြုခြင်းသည် များသောအားဖြင့် ပရိုဂရမ်တစ်ခု သို့မဟုတ် အခြားတစ်ခုအသုံးပြု၍ အယ်လဂိုရီသမ်ကို စစ်ဆေးခြင်းကို ဆိုလိုသည်။
၎င်းသည် ပရိုဂရမ်သည် မျှော်လင့်ထားသည့်အတိုင်း ပြုမူနေစေရန်နှင့် ၎င်း၏လုံခြုံရေးကိုလည်း သေချာစေရန်အတွက် လိုအပ်ပါသည်။
တရားဝင် စိစစ်ခြင်းသည် အားနည်းချက်များကို ရှာဖွေခြင်းနှင့် ဖယ်ရှားခြင်း၏ အစွမ်းထက်ဆုံး နည်းလမ်းဖြစ်သည်- ၎င်းသည် ပရိုဂရမ်တစ်ခုတွင် ရှိပြီးသား အပေါက်များနှင့် ချို့ယွင်းချက်များအားလုံးကို ရှာဖွေရန် သို့မဟုတ် ၎င်းတို့ တည်ရှိနေကြောင်း သက်သေပြနိုင်သည်။
စတုရန်းအကျယ် 8 ရှိသော မိဖုရား 1000 ပါး၏ ပြဿနာကဲ့သို့သော အချို့ကိစ္စများတွင် ၎င်းသည် မဖြစ်နိုင်ကြောင်း သတိပြုသင့်သည်- ၎င်းအားလုံးသည် အယ်လဂိုရီသမ်ရှုပ်ထွေးမှု သို့မဟုတ် ရပ်တန့်ခြင်းပြဿနာမှ ဆင်းသက်လာသည်ကို သတိပြုသင့်သည်။
မည်သို့ပင်ဆိုစေကာမူ အဖြေသုံးခုထဲမှ တစ်ခုကို လက်ခံရရှိလိမ့်မည်- ပရိုဂရမ်သည် မှန်သည်၊ မမှန်ပါ၊ သို့မဟုတ် အဖြေကို တွက်ချက်ရန် မဖြစ်နိုင်ပါ။
အဖြေကိုရှာရန်မဖြစ်နိုင်ပါက၊ တိကျသောအဖြေကိုရရှိရန်အလို့ငှာ၊ ၎င်းတို့၏ algorithm ရှုပ်ထွေးမှုကိုလျှော့ချကာ ပရိုဂရမ်၏မရှင်းလင်းသောအစိတ်အပိုင်းများကို ပြန်လည်လုပ်ဆောင်ရန် မကြာခဏဖြစ်နိုင်သည်။
ကာကွယ်မှုအမြင့်ဆုံးအဆင့်ကိုသေချာစေရန်၊ ဥပမာ၊ Windows kernel နှင့် Darpa ဒရုန်းလည်ပတ်မှုစနစ်များတွင် တရားဝင်အတည်ပြုခြင်းကိုအသုံးပြုပါသည်။
ကျွန်ုပ်တို့သည် အလိုအလျောက် သီအိုရီသက်သေပြခြင်းနှင့် ညီမျှခြင်းဖြေရှင်းခြင်းအတွက် အလွန်အစွမ်းထက်သည့်ကိရိယာတစ်ခုဖြစ်သည့် Z3Prover ကို အသုံးပြုပါမည်။
ထို့အပြင်၊ Z3 သည် ညီမျှခြင်းများကိုဖြေရှင်းပြီး brute force ကိုအသုံးပြု၍ ၎င်းတို့၏တန်ဖိုးများကိုမရွေးချယ်ပါ။
ဆိုလိုသည်မှာ ထည့်သွင်းမှုရွေးချယ်စရာ 10^100 ပေါင်းစပ်ထားသော ကိစ္စများတွင်ပင် ၎င်းသည် အဖြေကို ရှာဖွေနိုင်သည်ဟု ဆိုလိုသည်။
သို့သော် ၎င်းသည် အမျိုးအစား Integer ၏ ထည့်သွင်းမှုဆိုင်ရာ ငြင်းခုံချက်တစ်ဒါဇင်ခန့်သာဖြစ်ပြီး ၎င်းကို လက်တွေ့တွင် မကြာခဏကြုံတွေ့ရသည်။
မိဖုရား ၈ ပါးအကြောင်း (အင်္ဂလိပ်ဘာသာမှ ကူးယူဖော်ပြပါသည်။
# We know each queen must be in a different row.
# So, we represent each queen by a single integer: the column position
Q = [ Int('Q_%i' % (i + 1)) for i in range(8) ]
# Each queen is in a column {1, ... 8 }
val_c = [ And(1 <= Q[i], Q[i] <= 8) for i in range(8) ]
# At most one queen per column
col_c = [ Distinct(Q) ]
# Diagonal constraint
diag_c = [ If(i == j,
True,
And(Q[i] - Q[j] != i - j, Q[i] - Q[j] != j - i))
for i in range(8) for j in range(i) ]
solve(val_c + col_c + diag_c)
Z3 ကိုအသုံးပြုခြင်းဖြင့် ကျွန်ုပ်တို့သည် ဖြေရှင်းချက်ကို ရရှိသည်-
[Q_5 = 1,
Q_8 = 7,
Q_3 = 8,
Q_2 = 2,
Q_6 = 3,
Q_4 = 6,
Q_7 = 5,
Q_1 = 4]
မိဖုရားပြဿနာသည် မိဖုရား 8 ပါး၏ သြဒိနိတ်များကို ထည့်သွင်းကာ မိဖုရားအချင်းချင်း ရိုက်နှက်ခြင်းရှိမရှိ အဖြေထုတ်ပေးသည့် ပရိုဂရမ်တစ်ခုနှင့် နှိုင်းယှဉ်နိုင်သည်။
အကယ်၍ ကျွန်ုပ်တို့သည် အဆိုပါပရိုဂရမ်ကိုတရားဝင်အတည်ပြုခြင်းကိုအသုံးပြု၍ဖြေရှင်းရမည်ဆိုလျှင် ပြဿနာနှင့်နှိုင်းယှဉ်ပါက၊ ကျွန်ုပ်တို့သည် ပရိုဂရမ်ကုဒ်ကို ညီမျှခြင်းအဖြစ်သို့ပြောင်းလဲခြင်းပုံစံတွင် နောက်ထပ်ခြေလှမ်းတစ်လှမ်းသာလိုတော့သည်- ၎င်းသည် ကျွန်ုပ်တို့၏အခြေခံအားဖြင့် ထပ်တူဖြစ်သွားလိမ့်မည် ( ပရိုဂရမ်ကို မှန်ကန်စွာ ရေးခဲ့လျှင် ဟုတ်ပါတယ်။)
အားနည်းချက်များကို ရှာဖွေရာတွင် အလားတူအဖြစ်မျိုး ကြုံရလိမ့်မည်- ကျွန်ုပ်တို့ လိုအပ်သော အထွက်အခြေအနေများကို ဥပမာအားဖြင့်၊ စီမံခန့်ခွဲသူ စကားဝှက်၊ အရင်းအမြစ် သို့မဟုတ် စုစည်းထားသော ကုဒ်ကို အတည်ပြုခြင်းနှင့် ကိုက်ညီသည့် ညီမျှခြင်းအဖြစ်သို့ ပြောင်းလဲပြီးနောက် အဖြေတစ်ခု ရရှိမည်ဖြစ်သည်။ ပန်းတိုင်ရောက်ဖို့ data တွေကို input အဖြစ် ပံ့ပိုးပေးရပါမယ်။
ကျွန်တော့်အမြင်အရတော့ ဝံပုလွေ၊ ဆိတ်နဲ့ ဂေါ်ဖီထုပ်တို့နဲ့ ပတ်သက်တဲ့ ပြဿနာက ပိုလို့တောင် စိတ်ဝင်စားစရာကောင်းတာမို့ အဲဒါကို ဖြေရှင်းဖို့ အဆင့် (၇) ဆင့် အများကြီး လိုအပ်နေပါပြီ။
အကယ်၍ ဘုရင်မပြဿနာသည် GET သို့မဟုတ် POST တောင်းဆိုချက်တစ်ခုတည်းကို အသုံးပြု၍ ဆာဗာတစ်ခုအား ထိုးဖောက်ဝင်ရောက်နိုင်သည့်ကိစ္စနှင့် နှိုင်းယှဉ်ပါက၊ ဝံပုလွေ၊ ဆိတ်နှင့် ဂေါ်ဖီထုပ်တို့သည် ပိုမိုရှုပ်ထွေးပြီး ကျယ်ပြန့်သောအမျိုးအစားတစ်ခုမှ နမူနာတစ်ခုကို သရုပ်ပြပြီး ပန်းတိုင်ကိုသာ အောင်မြင်နိုင်မည်ဖြစ်သည်။ တောင်းဆိုမှုများစွာဖြင့်
ဥပမာအားဖြင့်၊ သင်သည် SQL ထိုးဆေးကိုရှာရန်၊ ၎င်းကိုဖြတ်၍ ဖိုင်တစ်ခုရေးပါ၊ ထို့နောက် သင်၏အခွင့်အရေးကိုမြှင့်တင်ကာ စကားဝှက်တစ်ခုရယူရန် လိုအပ်သည့်အခြေအနေတစ်ခုနှင့် နှိုင်းယှဉ်နိုင်သည်။
ပြဿနာ၏အခြေအနေများနှင့်၎င်း၏ဖြေရှင်းချက်လယ်သမားသည် ဝံပုလွေတစ်ကောင်၊ ဆိတ်တစ်ကောင်နှင့် ဂေါ်ဖီထုပ်များကို မြစ်ကိုဖြတ်၍ ပို့ဆောင်ရန် လိုအပ်သည်။ လယ်သမားတွင် လယ်သမားကိုယ်တိုင်မှတပါး အရာဝတ္ထုတစ်ခုကိုသာ ထားရှိနိုင်သော လှေတစ်စင်းရှိသည်။ ဝံပုလွေသည် ဆိတ်ကိုစားမည်ဖြစ်ပြီး လယ်သမားက ပိုင်ရှင်မဲ့ထားခဲ့ပါက ဂေါ်ဖီထုပ်ကို ဆိတ်က စားမည်ဖြစ်သည်။
အဖြေမှာ အဆင့် ၄ တွင် လယ်သမားသည် ဆိတ်ကို ပြန်ယူရန် လိုအပ်မည်ဖြစ်သည်။
ကဲ ပရိုဂရမ်ကျကျနဲ့ စတင်ဖြေရှင်းလိုက်ရအောင်။
လယ်သမား၊ ဝံပုလွေ၊ ဆိတ်နှင့် ဂေါ်ဖီထုပ်တို့ကို တန်ဖိုး 4 သို့မဟုတ် 0 သာယူသည့် ကိန်းရှင် 1 ခုအဖြစ် အဓိပ္ပါယ်ဖွင့်ဆိုကြပါစို့။ သုညဆိုသည်မှာ ၎င်းတို့သည် လက်ဝဲဘက်ကမ်းတွင်ရှိပြီး တစ်ခုမှာ ၎င်းတို့သည် ညာဘက်တွင်ရှိနေခြင်းဖြစ်သည်။
import json
from z3 import *
s = Solver()
Num= 8
Human = [ Int('Human_%i' % (i + 1)) for i in range(Num) ]
Wolf = [ Int('Wolf_%i' % (i + 1)) for i in range(Num) ]
Goat = [ Int('Goat_%i' % (i + 1)) for i in range(Num) ]
Cabbage = [ Int('Cabbage_%i' % (i + 1)) for i in range(Num) ]
# Each creature can be only on left (0) or right side (1) on every state
HumanSide = [ Or(Human[i] == 0, Human[i] == 1) for i in range(Num) ]
WolfSide = [ Or(Wolf[i] == 0, Wolf[i] == 1) for i in range(Num) ]
GoatSide = [ Or(Goat[i] == 0, Goat[i] == 1) for i in range(Num) ]
CabbageSide = [ Or(Cabbage[i] == 0, Cabbage[i] == 1) for i in range(Num) ]
Side = HumanSide+WolfSide+GoatSide+CabbageSide
နံပါတ်သည် ဖြေရှင်းရန် လိုအပ်သည့် အဆင့်အရေအတွက်ဖြစ်သည်။ ခြေလှမ်းတိုင်းသည် မြစ်၊ လှေနှင့် အရာဝတ္ထုအားလုံးကို ကိုယ်စားပြုသည်။
အခုအချိန်မှာ၊ ကျပန်းနဲ့ အနားသတ်နဲ့ 10 ကို ရွေးလိုက်ရအောင်။
တစ်ခုချင်းစီကို 10 မိတ္တူဖြင့် ကိုယ်စားပြုသည် - ၎င်းသည် အဆင့် 10 တစ်ခုစီတွင် ၎င်း၏တန်ဖိုးဖြစ်သည်။
ယခု စတင်ခြင်းနှင့် ပြီးဆုံးခြင်းအတွက် အခြေအနေများကို သတ်မှတ်ကြပါစို့။
Start = [ Human[0] == 0, Wolf[0] == 0, Goat[0] == 0, Cabbage[0] == 0 ]
Finish = [ Human[9] == 1, Wolf[9] == 1, Goat[9] == 1, Cabbage[9] == 1 ]
ထို့နောက် ဝံပုလွေသည် ဆိတ်ကိုစားသည့် အခြေအနေများ၊ သို့မဟုတ် ညီမျှခြင်းတွင် ကန့်သတ်ချက်များအဖြစ် ဆိတ်က ဂေါ်ဖီကိုစားသည်။
(တောင်သူရှေ့မှာ ရန်လိုတာ မဖြစ်နိုင်ဘူး)
# Wolf cant stand with goat, and goat with cabbage without human. Not 2, not 0 which means that they are one the same side
Safe = [ And( Or(Wolf[i] != Goat[i], Wolf[i] == Human[i]), Or(Goat[i] != Cabbage[i], Goat[i] == Human[i])) for i in range(Num) ]
နောက်ဆုံးအနေနဲ့၊ အဲဒီမှာ ဖြတ်ကူးတဲ့အခါ ဒါမှမဟုတ် နောက်ကြောင်းပြန်တဲ့အခါ လယ်သမားရဲ့ ဖြစ်နိုင်ချေရှိတဲ့ လုပ်ဆောင်မှုတွေကို သတ်မှတ်ပါမယ်။
သူသည် ဝံပုလွေ၊ ဆိတ်တစ်ကောင် သို့မဟုတ် ဂေါ်ဖီထုပ်တစ်ကောင်ကို ယူဆောင်သွားနိုင်သည်၊ သို့မဟုတ် မည်သူကိုမျှ မယူဆောင်နိုင်၊ သို့မဟုတ် မည်သည့်နေရာမှ ရွက်လွှင့်မသွားနိုင်ပေ။
လယ်သမားမရှိဘဲ ဘယ်သူမှ မဖြတ်နိုင်ဘူး။
မြစ်၏နောက်ဆက်တွဲအခြေအနေ၊ လှေနှင့် အစိတ်အပိုင်းတစ်ခုစီသည် ယခင်တစ်ခုနှင့်တစ်ခု တင်းကြပ်စွာကန့်သတ်ထားသည့်နည်းလမ်းဖြင့်သာ ကွဲပြားနိုင်သည်ဟူသောအချက်ဖြင့် ၎င်းကိုဖော်ပြပါမည်။
လယ်သမားသည် တစ်ကြိမ်လျှင် ပစ္စည်းတစ်ခုကိုသာ ပို့ဆောင်နိုင်ပြီး အားလုံးကို အတူတကွ မကျန်နိုင်သောကြောင့် 2 ဘစ်ထက် မပိုစေဘဲ အခြားကန့်သတ်ချက်များစွာဖြင့်၊
Travel = [ Or(
And(Human[i] == Human[i+1] + 1, Wolf[i] == Wolf[i+1] + 1, Goat[i] == Goat[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] + 1, Goat[i] == Goat[i+1] + 1, Wolf[i] == Wolf[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] + 1, Cabbage[i] == Cabbage[i+1] + 1, Wolf[i] == Wolf[i+1], Goat[i] == Goat[i+1]),
And(Human[i] == Human[i+1] - 1, Wolf[i] == Wolf[i+1] - 1, Goat[i] == Goat[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] - 1, Goat[i] == Goat[i+1] - 1, Wolf[i] == Wolf[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] - 1, Cabbage[i] == Cabbage[i+1] - 1, Wolf[i] == Wolf[i+1], Goat[i] == Goat[i+1]),
And(Wolf[i] == Wolf[i+1], Goat[i] == Goat[i+1], Cabbage[i] == Cabbage[i+1])) for i in range(Num-1) ]
အဖြေရှာကြည့်ရအောင်။
solve(Side + Start + Finish + Safe + Travel)
ငါတို့အဖြေကိုရ!
Z3 သည် အခြေအနေအားလုံးကို ကျေနပ်စေသော တသမတ်တည်းသော ပြည်နယ်အစုတစ်ခုကို တွေ့ရှိခဲ့သည်။
လေးဖက်မြင် အာကာသသွန်းပုံ တစ်မျိုး။
ဘာဖြစ်သွားလဲ ကြည့်လိုက်ရအောင်။
အဆုံးမှာတော့ လူတိုင်းဖြတ်ကျော်သွားတာကို တွေ့လိုက်ရတော့ ပထမတော့ လယ်သမားက အနားယူဖို့ ဆုံးဖြတ်ခဲ့ပြီး ပထမအဆင့် ၂ ဆင့်မှာ သူဘယ်ကိုမှ ရေမကူးပါဘူး။
Human_2 = 0
Human_3 = 0
ကျွန်ုပ်တို့ရွေးချယ်သောပြည်နယ်အရေအတွက်သည် အလွန်အကျွံဖြစ်ပြီး 8 သည် လုံလောက်မည်ဟု အကြံပြုထားသည်။
ကျွန်ုပ်တို့၏အခြေအနေတွင်၊ လယ်သမားက ဤသို့ပြုခဲ့သည်- အစ၊ အနားယူ၊ အနားယူ၊ ဆိတ်ကိုဖြတ်၊ နောက်ပြန်ဖြတ်၊ ဂေါ်ဖီထုပ်ကိုဖြတ်၊ ဆိတ်နှင့်အတူပြန်လာ၊ ဝံပုလွေကိုဖြတ်ကာ၊ တစ်ယောက်တည်းပြန်လာသည်၊ ဆိတ်ကိုပြန်ပို့ပေးသည်။
ဒါပေမယ့် နောက်ဆုံးမှာတော့ ပြဿနာက ပြေလည်သွားတယ်။
#Старт.
Human_1 = 0
Wolf_1 = 0
Goat_1 = 0
Cabbage_1 = 0
#Фермер отдыхает.
Human_2 = 0
Wolf_2 = 0
Goat_2 = 0
Cabbage_2 = 0
#Фермер отдыхает.
Human_3 = 0
Wolf_3 = 0
Goat_3 = 0
Cabbage_3 = 0
#Фермер отвозит козу на нужный берег.
Human_4 = 1
Wolf_4 = 0
Goat_4 = 1
Cabbage_4 = 0
#Фермер возвращается.
Human_5 = 0
Wolf_5 = 0
Goat_5 = 1
Cabbage_5 = 0
#Фермер отвозит капусту на нужный берег.
Human_6 = 1
Wolf_6 = 0
Cabbage_6 = 1
Goat_6 = 1
#Ключевая часть операции: фермер возвращает козу обратно.
Human_7 = 0
Wolf_7 = 0
Goat_7 = 0
Cabbage_7 = 1
#Фермер отвозит волка на другой берег, где он теперь находится вместе с капустой.
Human_8 = 1
Wolf_8 = 1
Goat_8 = 0
Cabbage_8 = 1
#Фермер возвращается за козой.
Human_9 = 0
Wolf_9 = 1
Goat_9 = 0
Cabbage_9 = 1
#Фермер повторно доставляет козу на нужный берег и завершают переправу.
Human_10 = 1
Wolf_10 = 1
Goat_10 = 1
Cabbage_10 = 1
အခု အခြေအနေတွေကို ပြောင်းလဲပြီး ဖြေရှင်းချက်မရှိဘူးဆိုတာကို သက်သေပြလိုက်ရအောင်။
ဒီလိုလုပ်ဖို့၊ ငါတို့ဝံပုလွေအပင်ကိုပေးလိမ့်မယ်၊ ပြီးတော့သူကဂေါ်ဖီထုပ်စားချင်လိမ့်မယ်။
ကျွန်ုပ်တို့၏ရည်မှန်းချက်သည် လျှောက်လွှာကို လုံခြုံစေရန်ဖြစ်ပြီး ၎င်းသည် အပေါက်အပြဲများမရှိကြောင်း သေချာစေရန်လိုအပ်ပါသည်။
Safe = [ And( Or(Wolf[i] != Goat[i], Wolf[i] == Human[i]), Or(Goat[i] != Cabbage[i], Goat[i] == Human[i]), Or(Wolf[i] != Cabbage[i], Goat[i] == Human[i])) for i in range(Num) ]
Z3 က ကျွန်တော်တို့ကို အောက်ပါ တုံ့ပြန်ချက် ပေးခဲ့ပါတယ်။
no solution
ဆိုလိုတာက ဖြေရှင်းနည်းတွေ တကယ်မရှိဘူး။
ထို့ကြောင့်၊ ကျွန်ုပ်တို့သည် လယ်သမားအတွက် အရှုံးမပေးဘဲ မျိုးပွားဝံပုလွေနှင့် ဖြတ်ကျော်ရန် မဖြစ်နိုင်ကြောင်း ပရိုဂရမ်ဖြင့် သက်သေပြခဲ့သည်။
ပရိသတ်သည် ဤအကြောင်းအရာကို စိတ်ဝင်စားဖွယ်တွေ့ရှိပါက၊ နောက်ဆောင်းပါးများတွင် သာမန်ပရိုဂရမ်တစ်ခု သို့မဟုတ် လုပ်ဆောင်ချက်များကို တရားဝင်နည်းလမ်းများနှင့် ကိုက်ညီမှုရှိသော ညီမျှခြင်းတစ်ခုအဖြစ်သို့ ပြောင်းလဲကာ ဖြေရှင်းနိုင်ခြင်းဖြင့် ၎င်းအား တရားဝင်သောအခြေအနေများနှင့် အားနည်းချက်များအားလုံးကို ထုတ်ဖော်ပြသမည်ဖြစ်သည်။ ပထမဦးစွာ၊ တူညီသောအလုပ်တွင်၊ ပရိုဂရမ်ပုံစံဖြင့်တင်ပြပြီးနောက်၊ ၎င်းကို တဖြည်းဖြည်းရှုပ်ထွေးစေပြီး ဆော့ဖ်ဝဲလ်ဖွံ့ဖြိုးတိုးတက်ရေးလောကမှ လက်ရှိနမူနာများဆီသို့ ဆက်သွားပါ။
နောက်ဆောင်းပါးသည် အဆင်သင့်ဖြစ်နေပါပြီ-
၎င်းတွင် ပြဿနာများကို တရားဝင်အတည်ပြုခြင်းမှ ပရိုဂရမ်များဆီသို့ ရွှေ့ပြီး ဖော်ပြပါ။
တရားဝင် အုပ်ချုပ်မှုစနစ်သို့ အလိုအလျောက် မည်သို့ပြောင်းလဲနိုင်မည်နည်း။
source: www.habr.com