ACTUALIZACIÓN: Anuncios para los participantes .
ACTUALIZACIÓN 2: Resultados provisionales y anuncios .
Hola anuncia concurso de programación de nuevo! Los ganadores son premios esperados:
- Primer lugar: 3000 USD.
- Segundo lugar: 2000 USD.
- Tercer lugar: 1000 USD.
- El jurado puede, a su discreción, otorgar un premio especial de 400 USD.
- Si le envía a alguien un enlace a este concurso colocando nuestra dirección en CC, y esta persona toma el premio, recibirá la mitad del monto del premio (por supuesto, no en detrimento del premio del ganador). Para un ganador, solo una persona puede recibir dicho premio: el que envió el enlace primero.
Los autores de decisiones interesantes serán invitados a entrevistas.

Las reglas
Los términos de la competencia en inglés están disponibles
en GitHub . A continuación hay una traducción al ruso.
- Envíe soluciones utilizando este formulario . No se toman decisiones por correo electrónico.
- Las decisiones se toman hasta el 20 de julio de 2018 a las 23:59:59 UTC.
- Los resultados preliminares se publicarán el 27 de julio de 2018 y el anuncio final de los ganadores: 3 de agosto de 2018 .
- Puede enviar decisiones varias veces, pero de cada participante solo se considerará la decisión más reciente, enviada antes de la fecha límite para aceptar el trabajo.
- Para las pruebas, utilizaremos Node.js v10.4.1 (la versión actual en el momento de la publicación). Puede usar cualquier función de idioma admitida por el intérprete en la configuración estándar.
- Todo el código de la solución debe estar en un solo archivo JS .
- La solución debería estar en JS. Si prefiere CoffeeScript o lenguajes similares, debe traducir la solución en JS antes de enviarla.
- Si su archivo JS es un producto de generación, minificación y / o compilación de otros lenguajes como CoffeeScript, adjunte un archivo con los códigos fuente, así como, preferiblemente, una descripción del enfoque. El contenido de este archivo se publicará, pero no lo probaremos.
- No puede cargar ningún módulo , ni siquiera los incluidos en el Nodo.js. estándar.
- Un participante puede usar solo una dirección de correo electrónico para enviar una decisión. Está prohibido enviar múltiples decisiones en colusión desde diferentes direcciones; Todas las decisiones que participen en dicho esquema serán descalificadas.
- Necesitamos saber su nombre completo, pero si lo desea, publicaremos un alias en su lugar. Mantendremos su dirección de correo electrónico confidencial.
- Los empleados actuales y anteriores de Hola y sus familiares inmediatos solo pueden participar fuera de la competencia, sin reclamar premios.
- Haga preguntas sobre el estado de la tarea en los comentarios de esta publicación o por correo electrónico .
Comercio
Digamos que tenemos un libro, dos sombreros y tres bolas. Usted y otro participante deben decidir cómo compartir este bien entre ustedes dos. Para usted, el libro tiene un valor de $ 4, cada bola es de $ 2 y los sombreros no tienen valor. Para un compañero, estos mismos objetos pueden tener un valor diferente, pero usted sabe que todos los objetos juntos para él son tan valiosos como lo son para usted, en este caso $ 10.
Usted y el compañero se turnan para sugerir una sección para artículos. A su vez, uno de ustedes puede aceptar la oferta anterior (a menos que sea la primera etapa) o hacer una contraoferta. Las negociaciones se limitan a 5 rondas, en total, ambos participantes pueden presentar hasta 10 propuestas. Si se llega a un acuerdo durante este tiempo, cada uno de ustedes recibirá el valor total de los artículos que le quedan (cada uno de acuerdo con sus propios factores de valor). Si no se llega a un acuerdo, es decir, la última palabra en la última ronda es una contraoferta, y no el consentimiento, entonces nadie obtiene nada. Lo mismo sucede si uno de los socios interrumpe las negociaciones.
Aquí hay un ejemplo de cómo pueden ir las negociaciones:
- Tú: quiero un libro y dos bolas; Obtendrá una pelota y los dos sombreros.
- Socio: no estoy de acuerdo. Quiero todas las bolas y un sombrero; obtendrás un libro y un sombrero.
- Tú: no estoy de acuerdo. Quiero un libro y una pelota; obtendrás dos bolas y ambos sombreros.
- Socio: estoy de acuerdo.
No sabías esto, pero para el compañero el valor de los artículos era el siguiente: a $ 2 por bola, a $ 2 por sombrero, el libro no tiene valor. El acuerdo trajo $ 6 para usted y $ 8 para el socio.
En general, hay dos o más tipos de objetos y un número entero positivo de objetos de cada tipo. El valor de cada tipo de objeto para cada uno de los socios es un número entero no negativo. El valor total de todos los objetos es el mismo para ambos socios, aunque los valores de los objetos individuales varían. La propuesta para la división debe distribuir entre los socios todos los objetos sin dejar rastro; Los objetos individuales no están fragmentados.
Su tarea es escribir un guión que busque concluir un acuerdo con el mayor valor posible (para usted).
Soluciones
La solución es un módulo Node.js sin dependencias. La exportación del módulo debe ser una clase:
module.exports = class {
constructor(me, counts, values, max_rounds, log){
..
}
offer(o){
...
}
}
. :
me
— 0, , 1, .counts
— , . 2 10 .values
— , counts
, .max_rounds
— ( ).log
— , (console.log
).
offer
, .
o
— ,
counts
. , . , ,
o
undefined
.
offer
undefined
, ( ,
o
undefined
). ,
counts
, , . ,
o
,
offer
.
1 . , , , , .
, , .
example.js , . , ; , .
log
.
haggle.js -, .
--help
, . ( ,
npm install
src
.)
, . , , , , , , . . , «» «», , .
: 3 , 6 , $10, 5 . , , .
c3.large (. ) Amazon AWS Ubuntu 14.04 (amd64). .
, ; (
). , , , (
--log
).
, . -: «», .
(3 , 6 , $10, 5 ). 1 , . :
wss://hola.org/challenges/haggling/arena/standard
haggle.js
, - .
--id
: , .
.
. «» ,
.
— . , . - , .
, , -, , UNIX shell:
while true; do node haggle.js --id me@example.com:1234abcd myscript.js wss://hola.org/challenges/haggling/arena/standard; done
. !
, , . , ; , ; CoffeeScript , , . README (-). tar.gz, tar.bz2 zip. , ( JS-, ).
JS- 64 . , , - «» . 64 , , .
, , ,
.
!