Bin mir da aber auch nicht so sicher ob ich das Richtig verstehe was die von mir wollen.
Was ist denn unklar?
Bin mir da aber auch nicht so sicher ob ich das Richtig verstehe was die von mir wollen.
Was ist denn unklar?
Advent of Code? Schau mal ob du hier fündig wirst!
Es geht schon mal an, dass es ja gar keine Sitze mit ID -1 geben kann
Ich kann jedenfalls nichts mit der Aufgabenstellung anfangen, was sie mir damit sagen wollen.
Anfangs meinte ich sie meinen damit, dass es die ganze vorderste und letzte Reihe nicht, aber das ist/war wohl falsch angenommen.
dass es ja gar keine Sitze mit ID -1 geben kann
Da steht ja auch "seats with IDs +1 and -1 from yours", also mit ID jeweils um 1 kleiner oder größer als die Deines Sitzes. Ist es damit klarer?
Leider nein, hab mich wohl jetzt in etwas verrannt.
Wenn ich mir so deinen Code ansehe hab ich wohl auch einen völlig falschen Ansatz für Teil 1 gewählt.
import os
SKRIPTPFAD = os.path.abspath(os.path.dirname(__file__))
class BinaryBoarding:
def __init__(self, max_row, max_column, seat):
self.rows = [value for value in range(0, max_row)]
self.columns = [value for value in range(0, max_column)]
self.seat = seat
self.seat_id = None
def analyze_seat_id(self):
for spell in self.seat:
if spell == "F":
self.change_row(False)
elif spell == "B":
self.change_row(True)
elif spell == "R":
self.change_column(True)
elif spell == "L":
self.change_column(False)
try:
self.seat_id = self.rows[0] * 8 + self.columns[0]
except IndexError:
self.seat_id = 0
def change_row(self, lower_upper):
if lower_upper:
self.rows = get_upper_half(self.rows)
else:
self.rows = get_lower_half(self.rows)
def change_column(self, lower_upper):
if lower_upper:
self.columns = get_upper_half(self.columns)
else:
self.columns = get_lower_half(self.columns)
def remove_seats(self):
self.rows = self.rows[8:-8]
def read_input(datei):
with open(datei) as file:
inhalt = file.readlines()
return inhalt
def get_upper_half(plaetze):
half = get_half(plaetze)
return plaetze[half:]
def get_lower_half(plaetze):
half = get_half(plaetze)
return plaetze[:half]
def get_half(plaetze):
return int(len(plaetze) / 2)
def main():
max_row = 128
max_column = 8
inhalt = read_input(os.path.join(SKRIPTPFAD, "input_5_1"))
max_seat_id = 0
for seat in inhalt:
boarding = BinaryBoarding(max_row, max_column, seat)
boarding.analyze_seat_id()
max_seat_id = max(boarding.seat_id, max_seat_id)
print(max_seat_id)
max_seat_id = 0
for seat in inhalt:
boarding = BinaryBoarding(max_row, max_column, seat)
boarding.remove_seats()
boarding.analyze_seat_id()
max_seat_id = max(boarding.seat_id, max_seat_id)
print(max_seat_id)
if __name__ == "__main__":
main()
Alles anzeigen
Wenn ich mir so deinen Code ansehe hab ich wohl auch einen völlig falschen Ansatz für Teil 1 gewählt.
Höchstens ein bißchen umständlich, aber durchaus korrekt.
Aber für Teil 2 stimmt Deine Aussage: Da suchst Du ja wieder nach der maximalen vorhandenen seat ID (nach Entfernen von ein paar Reihen), das ist aber gar nicht gefragt. Vielleicht doch die Aufgabenstellung noch mal genau lesen.
und dabei ein paar Sprach-Features verwenden, die ich sonst eher seltener sehe (&=, :=, Set-Operatoren, ...)
Spannend. Von := hatte ich schon mal irgendwo gelesen (und es für eine gute Idee befunden), in freier Wildbahn ist es mir aber noch nicht begegnet.
Ganz klar ist mir Deine Konstruktion mit der Verwendung in tuples und Zugriff auf deren letzes Element noch nicht. Kannst Du kurz die Motivation dafür erläutern?
Das sieht in der Tat recht kompliziert aus. Es gibt einen toootal simplen Zusammenhang zwischen dem was auf der Bordkarte steht und der ID. Reihe und Spalte kann man dann im Grunde vergessen weil die in den Aufgaben sonst nicht weiter gebraucht werden. Man muss ein bisschen low-level denken. Also Richtung Hardware, was ein Rechner eigentlich intern macht. Der Titel der Aufgabe ist da vielleicht auch ein Hinweis.
Zu Aufgabenteil 2: Der Flug ist voll besetzt. Du hast alle anderen Bordkarten gescannt, nur Deine ist ja verloren, das heisst Deine ID fehlt in den Daten. Zusatzbedingung: es fehlen am Anfang und am Ende IDs weil es dort keine Sitze gibt. Aber es ist garantiert das auf Sitz-ID -1 und +1 von Deinem Platz aus gesehen, jemand sitzt. Wäre dem nicht so, liesse sich die Aufgabe nicht eindeutig lösen.
Kannst Du kurz die Motivation dafür erläutern?
Da gibt's keine Motivation, ausser vielleicht um alles in eine Zeile zu bekommen.
Im Grunde statt:
Gleich muss ich mir von __blackjack__ wieder anhören, dass das nicht seinen Code-Standards entspricht
In der Praxis kommt das eher bei dicts vor, z.B. so:
Oder in C++ mit einer anonymen lambda-Funktion:
Manul Ich würde sagen die Tupel existieren um überhaupt eine Ausrede zu haben := da zu verwenden, denn man braucht das ja nur weil da mehrere Anweisungen so pervers in einen Ausdruck gezwängt werden.
Gleich muss ich mir von __blackjack__ wieder anhören, dass das nicht seinen Code-Standards entspricht
Sag ich ja. In der Zukunft gerne auf ungefragte Code-Reviews verzichten, danke
Ich wiederhole: Das ist kein Code, der irgendeiner Art einen Qualitätsanspruch erfüllen möchte.
Nicht streiten, Kinder!
Da gibt's keine Motivation, ausser vielleicht um alles in eine Zeile zu bekommen.
Na, das ist doch eine Motivation. Das := verwendest Du dann aber nur, weil eine normale Zuweisung mit = an der Stelle nicht stehen dürfte, richtig?
Wie ist das denn bei := mit dem Scope? Ist der genauso, als würde an der Stelle (sofern legal) eine reguläre Zuweisung stehen? Wie ist das im konkreten Beispiel? Existieren die von Dir angelegten Variablen außerhalb des tuples?
weil da mehrere Anweisungen so pervers in einen Ausdruck gezwängt werden.
Liest sich ein bißchen wie Deine Basic-Zeilen. SCNR
Wie ist das denn bei := mit dem Scope? Ist der genauso, als würde an der Stelle (sofern legal) eine reguläre Zuweisung stehen? Wie ist das im konkreten Beispiel? Existieren die von Dir angelegten Variablen außerhalb des tuples?
Linus Das hat nichts mit meinen Code-Standards zu tun. Es gibt Sachen über die man diskutieren kann, aber so ein Tupelmissbrauch verstösst gegen jeden Code-Standard. Das kann man bei Code-Golf machen, aber Code-Golf-Code ist das ja auch nicht.
Welcher ungefragte Code-Review? Ich habe auf die Frage von Manul geantwortet. Technisch nach Dir, aus meiner Sicht gleichzeitig, denn Deine Antwort habe ich noch nicht gesehen als ich auf Antworten geklickt hatte. Ansonsten: Wenn Du keine Kommentare zu Quelltext haben möchtest, stell den halt nicht öffentlich zur Diskussion…
Manul Nach BASIC kann man das auch aussehen lassen wenn man mehrere Ausdrücke mit ; in eine Zeile quetscht. Der Teil mit den := ohne die und ohne Tupel hat auch nicht mehr Zeilen:
byr = int(passport["byr"]); valid &= byr >= 1920 and byr <= 2002
iyr = int(passport["iyr"]); valid &= iyr >= 2010 and iyr <= 2020
eyr = int(passport["eyr"]); valid &= eyr >= 2020 and eyr <= 2030
hgt = int(passport["hgt"][:-2]); hgt_unit = passport["hgt"][-2:]
valid &= (
hgt >= {"cm": 150, "in": 59}[hgt_unit]
and hgt <= {"cm": 193, "in": 76}[hgt_unit]
)
hcl = passport["hcl"]; int(hcl[1:], 16);
valid &= len(hcl) == 7 and hcl[0] == "#"
valid &= passport["ecl"] in "amb blu brn gry grn hzl oth".split()
pid = passport["pid"]; int(pid); valid &= len(pid) == 9
Alles anzeigen
Was mir gerade erst auffällt: Ist das tuple nicht sowieso überflüssig, weil der Gag von := nach meinem Verständnis doch gerade ist, daß die Zuweisung einen Wert zurückliefert und daher direkt in Tests verwendet werden kann?
(Wobei in diesem Fall ja sogar
funktionieren müsste und das := dann doch wieder unnötig wäre.)
Zu Aufgabenteil 2: Der Flug ist voll besetzt. Du hast alle anderen Bordkarten gescannt, nur Deine ist ja verloren, das heisst Deine ID fehlt in den Daten.
Danke, das war der entscheidende Teil wo bei mir der Groschen gefallen ist
Hallo zusammen.
Der Teil 1 von heute (Tag 5) war für mich leicht.
Bei Teil 2 habe ich eine ganze weile gebraucht, um zu verstehen was überhaupt gesucht ist. danach ging es auch sehr einfach. - .... Finde die Lücke ..... wäre einfacher als Anweisung für Teil 2 gewesen....
Leider bin ich mit github noch nicht so vertraut, sonst könnte ich meinen Code auch veröffentlichen - wobei von mir keine "Hochstehenden" Lösungsansätz kommen. Bis jetzt habe ich das meist sehr einfach gelöst (mit Liste und Schleifen).
Bei denen die Ihre Lösung online gestellt haben, habe ich mir das eine oder andere überflogen und für mich interessante Herangehensweisen gefunden.
Bin gespannt was morgen kommt.
Gruss Dani
Leider bin ich mit github noch nicht so vertraut, sonst könnte ich meinen Code auch veröffentlichen
Erstens wäre das doch eine günstige Gelegenheit, sich mit Github vertraut zu machen. Kann m.E. ohnehin nichts schaden. Und zweitens könntest Du Deinen Code natürlich auch einfach hier in den Thread packen. Ich finde es spannend, mir anzuschauen, wie andere an die Aufgaben rangegangen sind.
Hallo Manul
Tönt beides gut.
Github nehme ich mir später / morgen zur Brust - jetzt muss ich zuerst noch etwas "für" meine Wohnung tun (aufräumen).
Code hier einstellen - anbei mal meine Lösung für heute.
Für diejenigen welche meinen Code anschauen:
- Hoffe ich, dass ihr keinen "Augenkrebs" bekommt
- Nehme ich konstruktive Ideen und Anregungen gerne entgegen
- Hoffe ich, dass ihr mich nicht "zerfleischt" - weil es unterirdisch ist, was ich gemacht habe.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#Beginn mit der Aufgabe = 12:15
#Ende mit der Aufgabe = 12:45
#imports
from copy import deepcopy
def func_liste_erstellen(anzahl_elemente):
return list(range(anzahl_elemente))
def func_dezimal_wert_aus_binaer(Wert_binaer, arbeits_liste):
list_char_elemente = list(Wert_binaer)
for charakter in list_char_elemente:
anzahl_elemente_aus_liste_loeschen = int(len(arbeits_liste)/2)
zaehler = 1
while zaehler <= anzahl_elemente_aus_liste_loeschen:
if charakter == "R" or charakter == "B":
del arbeits_liste[0]
else:
del arbeits_liste[anzahl_elemente_aus_liste_loeschen] # Die Anzahl der Elemente welche aus der Liste gelöscht wird, passt in diesem Fall mit der Startposition vom Löschen zusammen
zaehler += 1
PFAD = "1205.txt"
list_sitze = []
list_zeile_sitze = func_liste_erstellen(128)
list_spalte_sitze = func_liste_erstellen(8)
with open(PFAD, 'r') as datei_einlesen:
for datei_zeile in datei_einlesen:
zeile = datei_zeile[:-1]
# Zeile "finden"
zeile_sitz_binaer = zeile[:7]
list_zeile_sitze_arbeit = deepcopy(list_zeile_sitze)
func_dezimal_wert_aus_binaer(zeile_sitz_binaer, list_zeile_sitze_arbeit)
zeile_sitz_dezimal = list_zeile_sitze_arbeit[0]
# Spalte "finden"
spalte_sitz_binaer = zeile[7:]
list_spalte_sitze_arbeit = deepcopy(list_spalte_sitze)
func_dezimal_wert_aus_binaer(spalte_sitz_binaer, list_spalte_sitze_arbeit)
spalte_sitz_dezimal = list_spalte_sitze_arbeit[0]
# Sitz ID "berechnen" und Liste hinzufügen
sitz_id = zeile_sitz_dezimal * 8 + spalte_sitz_dezimal
#print("Zeile: {0} - Spalte: {1} => Sitz ID: {2}".format(zeile_sitz_dezimal, spalte_sitz_dezimal, sitz_id))
list_sitze.append(sitz_id)
list_sitze.sort()
print("Loesung Teil 1: Die höchste Sitz ID ist: {}".format(list_sitze[-1]))
# Fehlende Sitz ID suchen
anzahl_elemente_in_list_Sitze = len(list_sitze)
zaehler = 0
while zaehler < anzahl_elemente_in_list_Sitze:
akt_sitz_id = list_sitze[zaehler]
if zaehler < (anzahl_elemente_in_list_Sitze-1):
naechstse_sitz_id = list_sitze[zaehler + 1]
if akt_sitz_id+1 != naechstse_sitz_id:
print("Loesung Teil 2: Meine SitzID ist: {}".format(akt_sitz_id+1))
break
else:
print("keine fehlende Sitz-ID gefunden")
zaehler += 1
Alles anzeigen
Freundliche Grüsse
Dani
Hallo
Das hat heute richtig Spass gemacht. Der Adventskalender ist eine tolle Sache. Endlich hat man ein Ziel was man lösen muss . Als Anfänger fehlte mir so was. Ein Buch lesen oder ein Tutorial durcharbeiten ist ja schön und gut aber wenn man kein Projekt hat weiss man nicht so richtig was man coden soll. Und bis jetzt komme ich auch noch gut mit.
Auch ein Danke an alle die ihre Lösungen zeigen. Das ist sehr hilfreich da man seinen Code vergleichen kann und andere Herangehensweisen sieht.
Auch ich möchte meine Lösung nicht verheimlichen. Kommentare und Anregungen sind immer gerne gesehen.
Vielleicht kann mir ja auch einer sagen warum meine Funktion immer None zurück gegeben hat anstatt den Rückgabewert (ich hab dann Global angewandt).
#!/usr/bin/python3
SEAT_ROWS = [0, 127]
SEAT_COLUMNS = [0, 7]
def define_seat(lower_number, upper_number, rows_or_column):
if len(rows_or_column) == 0:
# return lower_number # I dont know why it return None.
global seat_return
seat_return = lower_number
else:
if rows_or_column[0] == 'F' or rows_or_column[0] == 'L':
upper_number = int((((upper_number - lower_number) / 2) - 0.5) + lower_number)
elif rows_or_column[0] == 'B' or rows_or_column[0] == 'R':
lower_number = int((((upper_number - lower_number) / 2) + 0.5) + lower_number)
rows_or_column = rows_or_column[1:]
define_seat(lower_number, upper_number, rows_or_column)
def calculate_seat_id(row, column):
return (row * 8) + column
def read_file(input_file):
with open(input_file, 'r') as file:
content = file.readlines()
return content
def get_my_seat_id(input):
for id in range(min(input), max(input) + 1):
if id not in input:
if (id - 1) in input:
if (id + 1) in input:
return id
def main():
# Part1
seat_id_list = []
seat_matrix = read_file('input_day5.txt')
for line in seat_matrix:
seat_row = define_seat(SEAT_ROWS[0], SEAT_ROWS[1], line[:7])
seat_row = seat_return
seat_column = define_seat(SEAT_COLUMNS[0], SEAT_COLUMNS[1], line[7:])
seat_column = seat_return
seat_id = calculate_seat_id(seat_row, seat_column)
seat_id_list.append(seat_id)
print(f"The highest SeatID is {max(seat_id_list)}")
# Part2
my_seat_id = get_my_seat_id(seat_id_list)
print(f"My SeatID is {my_seat_id}")
if __name__ == '__main__':
main()
Alles anzeigen
Gruss
Steinardo
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!