Desafio
Dado um inteiro positivo N
que é 28 ou acima, a saída uma lista de números somando para N
que os usos cada dígito 1
através 7
exatamente uma vez. Você pode dar como um programa ou função.
Os dígitos podem aparecer sozinhos ou concatenados, desde que você use cada um deles uma vez sem repetições. Por exemplo, [12, 34, 56, 7]
é válido, como é [1, 27, 6, 4, 35]
e [1234, 567]
, mas não é [123, 34567]
ou [3, 2, 1476]
. A ordem em que os números estão listados não importa.
Se N
não puder ser feito com 1-7, não retorne ou produza nada.
Outra informação
Esse é o código de golfe, portanto o código mais curto em bytes da quinta-feira, 15 de outubro, vence.
Faça qualquer pergunta nos comentários.
Tudo o que eu não especificar no desafio é com você.
As brechas padrão não são permitidas.
Exemplos
Isso pode esclarecer qualquer confusão:
Entrada
28
Saída
[1, 2, 3, 4, 5, 6, 7]
Entrada
100
Saída
[56, 7, 4, 31, 2]
Entrada
1234567
Saída
[1234567]
Entrada
29
Saída
Nada, 29 é inválido.
Entrada
1891
Saída
[1234, 657]
Entrada
370
Saída
[15, 342, 7, 6]
Farei mais, se necessário.
Aqui está uma pasta de todos os números possíveis criados com esses sete números, cortesia de FryAmTheEggman.
29
?(N/A)
como saída.[1234566, 1]
não é uma saída válida, porque 6 é repetido. Você não pode repetir números na saída.1, ..,, 7
modo que haja pelo menos tantos quantos1
sejam10
, pelo menos tantos quantos10
sejam100
e assim por diante.Respostas:
Pitão,
1814 bytesGraças a @isaacg por jogar fora 2 bytes e abrir caminho para mais 2.
O código falhará se não produzir saída, o que faz com que nenhuma saída seja produzida.
Isso funcionará para entradas pequenas, se você for paciente o suficiente, e para entradas maiores, se houver tempo e memória suficientes.
Para verificar se o código funciona como pretendido, você pode substituí
7
-lo3
por somas dos dígitos 1 a 3 . Clique aqui para uma suíte de testes.Execuções de exemplo
Como funciona
fonte
r\1\8
. Também@ .. 0
é o mesmo queh
.h
, mas não fazia ideia de que você poderia usarS
dessa maneira. (A referência de caractere no intérprete on-line não a menciona.)jkS7
Parece ser ainda mais curta, pois não precisos
mais.Python 3, 109
Uma função que pega um número e gera uma tupla semelhante
123,4567,
. Sim, esta é uma tupla válida.A idéia é gerar todas as cadeias possíveis como
43,126,7,5,
que têm os dígitos1
através7
separados por vírgulas, sem duas vírgulas consecutivas. Avalie esta expressão como uma tupla e sua soma é igualn
, imprima-a e termine com erro.Para criar todas essas seqüências, rastreamos o conjunto
s
de caracteres a serem usados e tentamos anexar cada um com uma vírgula, o que faz com que o dígito termine a entrada, ou sem, caso em que futuros dígitos concatenarão nela.Curto-circuito é usado para verificar se
s
está vazio porque a lista-comp está vazia, e quen==sum(eval(l))
, nesse caso, imprimimosl
e terminamos com um erro ao retirar~
oNone
retornado pela impressão (obrigado pelo Sp3000 por isso.).Acredito que no Python 3.5, dois caracteres podem ser salvos por escrito
s={*'1234567'}
(obrigado Sp3000).Há alguns pequenos aborrecimentos que comem caracteres. Uma é que, no caso de
l
aparência1234567
sem vírgulas, ela é analisada como um único número e a chamadasum
gera um erro. Isso é tratado com o truque de começarl
com o elemento0
e removê-lo durante a impressão. Isso custa 6 caracteres.A iteração
c
sobre a vírgula e a cadeia vazia é irritantemente prolixofor c in(',','')
, pois o Python 3 não permite que essa tupla fique nua. Eu gostaria que houvesse algum caractere?
que seja ignorado em números para fazer',?'
por 4 caracteres a menos, mas não parece existir esse caractere.Método antigo:
Python 2, 117
Define uma função que pega um número e imprime uma lista.
A idéia é usar a recursão para tentar todas as ramificações. As variáveis track são
n
necessárias
restantes para usarl
de números feitos até agorap
Quando
n==0
es
estiver vazio, imprimal
e termine por erro.Se o número parcialmente formado atual
p
for diferente de zero, tente adicioná-lo à lista e removê-lo da soma restante.Para cada dígito
x
que podemos usars
, tente anexá-lop
e removê-los
.fonte
Pyth, 23
A força bruta ingênua, online muito lenta, leva cerca de um minuto no meu computador. Usa o padrão comum "loop para sempre até a exceção" dos campos de golfe em que o acesso à lista de combinações filtrada resultante causa um erro para números impossíveis, como
29
.Saídas como uma lista pythonic, por exemplo
Aqui está uma pasta de todos os números 10136 que podem ser feitos dessa maneira.
fonte
Python 2.7,
178172169 bytesObserve que as últimas três linhas devem ser recuadas com guias, mas não consigo descobrir como fazê-lo neste editor.
Edit: Achatada uma camada de aninhamento com a ajuda do Sp3000
fonte
JavaScript (ES6),
165196Editar Encurtado um pouco. Pode ser mais curto usando
eval
, mas eu gosto de ser rápidoForça bruta, vergonhosamente mais longa que a versão Pith, mas mais rápida. Teste a execução do snippet abaixo em um navegador compatível com EcmaScript 6.
fonte
Python 2,
270268 bytesAinda trabalhando no golfe.
Isso faz um loop até que uma correspondência seja encontrada.
fonte
import as
raramente é necessário - você pode fazerfrom itertools import*;P=permutations
map(str,i)
que a compreensão da lista, e você pode construir a lista r diretamente, em vez de nivelar uma lista aninhada:r=[int(''.join(map(str,i)))for j in x for i in P(x,j)]
e algo semelhante para t.`n`
vez destr(n)
, poisn
nunca estará acima do número máximo máximo.Haskell (145 bytes)
Usa recursão.
Ungolfed (337 bytes):
fonte
Scala, 195 bytes
Esta não é a mais eficiente e levou mais de 15 minutos para obter a saída para 29, mas funciona
Aqui está uma saída
fonte
Ruby, 105 bytes
Força bruta! Verifica cada subconjunto de comprimentos entre 0 e 7 dos números inteiros entre 1 e 7654321 e verifica se algum deles corresponde aos nossos critérios. Você provavelmente não quer esperar que isso termine.
Para executar e verificar o algoritmo, você pode restringir o espaço de pesquisa substituindo
7654321
pelo maior número que você sabe que estará na resposta. Por exemplo, 56 para n = 100 ou 1234 para n = 1891. Aqui está um teste deste último:fonte