Hallo und herzlich willkommen zum AutoIt-Hackathon #3
Alles was ihr zur Teilnahme braucht, ist das Script, das unten im Code-Block eingefügt ist.
Kopiert es vollständig in euren Editor und lest euch die Anleitung genau durch.
Ihr könnt eigene Funktionen erstellen, Globale Variablen deklarieren usw ...
Gewonnen hat, dessen Script die Tests zu 100% bewältigt und am schnellsten ist.
Postet eure Lösung hier in diesen Thread. Abschreiben bringt nix, wenn die Lösung richtig ist.
Klinkt euch gerne auf Discord mit ein (am Besten mit Audio, so könnt ihr weiter coden und wir können euch schwitzen hören)
Ich wünsche allen Teilnehmern
happy coding
PS: Für künftige Hackathons ist es hilfreich zu wissen, wann die meisten Interessierten Zeit haben.
Tragt euch bei Interesse in dieses Tool ein, dann kann ich planen. Danke
#cs ****************** AutoIt Hackathon 2025 ******************
Teil 3 - "alte Zeiten"
für AutoIt Version >= 3.3.16.1
Aufgabe: Erstelle zwei Funktionen: _IntegerToRoman() & _RomanToInteger ( + eine Bonus-Aufgabe _DateToRoman() )
****************** AutoIt Hackathon 2025 ******************
1: _IntegerToRoman($sInteger) erhält eine Integer Zahl ( 0 < Zahl < 4000 ) und gibt diese als Ausdruck einer römischen Zahl zurück
originale Beschreibung: https://leetcode.com/problems/integer-to-roman/description/
Sieben verschiedene Symbole stellen römische Ziffern mit den folgenden Werten dar:
Symbol Wert
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
Römische Ziffern werden durch Anhängen der Umrechnungen von Dezimalstellenwerten vom höchsten zum niedrigsten Wert gebildet.
Für die Umwandlung einer Dezimalstelle in eine römische Zahl gelten die folgenden Regeln:
Wenn der Wert nicht mit 4 oder 9 beginnt, wählen Sie das Symbol des maximalen Wertes, der von der Eingabe subtrahiert werden kann,
hängen Sie dieses Symbol an das Ergebnis an, subtrahieren Sie seinen Wert und wandeln Sie den Rest in eine römische Zahl um.
Wenn der Wert mit 4 oder 9 beginnt, verwenden Sie die subtraktive Form, die ein Symbol vom folgenden Symbol subtrahiert,
z. B. 4 ist 1 (I) weniger als 5 (V): IV und 9 ist 1 (I) weniger als 10 (X): IX.
Es werden nur die folgenden subtraktiven Formen verwendet: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) und 900 (CM).
Nur Potenzen von 10 (I, X, C, M) können höchstens 3 Mal hintereinander angehängt werden,
um Vielfache von 10 darzustellen. Sie können 5 (V), 50 (L) oder 500 (D) nicht mehrfach anhängen.
Wenn Sie ein Symbol 4 Mal anhängen müssen, verwenden Sie die subtraktive Form.
Wandeln Sie eine ganze Zahl in eine römische Zahl um.
Beispiel 1:
Eingabe: $sInteger = 3749
Ausgabe: "MMMDCCXLIX"
Erläuterung:
3000 = MMM als 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC als 500 (D) + 100 (C) + 100 (C)
40 = XL als 10 (X) weniger von 50 (L)
9 = IX als 1 (I) weniger von 10 (X)
Hinweis: 49 ist nicht 1 (I) weniger von 50 (L), da die Umrechnung auf Dezimalstellen basiert.
Beispiel 2:
Eingabe: $sInteger = 58
Ausgabe: "LVIII"
Erläuterung:
50 = L
8 = VIII
Beispiel 3:
Eingabe: $sInteger = 1994
Ausgabe: "MCMXCIV"
Erläuterung:
1000 = M
900 = CM
90 = XC
4 = IV
Beschränkungen:
1 <= $sInteger <= 3999
2: _RomanToInteger($sRoman) erhält eine Ausdruck einer römische Zahl und gibt die Jahreszahl als Integer zurück
originale Beschreibung: https://leetcode.com/problems/roman-to-integer/description/
Die römischen Ziffern werden durch sieben verschiedene Symbole dargestellt: I, V, X, L, C, D und M.
Symbol Wert
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
Zum Beispiel wird 2 als II in römischen Zahlen geschrieben, einfach zwei Einsen addiert. 12 wird als XII geschrieben,
was einfach X + II ist. Die Zahl 27 wird als XXVII geschrieben, d. h. XX + V + II.
Römische Ziffern werden normalerweise von links nach rechts von der größten zur kleinsten Zahl geschrieben.
Die Zahl für vier ist jedoch nicht IIII. Stattdessen wird die Zahl Vier als IV geschrieben.
Da die Eins vor der Fünf steht, subtrahieren wir sie und erhalten vier.
Das gleiche Prinzip gilt für die Zahl Neun, die als IX geschrieben wird. Es gibt sechs Fälle, in denen die Subtraktion verwendet wird:
I kann vor V (5) und X (10) gesetzt werden, um 4 und 9 zu bilden.
X kann vor L (50) und C (100) platziert werden, um 40 und 90 zu ergeben.
C kann vor D (500) und M (1000) platziert werden, um 400 und 900 zu ergeben.
Wandeln Sie eine römische Zahl in eine ganze Zahl um.
Beispiel 1:
Eingabe: s = "III"
Ausgabe: 3
Erläuterung: III = 3.
Beispiel 2:
Eingabe: s = "LVIII"
Ausgabe: 58
Erläuterung: L = 50, V= 5, III = 3.
Beispiel 3:
Eingabe: s = "MCMXCIV"
Ausgabe: 1994
Erläuterung: M = 1000, CM = 900, XC = 90 und IV = 4.
Beschränkungen:
1 <= $sRoman.length <= 15
s enthält nur die Zeichen ('I', 'V', 'X', 'L', 'C', 'D', 'M').
Es wird garantiert, dass s eine gültige römische Zahl im Bereich [1, 3999] ist.
Bonus Aufgabe:
3: _DateToRoman() erhält ein Datum im Format "YYYY/MM/DD[ HH:MM:SS]" wobei eine Zeitangabe optional, aber möglich ist
Erstelle eine Funktion die ein Date-Format im "römischen Format" zurückgibt.
Die Trennzeichen sollen dabei unverändert erhalten bleiben.
zusätzliche Funktionen können erstellt werden, müssen aber im Lösungspost mit angegeben werden.
Es gilt der Code-Block, der im Thread als Antwort gepostet wird.
Als einzige Vorgabe für das Script wird die jeweilige Funktion samt Namen vorgegeben.
Diese sind unten ersichtlich, müssen so verwendet werden und aus ihnen muss das Ergebnis als Return erfolgen.
Prüfung: Die Funktion _Check() beinhaltet beispielhafte Prüfungsdatensätze und jeweils einen Hash der Lösung
Die Ausgabe zeigt an, wie viel Prozent dein Script bereits erfüllt.
Sobald dein Script 100% korrekt ist, poste dein Script im Thread
Sieger: GEWONNEN HAT, ...
PS: Die Verwendung von #includes ist gestattet, müssen aber im Script mit angegeben werden!
#ce
; Um dein Script zu überprüfen, drücke F5.
; ================================= entferne alle Leer- und Kommentarzeilen und poste diesen Code-Block im Thread ==================================
Func _IntegerToRoman($sInteger)
Local $Return
Return $Return
EndFunc ;==>_IntegerToRoman
Func _RomanToInteger($sRoman)
Local $Return
Return $Return
EndFunc ;==>_RomanToInteger
; Bonus-Aufgabe für Ambitionierte ;-)
Func _DateToRoman($sDate) ;Input date in the format "YYYY/MM/DD[ HH:MM:SS]", Output in same date-format with roman sign
Local $Return
Return $Return
EndFunc ;==>_DateToRoman
; ================================= entferne alle Leer- und Kommentarzeilen und poste diesen Code-Block im Thread ==================================
; Funktion zur Überprüfung des eigenen Scripts. Nicht mit in den Thread laden!
#include <Crypt.au3>
_Check_IntegerToRoman()
_Check_RomanToInteger()
_Check_DateToRoman()
Func _Check_IntegerToRoman()
Local $aPruefDaten[][] = [[], _
[1, "0xA83DD0CCBFFE39D071CC317DDF6E97F5C6B1C87AF91919271F9FA140B0508C6C"], _
[46, "0x101AC3C99D6FCEDF8C1A6E3EAC18697FB4BEAA4E4510A45C14D5233F3A09D459"], _
[728, "0x0934E3E7BF156E0EC2E6535F53A15A8E549315B40CA4EB849DBFD8ABCDB32BD1"], _
[1999, "0xC92979E7626148228B837A2904992490E20AFCB7E145F2C15F3B528FDB1BA566"], _
[2476, "0xC386049C1C68575AB4C0EA9AE781FF294080179B552619253DB5F92B4C4D0380"], _
[3888, "0x567A7E66D8EFD19459873F5836896987ECC6B07BF42C7EB98834B952EA39B0EA"]]
Local $aTestdaten[5]
Local $correct = 0
For $i = 1 To UBound($aPruefDaten) - 1
$CryptResultData = _Crypt_HashData(_IntegerToRoman($aPruefDaten[$i][0]), $CALG_SHA_256)
If $CryptResultData = $aPruefDaten[$i][1] Then $correct += 1
Next
ConsoleWrite("Testergebnis _IntegerToRoman: " & 100 / (UBound($aPruefDaten) - 1) * $correct & "%" & @CRLF)
EndFunc ;==>_Check_IntegerToRoman
Func _Check_RomanToInteger()
Local $aPruefDaten[][] = [["", ""], _
["XXIX", "0x79095D9004930C349E99C30F6C93E7BB5541F6EF7BB6883C04163E94CF82110A"], _
["CXXII", "0x4F55412B85445F7D15757C8214BE4581AB8A98AF792A98F3FD2D049FFCCDC494"], _
["CCCLIX", "0xD727F912336CA13E8E9BA1372377E3AC970AE44FE3306151E96516970B235659"], _
["MCDLV", "0x66B962775512A326EF7A82D11F2CB7EC6A16DCEB2F1A3489373F0119A7F7A021"], _
["MMCDXLIX", "0xEF3F5A3D3B8D5019C747679E70654A4A28F8771CD63C5B30C3A5742B6FBA7074"], _
["MMMCCCXXXIX", "0x54ACE80191BB37C31A8F7EBEAA062AFD02BE72FBD755637AC68FC1AD2D03B9BB"]]
Local $aTestdaten[5]
Local $correct = 0
For $i = 1 To UBound($aPruefDaten) - 1
$CryptResultData = _Crypt_HashData("Testdaten:" & _RomanToInteger($aPruefDaten[$i][0]), $CALG_SHA_256)
If $CryptResultData = $aPruefDaten[$i][1] Then $correct += 1
Next
ConsoleWrite("Testergebnis _RomantoInteger: " & 100 / (UBound($aPruefDaten) - 1) * $correct & "%" & @CRLF)
EndFunc ;==>_Check_RomanToInteger
Func _Check_DateToRoman() ;Date range = 01.01.0001 - 31.12.3999 (remember, in roman is no "0" !)
Local $aPruefDaten[][] = [["", ""], _
["01/05/1028", ""0x5CD51BB77D63FFDACB6BFCBC3C6C1D1B3056A3E140DF629CAC6D49D551BE55EA""], _
["23/05/2011 12", "0x13D4359153330C8587D7DB313A8C8758DE26B0FAA53FC93DACDBDED553F8694B"], _
["05/05/1777 16:22", "0xAFD10C28163A328A2C25783D70457DF4D63928CB00004715D648BB0D889A5703"], _
["31/12/2679 14:55:38", "0xDEE1E331FB56FA93C4EA51AACBF578A44149505A7A4239CC2D8D6058DC179BF7"]]
Local $aTestdaten[5]
Local $correct = 0
For $i = 1 To UBound($aPruefDaten) - 1
$CryptResultData = _Crypt_HashData("Test:" & _DateToRoman($aPruefDaten[$i][0]), $CALG_SHA_256)
If $CryptResultData = $aPruefDaten[$i][1] And $CryptResultData <> '0xE3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855' Then $correct += 1
Next
ConsoleWrite("Testergebnis _DateToRoman: " & 100 / (UBound($aPruefDaten) - 1) * $correct & "%" & @CRLF)
EndFunc ;==>_Check_DateToRoman
Alles anzeigen