پاسخ سوال مساله هالت + کوئرا

پاسخ سوال مساله هالت + کوئرا
پاسخ سوال مساله هالت + کوئرا

پاسخ سوال مساله هالت + کوئرا

در این نوشته تمرین “مساله هالت” که در وبسایت کوئرا موجود می باشد را برای شما کاربران عزیز حل کرده ایم.

 

 

در مورد سایت کوئرا بیشتر بخوانید…

 

تمرین مساله هالت کوئرا + پایتون

دوره ۱۰۲۸ ایا، دوره ۲۸ ایا را بسیار خفن می‌پنداشتند(زیرا دوره ۲۸ ایا واقعا خفن بودند). اعتقاد دوره ۱۰۲۸ ایا به خفونت دوره ۲۸ ایا چنان بود که فکر می‌کردند دوره ۲۸ ایا می‌توانستند حتی مساله توقف را حل کنند!

مساله توقف ( به انگلیسی : Halting problem ) مطرح می کند که آیا می توان برنامه ای نوشت که یک برنامه از ورودی بگیرد و تعیین کند که آیا برنامه متوقف می شود یا خیر. ثابت شده که در حالت کلی، الگوریتمی برای حل این مساله وجود ندارد.

مسئول دوره ۱۰۲۸ ایا برای اینکه اعتماد به نفس دوره ۱۰۲۸ ایا تقویت شود، نسخه ساده شده‌ای از مساله هالت را به آنها داد تا آنها فکر کنند مثل دوره ۲۸ ایا خفن هستند.

در این نسخه‌ ساده شده سه نوع دستور موجود است:

assign a = b + c
cout a
goto l

که در آن  و b و c یک حرف کوچک انگلیسی (که نام یک متغیر است) یا یک عدد یک رقمی هستند و l شماره خطی از برنامه است. تضمین می‌شود که بعد از assign متغیر a همیشه یک حرف کوچک انگلیسی است.

شما باید خط به خط برنامه را دنبال کنید، در صورتی که برنامه پایان‌ناپذیر است،  را چاپ کنید. در غیر این‌صورت خروجی این برنامه را چاپ کنید. در این برنامه cout به معنای چاپ کردن یک عدد یا یک متغیر است. goto به معنای پرش به یک خط خاص است (خط‌ها از ۱ شماره‌گذاری شده‌اند). assign a = b + c یعنی b+c را در متغیر a قرار بده. هر حرف کوچک انگلیسی نشان‌دهنده یک متغیر است و محتوای همه‌ متغیرها در ابتدا صفر می‌باشد.

با توجه به اینکه جواب مسئله ممکن است بزرگ شود شما باید باقی مانده خروجی بر 10^9+7 را بگویید.

ورودی سوال مساله هالت

در ورودی یک برنامه به شما داده می‌شود.

در خط اول n تعداد خط‌های برنامه و در n خط بعد در هر خط یک دستور از برنامه داده می‌شود.

 

خروجی سوال مساله هالت

اگر برنامه داده‌شده تمام نمی‌شود، در تنها سطر خروجی  چاپ کنید.

در غیر اینصورت خروجی‌های برنامه‌ (به ازای هر cout) را چاپ کنید.

 

حل سوال مساله هالت (به زبان برنامه نویسی پایتون)

x = int(input())
list1 = []

for i in range((int)(x)):
    list1.append(input())



variables = {}
outputs = []
line = 0
tekrar = []
for i in range(x):
    tekrar.append(0)
flag = False
while(True):
    aKhat = list1[line].split(" ")
    tekrar[line] += 1
    if(tekrar[line] > 1):
        flag = True
        print(-1)
        break
    if(aKhat[0] == "assign"):
        aval = aKhat[3]
        dovom = aKhat[5]
        if(not aval.isdigit()):
            if(not aval in variables):
                variables[aval] = 0
            aval = variables[aval]
        if(not dovom.isdigit()):
            if(not dovom in variables):
                variables[dovom] = 0
            dovom = variables[dovom]
        variables[aKhat[1]] = (int(aval) + int(dovom)) % 1000000007
    elif(aKhat[0] == "cout"):
        adad = aKhat[1]
        if(not adad.isdigit()):
            if(not adad in variables):
                variables[adad] = 0
            adad = variables[adad]
        outputs.append(adad)

    if(aKhat[0] == "goto"): #elif to if
        line = int(aKhat[1]) -1
    else: #added7
        line += 1 #added
    if(line >= x):#added
        break       #added

if(not flag):
    for i in outputs:
        print(i)

 

 

منبع سوال : وبسایت کوئرا

 

اگر روش حل بهتری برای “تمرین مساله هالت” دارید برای ما ارسال کنید تا با نام خودتان به اشتراک بگذاریم.

اگر سوال خاصی را مدنظر دارید در بخش نظرات برای ما ارسال کنید تا حل آن سوال را در الویت محتوای سایت بگذاریم.

موفق باشید.

برای امتیاز به این نوشته کلیک کنید!
[کل: 0 میانگین: 0]