Sie müssen ein Programm schreiben und eine Funktion implementieren digitsum(int i)
. Das Programm muss seinen eigenen Code ändern (für Sprachen, in denen dies mit Reflexion nicht möglich ist , seien Sie bitte kreativ), um das Ziel zu lösen.
Sie beginnen mit
function digitsum(int i){
return i;
}
und implementieren Sie einen evolutionären Algorithmus , der die obige Funktion modifiziert, bis beim Funktionsaufruf gültige Ziffern zurückgegeben werden.
Da dies ein Beliebtheitswettbewerb ist, haben Sie sehr viel freie Hände, bitte seien Sie kreativ!
Richtlinien:
- Beginnen Sie mit der definierten Funktion (natürlich in Ihre Sprache übersetzt).
- Drucken Sie mindestens die beste Funktion jeder Generation aus.
- Drucken Sie Ihre Arbeitslösung aus, die auf 0 <i <10000 getestet wurde.
- Seien Sie kreativ!
Unterlassen Sie:
- Tippe dein Programm auf die Lösung, bitte benutze deine gesamten Sprachoptionen!
- Wirf Fehler auf die Konsole.
- Verwenden Sie einen externen Eingang. Sie können in von Ihrem Programm erstellte Dateien schreiben und speichern. Kein Internet.
Die gültige Lösung mit den meisten Upvotes gewinnt!
popularity-contest
Reggaemuffin
quelle
quelle
no libraries
erlaubt keine libc?no libraries
wie es zu komplex wäre, damit die Wähler entscheiden können, ob zu viele Bibliotheken verwendet werden!Antworten:
C #
Fast völlig zufällige und rohe Montagelösung. Was C # und so ziemlich jede andere Plattform betrifft, ist dies so niedrig wie möglich. Glücklicherweise können Sie mit C # Methoden zur Laufzeit in IL definieren (IL ist eine Zwischensprache, der Bytecode von .NET, ähnlich wie Assembly). Die einzige Einschränkung dieses Codes besteht darin, dass ich einige Opcodes (von Hunderten) mit einer beliebigen Verteilung ausgewählt habe, die für die perfekte Lösung erforderlich wären. Wenn wir alle Opcodes zulassen, sind die Chancen eines Arbeitsprogramms gering bis gar nicht, daher ist dies notwendig (wie Sie sich vorstellen können, gibt es viele Möglichkeiten, wie zufällige Montageanweisungen abstürzen können, aber zum Glück bringen sie nicht das gesamte Programm zum Erliegen in .NET). Abgesehen von der Auswahl möglicher Opcodes handelt es sich um völlig zufälliges Schneiden und Würfeln von IL-Opcodes ohne jegliche Andeutung.
Entschuldigung, ich habe bisher keine Ergebnisse, da selbst beim Testen auf 1..99 (anstelle von 1..9999) ziemlich langsam ist und ich zu müde bin. Wir melden uns morgen bei Ihnen.
EDIT: Ich habe das Programm beendet und viel optimiert. Wenn Sie jetzt STRG-C drücken, wird der aktuelle Lauf beendet und die Ergebnisse in Dateien ausgegeben. Derzeit sind die einzigen realisierbaren Lösungen Programme, die immer eine konstante Anzahl zurückgeben. Ich fange an zu denken, dass die Chancen für ein fortgeschritteneres Arbeitsprogramm astronomisch gering sind. Wie auch immer, ich werde es für einige Zeit am Laufen halten.
EDIT: Ich optimiere ständig den Algorithmus, es ist ein perfektes Spielzeug für einen Geek wie mich. Ich habe einmal ein generiertes Programm gesehen, das tatsächlich zufällige Berechnungen durchgeführt hat und nicht immer eine konstante Zahl zurückgegeben hat. Es wäre fantastisch, es auf ein paar Millionen CPUs gleichzeitig laufen zu lassen :). Ich werde es weiter laufen lassen.
EDIT: Hier ist das Ergebnis einer völlig zufälligen Mathematik. Es springt herum und bleibt für den Rest der Indizes bei 17. Es wird nicht so schnell bewusst.
EDIT: Es wird immer komplizierter. Natürlich sieht es, wie zu erwarten, nicht nach dem richtigen Digitsum-Algorithmus aus, aber es ist sehr anstrengend. Schauen Sie, ein computergeneriertes Montageprogramm!
quelle
C #
Dies ist möglicherweise nicht ganz das, was Sie sich vorgestellt haben, aber dies ist das Beste, was ich jetzt tun kann. (Zumindest mit C # und CodeDom).
So funktioniert es:
((i & v1) >> v2)
. Diese Begriffe sind die Gene, die während des Laufs mutiert werden.Der Code:
Getestet unter OSX mit Mono C # Compiler Version 3.2.6.0.
Bei jeder Iteration wird der Fitnesswert der aktuellen Berechnung gedruckt. Am Ende wird die beste Lösung zusammen mit ihrer Fitness gedruckt. Die Schleife wird ausgeführt, bis eines der Ergebnisse einen Fitnesswert von 0 hat.
So fängt es an:
Und nach einer Weile (dauert ungefähr 30 Minuten) endet es so (zeigt die letzte und fast letzte Iteration):
Anmerkungen:
a >> b
ich ihn nichta / 2^b
return i;
Anforderungen des Problems.i & a >> a
statt ausseheni & a >> b
, da im letzteren Fall die Entwicklung einfach zu langsam war, um praktisch zu sein.return (i&a>>b)+(i&c>>d)+...
, da jede andere Art (wie der Versuch, einen "richtigen" Code mit Schleifen, Zuweisungen, Bedingungsprüfungen usw. zu generieren) einfach zu langsam konvergiert. Auch auf diese Weise ist es sehr einfach, die Gene (jeweils der Begriff) zu definieren und sie zu mutieren.0..10000
(wenn Sie die gefundene Lösung überprüfen, können Sie feststellen, dass sie bei Zahlen größer als 16384 nicht funktioniert).quelle
Javascript
Nun, ich habe ein Problem mit der Gleitkommapräzision bei meiner Antwort - das wahrscheinlich mit einer BigDecimal-Bibliothek gelöst werden kann -, wenn die Eingabenummern größer als sind
55
.Ja, das ist noch lange nicht
10000
so, also erwarte ich keinen Sieg, aber dennoch eine interessante Methode, die auf diesem Thema basiert .Es berechnet eine [Polynominterpolation] ( http://en.wikipedia.org/wiki/Polynomial_interpolation ) basierend auf einer Menge von Punkten, verwendet also nur Multiplikation, Division und Addition, keine Modulo- oder bitweisen Operatoren.
Ausgabefunktion:
Diese Polynomfunktion (vereinfacht bis Grad 25 und ohne Rundung) zeigt Werte für ganze Zahlen (lesbar für [6; 19]):
Tests:
quelle