7 Stimmen

Wie kann man alle möglichen Wörter mit einer bestimmten Länge herausfinden?

Ich versuche, einen Algorithmus in C# zu erstellen, der die folgenden Ausgabestrings erzeugt:

AAAA
AAAB
AAAC
...and so on...
ZZZX
ZZZY
ZZZZ

Wie lässt sich dies am besten bewerkstelligen?

public static IEnumerable<string> GetWords()
{
    //Perform algorithm
    yield return word;
}

0 Stimmen

Was wollen Sie damit erreichen? Je nach Ihrer Antwort ist es vielleicht besser, die Liste auf die Schnelle zu erstellen.

0 Stimmen

@John der Statistiker: Iterator-Blöcke verwenden tut die Liste nach und nach erstellen.

0 Stimmen

Dies kann bei der Erstellung einer naiven Brute-Force-Logik nützlich sein. Ich habe einmal etwas Ähnliches für einen Kurs gemacht, in dem wir eine Chiffre knacken mussten. Die analytische Technik war einfach, also habe ich auch ein Programm geschrieben, das an einem frühen Samstagmorgen das gesamte Computerlabor der Hochschule für ein paar Stunden in Anspruch nahm :)

1voto

Federico A. Ramponi Punkte 44697

Python!

(Dies ist nur ein Scherz, nimm mich nicht zu ernst :-)

# Convert a number to the base 26 using [A-Z] as the cyphers
def itoa26(n): 
   array = [] 
   while n: 
      lowestDigit = n % 26
      array.append(chr(lowestDigit + ord('A'))) 
      n /= 26 
   array.reverse() 
   return ''.join(array)

def generateSequences(nChars):
   for n in xrange(26**nChars):
      string = itoa26(n)
      yield 'A'*(nChars - len(string)) + string

for string in generateSequences(3):
   print string

1voto

Josh Lee Punkte 159535

Haskell!

replicateM 4 ['A'..'Z']

Ruby!

('A'*4..'Z'*4).to_a

1voto

eaanon01 Punkte 1049

Dies ist eine rekursive Version der gleichen Funktionen in C#:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ConsoleApplication1Test
{
    class Program
    {
        static char[] my_func( char[] my_chars, int level)
        {
            if (level > 1)
                my_func(my_chars, level - 1);
            my_chars[(my_chars.Length - level)]++;
            if (my_chars[(my_chars.Length - level)] == ('Z' + 1))
            {
                my_chars[(my_chars.Length - level)] = 'A';
                return my_chars;
            }
            else
            {
                Console.Out.WriteLine(my_chars);
                return my_func(my_chars, level);
            }
        }
        static void Main(string[] args)
        {
            char[] text = { 'A', 'A', 'A', 'A' };
            my_func(text,text.Length);
            Console.ReadKey();
        }
    }
}

Druckt von AAAA bis ZZZZ aus

1voto

Einfacheres Python!

def getWords(length=3):
    if length == 0: raise StopIteration
    for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
        if length == 1: yield letter
        else:
            for partialWord in getWords(length-1):
                yield letter+partialWord

0voto

Scott Evernden Punkte 37117

Javascript!

var chars = 4, abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", top = 1, fact = [];
for (i = 0; i < chars; i++) { fact.unshift(top); top *= abc.length; }
for (i = 0; i < top; i++)
{
    for (j = 0; j < chars; j++) 
        document.write(abc[Math.floor(i/fact[j]) % abc.length]);
    document.write("<br \>\n");
}

0 Stimmen

Das ist schön, so dass Sie zunächst die Berechnung der Anzahl der möglichen Wörter in top. und Sie betrachten die Zeichen als Zahlen in Basis abc.length :) Daran habe ich schon vor einiger Zeit gedacht, das ist eine nette Idee :) und auch besser als der rekursive Ansatz, obwohl Division und Modulo ihren Tribut fordern könnten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X