tło
Etykieta łazienki, jeśli chodzi o dostępne pisuary, stwierdza, że następny pisuar, który należy wypełnić, powinien być taki, który minimalizuje całkowity dyskomfort. Równanie całkowitego dyskomfortu daje następujący zestaw równań:
dist (x, y) = liniowa odległość między osobą x a osobą y w dyskomfortu w pisuarach (x) = suma (1 / (dist (x, y) * dist (x, y))) dla wszystkich osób y bez osoby x total_Discomfort = suma (dyskomfort (x)) dla wszystkich x
Bardziej szczegółowy artykuł na temat podobnego (nie dokładnie takiego samego) problemu można znaleźć tutaj: (Dzięki @Lembik za powiadomienie mnie o tym niesamowitym papierze!)
Wejście wyjście
Biorąc pod uwagę wkład pustych i pełnych pisuarów, wypisz wynikowy zestaw pisuarów z dodatkiem jednej osoby. W przypadku remisu na pozycji pisuary powinny być wypełniane od lewej do prawej. Dane wyjściowe powinny mieć taki sam format jak dane wejściowe.
- Jeśli podano skrzynkę z pełnymi pisuarami, zwróć dane wejściowe.
- Na wejściu zawsze będzie zdefiniowany przynajmniej jeden pisuar.
Przypadki testowe
WEJŚCIE -> WYJŚCIE 1000001 -> 1001001 101010101 -> 111010101 100 -> 101 00000 -> 10000 1111111 -> 1111111 0100 -> 0101 101000 -> 101001
Zasady
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach. Standardowe otwory na pętle są zabronione.
0100
i101000
w przypadkach testowych (niektóre podejście oparte na wyrażeniach regularnych działa na rzeczywistych przypadkach testowych, ale nie działa na tych, które nadal powinny być obsługiwane)Odpowiedzi:
Galaretka ,
1312 bajtówWypróbuj online! lub Zweryfikuj wszystkie przypadki testowe.
Wyjaśnienie
źródło
MATL ,
191817 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe (nieznacznie zmodyfikowany kod).
Wyjaśnienie
Wystarczy obliczyć odległość od każdej potencjalnej nowej pozycji do już zajętych. Pozostałe odległości nie zależą od potencjalnej nowej pozycji, a zatem stanowią stały element, który można zignorować.
Weźmy
[1 0 0 0 0 0 1]
za przykład przykład.źródło
JavaScript (ES6), 89 bajtów
Wyjście poprzez modyfikację tablicy wejściowej.
źródło
R,
837667 bajtówWłaśnie zdałem sobie sprawę, że mogę zaoszczędzić kilka bajtów, nie zawracając sobie głowy sprawdzaniem, czy pisuary kandydatów są puste. Niepuste pisuary zawsze zwracają
Inf
wartość dyskomfortu, dlatego są one wykluczane w trakcie obliczeń. Ponadto, zamiast bezpośredniego indeksowaniareplace
, jest krótszy, ale mniej elegancki.Wyjaśnienie
Odczytujemy bieżący stan ze standardowego wejścia i nazywamy go
x
. Zakładamy, że wkład jest sekwencją1
si0
y znak spacji lub znakami nowej linii. Dla celów wyjaśnienia załóżmy, że wprowadzamy1 0 0 0 0 0 1
.Zastępujemy wartość
x
określonego indeksu wartością 1. Wszystko pomiędzy[ ]
zastanawia się, jaki jest najlepszy indeks.Ponieważ istniejące pisuary są niezmienne, nie musimy brać pod uwagę odległości między nimi. Musimy tylko wziąć pod uwagę odległości między zajętymi pisuarami i możliwym nowym. Tak więc określamy wskaźniki zajmowanych pisuarów. Używamy
which
funkcji do zwracania indeksów wektora logicznegoTRUE
. Wszystkie liczby w R po wymuszeniu wpisanialogical
sąTRUE
niezerowe iFALSE
zerowe. Po prostu zrobieniewhich(x)
spowoduje błąd typuargument to 'which' is not logical
, podobnie jakx
wektor numeryczny. Musimy zatem zmusić to do logiki.!
to funkcja logicznej negacji R, która automatycznie zmienia się w logiczną. Zastosowanie go dwukrotnie!!x
daje wektorTRUE
iFALSE
wskazując, które pisuary są zajęte. (Alternatywne bajt równoważne coercions logicznemu obejmować operatorów logicznych&
i|
i przy pomocy poleceń wbudowanychT
iF
npF|x
alboT&x
i tak dalej.!!x
Wygląda bardziej wykrzyknikowy więc użyjemy tego.)Jest to sparowane z
seq(x)
, co zwraca sekwencję całkowitą od1
długościx
, tj. Wszystkich lokalizacji pisuaru (a więc wszystkich możliwych lokalizacji do rozważenia).Teraz mamy wskaźniki naszych zajętych pisuarów
1 7
i naszych pustych pisuarów1 2 3 4 5 6 7
. Przekazujemy`-`
funkcję odejmowania doouter
funkcji, aby uzyskać „odejmowanie zewnętrzne”, która jest następującą macierzą odległości między wszystkimi pisuarami a zajętymi pisuarami:Podnosimy to do
-2
potęgi. (Dla tych, którzy są trochę zagubieni, w OP „dyskomfort” definiuje się jako1 / (distance(x, y) * distance(x, y))
, co upraszcza1/d(x,y)^2
, tjd(x,y)^-2
.)Weź sumę każdego wiersza w macierzy.
Uzyskaj indeks najmniejszej wartości, czyli optymalnego pisuaru. W przypadku wielu najmniejszych wartości zwracana jest pierwsza (tj. Najbardziej lewa).
I voilà, mamy indeks optymalnego pisuaru. Zamieniamy na wartość tego wskaźnika w
x
z1
. W przypadku danych1111
wejściowych nie ma znaczenia, który z nich zastąpimy, nadal będziemy mieć prawidłowe dane wyjściowe.Zwraca zmodyfikowane dane wejściowe.
źródło
PHP, 135 bajtów
Jestem pewien, że jest na to znacznie szybszy sposób, ale mam niewyraźną głowę i nie mogę o tym myśleć!
Stary kod
Kod bez minimalizacji:
źródło
Python 3
223222165 bajtówOkej, wiem, że to nie jest najładniejsza odpowiedź i jestem pewien, że można trochę pograć w golfa, ale po prostu bawiłem się i widziałem, co mogę zrobić
Krzycz na mbomb007, aby uzyskać wskazówki na temat białych znaków i komparatorów. Widziałem też, że mój licznik postaci online bierze wszystkie karty i zamienia je w spacje, więc liczba jest znacznie mniejsza niż początkowo
Pokazuje zmienione białe znaki:
Oryginalny:
Oczekuje, że ciąg przekazany do niego jako 1 i 0,
"10001"
i zwróci ciąg"10101"
Edycja: zmieniono
1/float((j-i)**2)
nafloat((j-i)**-2)
źródło
!='1'
może być<'1'
i=='1'
może być>'0'
. Rozważ też tę wskazówkęPython 3,
574471347 bajtówPrawdopodobnie popracuję nad tym trochę dłużej, biorąc pod uwagę, że inne rozwiązanie Python jest jak jedna piąta tego: [.
Cóż, teraz jest o wiele lepiej, gdy nauczyłem się, że możesz używać pojedynczych spacji.
źródło
Python,
165163158147141140 140139 bajtówźródło
if"1"*len(p)==p:return p
aby zapisać bajt