A situação:
Vários ( M
) anões encontraram o baú de um goblin com N
moedas de ouro e precisam dividi-las. Devido às regras antigas que regem a alocação de pilhagem aos piratas em ordem de antiguidade, o anão mais velho deve receber uma moeda a mais que o próximo anão mais antigo, e assim por diante, para que o anão mais novo receba M-1
menos moedas que o anão mais antigo. Além disso, nenhum anão precisa arremessar moedas (ou seja, nenhuma moeda negativa para anões)
Ajude os anões a dividir as moedas dessa maneira, ou diga a eles que isso é impossível.
O código do vencedor deve sempre responder corretamente (esse desafio é determinístico) e seguir as regras gerais do código-golfe .
Entrada
Você recebe um número inteiro N (3 ≤ N ≤ 1000) para o número de moedas e um número inteiro M (3 ≤ M ≤ N) para o número de anões, separados por espaço.
Saída
Se for impossível dividir as moedas da maneira que os anões querem, imprima -1 (menos uma). Caso contrário, imprima o número de moedas que cada anão receberá, do mais antigo para o mais novo. Separe os números com espaços.
Amostras :
entrada
3 3
saída
2 1 0
entrada
9 3
saída
4 3 2
entrada
7 3
saída
-1
entrada
6 4
saída
3 2 1 0
Respostas:
J -
32.2928.25Nãomais curto que outra solução J,mase usa uma ideia diferenteA resposta para o número de moedas que o gnomo mais alto está recebendo é simples
N/M+(M-1)/2
(se for um número inteiro), construímos o negativo disso-:@-.@]-%
. Em seguida,i:
cria um array como esse2 1 0 _1 _2
para o argumento_2
e extraímos elementos M dele.fonte
i:
. Você pode salvar outros três caracteres escrevendo em%
vez de[%]
e usando em-.@]
vez de(1-])
.J - 30 caracteres
Muito divertido de golfe. Muitas coisas deram certo.
Explicação:
/
- Pegue os números inteiros separados por espaço como argumento e insira a função entre eles. Ou seja, considere N o argumento da esquerda para a função entre colchetes(...)
e M o argumento da direita.i.&-
- Negue (-
) e depois pegue números inteiros (i.
). Normalmente, quando você faz algo comoi.5
você recebe0 1 2 3 4
. Sempre quei.
recebe um número negativo, no entanto, ele reverte essa lista de saída. Então, por exemplo,i._5
vai dar4 3 2 1 0
.s=.+/&
- Execute a ação acima em cada argumento (&
) e faça uma tabela de adição (+/
) com essas matrizes. Agora temos uma tabela em que cada linha é uma possível distribuição de moedas para M anões, embora talvez não quando haja N moedas. Finalmente, esse verbo de criação de tabela é tão útil que vamos chamá-los
e usá-lo novamente mais tarde.+/@s~
- Agora, usamoss
novamente, mas trocamos (~
) a ordem dos argumentos, para que possamos transpor a tabela. Esta é uma maneira prática de obter a soma de cada linha após criar a tabela (+/@
), relacionada à maneira como J soma listas multidimensionais.i.[
- Nesta lista de somas, procuramos o argumento esquerdo do verbo, ou seja, N. Se N é um item, obtemos o índice: caso contrário, obtemos o comprimento da lista, que é notavelmente um índice inválido.{ ::_1:
- Agora tentamos usar o índice para extrair uma linha da tabelas
.{
lançará um erro de domínio se o índice for inválido; nesse caso, capturamos o erro (::
) e retornamos -1 (_1:
). Isso lida com tudo. Como usamosi.&-
anteriormente, a distribuição das moedas estará em ordem decrescente, conforme necessário.Uso:
fonte
9 3
deve retornar4 3 2
, não-1
. Parece que há uma transposição no seu exemplo de uso?9 3
dá4 3 2
e7 3
dá_1
, como esperado.R -
7170676665 caracteresUngolfed:
Solução:
Se M o número de anões, a sequência de ouro pago pode ser decomposta em duas séries singulares. Primeiro, uma série que termina em zero: M-1, ..., 2, 1, 0 e uma série constante de c, c, ..., c. A soma da primeira série é sempre M * (M-1) / 2. Portanto, se o restante (x = N - M * (M-1) / 2) puder ser dividido sem o restante (módulo igual a 0), cada anão recebe x / M mais a parte da série decrescente.
Uso:
fonte
m*(m+1)/2
porsum(1:m)
PHP (187)
É a minha primeira tentativa de jogar golfe, e sei que poderia ser melhor, mas ainda assim :)
Golfe:
Ungolfed:
Executar em um shell
Ideia básica:
As moedas podem ser separadas por essas regras, se uma delas for verdadeira:
Nesse caso, tomamos como base as moedas médias por anão (ACPD). Mas temos que começar do mais alto e produzir até chegarmos ao mais baixo. Então, fazemos um loop com um contador que começa em ACPD + a contagem do resto dos anões no final mais alto e continuamos até chegarmos ao ACPD - a contagem do restante dos anões no final mais baixo.
É basicamente o mesmo se os anões forem ímpares (ou seja, 5 anões - o do meio é 3, e em ambas as extremidades permanecem 2), mas não se forem pares - é por isso que confiamos no chão E na volta.
Problemas até agora: funciona com número de moedas muito baixo, o que significa que alguns anões serão derrubados e roubados de seus ganhos preciosos. E isso é triste. Ou pelo menos se você gosta de anões.
Solução :
Solução mais inteligente :
Moedas são de metal. Faça os anões derreterem todos e depois jogue-os em uma quantidade menor / maior de moedas, para que sejam divisíveis em qualquer caso.
Solução mais inteligente :
Roube a montanha deles, mude o nome para Smaug e guarde tudo por si. Afinal, por que você tem que se preocupar com anões rabugentos?
fonte
Python 3 (100)
Usando a mesma idéia que o @Geobits, mas em conformidade com os requisitos de entrada e saída.
fonte
Python 3 -
1091071031029093Usando a mesma idéia que o Evpok, mas com várias melhorias.
As melhorias são:
fonte
[::-1]
é melhor do que minha solução. +1Python 3-114
Funciona verificando se
N-(M*(M-1)/2)
é igualmente divisível porM
. Novo no python, então qualquer dica é apreciada.Exemplo de Ideone.com
fonte
print
estilo de declaração do Python 2 ? Ou como a última linha (else:print -1
) não resulta em erro?C # - 322
Pontuação horrível, mas tomei uma abordagem diferente e comecei a usar
goto
:)Vou encurtá-lo mais tarde.
fonte
Convert.ToInt16
chamadas para apenasint.Parse
. Você pode declarar qualquer variável pré-atribuída comvar
(em vez de, por exemploint[]
). Seus parâmetros de linha de comando não precisam ser chamadosargs
. E você pode também usar os tipos usados com frequênciausing C = Console
. Também acho que, para uma solução por tanto tempo, é melhor apresentar o espaçamento entre linhas intacto, em vez de salvar apenas alguns caracteres. Oh, e eu não sou realmente certo porquegoto
é melhor do que as alternativas aqui, ou ...Java 210
fonte
class A{public static void main(String[]a)
é válido e economiza 3 caracteres. Após cadaif
, e em torno de cadafor
, remova o espaço em branco ... etcR:
777370 caracteresCrie um vetor que vai de (M-1) a 0 e adiciona 1 a cada número até que a soma não seja mais inferior a N. Se for superior, a saída -1 ou outra saída gera o vetor.
Recuado e levemente sem golfe:
Exemplo de uso:
fonte
Julia, 45
Apenas um pouco de álgebra, me levou muito mais tempo do que deveria.
fonte
JavaScript - 76
Provavelmente eu poderia ter escrito isso mais curto em outro idioma, mas ainda não havia uma solução JS, então aqui está:
Execute no console.
Exemplo de entrada:
Saída:
Entrada:
Saída:
Entrada:
Saída: -1
Pena que o console.log demora tanto para escrever :) Infelizmente, declarar
l=console.log.bind(console)
não o torna mais curto e simplesmentel=console.log
não funciona.Entrada:
Saída:
fonte
c=console
ec.log()
encurtar.Golfscript, 35
Como funciona
No exemplo a seguir, a entrada é
9 3
.fonte
Delphi XE3 (176)
Como funciona.
Lê 2 números inteiros, moedas e anões.
Subtrai a diferença por anão.
Se o resto do mod anões> 0 é impossível.
Caso contrário, obtenha compartilhamento igual por anão em um loop de anões-1 a 0 e imprime dwarfIndex + compartilhamento igual
Ungolfed
fonte
Mathematica 65
A função,
g
gera todas as seqüências de aumento por uma, de comprimento m, de 0 a n e verifica se alguma delas soma m. Se for bem-sucedida, a sequência será retornada; caso contrário, -1 é retornado.As sequências são feitas por
Partition
inserindo a lista {0,1,2,3… m} em todas as sublistas possíveis de n números inteiros contíguos.É claro que existem maneiras mais eficientes de obter o mesmo efeito, mas as que encontrei exigem mais código.
Exemplos
fonte
C 131
Ungolfed
Isso é compilado com um aviso porque main não tem tipo. Se isso não for válido nas regras do golfe, eu teria que adicionar cinco caracteres.
fonte
Cobra - 198
Site Cobra
Explicado:
Necessário para a execução do código
Recebe e armazena como
a
eb
Inicializa a lista de saída
l
e inicializa o dinheiro total necessáriot
e o número de moedas para adicionar a cada pilha de anõesn
Encontra o menor valor monetário possível que resultará em todos os anões com um número permitido de moedas em sua pilha
Determina quantas moedas serão adicionadas a cada pilha para que o dinheiro total necessário seja> = ao dinheiro total disponível
Preenche a lista com as pilhas de dinheiro de diferentes tamanhos
Gera
-1
oul
depende se o dinheiro total necessário é igual ao dinheiro total disponívelfonte
Perl 5 , 78 + 1 (-n) = 79 bytes
Experimente online!
fonte
Python (
1009694):Uma boa resposta com pontuação.Não é mais, mas é mais curto agora.Ungolfed:
Saída:
fonte