أين يمكن حل المهام التحليلية من فرق Yandex؟ المسابقة والتحليل

تبدأ اليوم الجولة التجريبية لبطولة برمجة كأس Yandex . هذا يعني أنه يمكنك استخدام نظام Yandex.Contest لحل المشكلات المشابهة لتلك التي ستكون في جولة التصفيات. حتى الآن ، النتيجة لا تؤثر على شيء.



في المنشور ، ستجد شروط مهام مسار التحليلات والتحليلات ، والتي يتم إخفاؤها عمدًا في المفسدين. يمكنك رؤية الحل أو محاولة القيام بالمهام بنفسك أولاً. يكون الشيك تلقائيًا - ستبلغ المسابقة بالنتيجة فورًا ، وستتاح لك الفرصة لاقتراح حل مختلف.



أ. عد الكذابين في البلاد

حل في المسابقة



10000 شخص يعيشون في الولاية. إنهم منقسمون إلى محبين للحقيقة وكذابين. محبو الحقيقة يقولون الحقيقة مع احتمال 80٪ ، والكذابون - بنسبة 40٪. قررت الدولة إحصاء محبي الحقيقة والكذابين بناءً على مسح شمل 100 ساكن. في كل مرة يُسأل شخص تم اختياره عشوائيًا ، "هل أنت كاذب؟" - واكتب الجواب. ومع ذلك ، يمكن لشخص واحد المشاركة في الاستطلاع عدة مرات. إذا كان أحد المقيمين قد شارك بالفعل في الاستطلاع ، فإنه يجيب بنفس الإجابة في المرة الأولى. نعلم أن هناك 70٪ من محبي الحقيقة و 30٪ من الكاذبين. ما هو احتمال أن تقلل الدولة من عدد الكذابين ، أي أن الاستطلاع سيظهر أن هناك أقل من 30٪ من الكذابين؟ اكتب إجابتك بالنسبة المئوية مع وضع نقطة كفاصل ، وقم بتقريب النتيجة لأقرب جزء من مائة (مثال على إدخال: 00.00).



القرار
1. «» « ?».



«, » «» «» .



«, » :



: «» * = 0,2 * 0,7.

: «» * ( – ) + «» * ( ) = «» * = 0,2 * 0,7.



«, » 0,14 , . .



, «, » : 0,2 * 0,7 + 0,4 * 0,3 = 0,26.



2. .



, , — n = 100, p = 0,26.



, 30 (30% 100 ): P (x < 30). n = 100, p = 0,26 0,789458. : stattrek.com/online-calculator/binomial.aspx.



, : 78,95.


ب- موسم المسرح والتليفونات

قرر في المسابقة



قررت خدمة التذاكر الدولية تقييم الموسم المسرحي. كأحد المقاييس ، يريد مدير المشروع حساب عدد المستخدمين الذين اشتروا تذاكر لأداء مختلف.



عند شراء تذكرة ، يشير المستخدم إلى رقم هاتفه. تحتاج إلى العثور على العرض الذي يحتوي على أكبر عدد من أرقام الهواتف الفريدة. وحساب عدد مطابقة أرقام الهواتف الفريدة.



تنسيق الإدخال



تتوفر سجلات الشراء في ملفTicket_logs.csv. يحتوي العمود الأول على اسم الأداء من قاعدة بيانات الخدمة. في الثانية - رقم الهاتف الذي تركه المستخدم عند الشراء. لاحظ أنه من أجل التآمر ، تم استبدال رموز الهاتف بالدولة بمناطق غير مخدومة حاليًا.



تنسيق الإخراج



عدد الأرقام الفريدة.



القرار
main.py.



. . 801–807.



:



1. 8-(801)-111-11-11

2. 8-801-111-11-11

3. 8801-111-11-11

4. 8-8011111111

5. +88011111111

6. 8-801-flowers, — ( )



:



1. 1–4 replace.

2. 5 , 1. 11 , .

3. 6 , . , .



, . .


C. حساب pFound

حل في مسابقة



وأرشيفيحتوي على ثلاثة ملفات نصية:



  • qid_query.tsv - معرف الاستعلام ونص الاستعلام ، مفصولة بعلامات تبويب ؛
  • qid_url_rating.tsv - معرف الطلب ، عنوان URL للمستند ، صلة الوثيقة بالطلب ؛
  • hostid_url.tsv - معرف المضيف و URL المستند.


من الضروري عرض نص الطلب بأقصى قيمة لمقياس pFound ، محسوبًا من أهم 10 مستندات. يتكون الإصدار عند الطلب وفق القواعد التالية:

  • من مضيف واحد يمكن أن يكون هناك مستند واحد فقط في المشكلة. إذا كان هناك عدة مستندات للطلب بنفس معرف المضيف ، فسيتم أخذ المستند الأكثر صلة (وإذا كانت هناك عدة مستندات هي الأكثر صلة ، فسيتم أخذ أي منها).
  • يتم فرز المستندات عند الطلب بترتيب تنازلي من حيث الصلة.
  • إذا كانت هناك عدة مستندات من مضيفين مختلفين لها نفس الصلة ، فقد يكون ترتيبها عشوائيًا.


معادلة حساب pFound:



pFound =i=110pLook [i] ⋅ pRel [i]

pLook [1] = 1

pLook [i] = pLook [i - 1] ⋅ (1 - pRel [i - 1]) ⋅ (1 - pBreak)

pBreak = 0.15



تنسيق الإخراج



نص الطلب بأقصى قيمة للمقياس. على سبيل المثال ، بالنسبة لـ open_task.zip ، فإن الإجابة الصحيحة هي:





القرار
. - — pFound . pandas — .



import pandas as pd

#  
qid_query = pd.read_csv("hidden_task/qid_query.tsv", sep="\t", names=["qid", "query"])
qid_url_rating = pd.read_csv("hidden_task/qid_url_rating.tsv", sep="\t", names=["qid", "url", "rating"])
hostid_url = pd.read_csv("hidden_task/hostid_url.tsv", sep="\t", names=["hostid", "url"])

#  join  ,     url   
qid_url_rating_hostid = pd.merge(qid_url_rating, hostid_url, on="url")

def plook(ind, rels):
 if ind == 0:
 return 1
    return plook(ind-1, rels)*(1-rels[ind-1])*(1-0.15)

def pfound(group):
 max_by_host = group.groupby("hostid")["rating"].max() #   
 top10 = max_by_host.sort_values(ascending=False)[:10] #  -10    
 pfound = 0
    for ind, val in enumerate(top10):
 pfound += val*plook(ind, top10.values)
 return pfound

qid_pfound = qid_url_rating_hostid.groupby('qid').apply(pfound) #   qid   pfound
qid_max = qid_pfound.idxmax() #  qid   pfound

qid_query[qid_query["qid"] == qid_max]


د- البطولة الرياضية

حل في المسابقة
المهلة الزمنية للاختبار 2 ثانية
حد الذاكرة لكل اختبار 256 ميجا بايت
إدخال الإدخال القياسي أو input.txt
انتاج | الإخراج القياسي أو الإخراج. txt
بينما كانت ماشا في إجازة ، نظم زملاؤها بطولة شطرنج وفقًا للنظام الأولمبي. أثناء استراحتها ، لم تهتم ماشا كثيرًا بهذا المشروع ، لذلك بالكاد يمكنها تذكر من لعب مع من (ترتيب الألعاب غير وارد). فجأة خطرت لماشا فكرة أنه سيكون من الرائع إحضار هدية تذكارية للفائز بالبطولة من الإجازة. لا تعرف ماشا من فاز في المباراة النهائية ، لكنها تستطيع بسهولة معرفة من لعبها ، فقط إذا تذكرت بشكل صحيح أزواج اللعب. ساعدها في التحقق مما إذا كانت هذه هي الحالة وتحديد الفائزين المحتملين.



صيغة إدخال



يحتوي السطر الأول عدد صحيح 3 ≤ ≤ ن 2 16  - 1 ن = 2 ك - 1 - عدد المباريات السابقة. تحتوي الأسطر n التالية على ألقاب اللاعبين (بأحرف لاتينية كبيرة) مفصولة بمسافة. أسماء اللاعبين مختلفة. جميع الألقاب فريدة من نوعها ، ولا توجد أسماء بين الزملاء.



تنسيق الإدخال



اطبع "NO SOLUTION" (بدون علامات اقتباس) إذا كان Masha قد حفظ الألعاب بشكل غير صحيح وكان من المستحيل الحصول على دورة وفقًا للنظام الأولمبي على هذه الشبكة. إذا كانت شبكة البطولة ممكنة ، فقم بطباعة لقبين على سطر واحد - أسماء المرشحين للمركز الأول (الترتيب غير مهم).



مثال 1

إدخال انتاج |
7

GORBOVSKII ABALKIN

SIKORSKI KAMMERER

SIKORSKI GORBOVSKII

BYKOV IURKOVSKII

PRIVALOV BYKOV

GORBOVSKII IURKOVSKII

IURKOVSKII KIVRIN
IURKOVSKII GORBOVSKII
مثال 2

إدخال انتاج |
3

IVANOV PETROV

PETROV BOSHIROV

BOSHIROV IVANOV
NO SOLUTION
ملاحظات



النظام الأولمبي ، المعروف أيضًا باسم التصفيات ، هو نظام تنظيم منافسة يتم فيه إقصاء أحد المنافسين من البطولة بعد الخسارة الأولى. يمكنك قراءة المزيد عن النظام الأولمبي على ويكيبيديا .



مخطط الاختبار الأول من الشرط:







القرار
 n = 2^k – 1   k.  ,  i- ,  n_i. , (  k ).  , . ,  i  j   min(n_i, n_j),  - ( ).   r   (i, j),  min(n_i, n_j) = r. :



.   2^k – 1  , :



1. .

2. r 2^{k – r}.



.  : ,  .   k.  k = 1    — .   k – 1 -> k. 



-, , .  ,   q .  ,   q- . ,    1, 2, ..., q. , , ,  ,  2^k.  ,  2^{k – 1}    n_i = 1.  . 



,   2^{k – 1}   n_i > 1 — . ,  n_i = 1   2^{k – 1}, .  ,   :  n_i = 1,  —  n_i > 1.    k – 1 (  n_i  1). ,   .



import sys
import collections

def solve(fname):
    games = []
    for it, line in enumerate(open(fname)):
        line = line.strip()
        if not line:
            continue
        if it == 0:
            n_games = int(line)
            n_rounds = n_games.bit_length()
        else:
            games.append(line.split())

    gamer2games_cnt = collections.Counter()
    rounds = [[] for _ in range(n_rounds + 1)]

    for game in games:
        gamer_1, gamer_2 = game
        gamer2games_cnt[gamer_1] += 1
        gamer2games_cnt[gamer_2] += 1

    ok = True
    for game in games:
        gamer_1, gamer_2 = game
        game_round = min(gamer2games_cnt[gamer_1], gamer2games_cnt[gamer_2])
        if game_round > n_rounds:
            ok = False
            break
        rounds[game_round].append(game)

    finalists = list((gamer for gamer, games_cnt in gamer2games_cnt.items() if games_cnt == n_rounds))

    for cur_round in range(1, n_rounds):
        if len(rounds[cur_round]) != pow(2, n_rounds - cur_round):
            ok = False
            break
        cur_round_gamers = set()
        for gamer_1, gamer_2 in rounds[cur_round]:

            if gamer_1 in cur_round_gamers or gamer_2 in cur_round_gamers:
                ok = False
                break
            cur_round_gamers.add(gamer_1)
            cur_round_gamers.add(gamer_2)

    print ' '.join(finalists) if ok else 'NO SOLUTION'

def main():
    solve('input.txt')

if name == '__main__':
    main()





لحل مشاكل المسارات الأخرى للبطولة ، عليك التسجيل هنا .



All Articles