# Advent of Code 2017 - Programmieraufgaben im Adventskalender



## Laudian (2. Dezember 2017)

Wie schon die letzten beiden Jahre kann man auch dieses Jahr auf Advent of Code 2017 jeden Tag wieder 2 kleine Programmieraufgaben finden.

Wie immer fangen die Aufgaben am Start sehr simpel an und werden zum Ende hin dann relativ aufwändig.

Würde mich freuen, falls noch jemand mitmacht. Ich finde es immer interessant zu sehen, wie andere an die Aufgaben herangehen 

Meine Lösungen werden btw. hier zu finden seien:
adventofcode * GitLab


----------



## Ebrithil (3. Dezember 2017)

Ich mach dieses Jahr auch wieder mit, meine Lösungen sind/werden hier zu finden sein: Christoph Schlesselmann / AdventOfCode2017 * GitLab

Bin bisher noch nicht dazu gekommen die Aufgaben 2 & 3 zu erledigen, das werde ich dann entweder heute Abend oder morgen nachholen.

Edit:
Hab jetzt Aufgabe 2 erledigt und mir dann auch mal deine Lösung angesehen, irgendwie kommt mir deine dabei unnötig kompliziert vor, warum benutzt du zb nicht die Funktionen min() und max()? 

\Disclaimer, ich hab keinen Plan von Python, der AoC ist das erste mal das ich was damit mache


----------



## Laudian (4. Dezember 2017)

Ebrithil schrieb:


> Hab jetzt Aufgabe 2 erledigt und mir dann auch mal deine Lösung angesehen, irgendwie kommt mir deine dabei unnötig kompliziert vor, warum benutzt du zb nicht die Funktionen min() und max()?



Da habe ich die Lösung einfach so schnell runtergeschrieben, dass ich garnicht darüber nachgedacht habe, dass so eine Funktion bestimmt Teil der Standardbibliothek ist...

Beim zweiten Teil hast du aber natürlich Recht, Ich iteriere sonst eigentlich immer über die Indizes einer Liste, ich habe nicht die geringste Idee, warum ich hier über die Objekte iteriert habe und dann so eine bescheuerte Lösung benutzt habe...
Je öfter ich es mir angucke, desto bescheuerter wird meine Lösung da^^


----------



## Ebrithil (4. Dezember 2017)

Hab jetzt Aufgabe 3 & 4 nachgeholt. Bei Aufgabe 3 hab ich allerdings bisher nur den ersten Teil erledigt, weil ich es nicht einsehe, dass ich für den zweiten Teil die ganze Spirale aufbauen muss. Wenn mir da nichts anderes mehr einfällt wirds da wohl bei dem einen Stern bleiben.


----------



## Laudian (5. Dezember 2017)

Was stört dich daran, die ganze Spirale aufzubauen?
Das ist ja kaum eine Veränderung zu Aufgabe 1.

Edit: Ich sehe gerade, du baust die Spirale in Aufgabe 1 garnicht auf, sondern berechnest die Koordinaten der nten Stelle direkt. Damit kommt man in Teil 2 natürlich nicht sehr weit...


----------



## Ebrithil (5. Dezember 2017)

Laudian schrieb:


> Was stört dich daran, die ganze Spirale aufzubauen?


Der Brute-Force Ansatz ist mir zu stupide. Das ist nicht schwer, dauert nur n bisschen und da hab ich halt keine Lust drauf, ich versuch lieber was "kompliziertes" und wenns nicht klappt lass ich's halt. Ist halt mein persönlicher Anspruch, kann ja jeder handhaben wie er will


----------



## RicoBrassers (5. Dezember 2017)

Ich mache auch mal mit.

GitHub - RicoBrase/AdventOfCode2017: Entries for Advent of Code 2017 (http://adventofcode.com/)

Ich nutze das Ganze auch direkt mal als Einstieg in Kotlin. 
Die Aufgaben für die anderen Tage werden selbstverständlich nachgearbeitet (ohne Schummeln, versprochen ).


----------



## Ebrithil (5. Dezember 2017)

Aufgabe 5 war ja auch ziemlich leicht. Hab glaub ich insgesamt knapp 4-5 Minuten gebraucht.
Allerdings hat mich die lange Laufzeit doch relativ überrascht, deshalb hab ich den exakt gleichen Code nochmal in C++ geschrieben und naja:

Python

```
$ time python day5.py
360603
25347697

real    0m10.986s
user    0m0.000s
sys     0m0.000s
```


C++

```
$ time ./day5.exe
360603
25347697

real    0m0.066s
user    0m0.000s
sys     0m0.000s
```

ist halt doch einfach nochmal n bisschen schneller


----------



## RicoBrassers (7. Dezember 2017)

Laudian schrieb:


> Was stört dich daran, die ganze Spirale aufzubauen?
> Das ist ja kaum eine Veränderung zu Aufgabe 1.
> 
> Edit: Ich sehe gerade, du baust die Spirale in Aufgabe 1 garnicht auf, sondern berechnest die Koordinaten der nten Stelle direkt. Damit kommt man in Teil 2 natürlich nicht sehr weit...



Hm... Ich bin auch zuerst auf den Ansatz gekommen, die Koordinaten direkt zu berechnen.
Da ich das Ganze mit Arrays mache, berechne ich quasi erst einmal, wie lang & hoch mein Quadrat sein muss (bis die Zahl in der unteren rechten Ecke größer als die Eingabe ist) und gehe danach X Schritte in umgekehrter Reihenfolge durch das Quadrat zurück, wobei X die Differenz aus der Zahl unten rechts und der Eingabe ist. 

Da einem - mWn - in Teil 2 aber nichts anderes übrig bleibt, als das Ganze zu "brute forcen", ist das natürlich schon "komplexer". Vorallem dann, wenn man das ganze mit Arrays statischer Größe macht, so wie ich. 
Ihr kennt nicht zufälligerweise einen Weg, wie man die Qudratsgröße aus der zweiten Teilaufgabe schon im vornerein berechnen kann? Aktuell lege ich die Größe vorher einfach nach den gleichen Bedingungen wie aus der ersten Teilaufgabe fest, was nunmal etwas stark überdimensioniert und daher suboptimal ist.


----------



## Laudian (16. Dezember 2017)

Nicht einschlafen hier 

Mich würde vor allem Tag 13 sehr interessieren, das war die erste laufzeitkritische Aufgabe.
Ich habe die Laufzeit am Ende auf etwa 4 Sekunden runterbekommen und sehe nicht, was ich noch großartig verbessern könnte.



Spoiler





```
with open("eingabe_13.txt", "r") as file:
    eingabe = file.read().split("\n")

class Scanner():
    def __init__(self, depth, scanrange):
        self.depth = depth
        self.range = scanrange
        self.severity = self.depth*self.range
        self.modulo = (self.range-1)*2
        return

    def posZeroAfterSeconds(self, seconds):
        time = seconds + self.depth
        pos = time % self.modulo
        return pos == 0

def gotScanned(delay):
    global scanners
    for scanner in scanners:
        if scanner.posZeroAfterSeconds(delay):
            return True
    return False

scanners = []
for element in eingabe:
    x, y = [int(n) for n in element.split(": ")]
    scanners.append(Scanner(x, y))

severity = 0
for scanner in scanners:
    if scanner.posZeroAfterSeconds(0):
        severity += scanner.severity

print("Aufgabe 1:", severity)

delay = 0
while True:
    delay += 1
    if gotScanned(delay):
        continue
    else:
        break

print("Aufgabe 2:", delay)
```


----------



## RicoBrassers (18. Dezember 2017)

Laudian schrieb:


> Nicht einschlafen hier



Aus Zeitgründen stehe ich leider noch bei Tag 5, mal gucken, ob ich die Tage da noch ordentlich nachholen kann.


----------



## Ebrithil (18. Dezember 2017)

Hatte leider auch wenig Zeit die letzte Woche, werde aber definitiv noch nacharbeiten, mal gucken wie weit ich heute Abend komme.


----------



## Ebrithil (19. Dezember 2017)

Laudian schrieb:


> Mich würde vor allem Tag 13 sehr interessieren, das war die erste laufzeitkritische Aufgabe.
> Ich habe die Laufzeit am Ende auf etwa 4 Sekunden runterbekommen und sehe nicht, was ich noch großartig verbessern könnte.


Hab Tag 13 mal vorgezogen, in c++ mit -O3 kompiliert 52ms.


----------

