Rekurencyjne podanie wszystkich możliwości tablicy znaków

Rekurencyjne podanie wszystkich możliwości tablicy znaków
Burdzi0
  • Rejestracja:prawie 9 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Futurama
  • Postów:887
0

Witam!

Ostatnio staram się z zrozumieć podstawowe programy wykorzystujące algorytm typu brute force i potrzebuję waszej pomocy.
Chcę stworzyć metodę, która wypisze mi wszystkie możliwe wyrażenia, które można stworzyć korzystając z podanej tablicy znaków. Wiem jak to zrobić korzystając z pętli for, lecz jest ona nieelastyczna względem długości poszukiwanej wartości. Moim zadaniem jest stworzyć metodę rekurencyjną, która będzie przyjmowała długość hasła oraz tablicę dostępnych znaków.

W internecie jest parę przykładów (osobiście piszę w Javie), jednak nie wyczyn skopiować to, co ktoś napisał. Ja chcę zrozumieć sposób tworzenia takiej metody oraz jej działanie krok po kroku.

Przykład

Długość wyrażenia: 3 znaki.
Tablica znaków: {a, b, c}

Wynik:
a, a, a
a, a, b
a, a, c
a, b, a
a, b, b
a, b, c
a, c, a
a, c, b
a, c, c
b, a, a
b, a, b
b, a, c
b, b, a
b, b, b
b, b, c
b, c, a
b, c, b
b, c, c
c, a, a
c, a, b
c, a, c
c, b, a
c, b, b
c, b, c
c, c, a
c, c, b
c, c, c

Ze względu na mój oporny umysł poproszę o najłatwiejsze przedstawienie problemu - rozbicie go na najmniejsze części, aby łatwiej było mi go przyswoić.

Oto co znalazłem w internecie, za ewentualny duplikat przepraszam.

http://4programmers.net/Forum/Newbie/160002-metoda_brute_force_-_jak_polaczyc_sie_z_interfejsem?p=1024509#id1024509
http://stackoverflow.com/questions/14094864/explain-brute-force-algorithm
http://4programmers.net/Forum/Archiwum/29298-algorytmika_Permutacje
http://4programmers.net/Forum/Inne/191029-permutacje_sprawdzenie


Bite my shiny metal ass!
Life throws you an error code like that, you don't have the luxury of a ZnVja2luZw== pop-up explanation *Robię projekty studenckie, pisz priv ;) *
0

hydra, johny, hashcat ... itd się fochneły?

Napisz to w C/C++ dla jakiejś względnej wydajności.
Algorytm bute'a to nic trudnego nie rozumiem co tutaj można nie rozumieć.
Podstawiasz wartości do tablicy, wedle kolejności, można tego "dokonać", bez rekurencji na dowolną ilość znaków.
Wartości określasz na początku ustalasz im np indeksy (albo lecisz po kodach ASCII), generujesz haselko i je albo hashujesz (potem cmp hash), albo wpisujesz gdzie się należy.

Zasada taka sama jak z liczeniem do 1 000 000 (dla wilekości hasla 6-znakowego), z tym że podstawiasz pod cyferki swoje znaczki.

Burdzi0
Po pierwsze chodzi mi o zrozumienie stworzenia rekurencji. Po drugie nie znam ani C, ani C++, więc nie wiem po co w ogóle wychodzisz z tym pomysłem, bo nie mam zamiaru tworzyć z tego użytkowej apki, tylko ogarnąć trudną dla mnie rekurencję, bo z nią właśnie spotykam się w takich programach. Ustawiasz im indeksy? Hashujesz? (cmp hash -> stawiam, że to element C++) Odpowiedź może i dobra dla profesjonalisty, ale jak widzisz amator prosił o łopatologię i raczej jej nie dostał.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Burdzi0
Dziękuję, ale nie rozumiem kodu z C++, a szkoda, bo wygląda ciekawie
Shalom
Przecież to można przepisać 1:1 do Javy, kod będzie identyczny z dokładnością do nazw klas i metod...
Burdzi0
Ja rozumiem, że tutaj są osoby, które programują już lata a nawet dekady, ale ja jestem amatorem i nie mam pojęcia czym jest vector w C++, a z tego co wiem nie można go zastąpić Vectorem (Collections) z Javy. To forum chyba nie jest dla mnie
Shalom
Można go zastąpić vector z Javy. Programiści generalnie używają sensownych nazw... Ale masz rację, to forum dla ludzi którzy chcą się uczyć a nie żebrać o gotowce i narzekać że "nie umiem".
Burdzi0
Bo prośba o pseudokod rzeczywiście jest prośbą o gotowca. Gotowce to ja mam na stacku, więc nie rozumiem skąd ten ból czterech liter
Burdzi0
  • Rejestracja:prawie 9 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Futurama
  • Postów:887
0

Okej zapytam inaczej. Jak kod, który podaję poniżej przekształcić na kod, który będzie tworzył wszystkie możliwości bez pętli for.
Super by było, gdyby ktoś to napisał w pseudokodzie. Ewentualnie w Javie lub Pythonie, innego języka nie zrozumiem.

Pozdrawiam.


Bite my shiny metal ass!
Life throws you an error code like that, you don't have the luxury of a ZnVja2luZw== pop-up explanation *Robię projekty studenckie, pisz priv ;) *
AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:12 dni
1
Kopiuj
import java.util.*;
import java.lang.*;
import java.io.*;

public class Main
{
	private static boolean allCharactersAreAlreadyPutInArray(int position, char[] array){
		return position >= array.length;
	}
	
	private static void putCharcterInArrayAtPosition(char character, char[] array, int position){
		array[position] = character;
	}
	
	private static void printArray(char[] array){
		for(char character : array){
			System.out.print(character);
		}
		System.out.println();
	}
	
	public static void putCharacterAtPositionInArrayAndGenerateRest(int position, char[] array){
		if(allCharactersAreAlreadyPutInArray(position, array)){
			printArray(array);
			return;
		}
		
		for(char characterToPutAtPosition = 'a'; characterToPutAtPosition <= 'c'; ++characterToPutAtPosition){
			putCharcterInArrayAtPosition(characterToPutAtPosition, array, position);
			int nextPosition = position + 1;
			putCharacterAtPositionInArrayAndGenerateRest(nextPosition, array);
		}
	}
	
	public static void generateCombinations(char[] array){
		putCharacterAtPositionInArrayAndGenerateRest(0, array);
	}
	
	public static void main (String[] args) throws java.lang.Exception
	{
		// Generate combinations of length 3 (array of 3 elements)
		generateCombinations(new char[3]);
	}
}

Masz kod generujący kombinacje ze stałego zestawu znaków, rozszerz go jak chcesz i czytaj, aż zrozumiesz. A jak nie zrozumiesz, to napisz, co jest nieczytelne. Kod jest celowo napisany tak topornie.

Burdzi0
Serdecznie dziękuję! Wystarczająco topornie, żebym był w stanie zrozumieć. Jeszcze raz wielkie dzięki!
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)