fundo
A etiqueta do banheiro, ao pertencer aos mictórios disponíveis, afirma que o próximo mictório a ser preenchido deve ser o que minimiza o desconforto total. A equação de desconforto total é dada pelo seguinte conjunto de equações:
dist (x, y) = distância linear entre a pessoa x e a pessoa y em unidades de mictório desconforto (x) = soma (1 / (dist (x, y) * dist (x, y))) para todas as pessoas y excluindo a pessoa x total_Desconforto = soma (desconforto (x)) para todos os x
Um artigo mais aprofundado que lida com um problema semelhante (não exatamente o mesmo) pode ser encontrado aqui: (Obrigado ao @Lembik por me alertar sobre este incrível whitepaper!)
Entrada / Saída
Dada a entrada de um mictório vazio e cheio, produza o conjunto resultante de mictórios com a adição de uma pessoa. Se houver um empate em uma posição, os mictórios devem ser preenchidos da esquerda para a direita. A saída deve estar no mesmo formato que a entrada.
- Se houver um caso com mictórios cheios, retorne a entrada.
- A entrada sempre terá pelo menos um urinol definido.
Casos de teste
ENTRADA -> SAÍDA 1000001 -> 1001001 101010101 -> 111010101 100 -> 101 00000 -> 10000 1111111 -> 1111111 0100 -> 0101 101000 -> 101001
Regras
Isso é código-golfe , então o código mais curto em bytes vence. São proibidos os orifícios padrão.
0100
e101000
nos casos de teste (alguns baseados em regex trabalho abordagem sobre os casos de teste reais, mas não funcionará em aqueles que ainda deve ser manuseado)Respostas:
Geléia ,
1312 bytesExperimente online! ou Verifique todos os casos de teste.
Explicação
fonte
MATL ,
191817 bytesExperimente online!Ou verifique todos os casos de teste (código ligeiramente modificado).
Explicação
Basta calcular a distância de cada nova posição potencial até as já ocupadas. As distâncias restantes não dependem da nova posição potencial e, portanto, constituem um termo constante, que pode ser ignorado.
Vamos dar
[1 0 0 0 0 0 1]
um exemplo como exemplo.fonte
JavaScript (ES6), 89 bytes
Saídas modificando a matriz de entrada.
fonte
R,
837667 bytesAcabei de perceber que posso salvar vários bytes, sem me preocupar em verificar se os mictórios candidatos estão vazios. Mictórios não vazios sempre retornam um
Inf
valor de desconforto, portanto são excluídos no decorrer do cálculo. Além disso, basta usar a indexação direta em vez dereplace
, portanto, é mais curto, mas menos elegante.Explicação
Lemos o estado atual de stdin e o chamamos
x
. Nós assumimos que a entrada é uma sequência de1
s e0
s separados por espaços ou novas linhas. Para os fins da explicação, digamos que inserimos1 0 0 0 0 0 1
.Substituímos um valor de
x
um índice específico por 1. Tudo entre o[ ]
é descobrir qual é o melhor índice.Como os mictórios existentes são imutáveis, não precisamos considerar as distâncias entre eles. Só precisamos considerar as distâncias entre os mictórios ocupados e o possível novo. Então, determinamos os índices dos mictórios ocupados. Usamos
which
uma função para retornar os índices de um vetor lógico que sãoTRUE
. Todos os números em R, quando forçados a digitarlogical
, sãoTRUE
diferentes de zero eFALSE
zero. Simplesmentewhich(x)
resultará em um erro de tipoargument to 'which' is not logical
, comox
é um vetor numérico. Portanto, temos que coagi-lo à lógica.!
é a função de negação lógica de R, que obriga automaticamente a lógica. A aplicação duas vezes,!!x
produz um vetor deTRUE
eFALSE
indicando quais mictórios estão ocupados. (Coerções alternativas equivalentes a bytes para lógicas envolvem os operadores lógicos&
e|
e os builtinsT
eF
, por exemplo,F|x
ouT&x
e assim por diante.!!x
Aparência mais exclamatory por isso vamos usar isso.)Isso é emparelhado com
seq(x)
, que retorna a sequência inteira1
do comprimento dex
, ou seja, todos os locais do mictório (e, portanto, todos os locais possíveis a serem considerados).Agora temos os índices de nossos mictórios ocupados:
1 7
e nossos mictórios vazios1 2 3 4 5 6 7
. Passamos`-`
, a função de subtração, para aouter
função de obter a "subtração externa", que é a seguinte matriz de distâncias entre todos os urinóis e os urinóis ocupados:Nós elevamos isso ao
-2
poder th. (Para aqueles que estão um pouco perdidos, no OP, "desconforto" é definido como1 / (distance(x, y) * distance(x, y))
, o que simplifica para1/d(x,y)^2
, ied(x,y)^-2
.)Pegue a soma de cada linha na matriz.
Obtenha o índice do menor valor, ou seja, o urinol ideal. No caso de vários valores menores, o primeiro (ou seja, mais à esquerda) é retornado.
E, voilà, temos o índice do mictório ideal. Substituímos o valor nesse índice
x
por1
. No caso de1111
como entrada, não importa qual substituímos, ainda teremos uma saída válida.Retorne a entrada modificada.
fonte
PHP, 135 bytes
Tenho certeza de que há uma maneira consideravelmente mais rápida de fazê-lo, mas tenho uma cabeça confusa e não consigo pensar em uma!
Código antigo
O código sem minificação:
fonte
Python 3
223222165 bytesOk, eu sei que essa não é a resposta mais bonita do mundo, e eu tenho certeza que ela pode ser um pouco melhor, mas eu estava apenas brincando e vendo o que eu poderia fazer
Grite ao mbomb007 para obter dicas sobre espaços em branco e comparadores Além disso, eu vi meu contador de caracteres on-line pegando todas as guias e as transformando em espaços, então a contagem é muito menor do que eu originalmente
Mostrando espaço em branco revisado:
Original:
Isso espera que uma string seja passada de 1 e 0
"10001"
e retorne uma string"10101"
Editar: alterado
1/float((j-i)**2)
parafloat((j-i)**-2)
fonte
!='1'
pode ser<'1'
e=='1'
pode ser>'0'
. Além disso, considere esta dicaPython 3,
574471347 bytesProvavelmente vou trabalhar nisso um pouco mais, considerando que a outra solução Python é como um quinto desta: [.
Bem, isso é muito melhor agora que aprendi que você pode usar espaços únicos.
fonte
Python,
165163158147141140139 bytesfonte
if"1"*len(p)==p:return p
para salvar um byte