Wprowadzenie
Klasy permutacji antsy zdefiniowałem we wcześniejszym wyzwaniu . Przypominamy, że permutacja p liczb od 0 do r-1 jest niespokojna, jeśli dla każdego wpisu p [i] oprócz pierwszego istnieje kilka wcześniejszych wpisów p [ik] takich, że p [i] == p [ ik] ± 1 . Jako zabawny fakt stwierdziłem również, że dla r ≥ 1 istnieją dokładnie 2 permutacje antsy r-1 o długości r . Oznacza to, że istnieje zgodność jeden na jeden między permutacjami antsy o długości r i wektorami binarnymi o długości r-1. W tym wyzwaniu Twoim zadaniem jest wdrożenie takiej korespondencji.
Zadanie
Twoim zadaniem jest napisanie programu lub funkcji, która pobiera wektor binarny o długości 1 ≤ n ≤ 99 i generuje anutyczną permutację o długości n + 1 . Permutacja może być oparta na 0 na 1 (ale musi być spójna), a dane wejściowe i wyjściowe mogą mieć dowolny rozsądny format. Co więcej, różne dane wejściowe muszą zawsze dawać różne wyniki; poza tym możesz zwrócić dowolną permutację antsy, którą chcesz.
Wygrywa najniższa liczba bajtów.
Przykład
Permutacje antsy (oparte na 0) o długości 4 są
0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
2 1 0 3
2 1 3 0
2 3 1 0
3 2 1 0
a twój program powinien zwrócić jeden z nich dla każdego z ośmiu bitowych wektorów o długości 3:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
źródło
0 1
i0 0 1
powinien dawać wyjścia o różnych długościach.Odpowiedzi:
Galaretka ,
121110 bajtówWypróbuj online! lub wygeneruj wszystkie permutacje o długości 4 .
Jak to działa
źródło
Python 2,
6260 bajtówDzięki @xnor za grę w golfa z 2 bajtów!
Przetestuj na Ideone .
źródło
x=0,
?0,
jest krotką. Bez przecinka mapowanie na x nie powiedzie się.n
zrobić[n*len(x)]
i zmienić mapę do listy comp.Python, 54 bajty
Stosuje następującą procedurę:
Na przykład
l=[1,0,1,0]
dajef(l) == [2,1,3,0,4]
Podanie 0 również dałoby ten sam wynik.
enumerate
Jest niezgrabne, zobaczymy, czy można to zrobić lepiej rekurencyjnie.źródło
sum
składni i krojenie.JavaScript (ES6),
484745 bajtówOkazało się, że jest podobna do metody @ETHproductions, tyle że zacząłem od bezpośredniego obliczenia pierwszego elementu, a następnie za pomocą wektora binarnego, aby ustalić, czy każda cyfra jest nowym poziomem wysokim, czy nowym poziomem niskim. Edycja: Zapisano 1 bajt dzięki @ETHproductions. Zapisano 2 bajty, zaczynając od zera, a następnie dostosowując. Moja poprzednia metoda okazała się podobna do metody @ Dennisa, ale zajęła 54 bajty:
źródło
Perl, 33 bajty
Obejmuje +1 dla
-p
Podaj wektor jako ciąg bez spacji na STDIN:
antsy.pl
:źródło
JavaScript (ES6), 52 bajty
Przetestuj to:
Wyjaśnienie
Wykorzystuje to fakt, że po odwróceniu permutacji antsy każdy element jest albo o 1 większy niż maksimum poprzednich niskich wpisów, albo o 1 mniej niż minimum poprzednich wysokich wpisów. Oznaczając wyższy element jako a
0
i niższy element jako a1
, możemy stworzyć dokładną zgodność jeden na jednego między permutacjami mrówek o długości n i wektorami binarnymi o długości n - 1 .Najlepsze, co mogłem zrobić z techniką Dennisa, to
5751 bajtów:Rozwiązanie xnor to 56 (zapisano 1 bajt dzięki @Neil):
źródło
i-i*x
może byći*!x
.Haskell, 40 bajtów
Rozwiązanie Dennisa w Python gra w golfa w Haskell z
map
ifold
. To krócej niż moje próby przeniesienia mojej bezpośredniej konstrukcji wejściowej:źródło
Partia, 127 bajtów
Pobiera dane wejściowe jako parametry wiersza polecenia, dane wyjściowe są oddzielone wierszem. (Możliwe jest wprowadzanie jako STDIN w postaci spacji bez dodatkowych kosztów).
źródło