Solução em TXR :
(defstruct item nil
id
fields)
(let* ((items (build ;; build list procedurally: goes with (add ...) below
(awk ((plusp nf) ;; have at least one field
(fconv i) ;; convert id field [f 0] to integer
(add (new item id (first f) fields (rest f)))))))
(pitems (partition-by .id items))
(combinations [apply maprod list pitems]))
(each ((c combinations)
(n (range 1)))
(with-stream (*stdout* (open-file (fmt "file-~,06d" n) "w"))
(each ((i c)) ;; item in combination
(put-line '@{i.id} @{i.fields}')))))
Notas:
- A macro awk é usada para inserir a entrada nos campos.
- A macro build é usada para criar uma lista de
item
estruturas dos campos. - A função partição por agrupa a lista de itens em uma lista de -lists, onde as sub-listas consistem em itens consecutivos que compartilham o mesmo ID numérico.
- A partir dessas partições, geramos combinações aplicando essas partições à função de mapeamento de produtos cartesianos maprod . As combinações de produtos são mapeadas através de
list
para apenas listá-las. - Depois disso, a tarefa é apenas iterar sobre as combinações de produtos, junto com um contador de incremento e, em seguida, despejar cada combinação em um arquivo separado. Os arquivos são nomeados file-NNNNNN (seis dígitos) para antecipar o caso quando houver mais de 130 mil.