O princípio do pombo afirma que
Se N itens forem colocados em caixas M , com N > M , pelo menos uma caixa deverá conter mais de um item.
Para muitos, esse princípio tem um status especial em comparação com outros enunciados matemáticos. Como EW Dijkstra escreveu ,
Está cercado por alguma mística. As provas de usá-lo são frequentemente consideradas algo especial, algo particularmente engenhoso.
O desafio
O objetivo deste desafio é ilustrar o princípio do buraco de pombo usando representações de arte ASCII. Especificamente:
- Tome como entrada
N
(número de itens) eM
(número de caixas), comN
não negativo eM
positivo.N
pode ser menor queM
(mesmo que o princípio não se aplique nesse caso). - Selecione aleatoriamente uma das possíveis atribuições de itens para caixas. Cada tarefa deve ter uma probabilidade diferente de zero de ser escolhida.
Produza uma representação artística ASCII da tarefa da seguinte maneira:
- Existem
M
linhas, cada uma correspondendo a uma caixa. - Cada linha começa com um caractere que não seja um espaço em branco, como
|
. - Após esse caractere, há outro caractere que não é de espaço em branco, como
#
, repetido quantas vezes houver itens nessa caixa.
- Existem
Considere, por exemplo N = 8
, M = 5
. Se o assigment selecionado de itens para caixas é 4
, 1
, 0
, 3
, 0
, a representação é
|####
|#
|
|###
|
Uma execução diferente (resultando em uma atribuição diferente) do mesmo programa pode dar
|#
|##
|#
|#
|###
Existe alguma flexibilidade em relação à representação; ver abaixo.
Regras específicas
O código deve teoricamente ser executado para quaisquer valores de N
e M
. Na prática, pode ser restringido pelo tamanho da memória ou pelas limitações do tipo de dados.
Como a observação da saída não é suficiente para determinar se todas as atribuições têm probabilidade diferente de zero , cada envio deve explicar como o código alcança isso, se não óbvio.
As seguintes variações de representação são permitidas:
- Qualquer par de caracteres diferentes, que não sejam espaços em branco, pode ser escolhido. Eles devem ser consistentes nas execuções do programa.
- Rotações de 90 graus da representação são aceitáveis. Novamente, a escolha deve ser consistente.
- Espaço em branco à direita ou à direita é permitido.
Como exemplo com um formato de representação diferente, para N = 15
, M = 6
os resultados de duas execuções do programa podem ser
VVVVVV
@@@@@@
@@ @@@
@ @@
@
ou
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
Da mesma forma, N = 5
, M = 7
poderia dar, usando uma outra variação da representação,
*
* * * *
UUUUUUU
ou
*** **
UUUUUUU
ou
*
* *
* *
UUUUUUU
Observe como o princípio não é aplicável neste caso, porque N
< M
.
Regras gerais
Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas.
A entrada pode ser obtida por qualquer meio razoável ; e com qualquer formato, como uma matriz de dois números ou duas seqüências diferentes.
Os meios e o formato de saída também são flexíveis. Por exemplo, a saída pode ser uma lista de cadeias ou uma cadeia com novas linhas; retornado como argumento de saída da função ou exibido em STDOUT. Neste último caso, não é necessário se preocupar com a quebra de linha causada pela largura limitada da exibição.
O menor código em bytes vence.