ویرگول
ورودثبت نام
سهيل مرادی مریم‌نگاری
سهيل مرادی مریم‌نگاریدر حال یادگیری دانش‌ها یا در حال جمع‌آوری کتاب‌ها؟
سهيل مرادی مریم‌نگاری
سهيل مرادی مریم‌نگاری
خواندن ۱۲ دقیقه·۶ سال پیش

دیوانه بازی با برنامه نویسی (۲) : چطور گند بزنیم به کلمات؟

به نام خدا.

سلام.

با توجه به فراوانیِ وقت در دوران قرنطینه، بهترین و شاید باارزش ترین کار (در مقایسه با تلف کردن وقت توی اینستاگرام)، به رگبار بستنِ شما با نوشته های جدید، باشه.

چند روز پیش یه دیوانه بازی دیگه درآوردیم و یه برنامه نوشتیم که چند جمله ها رو برامان evaluate کنه. امروز هم گفتم در پیرو خطِ دیوانه بازی و به افتخار تمام دیوانه ها و جنگلی های دنیا (اولینشان خودم)، یه برنامه دیگه بنویسیم.

این برنامه حالا قراره چه دیوانه بازی دربیاره؟

توی دانشگاه Cambridge یه تحقیقی رو انجام داده بودن که خیلی جالب بود. ما میخوایم توی این مقاله همون کار رو به وسیله یه برنامهء Python ولی برای زبان فارسی انجام بدیم. احتمالاً نتیجش جالب بشه.

ولی قبلش بریم و ببینیم اونا چکار کرده بودن:

این تحقیق گفته بود که اگه ما یه متن داشته باشیم و بریم توی این متن و «فقط حروف داخلی» کلمات رو بهم بریزیم (یعنی حروف اول و آخر تغییر نکنن)، به احتمال زیاد ما میتانیم بازم متن رو بخوانیم و متوجه بشیم! جالبه نه؟

عکس زیر رو ببینید و سعی کنید بخوانیدش:

اگه نتانستید بخوانیدش، این میشه ورژن معمولیش:

According to a research at Cambridge University, it doesn’t matter in what order the letters in a word are, the only important thing is that the first and last letters be at the right place. The rest can be a total mess and you can still read it without problem. This is because the human mind does not read every letter by itself, but the word as a whole.

ترجمهء خودمانیِ فارسی:

بر اساس یه تحقیق توی دانشگاه کمبریج، اهمیتی نداره که حروف به چه ترتیبی توی کلمات قرار گرفتن، تنها چیزی که مهمه اینه که حروف اول و آخر در جای درست باشن. بقیه حروف میتانن کاملاً «خَر در چمن» (یعنی همون بهم ریخته) باشن ولی با این وجود، تو بازم میتانی بدون مشکل بخوانیش. این به این دلیله که ذهن انسان، تک تکِ حروف رو نمیخوانه، بلکه به کُلِ یه کلمه، به عنوان یه واحد، نگاه میکنه.

به این قضیه میگن Typoglycemia و البته اینکه «تحت چه شرایطی، بعد از بهم زدن کلمات، متنِ حاصل، خواناتر میشه» هم یه سری چیزا هست که من دیگه راجبش اینجا حرف نمیزنم. اگه خواستید اینجا میتانید راجبش بیشتر بخوانید.

و حالا دیوانه بازیِ ما

حالا ما میخوایم توی این مقاله همین کار رو با متونِ فارسی هم بکنیم و گَند بزنیم به کلمات و ببینیم نتیجه چه میشه و چقدر قابل خواندنه نتیجه.

یعنی میخوایم یه برنامه بنویسیم که:

  • یه متن فارسی بهش میدیم.
  • اونم گند میزنه به کلمات و نتیجه رو در قالب یه اثر هنری به ما میده.
  • بعد ما به اثر هنری که بهمان داده نگاه میکنیم. اگه خوشمان آمد که هیچ، اگه خوشمان نیامد بهش میگیم «این به درد عمت میخوره، یکی دیگه بهم بده».
  • بعد برنامه به ما میگه «چشم، همین متن رو دوباره تغییر بدم یا یه متن جدید رو میخوای امتحان کنی؟» ما هم بهش جواب میدیم.
  • در آخر هم هروقت از این دورِ باطل خسته شدیم، بهش میگیم «بسه دیگه» و برنامه رو میبندیم و خداحافظ.
  • البته این برنامه برای زبان انگلیسی هم کار میکنه. فرق چندانی نداره.

اول برنامه رو ببینید، بعدش یه توضیح کوتاه میدم راجب بخش های مختلفش:

import random as r def dota_tekrari_poshte_ham(word): for i in range(1, len(word)): if word[i - 1] == word[i]: return True return False def clean(text): words = text.split() clean_words = [] # clean each word for k in range(len(words)): clean_word = [] # Char by char, if word length > 2 if len(words[k]) > 1: for i in range(len(words[k])): if words[k][i] not in '.,:;?!()\'&quot؟،': clean_word.append(words[k][i]) # print('* Clean word:', clean_word) # test clean_words.append(''.join(clean_word) if clean_word else words[k]) # print('* Clean words:', clean_words) # test return ' '.join(clean_words) def gand_word(word): if len(word) > 1 and not word.isdigit(): inner_part = list(word[1:-1]) r.shuffle(inner_part) gandide = word[0] + ''.join(inner_part) + word[-1] # print('* Gandide word:', gandide) # test if not dota_tekrari_poshte_ham(gandide): return gandide else: gandide = gand_word(word) return gandide else: return word def gand_text(text): words = clean(text).split() # print('* Words:', words) # test result = [] for word in words: result.append(gand_word(word)) # print('* Result:', result) # test return ' '.join(result) def main(): text = input('Matn ro vared kon: ') version_count = 1 print('-------------\n* VERSION #{}:\n'.format(version_count), gand_text(text)) while True: q = input('-------------\nChekar konim?\n1) Hamin matn, ye version dige.\n2) Ye matn dige.\n3) Hichi, khodafezi.\n-> Entekhab: ') if q == '1': version_count += 1 print('-------------\n* VERSION #{}:\n'.format(version_count), gand_text(text)) elif q == '2': text = input('-------------\nMatne jadid ro vared kon: ') version_count = 1 print('-------------\n*** VERSION #{} BA MATNE JADID:\n'.format(version_count), gand_text(text)) elif q == '3': print('-------------\nKHODAFEZI.') break else: print('-------------\nFAGHAT MITANI 1, 2, 3 VARED KONI.') if __name__ == '__main__': main()

خب این کُد چکار میکنه؟

همون کاری که ما میخوایم. متن رو میگیره و با حفظ شئونات (یعنی همون حروف اول و آخر)، گند میزنه بهش.

کل قضیه میشه ۵ تا function که ما رو به هدف میرسانن:

  • فانکشِنِ dota_tekrari_poshte_ham کارش اینه که چک کنه آیا بعد از بهم ریختن کلمه، ۲ تا حرف تکراری پشت سر هم داریم یا نه. ازش توی فانکشِنِ gand_word استفاده میشه که پایین تر میگم راجبش.
  • فانکشِنِ clean کارش فقط اینه که متن رو تمیز کنه. وجودش زیادم مهم نیست. فقط این کار رو کردم که «نقطه» و «کاما» و غیره از توی متن پاک بشن. اگه نخوای از این استفاده کنی هم اتفاق خاصی نمیفته. فقط باید یه چندتا تغییر کوچیک جاهای دیگه بدی.
  • فانکشِنِ gand_word کارش اینه که گند بزنه به یه کلمه! یعنی چه؟ یعنی بیاد بجز حروف اول و آخر، حروف دیگه رو بهم بریزه. منتها اینجا ما از یه مفهومی توی علوم کامپیوتر استفاده کردیم به اسم Recursion که به این معنیه که یه function بیاد خودش رو call کنه. یکم درکش برای مبتدی ها سخته و زمان میبره فهمیدنش. چرا از Recursion استفاده کردیم حالا؟ به این خاطر که اگه gand_word گند به یه کلمه ای زد ولی «۲ تا حرفِ تکراریِ پشت سرِ هم» توش بود، انقدر به این گند زدن ادامه میده که بالاخره به یه ورژنی از اون کلمهء گندیده (!) برسه که توش ۲ تا حرفِ تکراریِ پشت سرِ هم نباشه.
    این قسمت کاملاً سلیقه ای تشریف داره. میتانیم Recursion رو حذف کنیم و هر کلمه ای که gand_word به ما داد رو قبول کنیم. اون با خودِ شما. اگه دوسداشتی تغییرش بده برای خودت. (البته توی این مثال، میشه بجای Recursion از loop هایی مثل for و while هم استفاده کرد).
  • فانکشِنِ gand_text هم کارش اینه که گند بزنه به کُلِ متن. توی خودش از همون gand_word استفاده میکنه که تمام کلمه های متن رو گندکاری کنه!
  • فانکشِنِ main هم که کارش فقط اینه که یه نقطه شروع برای برنامه باشه. وقتی script رو run میکنید، اول از همه این main اجرا میشه و فانکشِنِ gand_text رو call میکنه. تا زمانی که ما ادامه بدیم، برنامه ورژن های بیشتری از متنی که بهش دادیم، به ما میده. ولی وقتی یه متن جدید بهش بدیم، ورژن ها دوباره از ۱ شروع میشن (که منطقیه). اگه خوب متوجه نشدید، حتماً برنامه رو خودتان اجرا کنید که در عمل ببینید.

حالا چند تا مثال از اجرای این برنامه

برای مثال ها از ۲ تا از جمله های همین مقاله استفاده شده.

  • جمله ۱: بهش میگیم «بسه دیگه» و برنامه رو میبندیم و خداحافظ.
  • جمله ۲: «این به درد عمت میخوره، یکی دیگه بهم بده».

شما هر جمله ای که دوس داشتین بهش بدین و اگه باگ یا مشکلی هم داشت، برطرفش کنید. خدا رو چه دیدی؟ شاید چند تا باگ و مشکل توی جاهای مختلف این کد باشه!

یه نکته هم اینه که اگه خواستین دیگه خیلی نتیجه های عجیب به شما بده، اون محدودیتِ دو تا حرفِ پشت سر هم رو بردارید.

اگه هم احیاناً متن های فارسی به سمت راست کوچ کردن، دلیلش ادیتورِ ویرگوله، ما بی تقصیریم.

Matn ro vared kon: بهش میگیم «بسه دیگه» و برنامه رو میبندیم و خداحافظ. ------------- * VERSION #1: بهش میگیم «بسه دگهی» و برنماه رو میدبینم و خافاحدظ ------------- Chekar konim? 1) Hamin matn, ye version digeظ 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #2: بهش میگیم «سبه دگهی» و برمناه رو منبیدیم و خدحافاظ ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #3: بهش میگیم «سبه دهیگ» و بانرمه رو مبدینیم و خافادحظ ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 2 ------------- Matne jadid ro vared kon: «این به درد عمت میخوره، یکی دیگه بهم بده». ------------- *** VERSION #1 BA MATNE JADID: «یان به درد عمت مورخیه یکی دیگه بهم بهد» ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #2: «یان به درد عمت مویرخه یکی دیگه بهم بده» ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #3: «یان به درد عمت مخریوه یکی دگیه بهم بده» ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 2 ------------- Matne jadid ro vared kon: اونم گند میزنه به کلمات و نتیجه رو در قالب یه اثر هنری به ما میده. ------------- *** VERSION #1 BA MATNE JADID: انوم گند میزنه به کمالت و نتجیه رو در قالب یه اثر هنری به ما مدیه ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #2: انوم گند منزیه به کالمت و نیجته رو در قالب یه اثر هنری به ما مدیه ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #3: انوم گند مزنیه به کملات و نجیته رو در قالب یه اثر هنری به ما مدیه ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 3 ------------- KHODAFEZI.

از هرکدام از اون ۲ تا جمله، ۳ ورژن رو دیدیم. شما میتانی تا هزار ورژن هم بری جلو، البته اگه جمله جالبی داشته باشی، به علاوهء حوصله زیاد و وقت زیاد!

دی مخلصات پرمنگنات.

یا علی.


برای ارتباط با من میتانید از ID تلگرام solyinho@ یا آدرس ایمیل odiwxe@gmail.com استفاده کنید.

پایتونبرنامه نویسینرم افزارحال خوبتو با من تقسیم کنعلوم کامپیوتر
۲۹
۹
سهيل مرادی مریم‌نگاری
سهيل مرادی مریم‌نگاری
در حال یادگیری دانش‌ها یا در حال جمع‌آوری کتاب‌ها؟
شاید از این پست‌ها خوشتان بیاید