完全に異なるものについては、必要な文字列だけを生成するアプローチを次に示します。それをステート マシンと見なし、各ステートを関数にします。非常に冗長ですが、簡単です。(これを頻繁に行っている場合は、このコードを自動生成するように簡単に調整できます。)
Javaを求められたので、Javaです。(同じコードを Perl でも書きました。代わりに文字列に対して.=
andを実行しただけで、Java バージョンよりも 3 倍高速に実行されました。奇妙なことです。)chop
StringBuilder
import java.io.*;
public class ListAllAlarmedStrings {
static StringBuilder builder;
static int length;
public static void main(String[] args) throws IOException {
length = 5;
if (args.length > 0) {
try {
length = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.err.println("Argument" + " must be an integer");
System.exit(1);
}
}
builder = new StringBuilder(length);
for (int i = 0; i < length; i++)
builder.append("O");
stateA(0, 'A');
stateL(0, 'L');
stateNone(0, 'O');
}
static void stateNone (int pos, char chr) {
if (length < pos + 3)
return;
builder.setCharAt(pos, chr);
//System.out.println("stateNone " + pos + " " +builder.toString());
stateA(pos + 1, 'A');
stateL(pos + 1, 'L');
stateNone(pos + 1, 'O');
}
static void stateL (int pos, char chr) {
if (length < pos + 3)
return;
builder.setCharAt(pos, chr);
//System.out.println("stateL " + pos + " " +builder.toString());
stateA(pos + 1, 'A');
stateLL(pos + 1, 'L');
stateNone(pos + 1, 'O');
}
static void stateLL (int pos, char chr) {
if (length < pos + 2)
return;
builder.setCharAt(pos, chr);
//System.out.println("stateLL " + pos + " " +builder.toString());
stateA(pos + 1, 'A');
stateAlarmed(pos + 1, 'L');
stateNone(pos + 1, 'O');
}
static void stateA (int pos, char chr) {
if (length < pos + 2)
return;
builder.setCharAt(pos, chr);
//System.out.println("stateA " + pos + " " +builder.toString());
stateAlarmed(pos + 1, 'A');
stateAL(pos + 1, 'L');
stateA(pos + 1, 'O');
}
static void stateAL (int pos, char chr) {
if (length < pos + 2)
return;
builder.setCharAt(pos, chr);
//System.out.println("stateAL " + pos + " " +builder.toString());
stateAlarmed(pos + 1, 'A');
stateALL(pos + 1, 'L');
stateA(pos + 1, 'O');
}
static void stateALL (int pos, char chr) {
if (length < pos + 2)
return;
builder.setCharAt(pos, chr);
//System.out.println("stateALL " + pos + " " +builder.toString());
stateAlarmed(pos + 1, 'A');
stateAlarmed(pos + 1, 'L');
stateA(pos + 1, 'O');
}
static void stateAlarmed (int pos, char chr) {
if (length <= pos)
return;
if (length == pos + 1) {
builder.setCharAt(pos, chr);
System.out.println(builder.toString());
return;
}
builder.setCharAt(pos, chr);
stateAlarmed(pos + 1, 'A');
stateAlarmed(pos + 1, 'L');
stateAlarmed(pos + 1, 'O');
}
}