Combinações de Kakuro
Como não consigo fazer aritmética mental, luto frequentemente com o quebra- cabeça de Kakuro , que exige que a vítima calcule repetidamente quais números distintos no intervalo de 1 a 9 (inclusive) somam outro número no intervalo de 1 a 45 quando você sabe como muitos números existem. Por exemplo, se você quiser saber como obter 23 de 3 números, a única resposta é 6 + 8 + 9. (Essa é a mesma idéia que o Killer Sudoku, se você estiver familiarizado com isso).
Às vezes, você terá outras informações, como a de que o número 1 não pode estar presente; portanto, para atingir 8 em apenas 2 números, você pode usar apenas 2 + 6 e 3 + 5 (você não pode usar 4 + 4, porque eles são não distinto). Como alternativa, pode ser que você já tenha encontrado um 3 na solução e, portanto, algo como 19 em 3 números deve ser 3 + 7 + 9.
Sua tarefa é escrever um programa que lista todas as soluções possíveis para um determinado problema, em uma ordem estrita, em um layout estrito.
Entrada
Sua solução pode receber as entradas como uma única string ASCII através de stdin, um argumento de linha de comando, um argumento para uma função, um valor deixado na pilha ou qualquer loucura que sua linguagem esotérica favorita empregue. A cadeia está no formato
number_to_achieve number_of_numbers_required list_of_rejected_numbers list_of_required_numbers
Os 2 primeiros argumentos são números inteiros típicos de zero a zero na base 10, nos intervalos de 1 a 45 e 1 a 9, respectivamente (usar um ponto decimal seria uma entrada inválida); as duas listas são apenas dígitos alinhados, sem delimitação em nenhuma ordem específica sem repetição ou '0' se forem listas vazias. Não pode haver dígitos compartilhados entre as listas (exceto 0). Os delimitadores são espaços únicos.
Resultado
Sua saída deve começar com uma linha que contenha o número de soluções possíveis. Seu programa deve imprimir soluções delimitadas por quebra de linha classificadas por cada dígito cada vez mais significativo, onde cada dígito é colocado na posição em que estaria se você listasse os números de 1 a 9. Os exemplos abaixo esperam que isso fique mais claro.
Se uma entrada inválida for fornecida, não me importo com o que o seu programa faz, embora prefira que não zere meu setor de inicialização.
Exemplos
Para este exemplo de entrada
19 3 0 0
O resultado esperado seria
5
2 89
3 7 9
4 6 9
4 78
56 8
Observe os espaços no lugar de cada número "ausente", eles são necessários; Eu não estou incomodado com espaços que não têm um número depois deles (como os 9s ausentes acima). Você pode assumir que o que quer que esteja imprimindo usará uma fonte de espaço mono. Observe também a ordem, na qual as soluções com um dígito menor menor são listadas primeiro e, em seguida, aquelas com o menor dígito menor, etc.
Outro exemplo, baseado no exposto acima
19 3 57 9
O resultado esperado seria
2
2 89
4 6 9
Observe que todo resultado contém 9 e nenhum resultado contém 5 ou 7.
Se não houver soluções, por exemplo
20 2 0 0
Então você deve apenas produzir uma única linha com um 0.
0
Intencionalmente, fiz a análise da entrada parte da diversão desta pergunta. Isso é código-golfe, que a solução mais curta vença.