fundo
O chamado "Protocolo do Urinol", que descreve a ordem em que os urinóis individuais são colhidos no banheiro masculino, foi discutido em vários lugares. Uma versão é fornecida nesta postagem do blog xkcd . Esta pergunta diz respeito a uma ligeira variação:
Arranjo : n mictórios em uma linha.
Protocolo : cada nova pessoa seleciona um dos mictórios mais distantes daqueles já em uso.
Observe que isso não impõe restrições sobre a escolha do mictório pela primeira pessoa.
Atualização : A sequência do número de maneiras diferentes pelas quais n pessoas podem selecionar n urinóis começa com 1, 2, 4, 8, 20 ... Observe que isso não é o mesmo que OEIS A095236 , que descreve restrições um pouco mais rigorosas do que neste questão.
Tarefa
Dado um número n entre 0 e 10, produza (em qualquer ordem) todas as ordens possíveis nas quais n pessoas podem ocupar n urinóis. Cada pedido deve ser impresso como o arranjo final: uma sequência de dígitos representando as pessoas (1-9 para as primeiras 9 pessoas, 0 para o décimo), começando no urinol mais à esquerda, com separadores não alfanuméricos opcionais entre (mas não antes) ou depois) os dígitos. Por exemplo, as seguintes saídas são válidas:
>> 3
132
213
312
231
>> 4
1|3|4|2
1|4|3|2
3|1|4|2
4|1|3|2
2|3|1|4
2|4|1|3
2|3|4|1
2|4|3|1
Você pode escrever um programa ou função, recebendo informações via STDIN (ou alternativa mais próxima), argumento de linha de comando ou argumento de função. Os resultados devem ser impressos em STDOUT (ou alternativa mais próxima).
Pontuação
O menor código vence. Aplicam-se os termos e condições padrão.
fonte
span
comprimento 1, onde há umspan
comprimento 2 disponível. De repente, consegui me confundir. Parece que o OP é intencionalmente derivado do link e, portanto, o link deve ser seguido?Respostas:
Pyth,
5351Essa é uma abordagem iterativa. Dado um possível conjunto de locais ordenados parcialmente preenchidos, encontramos todos os locais adicionais ideais, depois geramos a lista de locais correspondentes e repetimos.
Os resultados são gerados no formulário e
[<first person's location>, <second person's location> ...]
, em seguida, isso é transformado no formato desejado.MhSm^-dG2H
define uma função auxiliar que encontra as distâncias mínimas de uma determinada paralisação a uma paralisação ocupada (ao quadrado). Divertidamente, o separador é gratuito.Exemplo de execução.
Explicação:
Primeiro, a função auxiliar
g
, que encontra a distância quadrática mínima entre G e qualquer valor em H.Em seguida, encontramos as localizações máximas acima do urinol da distância quadrática mínima entre esse urinol e qualquer urinol ocupado:
(
Q
é a entrada.)d
neste caso, é a lista de mictórios ocupados, enquantob
itera sobre os locais do mictório.Em seguida, encontramos todos os locais do urinol cuja distância ao quadrado mínima do urinol ocupado mais próximo é igual ao valor máximo encontrado acima.
Em seguida, geraremos as listas de locais do mictório criadas adicionando os locais do mictório encontrados acima a
d
. Faremos isso para cada lista anterior de localizações de urinol, estendendo assim as listas de comprimentoN
paraN+1
.G
é a lista de listas legais de locais de mictório ocupados de um determinado comprimento.Em seguida, aplicaremos a expressão acima repetidamente, para gerar a lista completa de listas de locais ocupados no mictório.
u
, a função reduzir, faz exatamente isso, quantas vezes houver elementos em seu segundo argumento.Converta da representação acima, que vai
[<1st location>, <2nd location>, ... ]
para o formato de saída desejado[<person in slot 1>, <person in slot 2>, ... ]
,. Em seguida, o formulário de saída é unido à string de saída e impresso. A impressão está implícita.fonte
kajsdlkas^23asdjkla1lasdkj~JZasSSA
- quase metade do tamanho.Pitão,
757167Solução combinatória recursiva.
É uma tradução bastante direta desta solução Python:
fonte
C,
929878 bytesEste é um monstro, pessoal. Desculpe.
Define 3 funções,
f(int*,int)
,P(int*,int,int,int,int)
, eL(int)
. LigueL(n)
e ele gera STDOUT.Saída para
n=5
:Atualização: removi os separadores e consertei o código. O código antigo não apenas falhou para n = 7 +, mas também não produziu nada para n = 10 (oops!). Eu testei mais detalhadamente esse grupo. Agora ele suporta entradas de até n = 13 (embora a
"%d"
alteração deva ser alterada para"%x"
para que seja impresso em hexadecimal). O tamanho da entrada dependesizeof(long)
e supõe-se que esteja8
na prática.Aqui está uma explicação de como funciona e por que existe uma restrição tão estranha:
Como eles foram usados muito, por isso os definimos para salvar alguns bytes:
typedef unsigned long U; typedef unsigned char C;
Aqui está
f
:f
pega uma matriz de números inteiros de tamanhon
en
ela própria. A única parte inteligente aqui é que ele retorna umunsigned long
, que é convertido em umchar[8]
pela função de chamada. Cada caractere na matriz é, portanto, definido como0xFF
ou para um índice apontando para um urinol válido para a próxima pessoa. Poisn<10
, nunca precisamos de mais de 5 bytes para armazenar todos os urinóis válidos que a próxima pessoa possa usar.Aqui está
P
:P
usa uma matrizu
de tamanhon
em que exatamente um elemento está definido como1
e o restante está0
. Em seguida, ele encontra e imprime todas as permutações possíveis recursivamente.Aqui está
L
:L
simplesmente chamaP
n
horários com diferentes posições iniciais a cada vez.Para os interessados, isso (menos golfe)
f
gerará a sequência em A095236 .fonte
14352
pessoa número 1 escolheu o urinol mais à esquerda. A pessoa 2 escolheu a mais à direita, que forçou a terceira a entrar no meio. Não é o número do mictório escolhido a seguir que deve ser produzido.Python 2, 208
Abordagem recursiva.
fonte
JavaScript (ES6) 153
160 169Edite usando o Math.min para encontrar (é claro) a distância máxima: código simplificado e 16 bytes salvos.
Pesquisa recursiva, pode trabalhar com n> 10, basta remover% 10 (e esteja preparado para aguardar enquanto o console desenrola toda a sua saída).
Eu uso uma única matriz para armazenar o slot em uso (números positivos) ou a distância atual do slot mais próximo (números negativos
<
e>
são trocados no código).Ungolfed
Teste no console Firefox / FireBug
fonte
Mathematica,
123104fonte
n~f~s~Join~{#}
se tornaráJoin[f[n,s],{#}]
.MATLAB, 164
fonte
Perl, 174
Não é muito curto, mas divertido. Não estou contando
use feature 'say';
para o total de bytes.De-golfe:
fonte
C, 248 bytes
Esse código usa um algoritmo recursivo para gerar o resultado desejado.
Expandido:
fonte
Bash,
744674 bytesAinda é muito longo :). Uso uma string para representar a fila de mictórios e um algoritmo de inundação para encontrar os mictórios mais distantes em cada fase da recursão. O código não destruído é quase autoexplicativo. O número de mictórios é lido no teclado.
Código (golfed):
Usar:
E não destruído, ele diz:
fonte