Wie kann ich meinem string die gewünschten Bedingungen hinzufügen?
-
Ja der Hinweis ist klar. Aber die Umsetzung leider nicht so wirklich.
Das Anlegen der Zeichentöpfe ist kein Problem, aber die Anweisungen zum Ziehen aus den verschiedenen Töpfen kriege ich nicht hin.
-
In letzter Zeit ist Chat GPT ja der Hype. Mal sehen, wer gewinnt, Student oder Sprach-KI?
Prompt:
Write a C++ program that generates a random password of at least 30 characters, containing at least one lower case letter, exactly 6 capital letters, at least 8 digits, and 5-8 special characters. Use only the Headers iostream, cstdlib, and ctime.
Antwort:
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; const int PASSWORD_LENGTH = 30; // minimum password length const int NUM_LOWERCASE = 1; // number of lowercase letters const int NUM_UPPERCASE = 6; // number of uppercase letters const int NUM_DIGITS = 8; // number of digits const int NUM_SPECIALS_MIN = 5; // minimum number of special characters const int NUM_SPECIALS_MAX = 8; // maximum number of special characters // Function to generate a random lowercase letter char getRandomLowercase() { return 'a' + rand() % 26; } // Function to generate a random uppercase letter char getRandomUppercase() { return 'A' + rand() % 26; } // Function to generate a random digit char getRandomDigit() { return '0' + rand() % 10; } // Function to generate a random special character char getRandomSpecial() { // Set of possible special characters const string specials = "!@#$%^&*()_+-=[]{}\\|;:'\",.<>/?"; // Generate a random index into the specials string int index = rand() % specials.length(); return specials[index]; } int main() { // Seed the random number generator with the current time srand(time(0)); // Initialize the password string with the required number of lowercase letters string password = ""; for (int i = 0; i < NUM_LOWERCASE; i++) { password += getRandomLowercase(); } // Add the required number of uppercase letters to the password for (int i = 0; i < NUM_UPPERCASE; i++) { password += getRandomUppercase(); } // Add the required number of digits to the password for (int i = 0; i < NUM_DIGITS; i++) { password += getRandomDigit(); } // Add a random number of special characters to the password int numSpecials = NUM_SPECIALS_MIN + rand() % (NUM_SPECIALS_MAX - NUM_SPECIALS_MIN + 1); for (int i = 0; i < numSpecials; i++) { password += getRandomSpecial(); } // Fill up the rest of the password with random characters until it reaches the minimum length while (password.length() < PASSWORD_LENGTH) { // Generate a random character type int charType = rand() % 4; char c; if (charType == 0) { c = getRandomLowercase(); } else if (charType == 1) { c = getRandomUppercase(); } else if (charType == 2) { c = getRandomDigit
Und dann ist leider der Stream abgebrochen, weil das System wegen dem Hype total überlastet ist. Was optimal ist, denn du sollst ja schließlich selber deine Hausaufgaben machen, selbst wenn einfache Programmieraufgaben offenbar obsolet sind. Die KI hat die Aufgabe offenbar nicht ganz exakt verstanden, aber das Verständnis scheint immerhin höher als beim Durchschnittsstudenten. Die gezeigten Programmteile sind solide umgesetzt, jetzt fehlt halt noch ein wenig die Anpassung und Vervollständigung zu der exakten Aufgabenstellung. Wer das nicht hinbekommt, wird von der KI ersetzt.
-
@SeppJ danke für deine Tipps und diesen Ansatz!! Ich probiere es
-
PS: Lol, ich habe einfach nach dem Rest des Programms gefragt:
} else { c = getRandomSpecial(); } password += c; } // Print the generated password cout << "Generated password: " << password << endl; return 0; }
Passt.
Nun obliegt es noch unseren Studenten, zu erkennen, was ich wohl meinte, als ich sagte, dass die Aufgabenstellung nicht ganz exakt getroffen wurde, und dann die entsprechenden Änderungen vorzunehmen.
Das ist natürlich das nächste Level der Hausaufgabenhilfe hier im Forum, wenn wir von nun an mit KI-Programmen antworten
-
@SeppJ Das ist echt nur Haarscharf daneben und ansonsten genau die vorgeschlagene "unschöne" Version.
Als ich letztens mit Chat GPT rumspielen wollte, ging das wegen überlastung nicht. Mich würde interessieren, was das daraus macht, ohne die Header Einschränkungen, mal gucken ob es jetzt geht.
Hier, ohne die Library Einschränkung. Nicht schlecht
#include <iostream> #include <random> #include <string> const int MIN_PASSWORD_LENGTH = 30; const int MIN_NUM_DIGITS = 8; const int MIN_NUM_SPECIAL_CHARS = 5; const int MAX_NUM_SPECIAL_CHARS = 8; const std::string LOWERCASE_LETTERS = "abcdefghijklmnopqrstuvwxyz"; const std::string UPPERCASE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const std::string DIGITS = "0123456789"; const std::string SPECIAL_CHARS = "!@#$%^&*()_+-=[]{}\\|';:/?,.<>"; std::string generatePassword() { // Seed the random number generator std::random_device rd; std::mt19937 gen(rd()); // Generate a random password of at least MIN_PASSWORD_LENGTH characters std::uniform_int_distribution<> passwordLengthDist(MIN_PASSWORD_LENGTH, MIN_PASSWORD_LENGTH + 10); int passwordLength = passwordLengthDist(gen); std::string password(passwordLength, ' '); // Generate at least MIN_NUM_DIGITS digits for the password std::uniform_int_distribution<> numDigitsDist(MIN_NUM_DIGITS, passwordLength - MIN_NUM_SPECIAL_CHARS - 6); int numDigits = numDigitsDist(gen); int numSpecialChars = passwordLength - numDigits - 6; int pos = 0; for (int i = 0; i < numDigits; i++) { std::uniform_int_distribution<> digitDist(0, DIGITS.length() - 1); password[pos++] = DIGITS[digitDist(gen)]; } // Generate exactly 6 capital letters for the password for (int i = 0; i < 6; i++) { std::uniform_int_distribution<> letterDist(0, UPPERCASE_LETTERS.length() - 1); password[pos++] = UPPERCASE_LETTERS[letterDist(gen)]; } // Generate at least MIN_NUM_SPECIAL_CHARS special characters for the password std::uniform_int_distribution<> numSpecialCharsDist(MIN_NUM_SPECIAL_CHARS, MAX_NUM_SPECIAL_CHARS); numSpecialChars = numSpecialCharsDist(gen); for (int i = 0; i < numSpecialChars; i++) { std::uniform_int_distribution<> specialCharDist(0, SPECIAL_CHARS.length() - 1); password[pos++] = SPECIAL_CHARS[specialCharDist(gen)]; } // Generate remaining characters for the password while (pos < passwordLength) { std::uniform_int_distribution<> charDist(0, LOWERCASE_LETTERS.length() - 1); password[pos++] = LOWERCASE_LETTERS[charDist(gen)]; } return password; }
-
@SeppJ sagte in Wie kann ich meinem string die gewünschten Bedingungen hinzufügen?:
Den Code von EinNutzer0 solltest du besser nicht abschreiben.
Das ist richtig, weil ich zu Übungszwecken einen, sagen wir, etwas wirren Algorithmus umgesetzt hatte...
-
Weil ich gerade so begeistert von ChatGPT bin, habe ich die KI auch nach Unit Tests mit Googletest dazu gefragt. Da hier ein paar Studies unterwegs sind und Unit Tests sonst eine vernachlässigte Sache sind, wollte ich das Ergebnis auch mal hier teilen:
#include <gtest/gtest.h> #include "random_password_generator.h" // contains the generatePassword function TEST(GeneratePasswordTest, Length) { std::string password = generatePassword(); ASSERT_GE(password.length(), MIN_PASSWORD_LENGTH); } TEST(GeneratePasswordTest, LowercaseLetters) { std::string password = generatePassword(); bool hasLowercaseLetters = false; for (char c : password) { if (std::islower(c)) { hasLowercaseLetters = true; break; } } ASSERT_TRUE(hasLowercaseLetters); } TEST(GeneratePasswordTest, UppercaseLetters) { std::string password = generatePassword(); int numUppercaseLetters = 0; for (char c : password) { if (std::isupper(c)) { numUppercaseLetters++; } } ASSERT_EQ(numUppercaseLetters, 6); } TEST(GeneratePasswordTest, Digits) { std::string password = generatePassword(); int numDigits = 0; for (char c : password) { if (std::isdigit(c)) { numDigits++; } } ASSERT_GE(numDigits, MIN_NUM_DIGITS); } TEST(GeneratePasswordTest, SpecialCharacters) { std::string password = generatePassword(); int numSpecialChars = 0; for (char c : password) { if (std::ispunct(c)) { numSpecialChars++; } } ASSERT_GE(numSpecialChars, MIN_NUM_SPECIAL_CHARS); ASSERT_LE(numSpecialChars, MAX_NUM_SPECIAL_CHARS); }
-
Sieht krass aus
Ist es komplett richtig? Es sieht auf den ersten Blick richtig aus, aber für ein komplettes Tiefenreview habe ich gerade keine Muße. Meine Erfahrung nach sind einfache Programme tatsächlich meist komplett richtig, aber bei schwierigeren, nicht-standard Problemen sieht es meistens nur richtig aus, und der Fehler steckt im Details. Es verteidigt dann auch vehement die Richtigkeit seiner Lösung, wenn man auf Fehler aufmerksam macht - ganz als wolle es einen fachfremden Manager überzeugen . Neulich wollte es mir weißmachen, dass sort(1) Duplikate löschen würde…
-
Ich glaube, für die eingegebenen Anforderung ist es korrekt. Sind halt fest 30 - 40 Zeichen, aber das erfüllt ja die Anforderung "at least"
Ob die Unit Tests ausreichend sind, um eine Funktion, die auf einem Zufallsgenerator basiert, zu testen, kann man sicherlich diskutieren, aber als ersten Schuss von einer KI erzeugt finde ich das richtig gut.
-
@Schlangenmensch sagte in Wie kann ich meinem string die gewünschten Bedingungen hinzufügen?:
Ob die Unit Tests ausreichend sind, um eine Funktion, die auf einem Zufallsgenerator basiert, zu testen, kann man sicherlich diskutieren, aber als ersten Schuss von einer KI erzeugt finde ich das richtig gut.
So wie es programmiert ist, hat sie auch keine Chance, den Zufallsgenerator für den Test zu beeinflussen. Wie soll die KI auch Dependency Injection und Interfaces lernen, wenn 70% der menschlichen Vorbilder das nicht kapieren?