ATUALIZAÇÃO: Anúncios para os participantes .
ATUALIZAÇÃO 2: Resultados e anúncios intermediários .
Hola Anuncia Concurso de Programação Novamente! Os vencedores são prêmios esperados:
- Primeiro lugar: 3000 USD.
- Segundo lugar: 2000 USD.
- Terceiro lugar: 1000 USD.
- O júri poderá, a seu critério, atribuir um prêmio especial de 400 USD.
- Se você enviar a alguém um link para este concurso colocando nosso endereço no CC, e essa pessoa receber o prêmio, você receberá metade do valor do prêmio (é claro, não em detrimento do prêmio do vencedor). Para um vencedor, apenas uma pessoa pode receber esse prêmio - aquele que enviou o link primeiro.
Autores de decisões interessantes serão convidados para entrevistas.

As regras
Os termos da competição em inglês estão disponíveis
no GitHub . Abaixo está uma tradução para o russo.
- Envie soluções usando este formulário . Nenhuma decisão é tomada por email.
- As decisões são tomadas até 20 de julho de 2018 , 23:59:59 UTC.
- Os resultados preliminares serão publicados em 27 de julho de 2018 e o anúncio final dos vencedores - 3 de agosto de 2018 .
- Você pode enviar decisões várias vezes, mas a partir de cada participante apenas a decisão mais recente será considerada, enviada antes do prazo final para aceitação do trabalho.
- Para o teste, usaremos o Node.js. v10.4.1 (a versão atual no momento da publicação). Você pode usar qualquer recurso de idioma suportado pelo intérprete na configuração padrão.
- Todo o código da solução deve estar em um único arquivo JS .
- A solução deve estar em JS. Se você preferir o CoffeeScript ou idiomas semelhantes, deve traduzir a solução em JS antes de enviar.
- Se o seu arquivo JS é um produto de geração, minificação e / ou compilação de outras linguagens como o CoffeeScript, anexe um arquivo com códigos-fonte e, de preferência, uma descrição da abordagem. O conteúdo deste arquivo será publicado, mas não será testado.
- Você não pode carregar nenhum módulo , mesmo aqueles incluídos no Node.js. padrão.
- Um participante pode usar apenas um endereço de email para enviar uma decisão. É proibido enviar várias decisões em conluio de diferentes endereços; Todas as decisões que participam desse esquema serão desqualificadas.
- Precisamos saber seu nome completo, mas se você quiser, publicaremos um apelido. Manteremos seu endereço de e-mail confidencial.
- Os atuais e antigos funcionários da Hola e seus familiares imediatos podem participar apenas fora da competição, sem reivindicar prêmios.
- Faça perguntas sobre as condições da tarefa nos comentários desta publicação ou por email .
Comércio
Digamos que temos um livro, dois chapéus e três bolas. Você e outro participante devem decidir como compartilhar esse bem entre vocês dois. Para você, o livro tem um valor de US $ 4, cada bola custa US $ 2 e os chapéus não têm valor. Para um parceiro, esses mesmos objetos podem ter um valor diferente, mas você sabe que todos os objetos juntos para ele são tão valiosos quanto para você - nesse caso, US $ 10.
Você e o parceiro se revezam sugerindo uma seção para itens. Por sua vez, um de vocês pode aceitar a oferta anterior (a menos que seja o primeiro estágio) ou fazer uma contraproposta. As negociações são limitadas a 5 rodadas, no total, os dois participantes podem apresentar até 10 propostas. Se um acordo for alcançado durante esse período, cada um de vocês receberá o valor total dos itens que o deixam (cada um de acordo com seus próprios fatores de valor). Se um acordo não for alcançado, ou seja, a última palavra na última rodada é uma contraproposta e não consentimento, ninguém recebe nada. O mesmo acontece se um dos parceiros interromper as negociações.
Aqui está um exemplo de como as negociações podem ser:
- Você: eu quero um livro e duas bolas; Você receberá uma bola e os dois chapéus.
- Parceiro: eu não concordo. Quero todas as bolas e um chapéu; você receberá um livro e um chapéu.
- Você: eu não concordo. Eu quero um livro e uma bola; você receberá duas bolas e os dois chapéus.
- Parceiro: eu concordo.
Você não sabia disso, mas para o parceiro o valor dos itens era o seguinte: a US $ 2 por bola, a US $ 2 por chapéu, o livro não tem valor. O contrato trouxe US $ 6 para você e US $ 8 para o parceiro.
Em geral, existem dois ou mais tipos de objetos e um número inteiro positivo de objetos de cada tipo. O valor de cada tipo de objeto para cada um dos parceiros é um número inteiro não negativo. O valor total de todos os objetos é o mesmo para ambos os parceiros, embora os valores de objetos individuais variem. A proposta da divisão deve distribuir entre os parceiros todos os objetos sem deixar vestígios; objetos individuais não são fragmentados.
Sua tarefa é escrever um script que procure concluir um acordo com o maior valor possível (para você).
Soluções
A solução é um módulo Node.js sem dependências. A exportação do módulo deve ser uma classe:
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 , , .
, , ,
.
!