Guten Tag Golfgeneers.
Dies ist eine ziemlich lange und detaillierte Frage. Angesichts dessen, was es verlangte, musste es sein. Wenn Sie Fragen haben, stellen Sie diese bitte. Wenn etwas nicht klar ist, benachrichtigen Sie mich bitte, damit ich es beheben kann. Dies ist wahrscheinlich auf der härteren Seite des Codegolfs.
Wir bauen einen leichten Computer und benötigen das leichteste Dateisystem, das möglich ist. Der kürzeste Code wird ausgewählt.
Wir bieten eine innovative 65536-Byte-Festplatte. Für diesen Prototyp handelt es sich um eine direkte Image-Datei, von der Ihr Programm annehmen kann, dass sie existiert, und die sich an einem für Sie geeigneten Speicherort befindet - dh eine Binärdatei, die die gesamte Festplatte darstellt. Sie können davon ausgehen, dass dieses Bild bereits "formatiert" ist - dh. Wenn Ihr Programm darauf angewiesen ist, dass etwas in der Datei funktioniert, kann dies der Fall sein. Wenn der anfängliche leere Zustand etwas anderes als Null sein soll, geben Sie bitte an, was er ist.
Es gibt keine Speicherbeschränkung für den von Ihrer Anwendung verwendeten RAM.
Die Eingabe- und Ausgabebefehle erfordern eine Schnittstelle zur eigentlichen Festplatte. Wie das Disk-Image kann Ihr Programm davon ausgehen, dass die Eingabedatei vorhanden ist und sich dort befindet, wo Sie sie haben möchten. Ebenso kann Ihr Programm überall dort ausgeben, wo es Ihnen passt. Es muss jedoch die Datei schließen, nachdem der Eingabe- oder Ausgabebefehl ausgeführt wurde.
Sie erhalten kein Format, das Sie für das Disc-Image verwenden müssen - Sie können Ihr eigenes Format entwickeln. Es muss in der Lage sein, bis zu 248 Dateien zu speichern. Jede Datei, die größer als 256 Byte ist, kann aufgrund dieser Begrenzung für jeweils 256 Byte oder einen Teil davon als neue Datei gezählt werden. Eine Datei kann bis zu 63488 Byte umfassen. Grundsätzlich muss es so leistungsfähig sein wie eine Festplatte mit 248 Sektoren mit jeweils 256 Bytes.
Der Grund für diese scheinbaren Größen besteht darin, Ihnen 2048 Byte 'Administration' zu geben - um Details der Dateien zu speichern. Auf jede Datei / jeden Ordner muss über einen Namen mit 4 alphanumerischen Zeichen zugegriffen werden. Je nach Wunsch kann zwischen Groß- und Kleinschreibung unterschieden werden. Wenn Ihr Programm Namen mit 4 oder weniger Zeichen unterstützt, gibt es einen Bonus von 0,95.
Ihr Programm muss über stdin die folgenden Befehle akzeptieren. Parameter werden durch ein Leerzeichen getrennt. Der Befehl wird durch eine neue Zeile beendet.
- L - Listen Sie die Namen aller aktuellen Dateien und ihre Größe in Bytes auf, die durch Zeilenumbrüche getrennt sind.
- C ab - Datei a in neue Datei kopieren b.
- D a - Datei löschen a
- R ab - Benennt Datei a in neuen Namen um. B.
- I a - Fügt die Eingabedatei (siehe Hinweis oben) als Datei a hinzu
- O a - Ausgabedatei a in die Ausgabedatei
Die folgenden Fehler können STDOUT oder STDERR als gültige Gründe für die Nichtausführung eines Befehls gemeldet werden. Sie können nur ERR # drucken, wobei # die Nummer des Fehlers ist:
- 1 - Datei existiert nicht
- 2 - Datei existiert bereits
- 3 - Nicht genügend Platz *
* Beachten Sie, dass Ihr Programm dies nicht ausgeben kann, nur weil nicht genügend Speicherplatz vorhanden ist. Wenn noch Sektoren verfügbar sind, müssen Sie die Festplatte defragmentieren, damit sie funktioniert.
Ein Ordnersystem ist optional. Sie erhalten jedoch einen Bonus von 0,8 auf Ihre Punktzahl. Wenn es mehr als 1 Verzeichnisebene unterstützt, erhält es einen Bonus von 0,7 Multiplikatoren (nicht zusätzlich zu 0,8). Für den Bonus müssen Sie haben
- L, R, C und D funktionieren nur im aktuellen Verzeichnis. L muss Ordner im aktuellen Verzeichnis sowie die Dateien auflisten.
- Neuer Befehl M ab verschiebt Datei a in Ordner b. Wenn b '.' Ist, wird die Datei an den übergeordneten Direktor verschoben
- Neuer Befehl G a geht zu Ordner a. Wenn a '.' Ist, wird zum übergeordneten Ordner gewechselt
- R muss auch Ordner umbenennen
- D muss auch Ordner und alle darin enthaltenen Dateien / Ordner löschen
- C muss auch Ordner und alle darin enthaltenen Dateien / Ordner kopieren
Die folgenden zusätzlichen Fehler können STDOUT oder STDERR als gültige Gründe für die Nichtausführung eines Befehls gemeldet werden.
- 4 - Ordner existiert nicht
- 5 - Datei, kein Ordner erforderlich - wobei für I und O Dateinamen erforderlich sind und ein Ordner angegeben wurde
Dein Ergebnis ist:
- Die Größe Ihres Quellcodes in Byte
Multipliziert mit
- 0,95, wenn Sie Namen mit 4 oder weniger Zeichen unterstützen
- 0.8, wenn Sie eine einzelne Ordnerebene unterstützen
- 0.7 wenn Sie mehrere Ordnerebenen unterstützen
- 0,95, wenn Sie Befehle (nicht unbedingt Dateinamen) in Klein- oder Großbuchstaben unterstützen
Viel Glück.
quelle
Antworten:
Ruby, Punktzahl 505,4 (560 Zeichen)
Anmerkungen:
F
im aktuellen Verzeichnis.F
muss vorhanden sein und kann über den folgenden Befehl erstellt / formatiert werden :IO.write('F',(([""]*248)+([0]*248)+[""]).pack('A4'*248+'s'*248+'A63488'))
.I
auch im aktuellen Verzeichnis, die Ausgabedatei istO
.Boni:
Der Code ist noch nicht vollständig golfen, zeigt aber bereits, dass ich für eine wesentlich bessere Punktzahl einen völlig anderen Ansatz ausprobieren würde.
Testsitzung (nur STDIN / STDOUT wird angezeigt, aber natürlich wird jedem Befehl durch Aufrufen des obigen Programms vorangestellt):
quelle
Tcl, Punktzahl 487.711 (772 Bytes)
Boni (müssen sie alle fangen):
Bekannte Einschränkungen:
F
muss bereits vorhanden sein. Leer oder Leerzeichen sind in Ordnung.i
, Ausgabedatei isto
und das Dateisystem ist inF
eval puts [expr 1+2]
I
(auch nicht meine Idee undG
wird nicht erstellt)G
überprüft das Verzeichnis nicht.Einige Hacks:
eval puts $c
-> aktuelles Verzeichnis, durch Leerzeichen getrennt.exit
- kein Kommentar.lappend c .
-> wechselt in das Unterverzeichnis.
quelle
Python 2.7 373 (413 Bytes)
Die Festplatte wird im Python-Pickle-Format gespeichert: Um eine leere Festplatte zu erstellen, müssen Sie diese beiden Bytes '}' einfügen. am Anfang und optional 65534 Bytes danach füllen. Unterstützt beliebig große Dateinamen (* 0,95), Groß- und Kleinbuchstaben (* 0,95) und Hardlinks (:-).
quelle