ビット演算によって、与えられた文字列の中の全ての文字列を出力するコードです。Cで書いていましたが、日本語に対応させるため、pythonで書き直しました。
alice.py
#!/usr/bin/python3
import sys
word=sys.argv[1]
K=1
N=len(word)
t=1
def nextset(x):
smallest=x & -x
ripple = x + smallest
new_smallest = ripple & - ripple
ones =((new_smallest // smallest) >>1)-1
return ripple | ones
def printset(s):
for i in range(N):
if (s & 1):
print( word[i] , end="")
s=s>>1
print("")
def conv(k):
global t
x= (1 << (k)) -1
while True:
if (x&~((1<<(N))-1)):
break
print(str(t)+" : ",end="")
printset(x)
x=nextset(x)
t=t+1
t=1
for K in range(N):
conv(K+1)
実行例
$ alice.py たんすいかぶつ
1 : た
2 : ん
3 : す
4 : い
5 : か
6 : ぶ
7 : つ
8 : たん
9 : たす
10 : んす
11 : たい
12 : んい
13 : すい
14 : たか
15 : んか
16 : すか
17 : いか
18 : たぶ
19 : んぶ
20 : すぶ
21 : いぶ
22 : かぶ
23 : たつ
24 : んつ
25 : すつ
26 : いつ
27 : かつ
28 : ぶつ
29 : たんす
30 : たんい
31 : たすい
32 : んすい
33 : たんか
34 : たすか
35 : んすか
36 : たいか
37 : んいか
38 : すいか
39 : たんぶ
40 : たすぶ
41 : んすぶ
42 : たいぶ
43 : んいぶ
44 : すいぶ
45 : たかぶ
46 : んかぶ
47 : すかぶ
48 : いかぶ
49 : たんつ
50 : たすつ
51 : んすつ
52 : たいつ
53 : んいつ
54 : すいつ
55 : たかつ
56 : んかつ
57 : すかつ
58 : いかつ
59 : たぶつ
60 : んぶつ
61 : すぶつ
62 : いぶつ
63 : かぶつ
64 : たんすい
65 : たんすか
66 : たんいか
67 : たすいか
68 : んすいか
69 : たんすぶ
70 : たんいぶ
71 : たすいぶ
72 : んすいぶ
73 : たんかぶ
74 : たすかぶ
75 : んすかぶ
76 : たいかぶ
77 : んいかぶ
78 : すいかぶ
79 : たんすつ
80 : たんいつ
81 : たすいつ
82 : んすいつ
83 : たんかつ
84 : たすかつ
85 : んすかつ
86 : たいかつ
87 : んいかつ
88 : すいかつ
89 : たんぶつ
90 : たすぶつ
91 : んすぶつ
92 : たいぶつ
93 : んいぶつ
94 : すいぶつ
95 : たかぶつ
96 : んかぶつ
97 : すかぶつ
98 : いかぶつ
99 : たんすいか
100 : たんすいぶ
101 : たんすかぶ
102 : たんいかぶ
103 : たすいかぶ
104 : んすいかぶ
105 : たんすいつ
106 : たんすかつ
107 : たんいかつ
108 : たすいかつ
109 : んすいかつ
110 : たんすぶつ
111 : たんいぶつ
112 : たすいぶつ
113 : んすいぶつ
114 : たんかぶつ
115 : たすかぶつ
116 : んすかぶつ
117 : たいかぶつ
118 : んいかぶつ
119 : すいかぶつ
120 : たんすいかぶ
121 : たんすいかつ
122 : たんすいぶつ
123 : たんすかぶつ
124 : たんいかぶつ
125 : たすいかぶつ
126 : んすいかぶつ
127 : たんすいかぶつ
$