Minha filha teve a seguinte tarefa para a lição de matemática. Imagine seis amigos vivendo em uma linha, denominados E, F, G, H, J e K. Suas posições na linha são as indicadas abaixo (sem escala):
Assim, F vive cinco unidades de E, e duas unidades de G, e assim por diante.
Sua tarefa: crie um programa que identifique um caminho que visite cada amigo exatamente uma vez com um comprimento total de n unidades, tomando as localizações dos amigos en como entradas. Ele deve relatar o caminho se o encontrar (por exemplo, para o comprimento 17, pode ser "E, F, G, H, J, K", e deve sair normalmente se não houver solução. Pelo que vale a pena, concluí uma solução não destruída no Mathematica em 271 bytes.Eu suspeito que seja possível de forma muito mais concisa do que isso.
fonte
[0, 5, 7, 13, 16, 17]
E62
) para garantir que não seja especificamente codificado para esse caso."[0, 5, 7, 13, 16, 17], 62"
e uma saída são"(7, 16, 0, 17, 5, 13)"
boas?Respostas:
J, 54 bytes
Produz uma rota correta. Se nenhuma rota existir, ela não gera nada.
Código de 52 bytes que gera todas as rotas (uma por linha):
Código de 38 bytes que gera posições em vez de letras:
fonte
Mathematica, 55 ou 90 bytes
Mathematica você disse? ;)
Essa é uma função anônima que primeiro assume as posições dos amigos (em qualquer ordem) e depois o comprimento do alvo. Ele retorna
Missing[NotFound]
, se esse caminho não existir.Posso salvar quatro bytes se o retorno de todos os caminhos válidos for permitido (
FirstCase
->Cases
).Retornar uma matriz de strings é um pouco mais complicado:
fonte
Z
continuará com os próximos caracteres ASCII (não que você queira executar meu código para n> 20 de qualquer maneira: D).Python 2,
154148 bytes(ou 118 bytes para a solução geral)
Este programa aceita uma linha com uma lista e um número inteiro como '[0, 5, 7, 13, 16, 17], n' on stdin e imprime um caminho na saída de comprimento n ou nada, se impossível.
É um desafio escrever pequenos programas em Python que exijam permutações. Essa importação e uso são muito caros.
A fonte do requisito de OP antes do minificador:
A solução geral (não minificada):
Devido ao algoritmo simples e ao grande número de combinações, a execução para mais de 20 posições iniciais será muito lenta.
fonte
from itertools import*
. Além disso, o Python 3 pode ser mais curtoinput()
e,*a,c=map(...)
se puder funcionar com o restante do seu programa.chr(a.index(n)+69)
?J (48 ou 65)
Eu suponho que isso possa ser jogado muito mais. Sinta-se livre para usar isso como um ponto de partida para jogar ainda mais
Ou com letras:
O que faz:
(Espero que este formato de E / S esteja bem ...)
Como faz:
Gera todas as permutações da entrada
Calcula a distância
Vê quais resultados são os mesmos da entrada e gera novamente essas permutações (suspeito que alguns caracteres possam ser raspados aqui)
Com letras:
Crie uma lista das primeiras n letras, em que n é o comprimento da lista de entrada
faz o mesmo que acima
fonte
Oitava, 73
Realmente não é possível cancelar o jogo, então deixe-me tentar explicar ... de dentro para fora, permutamos todas as distâncias; depois, para cada permutação, pegamos as diferenças entre casas, pegamos o valor absoluto à distância, adicionamos-as para cima, encontre o índice da primeira permutação com a distância desejada e permute as letras e encontre essa permutação específica de letras.
que é 13-0-16-5-17-7 => 13 + 16 + 11 + 12 + 10 = 62.
(em branco para entradas impossíveis)
fonte
perms()
no Octave 3.6.2 no ideone.com está tendo problemas com o vetor de strings.Matlab (86)
Exemplo no qual existe uma solução:
Exemplo no qual uma solução não existe:
Matlab (62)
Se o formato de saída puder ser relaxado produzindo posições em vez de letras e produzindo uma matriz vazia se não houver solução:
Exemplo no qual existe uma solução:
Exemplo no qual uma solução não existe:
Matlab (54)
Se for aceitável que o programa forneça todos os caminhos válidos :
Exemplo no qual existe uma solução:
fonte
Haskell, 109 bytes
Exemplo de uso:
17 # [0, 5, 7, 13, 16, 17]
que exibe todos os caminhos válidos, ie["EFGHIJ","JIHGFE"]
. Se não houver um caminho válido, a lista vazia[]
será retornada.A lista de cartas inclui
I
(espero que esteja tudo bem).Como funciona: faça uma lista de
(name, position)
pares, permute e leve aqueles onde o comprimento do caminho é igualn
e remova a parte da posição.fonte