【iPhone】アナグラムを生成するショートカットを作ってみる [作業ログ]

入力された文字列の各文字をランダムに入れ換えてアナグラムを生成するショートカットを作ります。

まあランダムに入れ替えるだけなので意味不明な文字列になることが大半ですが...。

作業過程をまとめました。


0. やるべきことを整理

先ずパッと思いつく方法(こうしたらできるかな?というやつ)として、「入力された文字列を文字単位で分割してリスト化した後、リストからランダムに項目を取得していく」というのがあります。

しかしこれだと「ランダムに取得」する際に被りが出た場合、アナグラムになりません。ランダムな文字列を生成するショートカット(例:昔作ったランダムなツイッターIDを生成するショートカット)ならそれでもいいのかもしれませんが、本記事で作りたいのはアナグラムを生成するショートカットなので、この方法では不味いことがわかります。

...いきなり結論を言ってしまうと、アナグラム生成のショートカットでは、重複なしの乱数列が欲しいわけです。例えば、「3,1,5,4,2」のような。

重複なしの乱数列が得られれば、あとはそれを左から順番に読み出して、その値をリストのインデックスとして、「入力の文字列を文字単位で分割したリスト」から値を取得していけばいいことがわかります。

例えば入力が "ドラえもん" の5文字だった場合、先程の乱数列「3,1,5,4,2」を使えば、"えドんもラ" という文字列を作ることが出来ることがわかります。

つまりショートカットの処理の流れとしては、

・文字列を入力する

・重複なしの乱数列(長さは入力された文字列の文字数)を作る。乱数の範囲は1〜文字列の長さ

・文字列を文字単位で分割し、リスト化

・乱数列を順に読み出し、それをインデックスとして「文字列を文字単位で分割したリスト」から値を読み出す

・読み出した値を全て結合して返す(これが最終結果のアナグラム)

のようにすればいいと思います。

関数のように「ショートカットを実行」アクションを使って外から呼び出して使えるようにしてもいいですが、それは後からでもできる(必要になった時にやればいい)ので、とりあえず一つのレシピで動くものを作ることにします。


1. 数が順番に並んだリスト(1,2,3, ...)を作成する

とりあえず何か文字列がないと話にならないので、「入力を要求」アクションを使って文字列を入力できるようにしておきます。

そしたら「カウント」アクションを使い、入力された文字列の長さを取得します。

あとは得られた文字列の長さ分繰り返すようにして、「繰り返しインデックス」を順に取り出します。

レシピは以下のような感じかな。実行結果として、数が順番に並んでいるリストが得られることが確認できたらおk。

画像1


2. 数のリストをシャッフルする

先ずは1. で得られたリストを適当な名前の手動変数に入れます。

そして、この変数(リスト)に対して以下のような操作を行うと、指定の値を除去することができます。処理の対象が「連続した数値のリストであり被っている値がない」からできる操作ですが。

・「テキストを置き換え」アクションで消したい値を除去 

・「一致するテキスト」アクションを使って値があるものだけ取り出す

・それを変数に再代入

上の操作を使って、「(リストを入れた)変数から項目をランダムに取得&ランダムに取得した値を除去したリストを作り変数に代入」することを繰り返します。

そして、「ランダムに取得した項目」を取得した順に並べれば、それは元のリストをランダムにシャッフルしたものリストになっていると思います。

レシピとしては以下のような感じかな?

画像2


3. アナグラム生成

最後に、できた乱数列(シャッフル後のリスト)を使ってアナグラムを生成します。

先ずは、レシピの冒頭で入力した文字列を適当な手動変数に入れてあとで使いやすくしておきます。

画像3


また、できた乱数列のリストも適当な手動変数に入れておきます。

画像4


そして、入力された文字列(inputStr) を文字単位で分割してリストにして、それも手動変数に入れます。

画像5


あとは以下のようにして乱数列(randNumSeq)を使って並び替えて、最後に結合してテキストに戻すだけ。結果はわかりやすいように適当な手動変数(anagram)に入れておきます。

画像6


とりあえずは完成と言って良さそう。


4. 結果を表示 & クリップボードにコピー
& 連続で並び替えられるようにする

先ずは冒頭の入力で、「デフォルトの回答」をクリップボードの値に設定しておきます。

画像7


あとは最後に結果を「結果を表示」アクションで表示して、その後でクリップボードにコピーするかどうかを「アラートを表示」アクションを使って聞いて、コピーする場合はコピーするだけ。

画像8


こうすれば実行して並び変えて...と言う動作を何度も繰り返すのが楽になる。(まえの実行結果がクリップボードに入っていて、デフォルトでそれが入力に入るから)


5. ちょっとテスト

以下のようなわかりやすい文字列を入れて何度かテストしてみる。

●●●●●〇〇〇〇〇▲▲▲▲▲△△△△△

画像9


クリップボードにコピーした後連続で実行すると、以下のような結果が得られる。

〇△△▲●△●●▲〇〇△〇▲●△▲▲〇●

〇●〇△〇●●△△▲〇▲▲●△▲△〇●▲

▲●〇〇〇●●△▲△△▲●●〇△△▲▲〇


多分大丈夫かなあ。。。


6. 遊んでみた

ピカソの本名を並び替えてみた。間違えてなきゃちゃんと並び変わってるはず。

マムシエメクノスィ・ピブ・ネ・ロカアリ・デピデドィラセ・イラ・・ンコリ・シスンソレリーパス・ゴ・リデウ・フルディスホニス・ンセラポデダー・パス・デローア・ン・ノ・ク・ピ・トホオマイア・ーサ


7. まとめ

この方法だとあんまり長い文字列を並び替えるのは向いてないけど、ちょっとしたアナグラムクイズを作るときとかには使えそう。

では。

この記事が気に入ったらサポートをしてみませんか?