Advent of Code

Gute Links und Tutorials könnt ihr hier posten.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@ThomasL: Ohne auf deinen anderen Code einzugehen, aber ein split() ohne Argumente braucht kein strip() davor, da es ja jeglichen Whitespace herausfiltert. Insofern tut etwas wie "spam ham eggs\n".split() bereits das, was du wahrscheinlich durch die Kombination aus strip() und split() erreichen willst. split() funktioniert halt so, dass der leere String als Teil der Rückgabe ignoriert wird. Kann man auch ganz einfach ausprobieren mit " spam ".split().

EDIT: Technisch gesehen gibt es natürlich keinen ignorierten Teil, da einfach der Whitespace am Anfang und am Ende durchlaufen wird, ohne dass etwas hinzugefügt wird. Ich meinte das quasi aus der semantischen Sicht, wo manch einer von einem Split (= linker und rechter Teil) im Ergebnis ausgeben würde.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier ein Nachbau von split() ohne Argumente in Python-Code:

Code: Alles auswählen

def get_part(iterable):
    result = []
    for char in iterable:
        if not char.isspace():
            result.append(char)
        elif result:
            break
    return "".join(result)

def split(string):
    parts = []
    it = iter(string)
    while (part := get_part(it)):
        parts.append(part)
    return parts
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gerryontour: Anmerkungen zum Quelltext:

Warum verbindest Du zwei literale Zeichenketten mit ``+``? Da kann man doch einfach gleich nur *eine* Zeichenkette schreiben.

An den Namen musst Du arbeiten. Was soll `f` bedeuten? `file`? Gibt es ja auch, aber das ist dann gar keine Datei, sondern eine Liste mit Zeichenketten. `i` ist ein ganz schlechter Name für eine Zeichenkette. Leser erwarten unter `i`, `j`, und `k` ganze Zahlen die als Index verwendet werden können. `line` wäre beispielsweise ein passender Name für eine Zeile.

Der `readlines()`-Aufruf ist Überflüssig. Dateiobjekte sind iterierbar und liefert die Zeilen aus der Datei.

Zeilenendezeichen entfernt man am Ende und sicht nicht in der gesamten Zeile danach. Also `rstrip()` statt `replace()`. Wobei das nicht wirklich notwendig ist, denn `int()` stört sich nicht an ”whitespace” vor und nach der Zahldarstellung.

Nach dem Einlesen sollte man bereits eine Liste mit Zahlen haben und nicht eine Liste mit Zeichenketten wo *jedesmal* zum addieren die Zeichenketten erneut in Zahlen umgewandelt werden.

Im ``with``-Block braucht nur der Code stehen, der die Daten einliest. Nachdem das passiert ist, braucht man die Datei ja nicht mehr.

`key` und `value` ist hier auch unpassend weil `key` gar kein Schlüssel ist.

`twfive` ist auch kein guter Name. Er ist kryptisch abgekürzt und sagt überhaupt aus was der Wert bedeutet, nur das es irgendwas mit „twenty five“ ist, wenn man den Namen mit der literalen Zahl in der Zeile in Verbindung bringen kann.

Und auch `final` ist nicht wirklich verständlich.

`i` ist wie gesagt ein Name für Indexwerte, also auch wieder schlecht, weil es zwar ganze Zahlen sind, aber keine Indexwerte. Bei `e` und `ap` kann ich nicht mal ansatzweise erraten was die bedeuten sollen. Man muss auch nicht jeden Zwischenwert an einen Namen binden.

``continue`` sollte man meiden. Das ist hier auch überhaupt nicht nötit, denn nach dem ``if``/``else`` wird ja ganz regulär ein neuer Schleifendurchlauf begonnen. Man kann also einfach die Bedingung beim ``if`` umkehren und den Code aus dem ``else``-Zweig in den ``if``-Zweig verschieben.

Zwischenstand mit besseren Namen, aber Code der immer noch das gleiche macht wie Deiner, also noch fehlerhaft ist:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    print("------------\n\n")
    with open("pe.txt", "r") as file:
        numbers = [int(line) for line in file]

    for i, number in enumerate(numbers):
        previous_numbers = numbers[i : i + 25]
        sums = []
        for number_a in previous_numbers:
            for number_b in previous_numbers:
                sums.append(number_a + number_b)

        if number not in sums:
            print(number)
            break


if __name__ == "__main__":
    main()
Die von Dir genannte Zeile macht in der Tat nicht das richtige. Mit den richtigen Namen fällt vielleicht sogar auf was der Fehler in der Zeile ist.

Aber auch die Schleife welche die Summen berechnet ist fehlerhaft. Einer der Beispielfälle für (un)gültige Zahlen aus der Aufgabenstellung würde damit nicht funktionieren.

Darum als Tipp diese Beispielfälle tatsächlich als Tests zu programmieren. Da gibt es bekannte Eingabedaten und dazu gehörende Ergebnisse. Wenn Dein Code die nicht reproduzieren kann, dann ist es *sehr* wahrscheinlich, dass es auch bei den Eingabedaten für die Aufgabe nicht richtig funktionieren wird.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@gerryontour: Ergänzend zu __blackjack__: Das Testen geht sehr einfach mit pytest:

Code: Alles auswählen

import random


def is_valid_next_number(number, last_numbers):
    # TODO
    return False


def test_is_valid_next_number():
    preamble = random.shuffle(list(range(1, 26)))
    assert is_valid_next_number(26, preamble)
    assert is_valid_next_number(49, preamble)
    assert not is_valid_next_number(100, preamble)
    assert not is_valid_next_number(50, preamble)

Code: Alles auswählen

$ pytest day09.py
============================= test session starts ==============================
platform linux -- Python 3.9.0, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: /tmp/t
collected 1 item

day09.py F                                                               [100%]

=================================== FAILURES ===================================
__________________________ test_is_valid_next_number ___________________________

    def test_is_valid_next_number():
        preamble = random.shuffle(list(range(1, 26)))
>       assert is_valid_next_number(26, preamble)
E       assert False
E        +  where False = is_valid_next_number(26, None)

day09.py:11: AssertionError
=========================== short test summary info ============================
FAILED day09.py::test_is_valid_next_number - assert False
============================== 1 failed in 0.03s ===============================
Dabei hilft es enorm, wenn man den Code auf (kleine) Funktionen aufteilt, die man leicht unabhängig voneinander testen kann.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Tag 9 in BASIC für den C64:

Code: Alles auswählen

   10 TI$="000000":N=1000:DIM N(N):OPEN 2,8,2,"INPUT09,S,R"
   20 PRINT"READING NUMBERS...":I=0
  100 IF ST<>0 THEN CLOSE 2:GOTO 200
  110 INPUT#2,N(I):I=I+1:IF (I AND 31)=0 THEN PRINT I:PRINT"{UP}";
  120 GOTO 100
  200 PRINT"READING TIME: "TI$:PRINT"SEARCHING INVALID NUMBER..."
  210 FOR I=25 TO N:PRINT I:PRINT"{UP}";:X=N(I):FOR J=I-25 TO I-2
  220 FOR K=J+1 TO I-1:F=N(J)+N(K)=X:IF F THEN J=I:K=I
  230 NEXT:NEXT:IF NOT F THEN R1=X:I=N
  240 NEXT:PRINT"PART 1:"R1:PRINT"TIME SO FAR: "TI$:
  300 PRINT"SEARCHING CONTIGEOUS SUBSET..."
  310 FOR I=0 TO N:PRINT I:PRINT"{UP}";:S=0:FOR J=I TO N:IF S>=R1 THEN B=J-1:J=N
  320 S=S+N(J):NEXT:IF S=R1 THEN A=I:I=N
  330 NEXT:MI=N(A):MA=N(A):FOR I=A TO B:X=N(I):IF X<MI THEN MI=X
  340 IF X>MA THEN MA=X
  350 NEXT:PRINT"PART 2:";MI+MA:PRINT"TOTAL TIME: "TI$
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
gerryontour
User
Beiträge: 23
Registriert: Dienstag 30. Juni 2020, 15:50

__blackjack__ hat geschrieben: Mittwoch 9. Dezember 2020, 21:01 @gerryontour: Anmerkungen zum Quelltext:

Warum verbindest Du zwei literale Zeichenketten mit ``+``? Da kann man doch einfach gleich nur *eine* Zeichenkette schreiben.

An den Namen musst Du arbeiten. Was soll `f` bedeuten? `file`? Gibt es ja auch, aber das ist dann gar keine Datei, sondern eine Liste mit Zeichenketten. `i` ist ein ganz schlechter Name für eine Zeichenkette. Leser erwarten unter `i`, `j`, und `k` ganze Zahlen die als Index verwendet werden können. `line` wäre beispielsweise ein passender Name für eine Zeile.

Der `readlines()`-Aufruf ist Überflüssig. Dateiobjekte sind iterierbar und liefert die Zeilen aus der Datei.

Zeilenendezeichen entfernt man am Ende und sicht nicht in der gesamten Zeile danach. Also `rstrip()` statt `replace()`. Wobei das nicht wirklich notwendig ist, denn `int()` stört sich nicht an ”whitespace” vor und nach der Zahldarstellung.

Nach dem Einlesen sollte man bereits eine Liste mit Zahlen haben und nicht eine Liste mit Zeichenketten wo *jedesmal* zum addieren die Zeichenketten erneut in Zahlen umgewandelt werden.

Im ``with``-Block braucht nur der Code stehen, der die Daten einliest. Nachdem das passiert ist, braucht man die Datei ja nicht mehr.

`key` und `value` ist hier auch unpassend weil `key` gar kein Schlüssel ist.

`twfive` ist auch kein guter Name. Er ist kryptisch abgekürzt und sagt überhaupt aus was der Wert bedeutet, nur das es irgendwas mit „twenty five“ ist, wenn man den Namen mit der literalen Zahl in der Zeile in Verbindung bringen kann.

Und auch `final` ist nicht wirklich verständlich.

`i` ist wie gesagt ein Name für Indexwerte, also auch wieder schlecht, weil es zwar ganze Zahlen sind, aber keine Indexwerte. Bei `e` und `ap` kann ich nicht mal ansatzweise erraten was die bedeuten sollen. Man muss auch nicht jeden Zwischenwert an einen Namen binden.

``continue`` sollte man meiden. Das ist hier auch überhaupt nicht nötit, denn nach dem ``if``/``else`` wird ja ganz regulär ein neuer Schleifendurchlauf begonnen. Man kann also einfach die Bedingung beim ``if`` umkehren und den Code aus dem ``else``-Zweig in den ``if``-Zweig verschieben.

Zwischenstand mit besseren Namen, aber Code der immer noch das gleiche macht wie Deiner, also noch fehlerhaft ist:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    print("------------\n\n")
    with open("pe.txt", "r") as file:
        numbers = [int(line) for line in file]

    for i, number in enumerate(numbers):
        previous_numbers = numbers[i : i + 25]
        sums = []
        for number_a in previous_numbers:
            for number_b in previous_numbers:
                sums.append(number_a + number_b)

        if number not in sums:
            print(number)
            break


if __name__ == "__main__":
    main()
Die von Dir genannte Zeile macht in der Tat nicht das richtige. Mit den richtigen Namen fällt vielleicht sogar auf was der Fehler in der Zeile ist.

Aber auch die Schleife welche die Summen berechnet ist fehlerhaft. Einer der Beispielfälle für (un)gültige Zahlen aus der Aufgabenstellung würde damit nicht funktionieren.

Darum als Tipp diese Beispielfälle tatsächlich als Tests zu programmieren. Da gibt es bekannte Eingabedaten und dazu gehörende Ergebnisse. Wenn Dein Code die nicht reproduzieren kann, dann ist es *sehr* wahrscheinlich, dass es auch bei den Eingabedaten für die Aufgabe nicht richtig funktionieren wird.
Danke für die ausführliche Antwort! Das mit den Variablennamen ist echt katastrophe gewesen bei mir.

Ich habe nun noch

Code: Alles auswählen

if number_a != number_b:
vor

Code: Alles auswählen

sums.append
gemacht, somit sollten die Bedinungen richtig sein. Leider funktioniert mein Programm noch nicht, den Fehler im

Code: Alles auswählen

if number not in sums:
finde ich nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gerryontour: Wie verhält sich denn `number` zu `previous_numbers`?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Welcome to day10 -> Zwei Wochen bis Heiligabend.
Viel Spaß.

An Part 2 habe ich über eine Stunde geknobelt und musste dann eine Musterlösung zur Hilfe nehmen. :?

Bild
gerryontour
User
Beiträge: 23
Registriert: Dienstag 30. Juni 2020, 15:50

__blackjack__ hat geschrieben: Donnerstag 10. Dezember 2020, 00:18 @gerryontour: Wie verhält sich denn `number` zu `previous_numbers`?
Naja previous_numbers soll halt die Bedingung der 25 Zahlen davor darstellen, number die iterierte Zahl des Inputs?
Hat es hiermit noch was zu tun, dass die ersten 25 Zahlen nicht beachtet werden sollen `for i, number in enumerate(numbers[25:]):`
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gerryontour: Du beschreibst die Beziehung zwischen `previous_numbers` und `numer` richtig, nur der Code passt da nicht zu.

Wie gesagt, probiere mal die Beispiele aus dem Text aus. Erstes Beispiel ist ja da kommen die Zahlen 1 bis 25 in zufälliger Reihenfolge und dann die 26. Also beispielsweise [20, 18, 24, 15, 10, 2, 6, 16, 22, 25, 5, 1, 19, 14, 8, 3, 12, 7, 11, 21, 13, 9, 23, 17, 4, 26]. Was muss jetzt berechnet werden? Und was macht Dein Code? Und wie weicht das von dem ab was eigentlich passieren soll?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
gerryontour
User
Beiträge: 23
Registriert: Dienstag 30. Juni 2020, 15:50

Für das Testset funktioniert der Code.

Code: Alles auswählen

def main():
    print("------------\n\n")
    with open("pe.txt", "r") as file:
        numbers = [int(line) for line in file]

    for i, number in enumerate(numbers[5:]):
        previous_numbers = numbers[i : i + 5]
        sums = []
        for number_a in previous_numbers:
            for number_b in previous_numbers:
              if number_a != number_b:
                sums.append(number_a + number_b)
        if number not in sums:
            print(number)
            break


if __name__ == "__main__":
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was ist denn *das* Testset? Da werden ja insgesamt 9 Testfälle beschrieben. Laufen die alle? Und wie sieht es jetzt mit den tatsächlichen Daten aus?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
gerryontour
User
Beiträge: 23
Registriert: Dienstag 30. Juni 2020, 15:50

__blackjack__ hat geschrieben: Donnerstag 10. Dezember 2020, 15:09 Was ist denn *das* Testset? Da werden ja insgesamt 9 Testfälle beschrieben. Laufen die alle? Und wie sieht es jetzt mit den tatsächlichen Daten aus?
Sorry, dass ich das Forum hier zu zuspamme haha!

35
20
15
25
47
40
62
55
65
95
102
117
150
182
127
219
299
277
309
576

Code: Alles auswählen

def main():
    print("------------\n\n")
    with open("pe.txt", "r") as file:
        numbers = [int(line) for line in file]

    for i, number in enumerate(numbers[5:]):
        previous_numbers = numbers[i : i + 5]
        sums = []
        for number_a in previous_numbers:
            for number_b in previous_numbers:
              if number_a != number_b:
                sums.append(number_a + number_b)
        if number not in sums:
            print(number)
            break


if __name__ == "__main__":
    main()
hier wird die 127 erkannt und geprintet.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hier meine Lösung für Tag 10. Hat mich auch etwas Zeit gekostet, den Zusammenhang zwischen der Anzahl der Einserfolgen und der Anzahl der Kombinationen zu erkennen.

Code: Alles auswählen

with open('input.txt') as file:
    data = [0] + sorted([int(line) for line in file])
data.append(data[-1] + 3)

difs = ''.join(str(x - data[i]) for i, x in enumerate(data[1:]))

# part 1
print(difs.count('1') * difs.count('3'))

# part 2
difs = difs.split('3')
print(2**difs.count('11') * 4**difs.count('111') * 7**difs.count('1111'))
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@ThomasL: Dein Teil 2 funktioniert nicht mehr, wenn mehr als 4 Einsen hintereinander kommen.

Meine Lösung funktioniert dann auch nicht mehr:

Code: Alles auswählen

» cat input
1
2
3
4
5
6
» ./solution.js
6
16
Ich habe es mit dem Binomialkoffizienten probiert (2 == comb(2, 2) + 1; 4 == comb(3, 2) + 1; 7 == comb(4, 2) + 1), aber das passt für Längen größer 4 auch nicht mehr.

Code: Alles auswählen

λ» diff = zipWith subtract <*> tail
diff :: Num c => [c] -> [c]

λ» possibleCombinations n = length . filter ((<= 3) . maximum . diff) . map (\xs -> 0 : xs <> [n + 3]) . subsequences $ [1..n]
possibleCombinations :: (Ord a, Num a, Enum a) => a -> Int

λ» map possibleCombinations [0..20]
[1,1,2,4,7,13,24,44,81,149,274,504,927,1705,3136,5768,10609,19513,35890,66012,121415]
Wenn man die Sequenz bei der OEIS eingibt, kommt man zu A000073, den Tribonacci-Zahlen. Da ist jetzt die Frage, wo da der Zusammenhang herkommt.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich habe das als Graphenproblem aufgefasst. Also Ladebuchse, jeder Adapter, und das zu ladenende Gerät sind Knoten. Alle Knoten deren Wert nicht mehr als 3 voneinander entfernt sind haben eine Kante/Verbindung vom kleineren Wert zum grösseren. Hier mal das kleine Beispiel aus der Aufgabe:

Code: Alles auswählen

     +----+
     | 0  |
     +----+
       |
       v
     +----+
     | 1  |
     +----+
       |
       v
     +----+ 
  +- | 4  | -+
  |  +----+  | 
  |    |     |
  |    v     |
  |  +----+  |
  |  | 5  | -+----+
  |  +----+  |    | 
  |    |     |    |
  |    v     |    |
  |  +----+  |    |
  |  | 6  | <+    |
  |  +----+       | 
  |    |          |
  |    v          |
  |  +----+       |
  +> | 7  | <-----+
     +----+    
       |
       v
     +----+
     | 10 | -+
     +----+  | 
       |     |
       v     |
     +----+  |
     | 11 |  |
     +----+  | 
       |     | 
       v     |
     +----+  |
     | 12 | <+
     +----+
       |
       v
     +----+
     | 15 |
     +----+
       |
       v
     +----+
     | 16 |
     +----+
       | 
       v
     +----+
     | 19 |
     +----+
Frage ist jetzt wie viele Wege es von der Ladebuchse zum Gerät bzw. letzten Adapter gibt. Das könnte man rekursiv von der Ladebuchse aus machen, aber wenn man sich mal anschaut wie das abläuft, sieht man, dass man das recht effizient vom Gerät aus lösen kann in dem man linear von hinten durch die Adapter geht und die Anzahl der Wege die vom aktuellen Adapter zum Ziel führen einfach auf die Anzahl der Wege aller direkten Vorgänger addiert.

Hier die Lösung in BASIC für den C64:

Code: Alles auswählen

   10 TI$="000000":OM=1000000:DIM A(100),H(3),J(100,2):N=0
   20 PRINT"READING ADAPTER JOLTS...":OPEN 2,8,2,"INPUT10,S,R"
   30 IF ST<>0 THEN CLOSE 2:PRINT"READING TIME: "TI$:GOTO 100
   40 INPUT#2,A(N):PRINT N:PRINT"{UP}";:N=N+1:GOTO 30
  100 PRINT"SORTING ADAPTERS..."
  110 F=0:FOR I=1 TO N:IF A(I-1)<A(I) THEN F=-1:T=A(I):A(I)=A(I-1):A(I-1)=T
  120 NEXT:IF F THEN 110
  130 REM CALCULATE DIFFERENCE HISTOGRAM
  140 FOR I=1 TO N:D=A(I-1)-A(I):H(D)=H(D)+1:NEXT
  150 PRINT"PART 1:";H(1)*(H(3)+1):PRINT"TIME SO FAR: "TI$
  200 REM CALCULATE TOTAL JOLTAGE
  210 J(0,0)=1:FOR I=0 TO N:FOR J=I+1 TO I+3:IF J>N THEN 250
  220 IF A(I)-A(J)>3 THEN 250
  230 L=J(I,0)+J(J,0):H=J(I,1)+J(J,1):IF L>OM THEN L=L-OM:H=H+1
  240 J(J,0)=L:J(J,1)=H
  250 NEXT:NEXT:PRINT"PART 2:"J(N,1)"MIO. +"J(N,0):PRINT"TOTAL TIME: "TI$
Es hat mal wieder die Genauigkeit der Gleitkommazahlen vom C64 nicht gereicht, weshalb ich die Summe auf zwei Werte aufgeteilt habe: einer zählt die ganzen Millionen und der andere den Rest. Darum wird das Ergebnis 14.173.478.093.824 als ``14173478 MIO. + 93824`` ausgegeben. 🤓
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

narpfel hat geschrieben: Donnerstag 10. Dezember 2020, 19:22 @ThomasL: Dein Teil 2 funktioniert nicht mehr, wenn mehr als 4 Einsen hintereinander kommen.
Hi, das ist mir durchaus bewusst, mein Code ist auf die Tagesaufgabe zugeschnitten, eine Generalität ist aber auch nicht erforderlich.
Aber Danke für den Hinweis auf die Tribonacci Zahlen, da werde ich mich mal einlesen.
Wieder etwas gelernt durch Advent of Code. :-)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Guten Morgen und viel Spaß an Tag 11!

Bild


Gäbe es einen Preis für die längste Lösung, heute hätte ich ihn gewonnen. Ich kann mich auch in Brute-Force-König umbenennen...
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Ich konnte durch umstellen einer Schleife die Laufzeit von >10min auf <10s drücken. Ist aber immer noch eine Brute-Force-Lösung :-(

Gruß
Whitie
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Das Ergebnis ist bei mir in unter 2 Sekunden da. Dann gehört die Krone vielleicht doch dir :)

Vor dem Refactoring hatte ich 110 Zeilen Code. Damit würden manche hier im Forum eine komplette Klimasimulation hinbekommen. :)
Antworten