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.
fonte
Respostas:
GolfScript, 88 caracteres
Uma implementação direta no GolfScript. Recebe entrada do STDIN ou da pilha.
O código pode ser testado aqui .
Código com alguns comentários:
fonte
JavaScript (E6) 172
180 275 296Como uma função (testável) com 1 argumento de string e retornando a saída solicitada. Para ter uma mudança real na saída, retorne com alert (), a mesma contagem de bytes, mas cuidado, a fonte do alerta não é monoespaçada.
Teste no console do FireFox ou FireBug
Saída de teste:
Ungolfed
fonte
Mathematica, 239 bytes
(Admito que comecei a trabalhar nisso enquanto ainda estava na caixa de areia.)
Ungolfed
Ele espera que a string de entrada seja armazenada
i
.É bastante simples. Primeiro, analise a entrada. Então, eu costumo
IntegerPartitions
descobrir como posso dividir o primeiro número nos números permitidos. Depois, filtro todas as partições que usam duplicatas ou não contêm os números necessários. E, em seguida, para cada solução que eu criar uma lista a partir1
de9
e converter os atuais números em sua representação de cadeia e os outros em espaços. E então concatenar tudo.fonte
Groovy - 494 caracteres
Resposta grande e sem inspiração, mas usa o Google Guava para gerar o "conjunto de energia".
Golfe:
Amostras de execuções:
Ungolfed:
fonte