Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Buchstabensalat entschlüsseln

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
24.02.2005, 15:39 Uhr
0xdeadbeef
Gott
(Operator)


Ich hab da mal was in C zusammengeschustert...in C++ halt std::next_permutation.

C++:
#include <stdio.h>
#include <stdlib.h>

static void print_perms_aux(char *alphabet,
                            size_t len,
                            char *stack,
                            size_t have) {
  size_t i;

  if(len == have)
    (void) puts(stack);
  else
    for(i = 0; i < len; ++i)
      if(alphabet[i] != '\0') {
        stack[have] = alphabet[i];
        alphabet[i] = '\0';
        print_perms_aux(alphabet, len, stack, have + 1);
        alphabet[i] = stack[have];
      }
}

static void print_perms(char *alphabet, size_t len) {
  char *alpha = (char *) malloc(len + 1);
  char *stack = (char *) malloc(len + 1);

  if(alpha == NULL || stack == NULL)
    fprintf(stderr, "malloc failed!\n");
  else {
    strncpy(alpha, alphabet, len);
    stack[len] = '\0';

    print_perms_aux(alpha, len, stack, 0);
  }

  free(alpha);
  free(stack);
}

int main(void) {
  print_perms("abcd", 4);
  return 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 24.02.2005 um 15:40 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
24.02.2005, 15:45 Uhr
Th



Naja, moderne Rechner sind ja so schnell,

also bei meinem Taschenrechner ergibt 25! = 15511210043330985984000000.

Und dann auch noch pro Wort in einem Wörterbuch nachsehen !?!

Also ich würde sagen, unser Universum ist längst erloschen, ehe "DeepThought" eine Antwort ausspuckt...

OK, habe mich vertan, bei 1Mrd Operationen pro Sekunde wären es nur knapp 500Mio Jahre!!!

Dieser Post wurde am 24.02.2005 um 15:48 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
25.02.2005, 00:38 Uhr
NemoEimi




Zitat von ~Kaiser:

ich habe eine Buchstabenfolge von 25 Buchstaben, diese sind wahllos durcheinander
gemischt. In der richtigen Reihenfolge sollen sie einen deutschen Satz ergeben.


Hier mal ein Lösungsansatz dazu in Python, schnell zusammengeschraubt, äußerst ineffizient und mit überaus optimierungsbedürftigem Ausgabeverhalten :


Code:
def prime(n):
  if (n >= 2 and n <= 3):
    return True
  k = 3
  if (n%2 == 0 or n < 2): return False
  while (k*k <= n):
    if (n%k == 0):
      return False
    k = k + 2
  return True

smallprimes = filter(prime, range(3,200,2))

alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

enc = zip(alphabet, smallprimes)
encoder = dict(enc)
def normalform(wort):
  p = 1
  for buchstabe in wort:
    p = p * encoder[buchstabe]
  return p

datei = open('woerter.txt')
dateitext = datei.read()
dateitext = dateitext.upper()
woerter = dateitext.split()
woerter = filter(lambda(x): x.isalpha(), woerter)
lexlist = [(normalform(wort), wort) for wort in woerter]
lexikon = dict(lexlist)

def enthaelt(n):
  def tmp_fun(pair):
    k = pair[0]
    return(n%k == 0)
  return tmp_fun

def ent_rec(nf, liste, lex):
  try:
    loesung = liste + lexikon[nf]
    print(loesung)
  except KeyError:
    for pair in lex:
      k  = pair[0]
      if (nf%k == 0):
        rest = nf/k
        w = pair[1]
        ent_rec(rest, liste + ' ' + w, filter(enthaelt(rest), lex))

def entschluessele_satz(satz):
  nf = normalform(satz)
  ent_rec(nf, 'Moegliche Wortliste:', lexlist)



Mit einem Testlexikon bestehend aus 25000 deutschen Wörtern (das ist die Datei "woerter.txt", die ich weiter oben öffne) findet das Programm leider für einen einfachen Testsatz eine sehr große Anzahl möglicher Zerlegungen in Wörter aus selbigem Lexikon. Es gäbe aber leichte Optimierungen, mit denen sich das (etwas) verbessern liesse.

Grüße,
Nemo

Dieser Post wurde am 25.02.2005 um 00:51 Uhr von NemoEimi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: