Meta-fundo
Isso foi definido como uma pergunta sobre o Puzzling , e a reação instantânea foi "bem, alguém resolverá isso apenas por computador". Houve um debate sobre o quão complexo seria um programa para resolver isso. Bem, "quão complexo esse programa precisa ser" é praticamente a definição de código-golfe , então talvez o PPCG possa resolver o problema?
fundo
Uma equação de palito de fósforo é basicamente uma equação matemática normal, mas onde os dígitos e operadores são construídos fisicamente, colocando palitos de fósforo em uma tabela. (A principal característica relevante dos palitos de fósforo aqui é que eles são bastante rígidos e têm um comprimento constante; às vezes as pessoas usam outros objetos, como cotonetes.)
Para esse desafio, não precisamos definir regras específicas para a organização dos palitos de fósforo (como faz o desafio vinculado); em vez disso, apenas nos importamos com quantas palitos de fósforo precisaremos para representar uma expressão que é avaliada para um determinado número.
A tarefa
Aqui está um alfabeto de dígitos e operadores matemáticos que você pode usar, cada um com um custo em palitos de fósforo:
0
, custando 6 palitos de fósforo1
, custando 2 palitos de fósforo2
, custando 5 palitos de fósforo3
, custando 5 palitos de fósforo4
, custando 4 palitos de fósforo5
, custando 5 palitos de fósforo6
, custando 6 palitos de fósforo7
, custando 3 palitos de fósforo8
, custando 7 palitos de fósforo9
, custando 6 palitos de fósforo+
, custando 2 palitos de fósforo-
, custando 1 palito de fósforo×
, custando 2 palitos de fósforo
(Você pode representar ×
como *
na saída do seu programa, se desejar, para evitar a necessidade de usar caracteres não-ASCII. Na maioria das codificações, ×
ocupa mais bytes do que *
, e por isso imagino que a maioria dos programas deseje tirar vantagem dessa margem de manobra. .)
Você precisa escrever um programa que use um número inteiro não negativo como entrada (por qualquer meio razoável ) e produza uma expressão que avalie esse número inteiro como saída (novamente por qualquer meio razoável). Além disso, a expressão deve ser não trivial: deve conter, pelo menos, um operador +
, -
ou ×
. Por fim, a expressão que você produz deve ser a mais barata (ou vinculada à mais barata) em termos de custo total do palito de fósforo, entre todas as saídas que, de outra forma, atendem à especificação.
Esclarecimentos
- Você pode formar números de vários dígitos através da saída de vários dígitos em uma linha (por exemplo,
11-1
é uma saída válida para produzir10
). Apenas para ser completamente preciso, o número resultante é interpretado em decimal. Esse tipo de concatenação não é uma operação que funciona com resultados intermediários; somente nos dígitos literais que aparecem na expressão original. - Para o propósito deste desafio.
+
,-
, E×
são operadores infixas; eles precisam de uma discussão à esquerda e à direita. Você não pode usá-los na posição de prefixo como+5
ou-8
. - Você não tem parênteses (ou qualquer outra maneira de controlar a precedência) disponível. A expressão é avaliada de acordo com as regras de precedência padrão típicas (as multiplicações ocorrem primeiro e, em seguida, as adições e subtrações são avaliadas da esquerda para a direita).
- Você não tem acesso a nenhum operador matemático ou constante além dos listados acima; As soluções de "pensamento lateral" são frequentemente aceitas no Puzzling, mas não faz sentido exigir que um computador as crie e, aqui no PPCG, gostamos que seja objetivo se uma solução está correta ou não.
- As regras usuais de estouro de números inteiros se aplicam: sua solução deve ser capaz de trabalhar com números inteiros arbitrariamente grandes em uma versão hipotética (ou talvez real) do seu idioma, na qual todos os números inteiros são ilimitados por padrão, mas se o seu programa falhar na prática devido à implementação não suporta números inteiros tão grandes que não invalida a solução.
- Se você usar o mesmo dígito ou operador mais de uma vez, terá que pagar o custo do palito de fósforo cada vez que o usar (porque, obviamente, não é possível reutilizar os mesmos palitos de fósforo físicos em dois locais diferentes na mesa).
- Não há limite de tempo; soluções de força bruta são aceitáveis. (Embora se você tiver uma solução mais rápida que a força bruta, fique à vontade para publicá-la, mesmo que seja mais longa; ver como as abordagens alternativas se comparam é sempre interessante.)
- Embora nunca seja necessário escrever uma explicação para o seu código , é provável que seja uma boa ideia; As soluções code-golf geralmente são muito difíceis de ler (especialmente para pessoas que não estão familiarizadas com o idioma em que estão escritas) e pode ser difícil avaliar (e, portanto, votar) em uma solução, a menos que você entenda como ela funciona.
Condição de vitória
Como um desafio de código-golfe , respostas com menos bytes são consideradas melhores. No entanto, como sempre, sinta-se à vontade para postar respostas com abordagens diferentes ou em idiomas específicos, mesmo que sejam mais detalhados que outros idiomas; o objetivo do golfe é realmente ver até que ponto você pode otimizar um programa em particular, e fazer as coisas dessa maneira nos oferece muitos programas em potencial para otimizar. Portanto, não desanime se alguém enviar uma solução usando uma abordagem completamente diferente ou um idioma completamente diferente e obter uma resposta muito mais curta; pode ser que sua resposta seja melhor otimizada e mostre mais habilidade, e os eleitores do PPCG geralmente apreciam isso.
fonte
Respostas:
Python2, 1̶9̶8̶ ̶b̶y̶t̶e̶s̶ 182 bytes graças a math_junkie
Esse algoritmo não faz nada para excluir versões de prefixo de
+
e-
, mas elas serão piores ou iguais a e aparecerão mais tarde na pesquisa, suas contrapartes de infixo. Como ele usa o argumento de palavra-chave de formae
mutável, ele fornecerá resultados inválidos se chamado várias vezes por sessão. Para corrigir isso, use emf(n, e=[(0,'')])
vez de apenasf(n)
. Observe que os recuos com quatro espaços representam guias, portanto, isso funcionará apenas com o Python 2.Eu também tenho uma versão otimizada e não-gasta, que roda rapidamente, mesmo para números bastante grandes:
fonte
PHP, 241 bytes
Versão Online
Demolir
Caminho com um desempenho um pouco melhor
Suporte de números inteiros negativos
Versão com números inteiros negativos
fonte
$e+="6255456376"[$i[$s++]];
.