پروسه و برنامه تقسیم پول اینفلوئنسربازی بین فالوئرها با معکوس کردن احتمال کسانی که چند بار ثبت نام کردن

خب یادتونه که قرار شد پول اینفلوئنسر بازی رو تقسیم کنیم. اینکار رو دیشب توی یک لایو اینستاگرام کردم و حالا می خوام روشش رو به اشتراک بذارم چون بامزه بوده. اما اول سه نکته رو جواب بدم:

۱. آیا من از این طریق فالوئر جمع می کنم؟

نه. اگر می خواستم فالوئر و اینها جمع کنم باید اینطوری می گفتم که «هر کس باید من رو فالو کنه و سه تا دوستش رو زیر این پست تگ کنه تا تو مسابقه شرکت داده بشه» (: اینطوری به شکل انفجاری به صد هزار می رسیدیم منطقا ((: من اصولا دنبال فالوئر بالاتر نیستم. کیفیت بسیار مهمتره و من نه خبرگزاری هستم نه درآمدم از این راهه نه علاقمند به گروه و دسته و گنگ هستم (: همین تعداد آدم باحال بهترین چیزه.

۲. آیا بهتر نبود به خیریه بدیم؟

احتمالا چرا. شاید سری بعد اینکار رو بکنیم.

۳. ایا بهتر نبود کالا بدیم؟

اگر می شد خوب بود ولی مشکلاتی داشت. مثلا اگر می گفتم بن کتاب است بعد من باید از طرف برنده براش کتاب می خریدم پست می کردم. یا اگر می گفتم کوپن فلان جا است طرف باید حتما فلان جا عضو می شد. اینطوری ساده تر بود هرچند که خب ذات دادن پول نقد کمتر از چیزهای دیگه باحاله. در عوض طرف حق انتخاب داره (:

۴. بهتر نبود خرج جادی.نت و رادیوگیک و… بشه؟

نه. جادی.نت و رادیوگیک و هیچ چیز دیگه من در وضعیتی نیست که بشه با پول بهترش کرد (: من هر چی لازم دارم،‌ دارم و سعی می کنم ایده ام این نباشه که کارهام رو می شه با پول بیشتر بهتر کرد.


اما حدود ۴۰۰۰ نفر فرم رو پر کردن:

طبق قرار باید ۶ نفر رو به شکل رندم از بین این آدم‌ها انتخاب کنیم. اول فرم گوگل رو توی یک فایل متنی ذخیره کردم. یک ستون حاوی همه اسم ها. اسم فایل هست all.txt و می خوام پیدا کنم که اسامی تکراری چند بار تکرار شدن.

sort all.txt| uniq -c | sort -n | awk '{$1=$1};1' > counted.txt

این دستور بهمون یک فایل جدید می ده که تعدادی که هر نفر اسمش رو نوشته جلوی اسمش اومده. مثلا اینطوری:

      4 Kyarash_bordbar
      5 توییتر
      6 Mary_am_j 
     16 Kayvan_mrz
     16 اینستاگرام

اینها نفرات آخر هستن که اسمشون رو بیشتر از یکبار نوشتن. بعضی ها چیزهای بامزه نوشتن مثلا نوشتن توییتر یا انیتساگرام یا «جادی بردار برای خودت» یا «جادی بده به خیریه» و .. (: همه رو شرکت می دیم. منطقی است که شانس کسانی که یک یا دو بار اسم نوشتن مساوی باشه (تا فالو کردن در دو جا به نفع آدم ها تموم نشه) ولی کسانی که بیشتر از یک بار اسم نوشتن رو باید چیکار کنیم؟ بذارین ببینم کلا دفعات تکرار، چیا هستن:

sort all.txt| uniq -c | sort -n | awk '{$1=$1};1' | cut -f1 -d' ' | uniq 
1
2
3
4
5
6
16

یک و دو که منطقی است. ولی کسانی که ۳ تا ۶ و حتی ۱۶ بار اسم نوشتن رو چیکار کنیم؟ اینها سعی کردن شانس خودشون رو زیاد کنن پس بهتره ما شانسشون رو کم کنیم (: ایده من اینه که کسی که ۱۶ بار ثبت نام کرده یک شانزدهم بقیه شانس برنده شدن داشته باشه. اول کوچکترین مضرب مشترک این اعداد رو پیدا می کنیم:

def BMM(i, nums):
    for n in nums:
        if i%n:
            return False
    return True

i = 1
nums = [1, 2, 3, 4, 5, 6, 16]
while not BMM(i, nums):
    i += 1
print (i)

240

یعنی ما باید هر اسم رو اگر یک یا دو بار تکرار شده بود ۲۴۰ بار تکرار کنیم، اگر ۳ بار نوشته شده بود ۷۰ بار، اگر هم ۱۶ بار نوشته شده بود فقط ۱۵ بار (: شانس رو معکوس کردیم که خیلی حال می ده. بذارین برنامه اش رو بنویسیم:

import re

f = open ('/tmp/counted.txt')
o = open ('/tmp/go.txt', 'w')

for line in f:
    num, name = re.findall ('(\d+) (.*)\n', line)[0]
    if num == '2':
        num = 1
    for i in range(0, 240/int(num)):
        o.write(name+'\n')

حالا ما یک فایل داریم که اگر توش کسی ۱۶ بار ثبت نام کرده، اسمش ۱۵ بار اومده، اگر کسی یک یا دو بار ثبت نام کرده اسمش ۲۴۰ بار اومده! شانس ها معکوس شد. حالا وقت قرعه کشی است:

import random
lines = open('/tmp/go.txt').read().splitlines()
myline =random.choice(lines)
print(myline)

هر بار که این رو اجرا کنیم یه اسم به ما می ده و با چک کردن دستی معلوم می شد که توی اینستاگرام بوده یا توییتر یا جای دیگه و بهش مسیج می دادم و برنده بودنش رو اعلام می کردم! بامزه و فان و راحت و سریع با پایتون باحال.