Halo Dunia!
Agustus 2018
Di jalan ada musim panas, perlahan-lahan mendekati akhir, dan saya duduk di ruangan yang dingin dengan laptop dan menjelajahi Internet untuk mencari hal-hal menarik. Setelah kehilangan harapan untuk menemukan sesuatu yang layak mendapat perhatian, tiba-tiba saya menemukan salah satu grup yang nyaris populer di VKontakte dengan
tautan ke sumber daya TI lain. Pencarian itu tampak menarik bagi saya, karena hampir merupakan pencarian teks klasik dalam pengaturan ruang, dan bahkan Anda perlu memprogram di sini!

Oleh karena itu, dalam artikel ini kita akan berbicara tentang bagaimana saya
bermain menyelesaikan pencarian ini.
Tautan menunggu kami dengan pengantar untuk pencarian dengan teks berikut:
2022 . - KASP 120 .
, . , - KASP . โ .
Setelah memilih bahasa - C ++, C # dan Python tersedia, kami menunggu halaman dengan "pesan dari PKS", yang merupakan serangkaian karakter dalam pengkodean tertentu. Untuk menuju ke tahap berikutnya, Anda perlu men-decode pesan dengan menyortir potongan-potongan pesan untuk menambah panjang pesan dan memasukkan
hash md5 dari pesan yang diterima.
Tapi seperti apa, katamu? Fakta bahwa pesan ini adalah penyandian tertentu menjadi segera menjadi jelas mana yang dapat dengan mudah dipahami menggunakan
sumber daya yang sama, misalnya.
Setelah mengerti bahwa itu adalah
base64 , kita mulai men-decode-nya. Saya melakukan ini
dengan python :
Dekode base64: import base64 code = """=""" def base64ToString(b): return base64.b64decode(b).decode('utf-8') decodedJSON = base64ToString(code) print(decodedJSON)
Setelah output, menjadi jelas bahwa data disajikan dalam format JSON:
Alasan yang kita dapat:[{"id":31,"s":"ony: 1 man"},{"id":27,"s":"de all spe"},{"id":61,"s":"s will fac"},{"id":55,"s":"out men, a"},{"id":42,"s":"ntists.\n2."},{"id":18,"s":"n. Our soc"},{"id":70,"s":"the planet"},{"id":5,"s":". One oper"},{"id":64,"s":" condition"},{"id":44,"s":"y have to "},{"id":49,"s":"st 51% of "},{"id":58,"s":"ists must "},{"id":71,"s":". Select p"},{"id":59,"s":"be male.\n3"},{"id":85,"s":"he followi"},{"id":43,"s":" The colon"},{"id":73,"s":" resilienc"},{"id":24,"s":"selection."},{"id":62,"s":"e all kind"},{"id":47,"s":"nerations,"},{"id":105,"s":"eople who "},{"id":103,"s":"rmation, s"},{"id":22,"s":"ias to sim"},{"id":86,"s":"ng format:"},{"id":2,"s":"p's lander"},{"id":36,"s":" computer "},{"id":48,"s":" so at lea"},{"id":16,"s":"for Mars c"},{"id":75,"s":"0 and more"},{"id":11,"s":". You have"},{"id":95,"s":"emale = 0,"},{"id":68,"s":"ple should"},{"id":41,"s":"s, 14 scie"},{"id":7,"s":", but is u"},{"id":98,"s":"e rating\ne"},{"id":0,"s":"Two of the"},{"id":101,"s":".\n\nKnowing"},{"id":33,"s":"oks, 4 ele"},{"id":97,"s":";Resilienc"},{"id":51,"s":"olonists m"},{"id":108,"s":"d Planet."},{"id":100,"s":"break - \\n"},{"id":60,"s":". Colonist"},{"id":40,"s":"8 mechanic"},{"id":78,"s":"100.\n\nThe "},{"id":1,"s":" three shi"},{"id":13,"s":"0 most app"},{"id":12,"s":" to pick 4"},{"id":93,"s":"ID;Profess"},{"id":104,"s":"elect 40 p"},{"id":39,"s":"5 medics, "},{"id":8,"s":"nable to c"},{"id":52,"s":"ust be fem"},{"id":96,"s":" male = 1)"},{"id":89,"s":"female = 0"},{"id":10,"s":" colonists"},{"id":65,"s":"s. Only th"},{"id":35,"s":"gineers, 5"},{"id":21,"s":"ree criter"},{"id":17,"s":"olonisatio"},{"id":54,"s":" forget ab"},{"id":15,"s":"andidates "},{"id":87,"s":" ID;Profes"},{"id":37,"s":"system spe"},{"id":79,"s":"file attac"},{"id":90,"s":", male = 1"},{"id":29,"s":"ssential f"},{"id":107,"s":"ize the Re"},{"id":6,"s":"ates fully"},{"id":66,"s":"e most res"},{"id":32,"s":"ager, 3 co"},{"id":63,"s":"s of harsh"},{"id":4,"s":"unctioning"},{"id":82,"s":"tains a li"},{"id":38,"s":"cialists, "},{"id":74,"s":"e rating 6"},{"id":77,"s":"from 1 to "},{"id":19,"s":"iologists "},{"id":3,"s":"s are malf"},{"id":53,"s":"ale. Don't"},{"id":23,"s":"plify the "},{"id":28,"s":"cialists e"},{"id":88,"s":"sion;Sex ("},{"id":94,"s":"ion;Sex (f"},{"id":106,"s":"will colon"},{"id":25,"s":"\n\n1. Crew "},{"id":102,"s":" this info"},{"id":91,"s":");Resilien"},{"id":81,"s":"s task con"},{"id":57,"s":"% of colon"},{"id":76,"s":" on scale "},{"id":30,"s":"or the col"},{"id":80,"s":"hed to thi"},{"id":14,"s":"ropriate c"},{"id":72,"s":"eople with"},{"id":69,"s":" colonize "},{"id":9,"s":"ontain 120"},{"id":20,"s":"defined th"},{"id":67,"s":"ilient peo"},{"id":50,"s":"selected c"},{"id":99,"s":"tc. \nLine "},{"id":83,"s":"st of colo"},{"id":56,"s":"t least 30"},{"id":84,"s":"nists in t"},{"id":34,"s":"ctrical en"},{"id":45,"s":"exist for "},{"id":92,"s":"ce rating\n"},{"id":26,"s":"must inclu"},{"id":46,"s":"several ge"}]
Di setiap elemen array ada parameter "id" - ini adalah nomor seri, dan kami akan mengurutkan potongan pesan dengan itu. Mari kita mempersulit kode kita:
Kode sebelumnya dengan perangkat tambahan: import base64 import json import hashlib code = """=""" def base64ToString(b): return base64.b64decode(b).decode('utf-8') def sortbylen(sortlist): return sortlist[ids] decodedJSON = base64ToString(code) print(decodedJSON) sortString = json.loads(decodedJSON) sortList = list() for item in sortString: sortList.append(item) elem = sortList[0] ids = list(elem.keys())[0] messages = list(elem.keys())[1] sortList.sort(key=sortbylen) finallyDecodedString = '' for item in sortList: finallyDecodedString = finallyDecodedString + '' + str(item[messages]) print(finallyDecodedString + '\n') print('Md5 hash: ' + hashlib.md5(finallyDecodedString.encode('utf-8')).hexdigest())
Sebagai hasilnya, kami mendapatkan pesan dan hash pesan:
Two of the three ship's landers are malfunctioning. One operates fully, but is unable to contain 120 colonists. You have to pick 40 most appropriate candidates for Mars colonisation. Our sociologists defined three criterias to simplify the selection.
1. Crew must include all specialists essential for the colony: 1 manager, 3 cooks, 4 electrical engineers, 5 computer system specialists, 5 medics, 8 mechanics, 14 scientists.
2. The colony have to exist for several generations, so at least 51% of selected colonists must be female. Don't forget about men, at least 30% of colonists must be male.
3. Colonists will face all kinds of harsh conditions. Only the most resilient people should colonize the planet. Select people with resilience rating 60 and more on scale from 1 to 100.
The file attached to this task contains a list of colonists in the following format: ID;Profession;Sex (female = 0, male = 1);Resilience rating
ID;Profession;Sex (female = 0, male = 1);Resilience rating
etc.
Line break - \n.
Knowing this information, select 40 people who will colonize the Red Planet.
Md5 hash: 88f57ef56978a95f044183951eabef3b
Pesan disertai dengan file dengan informasi tentang penjajah dalam format berikut:
1;electrical engineer;0;90
2;mechanic;0;77
3;scientist;1;71
Formatnya adalah: ID; Profesi; Jenis kelamin (wanita = 0, pria = 1); Peringkat keberlanjutan
Diusulkan bahwa dari 120 penjajah, skor 40 dipenuhi yang memenuhi kriteria berikut:
- Koloni harus memiliki 1 manajer, 3 juru masak, 4 tukang listrik, 5 ilmuwan komputer, 5 dokter, 8 mekanik dan 14 ilmuwan.
- Koloni harus ada selama lebih dari satu tahun, jadi setidaknya 51% dari populasi harus perempuan. Tetapi setidaknya 30% dari penjajah harus laki-laki.
- Hidup di koloni tidaklah mudah dan menyenangkan, jadi Anda hanya perlu memilih kandidat yang peringkat keberlanjutannya 60 atau lebih unit pada skala 1 hingga 100.
Dan sekarang kita lanjutkan ke pemilihan penjajah!
Kami memilih ... import random import math import sys colonists_list = list() new_colonists_list_male = list() new_colonists_list_female = list() manager_fem_list = list() manager_mal_list = list() cook_fem_list = list() cook_mal_list = list() elen_fem_list = list() elen_mal_list = list() compspec_fem_list = list() compspec_mal_list = list() doc_fem_list = list() doc_mal_list = list() mech_fem_list = list() mech_mal_list = list() sci_fem_list = list() sci_mal_list = list() lucky_colonists = list() luck_list = [random.randint(0, 100) for i in range(100)] managers = 1 cooks = 3 electrical_engineers = 4 computer_system_specialists = 5 medics = 5 mechanics = 8 scientists = 14 def pick_percentage(low, high): return random.randint(low, high)/100 perc_male = pick_percentage(30, 49) perc_female = pick_percentage(51, 69) quantity_required = 40 quantity_of_women_required = math.ceil(quantity_required * perc_female) min_percentage_fem = quantity_of_women_required/quantity_required quantity_of_men_required = quantity_required * perc_male min_percentage_mal = quantity_of_men_required/quantity_required unsorted_list = list() while 1: try: line = input() except EOFError: break unsorted_list.append(line) sorted_list = list() for i in unsorted_list: sorted_list.append(i.split(';'))
Formulir di situs mengambil kode dan secara otomatis mengujinya. Data disuplai dari aliran input standar, untuk alasan yang sama, Anda harus membacanya dari sana, yang mempersulit pengujian kode saat menulis.
Januari 2019
Saya ingin berbagi dengan Anda pengalaman yang agak menarik dari berpartisipasi dalam pencarian semacam ini. Bagi saya, dia adalah yang pertama. Tampaknya bagi saya bahwa idenya menarik bahkan tanpa dasar kompetitif. Secara pribadi, saya menyelesaikan 5 buah tugas dari berbagai jenis. Saya meletakkan sisanya di
tautan ke github.
Dan juga, sebagai hadiah, pada akhirnya ada tabel penilaian dengan waktu Anda. Bagi saya, hasil terbaik adalah ini:

Hasilnya, tempat ke-50 simbolis dari lebih dari 400+ peserta.
Apa yang bisa dikatakan tentang ini? Bagi saya itu adalah waktu yang dihabiskan untuk pemrograman. Ngomong-ngomong, tugas masih tersedia bagi mereka yang ingin menyelesaikannya, meskipun faktanya kompetisi telah lama selesai.