Задний план
В этикете ванной комнаты, касающемся имеющихся писсуаров, указывается, что следующий писсуар, который необходимо заполнить, должен быть таким, который сводит к минимуму общий дискомфорт. Общее уравнение дискомфорта задается следующей системой уравнений:
dist (x, y) = линейное расстояние между человеком x и человеком y в мочевых единицах дискомфорт (x) = сумма (1 / (dist (x, y) * dist (x, y))) для всех людей y, за исключением человека x total_Discomfort = сумма (дискомфорт (х)) для всех х
Более подробный документ, посвященный аналогичной (не точно такой же) проблеме, можно найти здесь: (Спасибо @Lembik за то, что предупредили меня об этом удивительном техническом описании!)
Ввод, вывод
Учитывая ввод пустых и полных писсуаров, выведите итоговый набор писсуаров с добавлением одного человека. Если есть галстук для позиции, писсуары должны заполнять слева направо. Вывод должен быть в том же формате, что и ввод.
- Если дан случай с полными писсуарами, верните ввод.
- На входе всегда будет определен хотя бы один писсуар.
Тестовые случаи
ВХОД -> ВЫХОД 1000001 -> 1001001 101010101 -> 111010101 100 -> 101 00000 -> 10000 1111111 -> 1111111 0100 -> 0101 101000 -> 101001
правила
Это код-гольф , поэтому выигрывает самый короткий код в байтах. Стандартные лазейки запрещены.
0100
и101000
в тестовых случаях (некоторые основанные на регулярных выражениях подходы работают на реальных тестовых случаях, но не будут работать на тех, которые все еще должны быть обработаны)Ответы:
Желе ,
1312 байтПопробуйте онлайн! или Проверьте все контрольные примеры.
объяснение
источник
MATL ,
191817 байтПопробуйте онлайн! Или проверьте все контрольные примеры (слегка измененный код).
объяснение
Достаточно рассчитать расстояние от каждой потенциальной новой позиции до уже занятой. Остальные расстояния не зависят от потенциальной новой позиции и поэтому составляют постоянный член, который можно игнорировать.
Давайте возьмем входные данные
[1 0 0 0 0 0 1]
в качестве примера.источник
JavaScript (ES6), 89 байт
Выходы путем изменения входного массива.
источник
R
837667 байтПросто понял, что я могу сэкономить несколько байтов, не потрудившись проверить, пустые ли писсуары кандидата. Непустые писсуары всегда возвращают
Inf
значение дискомфорта, поэтому они исключаются в ходе расчета. Кроме того, просто используется прямое индексирование, а неreplace
, так что это короче, но не так элегантно.объяснение
Мы читаем текущее состояние из стандартного ввода и называем его
x
. Мы предполагаем, что входные данные представляют собой последовательность1
s и0
s, разделенных пробелами или символами новой строки. Для целей объяснения, скажем, мы вводим1 0 0 0 0 0 1
.Мы заменяем значение
x
в определенном индексе на 1. Все, что[ ]
находится между, определяет , какой индекс лучше.Поскольку существующие писсуары неизменны, нам не нужно учитывать расстояния между ними. Нам нужно только рассмотреть расстояния между занятыми писсуарами и возможным новым. Таким образом, мы определяем показатели занятых писсуаров. Мы используем
which
функцию для возврата индексов логического вектора, которые естьTRUE
. При приведении к типу все числа в Rlogical
равныTRUE
нулю иFALSE
нулю. Простое выполнениеwhich(x)
приведет к ошибке типаargument to 'which' is not logical
, какx
и числовой вектор. Поэтому мы должны привести его к логическому.!
является функцией логического отрицания R, которая автоматически приводит к логическому. Применяя его дважды,!!x
получаем векторTRUE
иFALSE
указывая, какие писсуары заняты. (Альтернативные побайтно-эквивалентные приведения к логическому включают в себя логические операторы&
и|
и встроенные функцииT
иF
, например,F|x
илиT&x
и т. Д.!!x
Выглядит более восклицательным, поэтому мы будем использовать это.)Это в паре с
seq(x)
, который возвращает целочисленную последовательность от1
длиныx
, то есть все места писсуара (и, следовательно, все возможные места для рассмотрения).Теперь у нас есть индексы наших занятых писсуаров:
1 7
и наших пустых писсуаров1 2 3 4 5 6 7
. Мы передаем`-`
функцию вычитания вouter
функцию для получения «внешнего вычитания», которое представляет собой следующую матрицу расстояний между всеми писсуарами и занятыми писсуарами:Мы возносим это к
-2
власти. (Для тех, кто немного потерян, в ОП «дискомфорт» определяется как1 / (distance(x, y) * distance(x, y))
, что упрощает1/d(x,y)^2
, тd(x,y)^-2
. Е. )Возьмите сумму каждой строки в матрице.
Получите индекс наименьшего значения, то есть оптимальный писсуар. В случае нескольких наименьших значений возвращается первое (т.е. самое левое) значение.
И вуаля, у нас есть индекс оптимального писсуара. Мы заменяем значение в этом индексе в
x
с1
. В случае1111
ввода, не имеет значения, какой из них мы заменим, у нас все равно будет действительный вывод.Вернуть измененный ввод.
источник
PHP, 135 байт
Я уверен, что есть гораздо более быстрый способ сделать это, но у меня нечеткая голова и я не могу думать о ней!
Старый код
Код без минификации:
источник
Python 3
223222165 байтЛадно, я знаю, что это не самый красивый ответ, и я уверен, что его можно сыграть немного, но я просто возился и смотрел, что я могу сделать
Приветствую mbomb007 за советы по пробелам и компараторам. Кроме того, я увидел, что мой онлайн-счетчик символов берет все вкладки и превращает их в пробелы, так что количество намного меньше, чем у меня было изначально
Отображение исправленного пробела:
Оригинал:
Это ожидает, что строка, переданная ему 1 и 0, как
"10001"
и возвращает строку"10101"
Изменить: изменено
1/float((j-i)**2)
наfloat((j-i)**-2)
источник
!='1'
может быть<'1'
и=='1'
может быть>'0'
. Кроме того, рассмотрите этот советPython 3,
574471347 байтВозможно, я над этим еще поработаю, учитывая, что другое решение Python похоже на пятую часть этого: [.
Ну, теперь гораздо лучше, когда я узнал, что вы можете использовать одиночные пробелы.
источник
Python,
165163158147141140139 байтисточник
if"1"*len(p)==p:return p
чтобы сохранить байт