Musisz napisać program, implementujący funkcję digitsum(int i)
. Program musi zmodyfikować własny kod (w przypadku języków, w których nie jest to możliwe dzięki refleksji , bądź kreatywny), aby uzyskać cel.
Zaczynasz od
function digitsum(int i){
return i;
}
i zaimplementuj ewolucyjny algorytm, który będzie modyfikował powyższą funkcję, dopóki nie zwróci prawidłowych cyfr po wywołaniu funkcji.
Ponieważ jest to konkurs popularności, masz bardzo wolne ręce, bądź kreatywny!
Wytyczne:
- Zacznij od zdefiniowanej funkcji (oczywiście przetłumaczonej na twój język).
- Wydrukuj przynajmniej najdogodniejszą funkcję każdego pokolenia.
- Wydrukuj działające rozwiązanie przetestowane dla 0 <i <10000.
- Bądź kreatywny!
Nie rób:
- Podpowiedź swojemu programowi do rozwiązania, proszę użyć wszystkich opcji językowych!
- Zgłaszaj błędy do konsoli.
- Użyj dowolnego wejścia zewnętrznego. Możesz pisać i zapisywać w plikach utworzonych przez Twój program. Brak internetu.
Prawidłowe rozwiązanie z największą liczbą głosów wygranych!
popularity-contest
reggaemuffin
źródło
źródło
no libraries
dozwolone oznacza brak libc?no libraries
co byłoby skomplikowane imo, więc wyborcy mogą zdecydować, czy jest używanych zbyt wiele bibliotek!Odpowiedzi:
DO#
Niemal całkowicie losowe i surowe rozwiązanie montażowe. Jeśli chodzi o C # i praktycznie każdą inną platformę, jest to tak niski poziom, jak to możliwe. Na szczęście C # pozwala definiować metody podczas działania w IL (IL to język pośredni, kod bajtowy .NET, podobny do asemblera). Jedynym ograniczeniem tego kodu jest to, że wybrałem niektóre kody (spośród setek) o dowolnej dystrybucji, która byłaby konieczna dla idealnego rozwiązania. Jeśli zezwolimy na wszystkie kody operacyjne, szanse na działający program są niewielkie lub nie ma ich wcale, więc jest to konieczne (jak można sobie wyobrazić, istnieje wiele sposobów, w jakie mogą wystąpić awarie instrukcji montażu, ale na szczęście nie zmniejszają one całego programu w sieci). Poza zakresem możliwych kodów, jest to całkowicie losowe krojenie i krojenie kodów IL bez żadnego podpowiedzi.
Niestety nie mam do tej pory żadnych wyników, ponieważ nawet przy testach na 1..99 (zamiast 1..9999) jest dość powolny i jestem zbyt zmęczony. Wrócę do ciebie jutro.
EDYCJA: Skończyłem program i dużo go poprawiałem. Teraz, jeśli naciśniesz CTRL-C, zakończy on bieżący przebieg i wyświetli wyniki w plikach. Obecnie jedynymi możliwymi do rozwiązania rozwiązaniami są programy, które zawsze zwracają stałą liczbę. Zaczynam myśleć, że szanse na bardziej zaawansowany program roboczy są astronomicznie małe. W każdym razie utrzymam go przez jakiś czas.
EDYCJA: Ulepszam algorytm, jest idealną zabawką dla maniaka takiego jak ja. Kiedyś widziałem wygenerowany program, który faktycznie wykonał losową matematykę i nie zawsze zwracał stałą liczbę. Byłoby wspaniale uruchomić go na kilku milionach procesorów jednocześnie :). Nadal go uruchomię.
EDYCJA: Oto wynik jakiejś całkowicie przypadkowej matematyki. Skacze dookoła i pozostaje na poziomie 17 dla pozostałych wskaźników. W najbliższym czasie nie stanie się to świadome.
EDYCJA: Robi się coraz bardziej skomplikowana. Oczywiście, jak można się spodziewać, nie wygląda to jak odpowiedni algorytm cyfry, ale bardzo się stara. Spójrz, wygenerowany komputerowo program asemblacyjny!
źródło
DO#
To może nie być w pełni zgodne z tym, co sobie wyobrażałeś, ale to najlepsze, co mogłem teraz zrobić. (Przynajmniej z C # i CodeDom).
Jak to działa:
((i & v1) >> v2)
. Te terminy będą genami, które zostaną zmutowane podczas przebiegu.Kod:
Testowane na OSX z kompilatorem Mono C # w wersji 3.2.6.0.
Przy każdej iteracji drukuje wartość sprawności aktualnego obliczenia. Na koniec wydrukuje najlepsze rozwiązanie wraz z jego kondycją. Pętla będzie działać, dopóki jeden z wyników nie osiągnie wartości sprawności 0.
Tak to się zaczyna:
A po chwili (zajmuje to około 30 minut) tak to się kończy (pokazuje ostatnią i prawie ostatnią iterację):
Uwagi:
a >> b
używama / 2^b
return i;
wymagana przez problem.i & a >> a
zamiasti & a >> b
, ponieważ w tym drugim przypadku ewolucja była po prostu zbyt wolna, aby była praktyczna.return (i&a>>b)+(i&c>>d)+...
, ponieważ każdy inny rodzaj (jak próba wygenerowania „właściwego” kodu, z pętlami, przypisaniami, sprawdzaniem warunków itp.) Po prostu zbiega zbyt wolno. Również w ten sposób bardzo łatwo jest zdefiniować geny (każdy z tych terminów) i bardzo łatwo je zmutować.0..10000
(jeśli sprawdzisz znalezione rozwiązanie, zobaczysz, że nie będzie działać dla liczb większych niż 16384)źródło
JavaScript
Mam odpowiedź na zmiennoprzecinkowy problem z moją odpowiedzią - którą prawdopodobnie można rozwiązać za pomocą biblioteki BigDecimal - gdy liczby wejściowe są większe niż
55
.Tak, to daleko,
10000
więc nie spodziewam się wygranej, ale wciąż ciekawa metoda oparta na tym temacie .Oblicza [interpolację wielomianową] ( http://en.wikipedia.org/wiki/Polynomial_interpolation ) na podstawie zestawu punktów, więc używa tylko mnożenia, dzielenia i dodawania, bez operatorów modulo lub bitowych.
Funkcja wyjściowa:
Ta funkcja wielomianowa (uproszczona do stopnia 25 i bez zaokrąglania) wykreślona, spójrz na wartości liczb całkowitych (czytelne dla [6; 19]):
Testy:
źródło