Die Aufgabe besteht darin einen uebergebenen String so effektiv wie möglich (aber verlustfrei) zu komprimieren (keine externen Librarys, nur AutoIt-Code erlaubt).
Dazu müsst ihr zwei Funktionen programmieren _StringCompress und _StringDecompress.
Nachtrag 23.02.2022: Der Variablentyp fuer den komprimierten Text muss natürlich kein String sein. Dort könnt ihr euch ein eigenes Format ausdenken. Hauptsache am Ende von _StringDecompress kommt wieder der ursprüngliche String raus. Ich hab's im Beispiel mal angepasst.
Nachtrag 24.02.2022: Um ein besseres Ergebnis beim komprimieren zu bekommen, habe ich den zu komprimierenden Text etwas erweitert. Die Länge beträgt nun 6033 Bytes und befindet sich in der Datei "original.txt" im ZIP-Archiv.
Die Scripte als PN an mich.
Einsendeschluss: 31. März 2022, 23:59:59 Uhr
Gewonnen hat derjenige, der die beste Compress-Ratio erreicht.
Ergebnis:
Es hat drei Einsendungen gegeben und, soviel schonmal vorweg, alle drei haben mich sehr beeindruckt.
Die Aufgabe bestand darin, die beste Kompressionsrate zu erreichen, ohne Rücksicht auf die Zeit (solange sie im "Rahmen" bleibt).
Von daher erkläre ich Mars zum Sieger, weil er mit 50.174% tatsächlich die 50er Hürde übertroffen hat. Gratulation!
AspirinJunkie mit 49.255% liegt nur knapp dahinter, hat aber ein Script abgeliefert, was ihm klar die Perfomance-Krone verleiht.
Ahnungslos folgt dann mit 47.404% auf den dritten Platz.
Die Ergebnisse im einzelnen:
Spoiler anzeigen
============================================================
Result for "Mars"
============================================================
Decompressed = Original:True
Length Original: 6033
Length compressed: 3006
Length decompressed: 6033
Compress-Ratio: 50.174 %
Time compressed: 57940 ms
Time decompressed: 54119 ms
============================================================
============================================================
Result for "AspirinJunkie"
============================================================
Decompressed = Original:True
Length Original: 6105
Length compressed: 3098
Length decompressed: 6033
Compress-Ratio: 49.255 %
Time compressed: 1314 ms
Time decompressed: 189 ms
============================================================
============================================================
Result for "Ahnungslos"
============================================================
Decompressed = Original:True
Length Original: 6105
Length compressed: 3211
Length decompressed: 6033
Compress-Ratio: 47.404 %
Time compressed: 5647 ms
Time decompressed: 294 ms
============================================================
Das alle drei im Ergebnis nicht mal 3% auseinanderliegen, hätte ich so nicht erwartet. Zeigt aber, dass die Algorithmen wohl ziemlich ausgereizt sind.
Ich habe mich vor dem Wettbewerb nie damit beschäftigt, wusste also nicht viel darüber. Unsere drei Kandidaten dagegen haben ein gutes Fachwissen
bewiesen und es macht Spass, sich die Scripte mal genauer anzusehen (ich habe sie gepackt als "Scripte.zip" in den Anhang gelegt).
Das AutoIt-Gerüst habe ich mal vorbereitet (auch als Anhang):
Global Const $sUsername = 'Oscar' ; <- hier den eigenen AutoIt.de Usernamen eintragen
; Funktion zum komprimieren (verlustfrei)
; Uebergeben wird ein beliebiger String, Rueckgabe muss der komprimierte Datentyp sein
Func _StringCompress($sString)
Local $vCompress
$vCompress = $sString ; den String bearbeiten
Return $vCompress
EndFunc
; Funktion zum dekomprimieren
; Uebergeben wird der komprimierte Datentyp, Rueckgabe muss der dekomprimierte String sein
Func _StringDecompress($vCompress)
Local $sString
$sString = $vCompress ; den urspruenglichen String wiederherstellen
Return $sString
EndFunc
#Region Achtung! Diese Region darf nicht veraendert werden!
Global $hFile = FileOpen(@ScriptDir & '\original.txt', 128)
If $hFile = -1 Then Exit
Global $sOriginal = FileRead($hFile)
FileClose($hFile)
Global $iOriginalLen = StringLen($sOriginal)
Global $iTimer = TimerInit()
Global $vCompressed = _StringCompress($sOriginal)
Global $iTimeDiffComp = TimerDiff($iTimer)
Global $iCompressedLen = StringLen($vCompressed)
Global $iTimer = TimerInit()
Global $sDecompressed = _StringDecompress($vCompressed)
Global $iTimeDiffDecomp = TimerDiff($iTimer)
Global $iDecompressedLen = StringLen($sDecompressed)
ConsoleWrite('============================================================' & @CRLF)
ConsoleWrite(StringFormat('Result for "%s"\r\n', $sUsername))
ConsoleWrite('============================================================' & @CRLF)
ConsoleWrite(StringFormat('Decompressed = Original: %s\r\n', $sOriginal == $sDecompressed))
ConsoleWrite(StringFormat('Length Original: %i\r\n', $iOriginalLen))
ConsoleWrite(StringFormat('Length compressed: %i\r\n', $iCompressedLen))
ConsoleWrite(StringFormat('Length decompressed: %i\r\n', $iDecompressedLen))
ConsoleWrite(StringFormat('Compress-Ratio: %s %%\r\n', Round(100 - (100 / $iOriginalLen * $iCompressedLen), 3)))
ConsoleWrite(StringFormat('Time compressed: %i ms\r\n', $iTimeDiffComp))
ConsoleWrite(StringFormat('Time decompressed: %i ms\r\n', $iTimeDiffDecomp))
ConsoleWrite('============================================================' & @CRLF)
#EndRegion Achtung! Diese Region darf nicht veraendert werden!
Alles anzeigen