Hola mundo
Agosto 2018
En la calle hay un verano caluroso, que se acerca gradualmente al final, y estoy sentado en una habitación fresca con una computadora portátil y navegando por Internet en busca de cosas interesantes. Habiendo perdido la esperanza de encontrar algo digno de atención, de repente me topé con uno de los grupos bastante silenciosos más populares en VKontakte con un
enlace a otro recurso de TI. La búsqueda me pareció interesante, porque es casi una búsqueda de texto clásica en un espacio, ¡e incluso necesitas programar aquí!

Por lo tanto, en este artículo hablaremos sobre cómo
jugué resuelto esta búsqueda.
El enlace nos espera con una introducción a la búsqueda con el siguiente texto:
2022 . - KASP 120 .
, . , - KASP . — .
Después de elegir el idioma: C ++, C # y Python están disponibles, estamos esperando una página con un "mensaje del MCC", que es un conjunto de caracteres en una codificación determinada. Para pasar a la siguiente etapa, debe decodificar el mensaje clasificando las partes del mensaje para aumentar la longitud del mensaje e ingresar el
hash md5 del mensaje recibido.
¿Pero de qué tipo dices? El hecho de que este mensaje sea una cierta codificación se vuelve inmediatamente claro cuál puede entenderse fácilmente usando un
recurso similar, por ejemplo.
Habiendo entendido que es
base64 , comenzamos a decodificarlo. Hice esto
en python :
Decodificar base64: import base64 code = """=""" def base64ToString(b): return base64.b64decode(b).decode('utf-8') decodedJSON = base64ToString(code) print(decodedJSON)
Después de la salida, queda claro que los datos se presentan en formato JSON:
Tal Jason tenemos:[{"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"}]
En cada elemento de la matriz hay un parámetro "id": este es un número de serie y clasificaremos los mensajes por él. Vamos a complicar nuestro código:
Código anterior con mejoras: 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())
Como resultado, obtenemos el mensaje y el hash md5 del mensaje:
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
El mensaje va acompañado de un archivo con información sobre los colonos en el siguiente formato:
1;electrical engineer;0;90
2;mechanic;0;77
3;scientist;1;71
El formato es: ID; Profesión Género (mujer = 0, hombre = 1); Calificación de sostenibilidad
Se propone que de 120 colonos, se cumpla un puntaje de 40 que cumpla con los siguientes criterios:
- La colonia debe tener 1 gerente, 3 cocineros, 4 electricistas, 5 informáticos, 5 médicos, 8 mecánicos y 14 científicos.
- Las colonias tendrán que existir durante más de un año, por lo que al menos el 51% de la población debe ser mujer. Pero al menos el 30% de los colonos deben ser hombres.
- Vivir en una colonia no es tan fácil y divertido, por lo que solo necesita seleccionar candidatos cuya calificación de sostenibilidad sea de 60 o más unidades en una escala de 1 a 100.
¡Y ahora procedemos a la selección de colonos!
Seleccionamos ... 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(';'))
El formulario en el sitio toma el código y lo prueba automáticamente. Los datos se suministran desde el flujo de entrada estándar, por la misma razón, debe leerlos desde allí, lo que complica un poco las pruebas de código al escribir.
Enero 2019
Quería compartir con ustedes esta experiencia bastante interesante de participar en tales misiones. Para mí, él fue el primero. Me parece que la idea es interesante incluso sin una base competitiva. Personalmente, resolví 5 tareas de varios tipos. Puse el resto en el
enlace a github.
Y también, como recompensa, al final hay una tabla de clasificación con su tiempo. Para mí, el mejor resultado fue este:

El resultado, un 50º lugar simbólico entre más de 400 participantes.
¿Qué se puede decir sobre esto? Para mí fue un tiempo emocionante dedicado a la programación. Por cierto, las tareas aún están disponibles para aquellos que desean resolverlas, a pesar del hecho de que la competencia se ha completado durante mucho tiempo.