Amassando ideas

Dentro de la comunidad de programación competitiva existen varias guías acerca de como mejorar y prepararse resolviendo problemas. Esta pequeña guía pretende hacer algo distinto, una lista de comprobación de cosas que hacer antes y durante una competencia de programación.

Antes del contest

  • No tener hambre ni sed
  • No tener ganas de ir al baño
  • Tener agua u otro bebestible a mano
  • Entrar a Codeforces (o el sitio donde se aloje la competencia) e iniciar sesión.
  • Abrir un archivo de texto para cada problema con la plantilla a usar para la competencia
  • Abrir esta lista de comprobación

Al resolver un problema

  • Leer el enunciado cuidadosamente
  • Determinar exactamente qué es lo que tiene que hacer el programa (matemáticamente si es posible)
  • Comprobar límites de la entrada, de tiempo y de memoria

Encontrar la solución

  • Buscar patrones
  • Reducir a casos sencillos
  • Aplicar técnicas conocidas

Implementar la solución

  • Escribir grandes pasos
  • Escribir el código
  • Probar con los casos de ejemplo
  • Probar con pequeños casos borde

Si da Wrong Answer

  • Probar con distintos casos de prueba en los que conozcamos la salida esperada. Si son grandes, generar los casos con números aleatorios y comparar nuestro programa con una solución de búsqueda exhaustiva
  • Inspeccionar el código en busca de errores
  • Intentar demostrar la solución
  • Si todo lo anterior falla, implementar la solución de una forma diferente

Si da TLE/MLE

  • Reducir constantes
  • Hacer pequeñas optimizaciones (arrays en vez de vectores, uso de variables globales, etc)

Si da RE

  • Fijarse en los subíndices de los arrays y vectores
  • Evitar divisiones por 0
  • Si todo lo anterior falla, implementar la solución de una forma diferente

Directo al grano. Acabo de perder el reto. No pensé que sería tan pronto, sólo que no sabía que había perdido. Simplemente estaba muerto de hambre porque no había llevado suficiente comida a la universidad, y lo único razonable que podía comprar eran unas galletas de soda en el kioskito del DCC. Debo llevar más comida. Mañana llevaré frutas aparte de mi wrap diario. Es para darme una segunda oportunidad.

Últimamente no he escrito artículos para el blog porque he estado ocupado estudiando para la universidad y practicando en Codeforces. Pero aún así vengo a comentar que lamentablemente he desarrollado una adicción a comer, sobretodo comida azucarada, y por eso he engordado bastante. He intentado dejar la adicción, pero se me hace demasiado difícil. En contra de mi voluntad termino comprando comida que sé que es insalubre y poco después termino arrepentido. Afortunadamente, se me ocurrió una idea que puede solucionar el problema.

En internet existe un desafío anual muy popular entre los hombres llamado “Septiembre sin FAP”, que consiste en evitar masturbarse durante todo el mes de septiembre. Se me ocurrió una idea parecida: desafiarme a no comer comida insalubre durante todo el mes de junio. ¿Pero por qué creo que esta idea puede funcionar si es que no he podido controlarme estos últimos meses? Bueno, creo que el símil entre “Septiembre sin FAP” y este reto auto-impuesto es más divertido y llamativo, además que el año pasado gané por primera vez el reto de no jalarse el ganso, lo que me hace creer que puedo lograr este nuevo desafío.

Las reglas del reto serán las siguientes:

  • Comer solamente si es que estoy muy hambriento. Debo evitar comer en exceso.

  • No consumir alimentos que vengan con sellos negros. Tampoco debo comer alimentos que no sepa que son saludables, es decir, comida como pasteles y papas fritas quedan fuera.

  • No comprar carne. No hay que apoyar el maltrato animal.

  • Si no cumplo con alguna de las reglas anteriores, perderé el reto inmediatamente y avisaré en un blog post que perdí contando los detalles.

Podría contar muchas mas cosas sobre mi estadía en Santiago, pero mañana tengo un test de física moderna y apenas he estudiado, así que lo dejaré para otra ocasión.

Hoy termina mi cuarta semana estudiando en la FCFM. Como prometí que haría, escribiré sobre mi experiencia y mis impresiones de la universidad. El post no está tan estructurado como otros artículos porque lo escribo con menor planificación.

Primeros días

El primer día amanecí antes de las 6AM. Estaba muy emocionado, en contraste con los días previos en los que no tenía ganas de nada. Ordené mis cosas y me dirigí a caminando a la facultad (afortunadamente vivo relativamente cerca).

Como me había levantado temprano, aproveché de pasear por la facultad. Me encantó el edificio antiguo de Beauchef y el patio que tenía adentro. El problema era que no encontraba la sala y llegué un poco tarde a mi primera clase. Tuve que haber intuido que la “G” como la primera letra del nombre de la sala era de “Geología”.

Cerca del mediodía tuve clase en el edificio nuevo. Me gustó el contraste entre ambos edificios aunque no me gustó tanto la idea de tener que salir de la facultad hacia la calle para luego volver a entrar.

En los días siguientes pasaron hartas cosas buenas pero tenía una ensalada de emociones. Conocí en persona a algunos compañeros de programación en el patio. También pude colarme en el DCC (Departamento de Ciencias de la Computación) y sentí que era mi lugar, como que pertenecía ahí. No obstante, me sentía algo irritado y con pocas ganas de esforzarme, lo que hizo que me atrasara en algunos ramos.

Tengo muchos problemas para concentrarme en clase. Mi cerebro se distrae fácilmente pensando en cualquier otra cosa. Últimamente he estado pensando mucho en mi propósito y en cómo aportar de la mejor manera al mundo con algo que me guste. Y parece bastante complicado.

Impresiones de los ramos

Tengo una carga académica normal (30 créditos), pero siento que me quita demasiado tiempo. A continuación los ramos que tomé para este semestre:

Cálculo Avanzado y Aplicaciones

Aquí vemos Cálculo vectorial, Variable Compleja, series de Fourier y ecuaciones en derivadas parciales. Parece que se aplica mucho en física, pero parece una excusa para aplicar lo que vimos en Cálculo en Varias Variables y en Ecuaciones Diferenciales Ordinarias.

Sobre mi desempeño en el ramo, no hemos tenido evaluaciones aún pero voy bastante atrasado y me cuesta entender la materia del apunte.

Inglés 4

Estas clases son como las que tenía en el instituto de idiomas, sólo que esta vez son con más gente. La profesora es chilena pero eso no es un problema para mí. Creo que el nivel que busca que obtengamos es B2 en todo excepto en escritura, pero no estoy completamente seguro.

Introducción a la Física Moderna

Aquí estudiamos ondas, sonido, relatividad, etc. El profesor es algo sarcástico y honestamente no aprendo mucho con él en clase. Afortunadamente los tests son fáciles y me ha ido muy bien en ellos.

Probabilidades y Estadística

El curso está dictado por un profesor que ganó el premio nacional en ciencias exactas. El profesor dio una motivadora primera clase explicando varios casos y situaciones que inspiraron la creación de distintas teorías de probabilidad. Sus clases se basan en copiar texto del pizarrón pero se toma el tiempo de explicar los conceptos. Quiere que preguntemos sobre nuestras dudas pero suele regañar a algun@s que lo hacen, ya sea porque el o la estudiante asume algo que no sale escrito o por otros motivos que no recuerdo. Aún así me cae muy bien.

Proyecto de innovación en Ingeniería y Ciencias

Tod@s parecen odiar este ramo, pero a mi me gusta la idea de aprender cómo aportar a la sociedad mediante la ingeniería. Uno de l@s profesores es muy agradable de escuchar, hace aportes entretenidos e interesantes.

Química

Tod@s parecen odiar este ramo también. Me tocó con un profesor francés y se le nota al hablar, pero eso me agrada. Lamentablemente me fue mal en la primera tarea, pero no sé por qué pues no he visto la corrección. Espero que me la den para la revisión, porque creo que merezco una mejor nota aunque no esté seguro.

Taller de Inducción a Competencias Docentes para Auxiliares

La docencia me llama la atención así que decidí pedirle al CAD que me inscribiera a este ramo para ser auxiliar. Me he imaginado siendo auxiliar de Intro al Álgebra y de Intro a la Progra. Lo malo es que es necesario ver vídeos de Youtube por EOL, lo que requiere descargar JavaScript privativo, por lo que le pedí a los profesores que enviaran los enlaces a los vídeos directamente para poder verlos desde Invidious.

Últimamente he estado practicando mucho en Codeforces, pero lamentablemente no me ha ido tan bien como esperaba. De hecho, me ha ido bastante mal. También me he sentido muy ansioso en general porque pienso mucho sobre si mis metas (como la de ser red coder) son las adecuadas para mí.

Para ayudarme con lo anterior, me he preguntado por qué quiero ser red coder en Codeforces, y he identificado tres motivos principales:

1) Quiero ser muy bueno en algo, y ya soy medianamente decente en programación competitiva por lo que el camino a recorrer es aparentemente más corto.

2) Me gustaría ver a Chile con un red coder y con gente más habilidosa en general. Con mis habilidades obtenidas también podría ayudar a otras personas a mejorar en programación.

3) Pienso muy seguido en que me fue mal en la IOI y debería haber entrenado más, por lo que esto me serviría como una forma de redención conmigo mismo.

A ver, pensemos un poco. ¿Son estos motivos suficientes para querer dedicarle cientos de horas de tu vida a ProgComp?

Definitivamente el tercer motivo no es válido para mí, porque quiero tomar la mejor decisión dadas las circunstancias. Así que me enfocaré en los dos primeros motivos.

Respecto del primero, disfruto pensar y resolver problemas que requieran una mezcla entre creatividad y pensamiento sistemático, y la programación competitiva ofrece justamente eso. Me apasiona la idea de volverme muy bueno en Codeforces. No obstante, hay otras cosas en las que puedo ser bueno, y quizás en ellas le haría un mayor bien a la humanidad, como dedicarme a un proyecto real de software.

Respecto del segundo motivo, nuestro país tiene problemas grandes dónde la informática puede contribuir a su solución, problemas aparentemente más importantes que unos puntos en una página de internet o la habilidad de un@s cuant@s en una actividad en concreto, sobretodo si consideramos que la programación competitiva no es un fin en sí mismo sino que tiene el objetivo de generar mejores ingenier@s de software y científic@s en computación.

En conclusión, me gusta resolver problemas algorítmicos, pero el fin es ser bueno en informática para un bien social, por lo que abandonaré mi objetivo de ser red coder (aunque seguiré mejorando en Codeforces por diversión y un sentimiento de crecimiento personal) y buscaré algo en lo que pueda aportar con mis conocimientos y habilidades (presentes y futuras).

Hace algunos años postulé y entré como alumno a estudiar Ingeniería y Ciencias en la Universidad de Chile. Lamentablemente, la pandemia arruinó mi expectativa ya que todas las actividades se volvieron online. Lo bueno es que este año volveremos a las actividades presenciales (¡por fin!), y estaré escribiendo mis experiencias en este blog. Aunque no lo parezca, no me siento muy motivado, porque en general no ando con muchas ganas de hacer cosas, y porque hay otras cosas que quiero hacer este año y siento que la universidad me quitará bastante tiempo. A pesar de eso, espero tener una buena experiencia: aprender mucho y conocer gente buena onda.

Pronto competiré en una ronda de Codeforces hecha por un Argentino. Espero remontar lo que perdí durante el mes. Luego de eso me iré a Santiago.

Últimamente me he sentido mal conmigo mismo. Me he propuesto la meta de ser el primer red coder chileno de la historia. Parece una meta difícil de alcanzar, y lo es. Durante este mes he estado resolviendo muchos problemas de programación para mejorar mi nivel, pero lo único que gano es perder rating (que es como el ELO del ajedrez, solo que en este caso se calcula en base al rendimiento de tod@s l@s participantes). Después del concurso consigo resolver el problema con una solución relativamente sencilla. En parte me alegra porque pude conseguir lo que me había costado tanto antes, pero por otra parte me frustra el no poder resolver cosas que deberían ser fáciles para mi, sobretodo considerando que llevo años en programación competitiva.

No sé si considerar la frustración como un problema de autoestima. Por un lado me pregunto si realmente podré ser red coder y me siento como un tonto cuando leo el tutorial y la solución es muy simple, pero por otro sigo intentándolo porque en el fondo me gusta hacer esto y siento que no quiero dejar atrás algo que llevo haciendo durante mucho tiempo. De todas formas, tengo otras virtudes aparte de programar, y puedo ser un gran informático sin necesidad de tener un buen rendimiento en esta clase de competencias.

Lo bueno es que al escribir estas palabras me he sentido algo mejor. Eso significa que escribir ayuda a despejarse. Pero no debo relajarme tanto si quiero ser el primer red coder chileno. Debo disfrutar del proceso, no sentirme mal por tener que leer la solución, y sobretodo ayudar a alguien con lo que estoy haciendo. Estoy trabajando en un proyecto relacionado, y tengo pensados otros más que espero sean de su agrado.

Un problema muy común es el de calcular la potencia de un número $b$ con exponente $n$, es decir, calcular $b^n$. La forma obvia de hacerlo en programación consiste en multiplicar $b$ por si mismo unas $n$ veces con un bucle. Esta solución requiere de $O(n)$ operaciones, lo que puede ser demasiado para determinados contextos. En este artículo expondré sobre una forma más eficiente de resolver el problema, aunque sólo aplica para números .

La idea

Sea $b$ la base y $n$ el exponente (un entero no negativo) al que queremos elevar el número $b$. El algoritmo de exponenciación binaria nace de una simple observación: Si $n$ es par entonces $b^n = (b^2)^{\frac{n}{2}}$, y si $e$ es impar entonces $b^n = b \times b^{n-1}$. Por lo tanto el problema se puede expresar de forma recursiva:

potencia(b, n):
    // Caso base
    Si es es nulo:
        retornar 1

    Si e es par:
        retornar potencia(b*b, n/2)
    Si e es impar:
        retornar b * potencia(b, n-1)

Complejidad temporal

La exponenciación binaria es mucho mejor que la lineal, sobretodo si se implementa de forma iterativa y usa con exponentes grandes. Se puede demostrar que ejecuta $O(\log{n})$ operaciones.

Bibliografía

La semana pasada se aprobó en la Comisión Sistemas de Conocimientos, una norma constitucional para modernizar la legislación sobre derecho de autor, equilibrando los derechos morales y patrimoniales de los autores y autoras con el derecho del público general a acceder a la cultura. Ahora vayamos al grano: uno de los artículos aprobados obliga al estado a “utilizar y promover recursos y herramientas de libre acceso y distribución, así como aquellas que permitan la innovación por medio de su modificación”. En la discusión de la norma se hizo mención al posible uso de software libre (programas informáticos que otorgan las libertades de usarlos para cualquier propósito) por parte del estado en lugar de software privativo (programas que no otorgan alguna de las libertades mencionadas) debido a este artículo. Lo anterior nos daría más soberanía como país ya que el estado podría auditar la seguridad de los programas informáticos que ocupa y adaptar dichos programas a sus necesidades. Además podría ahorrar miles de millones de pesos que se gastan en licencias de uso de software privativo.

Mi preocupación radica en que el artículo de la norma es demasiado débil para “abrirle la puerta” al software libre en el estado. No consigue que el estado priorice el software libre por sobre el que no lo es, ya que el artículo puede interpretarse de modo que se usen sólo algunos programas libres y que el resto sean privativos. Por tanto, no se conseguiría el objetivo de incrementar la soberanía informática. Desconozco si es posible, pero en caso de serlo, espero que el pleno pueda corregir el artículo para que obligue al estado a priorizar el uso de recursos de libre estudio, modificación y distribución.

Aquí publico un comentario de una cita que escribí para una asignatura en la Universidad. Defiende la idea de que las necesidades en el ser humano no son necesariamente ilimitadas y que el deseo de maximizar las propias riquezas no es hegemónico en todas las culturas.

Cita a comentar

“Deberá dependerse siempre del principio de acción cuya influencia sea la más poderosa, constante, uniforme, permanente y más generalizada entre la humanidad. Ese principio es el interés personal [egoísmo o maximización]; el sistema de economía que se construya sobre cualquier otra base, se edifica sobre una base falsa” Jeremy Bentham, filósofo utilitarista La psicología del hombre económico

Introducción

La cita a comentar fue escrita por Jeremy Bentham, un filósofo importante en la formulación del utilitarismo, corriente filosófica cuyo principio fundamental es que la medida del bien y del mal es la máxima felicidad del máximo número de personas (Cortina, 1994, p. 29-30). Desde esta perspectiva, en la cita se plantea que los sistemas económicos deben basarse en el interés personal de quienes lo componen, es decir, suponer que todas las personas buscan maximizar su propia felicidad sin tomar en cuenta la del prójimo (Bentham, 1786). No obstante, es legítimo preguntarse si el interés personal es el motor principal de la conducta humana en todas las culturas. En el presente comentario se intentará dar respuesta a la problemática anterior, explorando las necesidades humanas, la moral imperante en algunas sociedades que existieron en el pasado, y las causas y consecuencias de la ayuda mutua y cómo éstas están relacionadas con el altruismo y con el propio bienestar.

Desarrollo

En primer lugar, los seres humanos estamos programados por naturaleza para buscar nuestra propia supervivencia. En la Pirámide de Maslow, el primer peldaño está reservado para las necesidades relacionadas con la supervivencia, tales como la alimentación y el sueño (Maslow, 1943). Claramente la satisfacción de dichas necesidades contribuyen al propio bienestar personal del individuo, pero no son ilimitadas ya que existe un máximo nivel en el que éstas pueden satisfacerse. Por ejemplo, uno no puede comer ilimitadamente, sólo hasta la saciedad, y tampoco es necesario ingerir una cantidad infinita de alimento para vivir. De hecho, en su tratado sobre la política, Aristóteles asevera que los recursos necesarios para vivir “parecen constituir la verdadera riqueza, pues la propiedad de esta índole que basta para vivir no es ilimitada” (Aristóteles, Siglo IV a. C).

Por otra parte, la subsistencia no es la única necesidad del ser humano. Recordemos que las personas, en general, también necesitan recibir afecto, atención, respeto, y tener una sensación de libertad y seguridad (Maslow, 1943). Según los aristotélicos, “Los hombres tienden necesariamente a la felicidad” (Cortina, 1994, p. 29). Lo anterior podría hacernos pensar que Sin embargo, la felicidad, entendida como el estado de mayor satisfacción física y espiritual, y a la vez el fin último del ser humano, no se consigue con las riquezas naturales (que según San Tomás de Aquino, son las necesarias para vivir, “para subsanar las debilidades de la naturaleza”), pues “se las busca en orden a otra cosa; para sustentar la naturaleza del hombre y, por eso, no pueden ser el fin último del hombre, sino que se ordenan a él como a su fin.” (de Aquino, Siglo XIII), ni tampoco con riquezas artificiales, como el dinero, porque este tipo de riquezas se creó como un medio para conseguir riquezas naturales mediante el intercambio, tal como explica Aristóteles en el primer libro de su tratado sobre Política: cuando se dependió más del exterior para importar lo necesario y exportar lo que se tenía en abundancia, la necesidad hizo que se ideara la utilización del dinero por no ser fáciles de transportar todos los productos naturalmente necesarios. Por eso convinieron en dar y recibir recíprocamente en sus cambios algo que, siendo útil en sí mismo, fuera además de fácil manejo para la vida, como el hierro, la plata o algo semejante. (Aristóteles, Siglo IV a.C.)

Además, la satisfacción de ciertas necesidades como el afecto y el respeto, deben cumplirse de manera recíproca entre dos personas, por lo que su satisfacción requiere de un comportamiento no egoísta, pues se debe tener en consideración el bienestar del prójimo. De este modo, el ser humano no necesita maximizar sus riquezas ni ser completamente egoísta para alcanzar la felicidad.

Sumado a lo anterior, el comportamiento humano está sujeto a las expectativas culturales del entorno, y en distintas sociedades se han creado mecanismos, ya sea de manera consciente o inconsciente, para ayudar al prójimo y otros para evitar una excesiva acumulación de riqueza. A continuación estudiaremos algunos ejemplos de estos mecanismos en sociedades antiguas y medievales.

Un ejemplo de estos pueblos es el judío, cuyos integrantes no actúan basándose en el interés personal, o al menos no principalmente, sino de la voluntad y las normas marcadas por su dios, Yahvé. Por ejemplo, en el Deuteronomio se le impera a los fieles apartar la décima parte de su cosecha anual cada tres años para que el levita, los extranjeros, los huérfanos y las viudas que viven en su ciudad puedan alimentarse. También les ordena perdonar las deudas de sus deudores en el año sabático, es decir, cada siete años, y el párrafo siguiente apela a los fieles a ser caritativo y ayudar a los pobres: “Si hay junto a ti algún pobre de entre tus hermanos, en alguna de las ciudades de tu tierra que Yahvé tu Dios te va a dar, no endurezcas tu corazón ni cierres tu mano a tu hermano pobre; antes bien, le abrirás tu mano y le prestarás lo que necesite para remediar lo que le falta.”. A pesar de lo anterior, un contra-argumento en defensa del principio del egoísmo podría ser que los fieles no actúan de forma caritativa como un fin en si mismo, sino como un medio para conseguir la bendición de Yahvé, bendición que se menciona en el mismo libro. No obstante, ello no es a costa del prójimo sino que en su auyda.

En las ciudades medievales en Europa imperaba una jurisdicción propia y una organización autónoma dentro de las mismas, y ésta tenía en consideración el bienestar general de su población. Por ejemplo, todos los productos de primera necesidad debían llegar al mercado de la ciudad para que todos los habitantes pudieran abastecerse antes de que un comerciante pudiera adquirir los productos que sobraban, “y aún así su ganancia tenía que ser nada más una «ganancia honesta»” (Kropotkin, 1902). Sobre la Grecia Arcaica, Finley comenta que En el comercio o en cualquiera otra relación, había que acogerse al principio de igualdad y beneficio mutuo. La ganancia a expensas de otro pertenecía a un terreno diferente, al de la guerra y de la incursión, donde se obtenía por realización (o amenaza) de proezas, no por manipulaciones y regateos. (Finley, 1954)

Las normas mencionadas anteriormente no están basadas en la maximización, sino en el bien común y una limitación razonable de las ganancias que un comerciante podía obtener, o bien en el principio de beneficio mutuo en el caso de la Grecia Antigua, donde el lucro a expensas de otro griego iba contra la moral de dicha sociedad.

No obstante, el concepto de maximización no estaba ausente en la totalidad de civilizaciones antiguas. Aristóteles escribió sobre dos tipos de crematística: una natural, cuyo fin era “el vivir bien”, y otra antinatural, cuya finalidad era maximizar las riquezas como un fin en sí mismo. Sobre la antinatural, el filósofo comenta: “aquella crematística es comercial y productiva de dinero, no en general, sino mediante el cambio. Esta crematística comercial parece tener por objeto el dinero, ya que el dinero es el elemento y el término del cambio, y la riqueza resultante de esta crematística es ilimitada. (…) Por un lado, pues, resulta claro que toda riqueza debe tener un límite, pero de hecho vemos [18] que ocurre lo contrario, pues todos los que trafican aumentan su caudal indefinidamente.” (Aristóteles, Siglo IV a.C.). Este tipo de crematística surgió años después del período estudiado por Finley en “El mundo de Odiseo”, pero de todas formas el filósofo griego mantiene una actitud crítica respecto de ella y de quienes la practican.

Conclusiones

El ser humano busca satisfacer sus necesidades, pero la cantidad de recursos necesarios para dicho fin no es infinita, por lo que no es siempre necesario adquirir la máxima cantidad de dichos bienes. Además, varias de las sociedades históricas que estudiamos han confeccionado y aplicado un sistema de normas que fomenta la cooperación, incluso entre individuos que no forman parte del mismo núcleo familiar. Y aunque de todas formas existían personas que buscaban maximizar sus riquezas, constituían sólo una fracción de su respectiva sociedad y eran mal vistas por ésta. Lo anterior nos permite concluir que el deseo de maximizar bienes que proporcionan placer o felicidad no es universal en todos los seres humanos, ni en todas las culturas. No obstante, las personas que componen los sistemas estudiados se benefician de dichos sistemas, por lo que el presente comentario no demuestra que el interés en uno mismo o una misma no es un universal cultural. Una reflexión en profundidad sobre la última problemática mencionada, desde un punto de vista antropológico, podría involucrar el estudio de sociedades cuyos individuos sean ajenos a sí mismos, en caso de que existan.

Bibliografía

Aristóteles (Siglo IV a.C.) POLÍTICA: La economía: propiedad y crematística

Bentham, J. (1786) La psicología del hombre económico

Cortina, A. (1994) Ética de la empresa: claves para una nueva cultura empresarial. Trotta, Madrid

de Aquino, T. (Siglo XIII) Suma Teológica

Finley, M. (1954) El mundo de Odiseo

Kropotkin, P. (1902). Capítulo 5: Ayuda mutua en la ciudad medieval. En La ayuda mutua