Znajdź czynniki podzbioru


14

Wyobraźmy sobie, że mamy skończony zestaw dodatnich liczb całkowitych. Ten zestaw może być reprezentowany jako linia kropek, w której każda liczba całkowita występująca w zestawie jest wypełniona jak karta scantron lub poncz . Na przykład zestaw {1,3,4,6}można przedstawić jako:

*.**.*

*reprezentuje członka naszego zestawu i .reprezentuje liczbę całkowitą, która nie jest członkiem zestawu.

Te zestawy mają „czynniki”. Luźno x jest współczynnikiem y, jeśli y można zbudować z kopii x. Bardziej rygorystycznie nasza definicja czynnika jest następująca:

  • x jest współczynnikiem y wtedy i tylko wtedy, gdy y jest sumą szeregu rozłącznych zbiorów, z których wszystkie są x z przesunięciem.

Nazwalibyśmy *.*to czynnik o *.**.*ponieważ jest ona dość wyraźnie składa się z dwóch egzemplarzy *.*put końca do końca.

*.**.*
------
*.*...
...*.*

Czynniki nie muszą być od końca do końca, powiedzielibyśmy również, że *.*jest to czynnik*.*.*.*

*.*.*.*
-------
*.*....
....*.*

Czynniki mogą się również nakładać. Oznacza *.*to również, że****

****
----
*.*.
.*.*

Jednak liczby nie można objąć czynnikiem więcej niż jeden raz. Na przykład *.*to nie czynnik *.*.*.


Oto bardziej skomplikowany przykład:

 *..*.**..***.*.*

Ma to *..*.*jako czynnik. Możesz zobaczyć to poniżej, gdzie ustawiłem trzy wystąpienia *..*.*.

*..*.**..***.*.*
----------------
*..*.*..........
......*..*.*....
..........*..*.*

Zadanie

Biorąc pod uwagę zbiór dowolnej rozsądnej reprezentacji, wypisywane są wszystkie zbiory będące czynnikami wejściowymi.

Możesz indeksować według dowolnej wartości (tzn. Możesz wybrać najmniejszą liczbę, która może być obecna na wejściu). Możesz również założyć, że zestaw wejściowy zawsze będzie zawierał najmniejszą wartość.

To jest pytanie w więc powinieneś starać się to zrobić w jak najmniejszej liczbie bajtów.

Przypadki testowe

Te przypadki testowe zostały wykonane ręcznie, może być błąd lub dwa na większych

*                -> *
*.*.*            -> *, *.*.*
*.*.*.*          -> *, *.*, *...*, *.*.*.*
******           -> *, **, *..*, ***, *.*.*, ******
*..*.**..***.*.* -> *, *..*.*, *.....*...*, *..*.**..***.*.*
*...*****.**.**  -> *, *...**.**, *.....*, *...*****.**.**

Jeśli przyjmiemy zestaw za listę liczb (np. [1,3,5,7]Dla *.*.*.*), czy możemy założyć, że jest on posortowany?
Martin Ender

1
Czy to równoznaczne ze znalezieniem dzielników wielomianów, których współczynniki są ograniczone do 0 i 1?
xnor

1
@ xnor Nie jestem pewien. Jeśli *.*.*= x+x^2+x^4, to 1+x+x^2= ***byłoby dzielnikiem, prawda? x+x^2+x^4 = (1-x+x^2)(1+x+x^2)
mbomb007

1
@JonathanAllan Dla twoich przykładów *wymieniony jest jako czynnik reprezentujący ten sam podzbiór co *.lub *...
Martin Ender

1
@JonathanAllan Mówi, że wypisuje wszystkie zestawy, a nie wypisuje wszystkie reprezentacje ASCII poprawnych zestawów.
Martin Ender

Odpowiedzi:


3

Mathematica, 71 68 bajtów

#&@@@Cases[(s=Subsets)@s@#,x_/;Sort[Join@@x]==#&&Equal@@(#&@@@x-x)]&

Wprowadź jako {1,3,5,7} (posortowane) i wyślij jako {{1, 3, 5, 7}, {1, 3}, {1, 5}, {1}}. Funkcja wyrzuci kilka wiadomości.

Jest to O (2 2 Nie ) (gdzie N jest długością wejścia, a o = p = e = 1 ...). Generuje wszystkie podzbiory podzbiorów, a następnie wybiera te, które skutkują wysyłaniem danych wejściowych po połączeniu (upewniając się, że rozważamy tylko partycje) i gdzie wszystkie elementy są takie same, jeśli odejmiemy najmniejszą wartość każdego podzbioru).


2

Galaretka , 12 bajtów

;÷@DỊȦ
ÆDçÐf

Wykorzystanie danych wejściowych i wyjściowych 1oraz 0zamiast *i. .

Wypróbuj online!

Jak to działa

ÆDçÐf   Main link. Argument: n (integer with decimal digits 1 and 0)

ÆD      Compute all divisors of n.
  çÐf   Filter; call the helper link with left argument d and right argument n for
        all divisors d of n. Return the array of d's for which the helper link
        returns a truthy value.


;÷@DỊȦ  Helper link. Left argument: d. Right argument: n

 ÷@     Divide n by d.
;       Concatenate, yielding [d, n÷d].
   D    Decimal; convert both integers in the pair to base 10.
    Ị   Insignificant; map 1 and 0 to 1, all other positive integers to 0.
     Ȧ  All; return 1 iff the result contains no zeroes.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.