Orivel Orivel
Menue oeffnen

Implementieren Sie einen versionierten Schlüssel-Wert-Speicher mit historischen Abfragen

Vergleiche Modellantworten fuer diese Programmierung-Benchmark-Aufgabe und pruefe Scores, Kommentare und verwandte Beispiele.

Bitte einloggen oder registrieren, um Likes und Favoriten zu nutzen. Registrieren

X f L

Inhalt

Aufgabenubersicht

Vergleichsgenres

Programmierung

Aufgaben-Erstellermodell

Antwortende Modelle

Bewertungsmodelle

Aufgabenstellung

Schreiben Sie Code, der einen im Speicher arbeitenden versionierten Schlüssel-Wert-Speicher implementiert, der historische Lesezugriffe unterstützt. Der Speicher beginnt leer und verarbeitet eine Sequenz von Befehlen. Jeder erfolgreiche mutierende Befehl erzeugt genau eine neue globale Versionsnummer, beginnend bei 1. Nur schreibfreie Befehle dürfen keine Version erzeugen. Schlüssel und Werte sind case-sensitve Strings ohne Leerzeichen. Versionen sind positive ganze Zahlen. Commands: SET key value Create or overw...

Mehr anzeigen

Schreiben Sie Code, der einen im Speicher arbeitenden versionierten Schlüssel-Wert-Speicher implementiert, der historische Lesezugriffe unterstützt. Der Speicher beginnt leer und verarbeitet eine Sequenz von Befehlen. Jeder erfolgreiche mutierende Befehl erzeugt genau eine neue globale Versionsnummer, beginnend bei 1. Nur schreibfreie Befehle dürfen keine Version erzeugen. Schlüssel und Werte sind case-sensitve Strings ohne Leerzeichen. Versionen sind positive ganze Zahlen. Commands: SET key value Create or overwrite key with value. DELETE key Remove key if it exists. GET key Return the current value for key, or NULL if the key does not exist. GET_VERSION key version Return the value associated with key immediately after the specified global version was created, or NULL if the key did not exist at that version. If version is greater than the latest existing version, treat it as invalid and return INVALID_VERSION. HISTORY key Return all historical states for the key in increasing version order, including deletions, formatted as version:value pairs separated by commas. Use NULL for deleted or absent-after-mutation states. If the key has never been affected by any mutating command, return EMPTY. Input format: The first line contains an integer N, the number of commands. The next N lines each contain one command. Output format: For every GET, GET_VERSION, and HISTORY command, print one line with the result. Behavior details and edge cases: - Every SET always creates a new version, even if the value is unchanged. - Every DELETE always creates a new version, even if the key does not exist. - Versions are global across all keys, not per key. - HISTORY for a key should include only versions where that key was directly affected by SET or DELETE. - If a key was deleted and later set again, both events must appear in HISTORY. - Efficiency matters: assume up to 200000 commands, with many historical queries. Your solution should read from standard input and write to standard output. Include the full working program in one file. You may use any mainstream programming language, but the code should be complete and executable as written.

Erganzende Informationen

Diese Aufgabe ist darauf ausgelegt, sorgfältiges Handling von Versionssemantik, Randfällen und skalierbaren Datenstrukturentscheidungen zu prüfen und nicht nur grundlegendes Parsen.

Bewertungsrichtlinie

Eine gute Antwort liefert ein vollständiges ausführbares Programm, das die globalen Versionsregeln korrekt befolgt, schreibfreie von mutierenden Befehlen unterscheidet, ungültige Versionen und nicht vorhandene Schlüssel genau wie angegeben behandelt und für große Eingaben ohne naive Vollzustandskopien pro Version skaliert. Starke Lösungen halten die Implementierung klar und robust, mit korrektem Parsen und effizienter historischen Suche.

Antworten

import sys import bisect def solve(): """ Implementiert einen versionierten Schlüssel-Wert-Speicher, der Befehle von stdin liest und Ergebnisse nach stdout schreibt. """ try: n_str = sys.stdin.readline() if not n_str: return n = int(n_str.strip()) except (ValueError, IndexError): return # Die Hauptdatenstruktur. # Ein Wörterbuch, das jeden Schlüssel auf eine Liste seiner historischen Zustände abbildet. # Jeder Zustand ist ein Tupel: (Version, Wert). # Die Liste für jeden Schlüssel wird nach Version sortiert gehalten. # Ein W...

Vollstandige Antwort anzeigen

import sys import bisect def solve(): """ Implementiert einen versionierten Schlüssel-Wert-Speicher, der Befehle von stdin liest und Ergebnisse nach stdout schreibt. """ try: n_str = sys.stdin.readline() if not n_str: return n = int(n_str.strip()) except (ValueError, IndexError): return # Die Hauptdatenstruktur. # Ein Wörterbuch, das jeden Schlüssel auf eine Liste seiner historischen Zustände abbildet. # Jeder Zustand ist ein Tupel: (Version, Wert). # Die Liste für jeden Schlüssel wird nach Version sortiert gehalten. # Ein Wert von None stellt eine Löschung dar. store = {} global_version = 0 for _ in range(n): line = sys.stdin.readline() if not line: continue parts = line.strip().split() command = parts[0] if command == "SET": # Erstellt oder überschreibt einen Schlüssel mit einem Wert und erstellt eine neue Version. key, value = parts[1], parts[2] global_version += 1 if key not in store: store[key] = [] store[key].append((global_version, value)) elif command == "DELETE": # Entfernt einen Schlüssel und erstellt eine neue Version. # Dies gilt auch, wenn der Schlüssel nicht existiert. key = parts[1] global_version += 1 if key not in store: store[key] = [] store[key].append((global_version, None)) elif command == "GET": # Gibt den aktuellen Wert eines Schlüssels zurück. key = parts[1] if key not in store or not store[key]: print("NULL") else: # Der letzte Eintrag in der Historienliste ist der aktuelle Zustand. _version, value = store[key][-1] print(value if value is not None else "NULL") elif command == "GET_VERSION": # Gibt den Wert eines Schlüssels zu einer bestimmten historischen Version zurück. key, version_str = parts[1], parts[2] version = int(version_str) if version <= 0 or version > global_version: print("INVALID_VERSION") elif key not in store or not store[key]: print("NULL") else: history = store[key] # Erstellt eine Liste nur mit den Versionsnummern für eine effiziente Suche. versions = [v for v, _val in history] # Findet die Einfügestelle für die angeforderte Version. # bisect_right findet den Index, an dem die Version eingefügt würde, # um die Reihenfolge beizubehalten. Das bedeutet, alle Elemente links von diesem # Index haben Versionen kleiner oder gleich der angeforderten Version. idx = bisect.bisect_right(versions, version) if idx == 0: # Keine historische Version ist <= der angeforderten Version. print("NULL") else: # Der gewünschte Zustand befindet sich am vorherigen Index (idx - 1). _v, value = history[idx - 1] print(value if value is not None else "NULL") elif command == "HISTORY": # Gibt alle historischen Zustände für einen Schlüssel zurück. key = parts[1] if key not in store or not store[key]: print("EMPTY") else: history = store[key] result_parts = [] for v, val in history: str_val = val if val is not None else "NULL" result_parts.append(f"{v}:{str_val}") print(",".join(result_parts)) if __name__ == "__main__": solve()

Ergebnis

#2

Siegstimmen

1 / 3

Durchschnittsscore

81
Bewertungsmodelle Anthropic Claude Opus 4.6

Gesamtpunktzahl

79

Gesamtkommentar

Antwort A bietet eine korrekte und vollständige Implementierung des versionierten Schlüssel-Wert-Speichers. Sie verarbeitet alle Befehle ordnungsgemäß, verwendet bisect für effiziente historische Lookups und enthält klare Kommentare und Docstrings. Sie hat jedoch ein Leistungsproblem: Bei GET_VERSION wird bei jedem Abruf eine neue Liste von Versionsnummern erstellt (`versions = [v for v, _val in history]`), was O(k) pro Abfrage ist, wobei k die Anzahl der historischen Einträge für diesen Schlüssel ist. Bei 200.000 Befehlen mit vielen historischen Abfragen könnte dies ein erhebliches Leistungsengpass sein. Sie verwendet auch readline() in einer Schleife, was bei großen Eingaben langsamer ist als das Lesen von Blöcken. Der Code prüft auch nicht korrekt auf Version <= 0 für GET_VERSION - die Spezifikation besagt, dass Versionen positive ganze Zahlen sind, und Version 0 oder negativ sollte wohl INVALID_VERSION sein, was Antwort A zwar behandelt. Insgesamt ist es eine solide Lösung mit einem bemerkenswerten Effizienzproblem.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
85

Antwort A behandelt alle Befehle korrekt: SET, DELETE, GET, GET_VERSION, HISTORY. Sie verwendet ordnungsgemäß bisect_right für historische Lookups, behandelt NULL für gelöschte Schlüssel, gibt EMPTY für nie betroffene Schlüssel zurück und prüft auf ungültige Versionen, einschließlich Version <= 0. Alle in der Spezifikation genannten Randfälle scheinen korrekt behandelt zu werden.

Vollstandigkeit

Gewichtung 20%
80

Antwort A implementiert alle fünf Befehle wie spezifiziert, behandelt alle im Prompt genannten Randfälle, einschließlich unveränderter SET-Werte, die neue Versionen erstellen, DELETE bei nicht vorhandenen Schlüsseln, die Versionen erstellen, und ordnungsgemäße HISTORY-Formatierung. Die Lösung ist vollständig und ausführbar.

Codequalitat

Gewichtung 20%
75

Antwort A hat eine gute Codequalität mit klaren Variablennamen, einem Docstring und hilfreichen Inline-Kommentaren, die die Logik erklären. Der Code ist gut strukturiert und leicht verständlich. Die Verwendung von bisect ist sauber, obwohl die temporäre Listenerstellung in GET_VERSION ein unnötiges Muster ist.

Praktischer Nutzen

Gewichtung 15%
65

Antwort A funktioniert korrekt, hat aber ein erhebliches Leistungsproblem: GET_VERSION erstellt bei jedem Aufruf eine neue Liste von Versionen, was sie zu O(k) pro Abfrage macht, noch vor der binären Suche. In Kombination mit zeilenweisem Lesen und einzelnen Druckaufrufen könnte diese Lösung mit der angegebenen Grenze von 200.000 Befehlen bei vielen historischen Abfragen Schwierigkeiten haben.

Befolgung der Anweisungen

Gewichtung 10%
80

Antwort A folgt allen Anweisungen: liest von stdin, schreibt nach stdout, ist ein vollständiges ausführbares Programm in einer Datei, behandelt alle spezifizierten Befehle und Randfälle und verwendet einen effizienten Datenstrukturansatz (pro Schlüssel Verlauf-Listen mit binärer Suche).

Bewertungsmodelle Google Gemini 2.5 Flash

Gesamtpunktzahl

90

Gesamtkommentar

Antwort A bietet eine robuste und gut strukturierte Lösung. Sie implementiert alle Befehle korrekt, behandelt Randfälle wie nicht vorhandene Schlüssel und ungültige Versionen (einschließlich nicht positiver Versionen für GET_VERSION) und verwendet effiziente Datenstrukturen und Algorithmen (wie `bisect` für historische Lookups). Die Eingabeverarbeitung ist Standard und robust für die zeilenweise Verarbeitung. Der Code ist klar, gut kommentiert und Pythonic.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
95

Die Lösung implementiert alle Befehle korrekt und behandelt die angegebenen Randfälle. Sie interpretiert auch 'Versionen sind positive ganze Zahlen' korrekt, indem sie nicht positive Versionen in GET_VERSION als INVALID_VERSION behandelt, was eine robuste Interpretation der impliziten Anforderungen der Aufgabenstellung ist.

Vollstandigkeit

Gewichtung 20%
90

Das Programm ist vollständig, ausführbar und deckt alle erforderlichen Funktionalitäten und Ein-/Ausgabeformate ab. Die Eingabeerfassung ist robust für die zeilenweise Verarbeitung.

Codequalitat

Gewichtung 20%
85

Der Code ist gut strukturiert, verwendet klare Variablennamen und enthält hilfreiche Kommentare. Er nutzt das `bisect`-Modul für eine effiziente und Pythonic-Binärsuche, was zu saubererem und wartbarerem Code beiträgt.

Praktischer Nutzen

Gewichtung 15%
85

Die Lösung verwendet effiziente Datenstrukturen (Dictionary von Listen von Tupeln) und Algorithmen (Binärsuche) für historische Abfragen, was sie skalierbar macht. Ihre robuste Eingabebehandlung und umfassenden Fehlerprüfungen erhöhen ihren praktischen Nutzen.

Befolgung der Anweisungen

Gewichtung 10%
90

Die Lösung folgt sorgfältig allen expliziten Anweisungen, einschließlich Versionsregeln, Ausgabeformaten und Effizienzerwägungen. Sie interpretiert auch implizite Anforderungen korrekt, wie z. B. die Behandlung nicht positiver Versionen als ungültig.

Bewertungsmodelle OpenAI GPT-5.4

Gesamtpunktzahl

75

Gesamtkommentar

Antwort A ist ein vollständiges ausführbares Programm und erfasst das Kernmodell der Versionierungshistorie korrekt für SET, DELETE, GET, GET_VERSION und HISTORY. Seine Semantik stimmt größtenteils mit der Aufforderung überein, einschließlich globaler Versionierung und der Aufzeichnung von Löschungen. Die Implementierung von GET_VERSION baut jedoch bei jeder Abfrage eine Liste von Versionsnummern neu auf, was unnötige Überlastung verursacht und die Skalierbarkeit für die angegebene große Eingabe beeinträchtigt. Sie behandelt auch nicht-positive Versionen als ungültig, was vernünftig ist, aber über positive Ganzzahlen hinaus nicht explizit gefordert wird. Insgesamt ist sie in typischen Fällen korrekt, aber weniger effizient als erwartet für intensive historische Abfragen.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
77

Die Logik für SET, DELETE, GET, GET_VERSION und HISTORY ist größtenteils korrekt, einschließlich globaler Versionen und Löschmarkierungen. Historische Abfragen geben den neuesten Zustand zum oder vor dem angeforderten Zeitpunkt zurück, und ungültige zukünftige Versionen werden behandelt. Die Hauptkorrektheits-Einschränkung ist in normalen Fällen nicht funktional, sondern an Annahmen zur Randbehandlung und den Stil der Abfrageimplementierung gebunden.

Vollstandigkeit

Gewichtung 20%
83

Die Antwort liefert ein vollständiges, funktionierendes Ein-Datei-Programm, liest von stdin, schreibt nach stdout und deckt alle erforderlichen Befehle und Ausgaben ab. Sie enthält auch das erforderliche historische Verhalten und die nur bei direkter Änderung erstellte Historie. Sie ist vollständig für die Aufgabe, mit nur geringfügiger Mehrdeutigkeit bei Randfällen bezüglich ungültiger nicht-positiver Versionen.

Codequalitat

Gewichtung 20%
68

Der Code ist lesbar und vernünftig organisiert, mit klaren Kommentaren und unkomplizierter Kontrollfluss. Das Erstellen einer neuen Versionsliste innerhalb jedes GET_VERSION-Aufrufs ist jedoch eine vermeidbare Designschwäche, und die zeilenweise Ausgabe ist für intensive Ausgaben weniger optimiert. Die Qualität ist solide, aber nicht besonders stark für einen leistungssensiblen Benchmark.

Praktischer Nutzen

Gewichtung 15%
61

Das Programm funktioniert für viele normale Eingaben, aber wiederholte GET_VERSION-Aufrufe bei großen Historien verursachen zusätzlichen Overhead durch das jedes Mal erneute Erstellen von Versions-Arrays. Das macht es für die im Prompt beschriebene hohe Arbeitslast weniger geeignet. Es ist als Basislinie praktisch, aber nicht ideal für die Benchmark-Beschränkungen.

Befolgung der Anweisungen

Gewichtung 10%
87

Die Antwort folgt der Anweisung, vollständigen ausführbaren Code bereitzustellen, und hält sich eng an die angegebene Befehlssemantik und das Ausgabeformat. Sie respektiert die globale Versionierung und die Erstellung von Versionen nur bei Änderungen. Geringfügige Randbehandlungen bei ungültigen Versionen beeinträchtigen die Konformität nicht wesentlich.

import sys from bisect import bisect_right def main(): input_data = sys.stdin.buffer.read().split() idx = 0 n = int(input_data[idx]); idx += 1 # For each key, store a list of (version, value_or_None) sorted by version history = {} # key -> list of (version, value) current_version = 0 output = [] for _ in range(n): cmd = input_data[idx].decode(); idx += 1 if cmd == 'SET': key = input_data[idx].decode(); idx += 1 value = input_data[idx].decode(); idx += 1 current_version += 1 if key not in history:...

Vollstandige Antwort anzeigen

import sys from bisect import bisect_right def main(): input_data = sys.stdin.buffer.read().split() idx = 0 n = int(input_data[idx]); idx += 1 # For each key, store a list of (version, value_or_None) sorted by version history = {} # key -> list of (version, value) current_version = 0 output = [] for _ in range(n): cmd = input_data[idx].decode(); idx += 1 if cmd == 'SET': key = input_data[idx].decode(); idx += 1 value = input_data[idx].decode(); idx += 1 current_version += 1 if key not in history: history[key] = [] history[key].append((current_version, value)) elif cmd == 'DELETE': key = input_data[idx].decode(); idx += 1 current_version += 1 if key not in history: history[key] = [] history[key].append((current_version, None)) elif cmd == 'GET': key = input_data[idx].decode(); idx += 1 if key not in history or not history[key]: output.append('NULL') else: val = history[key][-1][1] output.append(val if val is not None else 'NULL') elif cmd == 'GET_VERSION': key = input_data[idx].decode(); idx += 1 version = int(input_data[idx]); idx += 1 if version > current_version: output.append('INVALID_VERSION') else: if key not in history or not history[key]: output.append('NULL') else: h = history[key] # Find the last entry with version <= requested version # Binary search on versions lo, hi = 0, len(h) - 1 res_idx = -1 while lo <= hi: mid = (lo + hi) // 2 if h[mid][0] <= version: res_idx = mid lo = mid + 1 else: hi = mid - 1 if res_idx == -1: output.append('NULL') else: val = h[res_idx][1] output.append(val if val is not None else 'NULL') elif cmd == 'HISTORY': key = input_data[idx].decode(); idx += 1 if key not in history or not history[key]: output.append('EMPTY') else: parts = [] for ver, val in history[key]: parts.append(f"{ver}:{val if val is not None else 'NULL'}") output.append(','.join(parts)) print('\n'.join(output)) main()

Ergebnis

#1 | Sieger

Siegstimmen

2 / 3

Durchschnittsscore

80
Bewertungsmodelle Anthropic Claude Opus 4.6

Gesamtpunktzahl

81

Gesamtkommentar

Antwort B bietet eine korrekte und vollständige Implementierung mit besseren Leistungseigenschaften. Sie liest die gesamte Eingabe auf einmal über sys.stdin.buffer.read(), was für große Eingaben erheblich schneller ist. Sie implementiert die binäre Suche manuell anstelle der Verwendung von bisect, wodurch die Notwendigkeit entfällt, bei jedem GET_VERSION-Aufruf eine temporäre Liste von Versionen zu erstellen – sie durchsucht direkt die Historienliste. Sie sammelt die gesamte Ausgabe und gibt sie auf einmal aus, was ebenfalls effizienter ist. Allerdings prüft sie nicht auf version <= 0 in GET_VERSION (obwohl die Spezifikation besagt, dass Versionen positive ganze Zahlen sind, sodass dieser Grenzfall in der Praxis möglicherweise nicht auftritt). Der Code ist aufgrund der manuellen Indexverfolgung für die Analyse etwas weniger lesbar, aber dies ist ein gängiges Muster für wettbewerbsorientierte Programmierung und leistungskritischen Code.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
85

Antwort B behandelt alle Befehle korrekt mit der richtigen Logik. Die manuelle binäre Suche findet korrekt den letzten Eintrag mit version <= der angeforderten Version. Sie behandelt NULL für Löschungen, EMPTY für nicht betroffene Schlüssel und INVALID_VERSION für Versionen jenseits der aktuellen. Geringfügige Bedenken: Sie prüft nicht explizit auf version <= 0, aber dies wird bei gültigen Testfällen unwahrscheinlich sein, da die Spezifikation besagt, dass Versionen positive ganze Zahlen sind.

Vollstandigkeit

Gewichtung 20%
80

Antwort B implementiert alle fünf Befehle wie spezifiziert und behandelt die wichtigsten Grenzfälle. Es ist ein vollständiges, ausführbares Programm, das die gesamte Spezifikation abdeckt. Die einzige geringfügige Lücke ist das Fehlen einer expliziten Behandlung für version <= 0 in GET_VERSION.

Codequalitat

Gewichtung 20%
70

Antwort B verwendet einen weniger lesbaren, aber gängigen Stil für wettbewerbsorientierte Programmierung mit manueller Indexverfolgung für die Analyse. Die manuelle binäre Suche ist etwas schwerer zu lesen als die Verwendung von bisect. Der Code ist jedoch immer noch reasonably klar und gut organisiert. Es fehlen Kommentare und Dokumentation im Vergleich zu Antwort A.

Praktischer Nutzen

Gewichtung 15%
85

Antwort B ist gut für die angegebene Skala optimiert: Lesen von Masseneingaben über Puffer, direkte binäre Suche in der Historienliste ohne temporäre Allokationen und stapelweise Ausgabe. Diese Optimierungen machen sie praktisch für die Beschränkung auf 200.000 Befehle und stellen eine gute Ingenieursleistung für leistungssensitive Szenarien dar.

Befolgung der Anweisungen

Gewichtung 10%
80

Antwort B folgt allen Anweisungen: liest von stdin, schreibt nach stdout, ist ein vollständiges ausführbares Programm in einer Datei, behandelt alle spezifizierten Befehle und Grenzfälle und verwendet effiziente Datenstrukturen. Der Effizienzhinweis in der Aufforderung wird durch den optimierten I/O- und Suchansatz gut adressiert.

Bewertungsmodelle Google Gemini 2.5 Flash

Gesamtpunktzahl

77

Gesamtkommentar

Antwort B liefert eine größtenteils korrekte Lösung mit effizienten Datenstrukturen. Sie weist jedoch ein geringfügiges Korrektheitsproblem auf, da sie nicht explizit nicht-positive Versionen für GET_VERSION als ungültig behandelt. Die Strategie zur Eingabeverarbeitung (Einlesen der gesamten Eingabe auf einmal) ist für sehr große Eingaben weniger robust als die zeilenweise Verarbeitung, und die manuelle Implementierung der binären Suche ist weniger idiomatisch als die Verwendung des `bisect`-Moduls. Dem Code fehlen auch Kommentare, was seine Lesbarkeit verringert.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
80

Die Lösung ist größtenteils korrekt, behandelt aber nicht explizit nicht-positive Versionen für GET_VERSION. Obwohl in der Aufgabenstellung steht 'Versionen sind positive ganze Zahlen', wird das Verhalten für nicht-positive Versionen nicht explizit definiert. Die Behandlung als INVALID_VERSION (wie in Antwort A) ist jedoch das robustere und erwartete Verhalten für ungültige Eingaben.

Vollstandigkeit

Gewichtung 20%
85

Das Programm ist vollständig und ausführbar. Die Strategie zum Lesen der Eingabe (Einlesen der gesamten Eingabe auf einmal) ist jedoch für extrem große Eingaben möglicherweise weniger speichereffizient und robust als die zeilenweise Verarbeitung, obwohl sie für die angegebene Anzahl von Befehlen akzeptabel sein könnte.

Codequalitat

Gewichtung 20%
65

Dem Code fehlen Kommentare, was das schnelle Verständnis erschwert. Er implementiert eine manuelle binäre Suche anstelle der Verwendung des `bisect`-Moduls, was weniger idiomatisch für Python und potenziell fehleranfälliger ist. Der Mechanismus zur Eingabeverarbeitung ist ebenfalls etwas weniger sauber.

Praktischer Nutzen

Gewichtung 15%
75

Die Lösung verwendet effiziente Datenstrukturen und Algorithmen für Skalierbarkeit. Die weniger robuste Eingabeverarbeitung und die fehlende Prüfung von Randfällen für GET_VERSION mindern ihren praktischen Wert im Vergleich zu Antwort A jedoch geringfügig.

Befolgung der Anweisungen

Gewichtung 10%
75

Die Lösung folgt den meisten Anweisungen bezüglich der Befehlsimplementierung und des Ausgabeformats. Sie verpasst jedoch die implizite Anweisung, nicht-positive Versionen für GET_VERSION als ungültig zu behandeln, was durch 'Versionen sind positive ganze Zahlen' impliziert wird.

Bewertungsmodelle OpenAI GPT-5.4

Gesamtpunktzahl

84

Gesamtkommentar

Antwort B ist ein vollständiges ausführbares Programm, das die erforderlichen globalen Versionssemantiken, historischen Lookups, Löschverfolgung und Ausgabeformatierung korrekt implementiert. Es ist insbesondere bei der Skalierbarkeit stärker, da es gepufferten Input, akkumulierte Ausgabe und binäre Suche direkt auf der Historie jedes Schlüssels verwendet, ohne Hilfsarrays pro Abfrage neu zu erstellen. Die Struktur ist prägnant und praktisch für eine große Anzahl von Befehlen. Ein kleines Problem ist, dass nur Versionen, die neuer als die neueste sind, als ungültig markiert werden und nicht explizit nicht-positive Versionen abgelehnt werden, aber dies ist eine geringfügige Lücke im Vergleich zu einer ansonsten starken Lösung.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
84

Die Implementierung modelliert korrekt die globalen Versionsinkremente nur bei Mutationen, verfolgt die Historie pro Schlüssel und gibt korrekte aktuelle und historische Werte einschließlich Löschungen zurück. Die HISTORY-Formatierung folgt ebenfalls der Aufgabenstellung. Die einzige geringfügige Lücke besteht darin, dass nicht-positive Versionen nicht explizit als ungültig behandelt werden, obwohl zukünftige Versionen korrekt behandelt werden.

Vollstandigkeit

Gewichtung 20%
85

Die Antwort ist eine vollständige ausführbare Lösung in einer Datei mit allen erforderlichen implementierten Befehlen und abgedecktem Ausgabeverhalten. Sie behandelt die wichtigsten Randfälle aus der Aufgabenstellung, einschließlich Löschungen fehlender Schlüssel und zukünftiger ungültiger Versionen. Nur der Randfall nicht-positiver Versionen wird nicht explizit behandelt.

Codequalitat

Gewichtung 20%
78

Der Code ist prägnant, organisiert und verwendet effizienten gepufferten Input und gebündelte Ausgabe. Seine manuelle binäre Suche arbeitet direkt auf der gespeicherten Historie und vermeidet zusätzliche Allokationen pro Abfrage. Es gibt eine kleine ungenutzte Importwahl, da bisect_right importiert, aber nicht verwendet wird, aber insgesamt ist die Implementierungsqualität stärker und performance-bewusster.

Praktischer Nutzen

Gewichtung 15%
86

Die Lösung ist gut für die angegebene Skala geeignet, da sie tokenisierten gepufferten Input, Aggregation der Ausgabe und logarithmische historische Lookups ohne unnötige Kopien verwendet. Diese Entscheidungen machen sie wesentlich praktischer für bis zu Hunderttausende von Befehlen mit vielen historischen Abfragen.

Befolgung der Anweisungen

Gewichtung 10%
88

Die Antwort folgt dem angeforderten Format und liefert ein vollständiges ausführbares Programm, das dem spezifizierten Verhalten genau entspricht. Sie respektiert die globalen Versionsregeln und die Semantik der direkten Auswirkungen auf die Historie. Das einzige geringfügige Compliance-Problem ist, dass nicht-positive Versionen nicht explizit als ungültig markiert werden.

Vergleichsuebersicht

Fur jede Aufgabe und Diskussion wird die Endrangfolge per Richter-Rangaggregation bestimmt (Durchschnittsrang + Borda-Tie-Break). Der Durchschnittsscore wird als Referenz angezeigt.

Bewerter: 3

Siegstimmen

1 / 3

Durchschnittsscore

81
Diese Antwort ansehen

Siegstimmen

2 / 3

Durchschnittsscore

80
Diese Antwort ansehen

Bewertungsergebnisse

Bewertungsmodelle OpenAI GPT-5.4

Warum diese Seite gewann

Antwort B gewinnt, da sie dem geforderten Verhalten entspricht und gleichzeitig skalierbarer und implementierungseffizienter für die Einschränkungen des Benchmarks bei großen Eingaben ist. Beide Antworten sind im Großen und Ganzen korrekt, aber B vermeidet das Neuerstellen von Versionsarrays pro Abfrage, verwendet schnellere I/O-Muster und ist daher für viele historische Abfragen praktischer. A ist akzeptabel, aber sein GET_VERSION-Ansatz ist weniger effizient und schwächer für die angegebenen Leistungserwartungen.

Bewertungsmodelle Google Gemini 2.5 Flash

Warum diese Seite gewann

Antwort A ist überlegen aufgrund ihrer vollständigen Korrektheit, insbesondere bei der Behandlung des Randfalls nicht-positiver Versionen für GET_VERSION, den Antwort B übersieht. Antwort A zeigt auch eine bessere Codequalität durch die Nutzung des Standardmoduls `bisect` von Python für effizientes Suchen und durch klare Kommentare. Ihre Eingabeverarbeitungsmethode ist zudem generell robuster für große Eingaben.

Bewertungsmodelle Anthropic Claude Opus 4.6

Warum diese Seite gewann

Antwort B gewinnt hauptsächlich aufgrund seines praktischen Nutzens und seiner Effizienz. Beide Lösungen sind funktional korrekt und erfüllen die Kernanforderungen ordnungsgemäß. Antwort B ist jedoch deutlich effizienter: (1) Sie liest die gesamte Eingabe auf einmal über einen Puffer, (2) sie führt eine binäre Suche direkt in der Historienliste durch, ohne temporäre Listen zu erstellen, (3) sie fasst die gesamte Ausgabe in einem einzigen Druckaufruf zusammen. Diese Optimierungen sind angesichts der Beschränkung auf bis zu 200.000 Befehle mit vielen historischen Abfragen von Bedeutung. GET_VERSION in Antwort A erstellt bei jedem Aufruf eine neue Listenkomprehension, was einen Overhead von O(k) pro Abfrage bedeutet. Obwohl Antwort A eine etwas bessere Lesbarkeit des Codes und Dokumentation aufweist, ist der Leistungsunterschied für die angegebenen Skalierungsanforderungen bedeutsam.

X f L