Você precisa escrever um programa, implementando uma função digitsum(int i)
. O programa precisa modificar seu próprio código (para idiomas, onde isso não é possível com uma reflexão , por favor, seja criativo) para conseguir resolver o objetivo.
Você começa com
function digitsum(int i){
return i;
}
e implemente um algoritmo evolutivo que modificará a função acima até que retorne dígitos válidos na chamada de função.
Como este é um concurso de popularidade, você tem muitas mãos livres, por favor, seja criativo!
Diretrizes:
- Comece com a função definida (traduzida para o seu idioma, é claro).
- Imprima pelo menos a função mais adequada de cada geração.
- Imprima sua solução de trabalho testada para 0 <i <10000.
- Seja criativo!
Não:
- Sugira o seu programa para a solução, use todas as opções de idioma!
- Lance erros para o console.
- Use qualquer entrada externa. Você pode gravar e salvar em arquivos criados pelo seu programa. Sem internet.
A solução válida com mais votos positivos ganha!
popularity-contest
reggaemuffin
fonte
fonte
no libraries
permitido dizer nenhum libc?no libraries
que seria para imo complexa, para que os eleitores possam decidir se existem muitas bibliotecas usadas!Respostas:
C #
Solução de montagem quase inteiramente aleatória e bruta. Quanto ao C # e praticamente qualquer outra plataforma, esse é o nível mais baixo possível. Felizmente, o C # permite definir métodos durante o tempo de execução em IL (IL é uma linguagem intermediária, o código de bytes do .NET, semelhante ao assembly). A única limitação desse código é que escolhi alguns opcodes (dentre centenas) com uma distribuição arbitrária que seria necessária para a solução perfeita. Se permitirmos todos os códigos de operação, as chances de um programa funcionar são reduzidas a zero; portanto, isso é necessário (como você pode imaginar, existem muitas maneiras pelas quais as instruções aleatórias de montagem podem falhar, mas, felizmente, elas não derrubam todo o programa na rede). Além da variedade de possíveis códigos de operação, são códigos de operação de divisão e distribuição de dados completamente aleatórios, sem nenhum tipo de sugestão.
Desculpe, não tenho resultados até agora, porque mesmo com os testes para 1..99 (em vez de 1..9999) é muito lento e estou muito cansado. Voltarei para você amanhã.
EDIT: Eu terminei o programa e o aprimorei bastante. Agora, se você pressionar CTRL-C, ele terminará a execução atual e produzirá os resultados em arquivos. Atualmente, as únicas soluções viáveis que produz são programas que sempre retornam um número constante. Estou começando a pensar que as chances de um programa de trabalho mais avançado são astronomicamente pequenas. De qualquer forma, vou mantê-lo funcionando por algum tempo.
Edição: Eu continuo ajustando o algoritmo, é um brinquedo perfeito para um nerd como eu. Uma vez vi um programa gerado, que na verdade fazia algumas contas aleatórias e nem sempre retornava um número constante. Seria incrível executá-lo em alguns milhões de CPUs ao mesmo tempo :). Continuará executando.
EDIT: Aqui está o resultado de algumas contas completamente aleatórias. Ele pula e fica aos 17 anos pelo resto dos índices. Não ficará consciente tão cedo.
EDIT: Está ficando mais complicado. Obviamente, como seria de esperar, ele não se parece em nada com o algoritmo digitsum adequado, mas está se esforçando. Olha, um programa de montagem gerado por computador!
fonte
C #
Isso pode não estar completo para o que você imaginou, mas é o melhor que posso fazer agora. (Pelo menos com C # e CodeDom).
Então, como funciona:
((i & v1) >> v2)
. Esses termos serão os genes que serão mutados durante a execução.O código:
Testado no OSX com o compilador Mono C # versão 3.2.6.0.
A cada iteração, imprime o valor de adequação do cálculo atual. No final, imprimirá a melhor solução, juntamente com sua adequação. O loop será executado até que um dos resultados tenha um valor de adequação 0.
Assim é que começa:
Depois de um tempo (leva cerca de 30 minutos), é assim que termina (mostrando a última e quase a última iteração):
Notas:
a >> b
usara / 2^b
return i;
exigida pelo problema.i & a >> a
vez dei & a >> b
, como no último caso, a evolução foi simplesmente lenta demais para ser prática.return (i&a>>b)+(i&c>>d)+...
, pois qualquer outro tipo (como tentar gerar um código "adequado", com loops, atribuições, verificações de condições etc.) simplesmente convergiria muito lentamente. Além disso, é muito fácil definir os genes (cada um dos termos) e é muito fácil modificá-los.0..10000
(se você verificar a solução encontrada, poderá ver que ela não funcionará para números maiores que 16384)fonte
Javascript
Bem, eu tenho um problema de precisão de ponto flutuante com a minha resposta - que provavelmente pode ser resolvida usando uma biblioteca BigDecimal - quando os números de entrada são maiores que
55
.Sim, isso está longe de ser,
10000
então não espero vencer, mas ainda assim um método interessante com base nesse tópico .Ele calcula uma [interpolação polinomial] ( http://en.wikipedia.org/wiki/Polynomial_interpolation ) com base em um conjunto de pontos, portanto, utiliza apenas multiplicação, divisão e adição, sem operadores de módulo ou bit a bit.
Função de saída:
Essa função polinomial (simplificada para o grau 25 e sem arredondamentos) plotada, analisa valores para números inteiros (legíveis para [6; 19]):
Testes:
fonte