タグ別アーカイブ: String

人工無脳を作ってみる (1)入力文の末尾に文字列を追加

さて、最初は単純にユーザの入力文の末尾に予め定義されている文字列を付け足して応答するだけのものです。

ソースコード

getSuffixResponse()メソッド内で使われているMath.random()は、

static double random()
0.0 以上で、1.0 より小さい正の符号の付いた double 値を返します。

ですので、「Math.random() * 配列の長さ」 は「0~配列の長さ-1」 を意味します。

実行結果の例

なんだかー、それはかとなくばかにしていますねf^^;

最初はJavaで書いていきますが、実装する機能の種類やリリースする環境によっては恐らく途中でOOをサポートする他の言語に変更するかも。

Java: ユーザからの(標準)入力を取得 – System.inとInputStreamReaderクラス

コマンドプロンプトからキーボード(標準)入力を取得するプログラムです。

肝心の標準入力を取得する手続きはSystem.inフィールドですが、これはバイトストリームでの読み込みを行うメソッドしか持たないので、InputStreamReaderクラスでラップすることでバイトストリームを文字列に変換出来るメソッドに任せます(read()メソッド)。
しかし、InputStreamReader#read()メソッドは一文字毎にしか読み込めず非効率な面があるので、最後にBufferedReaderクラスでラップすることで入力文字をバッファに格納し一行まとめて読み込めるようにします。(readLine()メソッド)。

このように、高水準のコンポーネントにSystem.inのような低水準のコンポーネントを渡して、その中で低水準メソッドを制御する手法はTemplate Methodパターンに通じるものがあるかも。The Open-Closed Principleですね。

ソースコード

実行結果

文字列を入力した後Enterキーを押すと入力した文字がOUTPUTされます。

プログラムを終了する際は、プロンプト上でCtrl+CかCtrl+Zを押してください。それでreadLine()の戻り値はnullとなりwhileループを抜けます。ここでの注意は、単に文字を何も入力せずEnterキーだけ打つと空文字を返すことです(≠null)。

対して、C言語でこういった処理の場合は環境に合わせた改行文字も読み込こんでいます。たぶん、JavaではInputStreamReaderのreadのどこかの段階でその辺は上手く処理されているのかな?気が向いた時に確認してみようかな。

Python: 文字列の上位型であるシーケンス型の構文 – Sequence[X:Y:Z]

データの順序が存在するデータ型としてシーケンス型があり、文字列型の上位型となっています。このシーケンス型には文字列中の文字の抽出や操作を簡略化する分かりやすい構文がありますので、これを確認してみましょう。

String[X:] はString[X]から末尾までの文字を持つ文字列

実行結果

String[:Y] は文字列の先頭からString[Y-1]までの文字を持つ文字列

実行結果

String[::Z] は文字列の先頭から末尾まで Z 間隔で文字を抽出した文字列

実行結果

文字列の文字順序を逆順にする処理を構文で賄えるのは良いですね。汎用性があって。

上述の複合 – String[X:Y:Z]

実行結果

チュートリアル

リファレンス

Python: 10進数整数を2進数文字列に変換する関数

2進数文字列を10進数整数に変換する関数int()はありますが、

その逆の、10進数整数を2進数文字列に変換する関数が(Python2.5では)見当たらなかったので、書いてみました。

ソースコード

Pythonでは明示的に型変換する必要がありますので、所々int()、str()を用いて型直ししています。

実行結果

追記: 32bit以上の整数を扱う場合

参考: 10進数を2進数と16進数に変換する – gan2 の Ruby 勉強日記
↑の記事で、データサイズにかかわらず処理できるRubyプログラムがありましたので、参考させていただきました。

実行結果は上と同じです。

リファレンス

Python: リスト中の文字列を大文字⇔小文字に変換

文字列を比較する際に、大文字・小文字を区別したくない場合があります。その時は、比較する文字列を大/小文字列のどちらかに統一しておく、という手があります。Pythonでは大文字・小文字変換メソッドlower()、upper()はstringオブジェクトに組み込まれています。
今回は、その使い方と実際に使用する状況に近いデータ構造、ここでは変換対象文字列がリスト中の要素である場合を想定し、for文とリストコンプリヘンション(リスト内包表記)の両表記を以下に示します。

ソースコード

実行結果

List Comprehensions ならワンライナーで書けるってのは地味に良いですね。
話変わりますが、Rubyにもイテレータやブロックを用いた簡略記法がありましたね。アレはアレで、応用しやすいものです。

チュートリアル

リファレンス

Python: if/for文でのin演算子の各オブジェクト毎の評価

if/for文中で使われるin演算子の評価はオブジェクトごとに微妙に変化します。あやふやなままにしておくのもなんですし、ここで、以下のオブジェクトに対するif/for文中の評価を実際に確認してみましょう。

  • 文字列
  • リスト
    • 数値のリスト
    • 文字列のリスト
    • 辞書のリスト
  • 辞書

if/for文 + in 文字列

実行結果

if/for文 + in リスト

実行結果

if/for文 + in 辞書

実行結果

チュートリアル

リファレンス

Python: 文字列の検索 – index()、reindex()メソッド

ソースコード

実行結果

リファレンス

チュートリアル