Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Wortlisten-Generator (Algorithmen)

Schreiben Sie ein Programm, das mehrere Zeichenketten (oder auch Wörter aus Einzelzeichen) entgegen nimmt und daraus alle möglichen Wortkombinationen bildet. Dabei darf jedes Wort in der Ausgabe nur einmal benutzt werden (ansonsten würde die Liste rasch sehr, sehr lange):

Beispiel:

Eingabe Wortvorrat> maria mike auto a b 1 2

Mögliche Ausgabe (die Reihenfolge ist irrelevant):

a12, mariamikeautoab12, ab12, a12b, mike12, abmike, mikeauto, a1bmike, amariab, ...

Nicht im Output aber:

maria3 (enthält falsche Zeichen)

mariamaria (wort kommt doppelt vor)

Bemerkung: Solche Algorithmen können leicht verwendet werden, um mittels Rainbow-Tables Passwörter zu knacken. Vermeiden Sie also in Ihren eigenen Passwörtern --- wenn immer möglich --- das Auftreten sinnvoller Wörter.

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

2 Lösung(en)

/*
von Ruben S.
*/
#include <iostream>
#include <stdlib.h>  
#include <string>
#include <vector>
#include <time.h>  

using std::cout;
using std::endl;
using std::cin;

class wordlistgen
{
public:
	wordlistgen();
	~wordlistgen();

	std::string swap_Index(int &index);

private:
	std::string Input;
	std::vector<std::string> vecWords;
};

wordlistgen::wordlistgen()
{
	cout << "Eingabe: ";
	std::getline(cin, Input);
	Input.push_back(' ');

	std::string * str = NULL;
	str = new std::string;

	//woerter erkennen
	for (std::string::iterator it = Input.begin(); it != Input.end(); ++it){
		if (*it != ' '){
			str->push_back(*it);
		}
		else{
			vecWords.push_back(*str);
			str = new std::string;
		}
	}

	for (int stage = 0; stage < 4; stage++){ //verstellbar 4 = bis zu 4er Kombinationen, 3 bis zu...
		for (int y = 0; y < vecWords.size(); y++){
			std::string output = (y == 0 ? vecWords[y] : swap_Index(y));
			if (stage > 0){
				for (int u = 0; u < vecWords.size() - 1; u++){
					output = vecWords[0];
					output += vecWords[u + 1];
					if (stage >= 2){ //fuer 3er Kombi
						for (int i = 1; i < vecWords.size(); i++){
							if (i != u + 1){ //herausfiltern der bereits benutzten woerter
								output = vecWords[0];
								output += vecWords[u + 1];
								output += vecWords[i];
								if (stage == 3){ //fuer 4er Kombi
									for (int d = 1; d < vecWords.size(); d++){
										if (d != 0 && d != u + 1 && d != i){ //herausfiltern...
											output = vecWords[0];
											output += vecWords[u + 1];
											output += vecWords[i];
											output += vecWords[d];
											cout << output << endl;
										}
									}
								}
								else{
									cout << output << endl;
								}
							}
						}
					}
					if (stage < 2){
						cout << output << endl;
					}
				}
			}
			else{
				cout << output << endl;
			}
		}
	}

	cout << "Du hast " << vecWords.size() << " Woerter eingegeben." << endl;
	cout << "                       Kombinationen        " << endl;
	cout << "Anzahl Woerter| 1er | 2er | 3er | 4er |     " << endl;
	cout << "--------------|-----|-----|-----|-----|-----" << endl;
	cout << "       1      |  1  |  0  |  0  |  0  |     " << endl;
	cout << "--------------|-----|-----|-----|-----|-----" << endl;
	cout << "       2      |  2  |  2  |  0  |  0  |     " << endl;
	cout << "--------------|-----|-----|-----|-----|-----" << endl;
	cout << "       3      |  3  |  6  |  6  |  0  |     " << endl;
	cout << "--------------|-----|-----|-----|-----|-----" << endl;
	cout << "       4      |  4  |  12 |  24 |  24 |     " << endl;
	cout << "--------------|-----|-----|-----|-----|-----" << endl;
	cout << "       5      |  5  |  20 |  60 | 120 |     " << endl;
	cout << "--------------|-----|-----|-----|-----|-----" << endl;
	cout << "              |     |     |     |     |     " << endl;

	system("PAUSE");
}


std::string wordlistgen::swap_Index(int &index)
{
	std::string save = vecWords[0]; //0 wird zwischengespeichert
	vecWords[0] = vecWords[index]; //0 wird zum index
	vecWords[index] = save; //index wird zum 0

	return vecWords[0];
}

wordlistgen::~wordlistgen(){}

int main()
{
	wordlistgen GEN;
}

                

Lösung von: Ruben Sidon (WRG Bendorf)

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Created by linus on 16.10.17.
 */
public class Main {

    public static void main(String[] args) {
        new Main().init();
    }

    private void init() {
        List<String> combinations = generateWords(read());
        print(combinations);
    }

    private String[] read() {
        System.out.print("Eingabe: ");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextLine().split(" ");
    }

    private List<String> generateWords(String[] words) {
        return loop(words, new ArrayList<>(), new ArrayList<>(), 1);
    }

    private List<String> loop(String[] words, List<String> current, List<String> combinations, int loop) {
        for(int i = 0; i < words.length; i++) {
            if(!current.contains(words[i])) {
                current.add(words[i]);

                StringBuilder stringBuilder = new StringBuilder();
                current.forEach(stringBuilder::append);
                combinations.add(stringBuilder.toString());

                if(loop != words.length) {
                    loop(words, current, combinations, loop + 1);

                    if(current.size() > 0) {
                        current.remove(current.size() - 1);
                    }
                }
            }

            if(i == words.length - 1 && current.size() > 0 && loop == words.length) {
                current.remove(current.size() - 1);
            }
        }

        return combinations;
    }

    private void print(List<String> list) {
        System.out.println();
        System.out.println("Anzahl der Kombinationen: " + list.size());
        System.out.println("Kombinationen:");

        for(String s : list) {
            System.out.println(s);
        }
    }
}

                

Lösung von: Linus Götz (Lichtenberg-Gymnasium Cuxhaven)

Verifikation/Checksumme:

Eingabe Wortvorrat> 123

Ausgabe

1, 2, 3, 12, 21, 13, 31, 23, 32, 123, 132, 213, 231, 312, 321

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 2
Schwierigkeit: Schwer
Webcode: ankq-6hca
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen