Immaginiamo di avere un insieme finito di numeri interi positivi. Questo set può essere rappresentato come una linea di punti in cui ogni numero intero presente nel set viene riempito come una scantron o una scheda perforata . Ad esempio il set {1,3,4,6}
potrebbe essere rappresentato come:
*.**.*
*
rappresenta un membro del nostro set e .
rappresenta un numero intero che non è un membro del set.
Questi insiemi hanno "fattori". Liberamente x è un fattore di y se y può essere costruito da copie di x. Più rigorosamente la nostra definizione di fattore è la seguente:
- x è un fattore di y se e solo se y è l'unione di un numero di insiemi disgiunti , che sono tutti x con un offset.
Vorremmo chiamare *.*
un fattore di *.**.*
perché è chiaramente costituito da due copie di *.*
fine put a fine.
*.**.*
------
*.*...
...*.*
I fattori non devono essere end-to-end, diciamo anche che *.*
è un fattore di*.*.*.*
*.*.*.*
-------
*.*....
....*.*
I fattori possono anche sovrapporsi. Questo significa che *.*
è anche un fattore di****
****
----
*.*.
.*.*
Tuttavia, un numero non può essere coperto da un fattore più di una volta. Ad esempio non*.*
è un fattore di .*.*.*
Ecco un esempio più complicato:
*..*.**..***.*.*
Questo ha *..*.*
come fattore. Puoi vedere quello sotto dove ho allineato i tre casi di *..*.*
.
*..*.**..***.*.*
----------------
*..*.*..........
......*..*.*....
..........*..*.*
Compito
Dato un set da qualsiasi rappresentazione ragionevole emetta tutti gli insiemi che sono fattori dell'input.
Puoi indicizzare per qualsiasi valore (ovvero puoi selezionare un numero più piccolo che può essere presente nell'input). Si può anche supporre che il set di input contenga sempre quel valore più piccolo.
Questa è una domanda di code-golf, quindi dovresti mirare a farlo nel minor numero di byte possibile.
Casi test
Questi casi di test sono stati fatti a mano, potrebbero esserci un errore o due su quelli più grandi
* -> *
*.*.* -> *, *.*.*
*.*.*.* -> *, *.*, *...*, *.*.*.*
****** -> *, **, *..*, ***, *.*.*, ******
*..*.**..***.*.* -> *, *..*.*, *.....*...*, *..*.**..***.*.*
*...*****.**.** -> *, *...**.**, *.....*, *...*****.**.**
*.*.*
= x+x^2+x^4
, allora 1+x+x^2
= ***
sarebbe un divisore, giusto? x+x^2+x^4 = (1-x+x^2)(1+x+x^2)
*
è elencato come un fattore che rappresenta lo stesso sottoinsieme di *.
o *..
.
[1,3,5,7]
per*.*.*.*
) possiamo supporre che sia ordinato?