Finden Sie Teilmengenfaktoren

14

Stellen wir uns vor, wir haben eine endliche Menge positiver Ganzzahlen. Dieser Satz kann als eine Reihe von Punkten dargestellt werden, wobei jede in dem Satz vorhandene Ganzzahl wie eine Scantron- oder Lochkarte ausgefüllt wird . Zum Beispiel könnte die Menge {1,3,4,6}dargestellt werden als:

*.**.*

*repräsentiert ein Mitglied unserer Menge und .repräsentiert eine ganze Zahl, die kein Mitglied der Menge ist.

Diese Sätze haben "Faktoren". Lose x ist ein Faktor von y, wenn y aus Kopien von x aufgebaut werden kann. Strenger definieren wir Faktor wie folgt:

  • x ist genau dann ein Faktor von y, wenn y die Vereinigung mehrerer disjunkter Mengen ist, die alle x mit einem Versatz sind.

Wir würden *.*einen Faktor von nennen, *.**.*weil er ganz klar aus zwei Kopien von *.*Ende zu Ende besteht.

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

Faktoren müssen nicht Ende zu Ende sein, wir würden auch sagen, das *.*ist ein Faktor von*.*.*.*

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

Faktoren können sich auch überschneiden. Dies bedeutet *.*auch einen Faktor von****

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

Eine Zahl kann jedoch nicht mehrmals durch einen Faktor abgedeckt werden. Zum Beispiel *.*ist kein Faktor von *.*.*.


Hier ist ein komplizierteres Beispiel:

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

Dies ist *..*.*ein Faktor. Sie können das unten sehen, wo ich die drei Fälle von aufgereiht habe *..*.*.

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

Aufgabe

Bei einer Menge durch eine sinnvolle Darstellung werden alle Mengen ausgegeben, die Faktoren der Eingabe sind.

Sie können nach jedem Wert indizieren (dh Sie können eine kleinste Zahl auswählen, die in der Eingabe vorhanden sein kann). Sie können auch davon ausgehen, dass die Eingabemenge immer den kleinsten Wert enthält.

Dies ist eine Frage, daher sollten Sie versuchen, dies in so wenigen Bytes wie möglich zu tun.

Testfälle

Diese Testfälle wurden von Hand durchgeführt. Bei den größeren Fällen kann es zu ein oder zwei Fehlern kommen

*                -> *
*.*.*            -> *, *.*.*
*.*.*.*          -> *, *.*, *...*, *.*.*.*
******           -> *, **, *..*, ***, *.*.*, ******
*..*.**..***.*.* -> *, *..*.*, *.....*...*, *..*.**..***.*.*
*...*****.**.**  -> *, *...**.**, *.....*, *...*****.**.**
Post Rock Garf Hunter
quelle
Wenn wir das Set als eine Liste von Zahlen (zB [1,3,5,7]für *.*.*.*) nehmen, können wir annehmen, dass es sortiert ist?
Martin Ender
1
Entspricht dies dem Auffinden von Teilern von Polynomen, deren Koeffizienten auf 0 und 1 beschränkt sind?
2.
1
@ Xnor Ich bin nicht sicher. Wenn *.*.*= x+x^2+x^4, dann wäre 1+x+x^2= ***ein Teiler, richtig? x+x^2+x^4 = (1-x+x^2)(1+x+x^2)
mbomb007
1
@JonathanAllan Wird in Ihren Beispielen *als Faktor aufgeführt, der dieselbe Teilmenge wie *.oder darstellt *...
Martin Ender
1
@ JonathanAllan Es wird gesagt, dass alle Mengen ausgegeben werden, nicht alle ASCII-Darstellungen der gültigen Mengen.
Martin Ender

Antworten:

3

Mathematica, 71-68 Bytes

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

Eingabe als {1,3,5,7}(sortiert) und Ausgabe als {{1, 3, 5, 7}, {1, 3}, {1, 5}, {1}}. Die Funktion wirft eine Reihe von Nachrichten.

Dies ist O (2 2 Nope ) (wobei N die Länge der Eingabe ist und o = p = e = 1 ...). Es generiert alle Teilmengen von Teilmengen und wählt dann diejenigen aus, die beim Zusammenfügen zum Senden der Eingabe führen (wobei sichergestellt ist, dass nur Partitionen berücksichtigt werden) und bei denen alle Elemente gleich sind, wenn der kleinste Wert jeder Teilmenge subtrahiert wird.

Martin Ender
quelle
2

Gelee , 12 Bytes

;÷@DỊȦ
ÆDçÐf

Eingabe und Ausgabe verwenden 1und 0anstelle von *und ..

Probieren Sie es online!

Wie es funktioniert

Æ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.
Dennis
quelle