【paizaラーニング】問題集 線形探索メニュー「指定された値の探索」を解く

レベルアップ問題集「定番アルゴリズムの習得」の線形探索メニュー問題をPythonで解きました。

リスト型に対する組み込みメソッド(count(), find()など)やin演算子の使用は、アルゴリズム学習の主旨から外れるため禁じ手とします。

公式解答例はメインルーチンだけで解いているようですが、私は必要に応じて関数やクラスを利用する方針でコーディングしています。 理由は、海外のオンラインジャッジにも挑戦しており、そちらではメインルーチンがなく標準入出力も使わないためです。

CodeWarsでは関数、LeetCodeではクラス(とそのメソッド)が解答様式となっています(名前もすでについているので、考える手間が省けて良いです)。

以下、私のコードの一部をご紹介します。入力行の読み込みは、説明で特に必要なもの以外は省略します。

指定された値の探索

def myCount(l: list, k: int):
    """
    リストに含まれるキーのカウント
    l: list 対象リスト
    k: int  キー
    """
    amount = 0
    for data in l:
        if data == k:
            amount += 1
    return amount

指定された値の位置1

問題ではリストの最初を「1番目」としていますが、多くのプログラミング言語では配列の先頭インデックスを0とする仕様です。

実用的な関数としては、正直にインデックスを戻り値として、問題に合わせてメインルーチン側で調整するのが良いと思います。そうすれば他のオンラインジャッジでも使いまわせるでしょう。

関数

def myLinearSearch(l: list, k: int):
    """
    線形探索
    l: list 対象リスト
    k: int  キー
    最初に見つかったキーのインデックスを返す
    見つからなかった場合は-1を返す
    """
    p = 0
    while p < len(l):
        if l[p] == k:
            return p + 1
        p += 1
    return -1

メインルーチン側

result = myLinearSearch(a, k) + 1

これで題意は満たせます。

指定された値の位置2

一次変数を用意して、見つかったキーのインデックスを保持します。リストの最後まで探索が進んだ後、その一時変数を戻り値とします。

def myLinearSearch2(l: list, k: int):
    """
    線形探索2
    l: list 対象リスト
    k: int  キー
    最後に見つかったキーのインデックスを返す
    キーが見つからなかった場合は-1を返す
    """
    p = 0
    latest = 0
    flag = False
    while p < len(l):
        if l[p] == k:
            flag = True
            latest = p
        p += 1
    if flag:
        return latest
    else:
        return -1

FINAL問題:指定された値の位置3

戻り値をリストにして、メインルーチン側でfor文を使い、各要素に対してprint()を使えば良いでしょう。

def myLinearSearch3(l: list, k: int):
    """
    線形探索 Final
    l: list 対象リスト
    k: int  キー
    見つかったキーのインデックスのリストを返す
    キーが見つからなかった場合は空のリストを返す
    """
    p = 0
    result = []
    while p < len(l):
        if l[p] == k:
            result.append(p)
        p += 1
    return result

余談

Pythonのリストのインデックスに対してfor文を使うのがとても苦手です。よくlist index out of rangeエラーを出して失敗します。

それでは、と思い今はwhile文を使っています。これはこれでインデックスの増加をし忘れるんですけどね(なのでそこまで先に書いてから中身を書くようにしています)。

ロマニ語の数詞

1〜10

jekh, duj, trin, śtar, panʒ,

śov, efta, oxto, enǎ, deś

11, 12, …, 19

deśujekh, deśuduj, …, deśuenǎ

20 biś

21 biś thaj jekh / biśujekh

29 biś thaj enǎ / biśuenǎ

30 trinvardeś / trindeśa

40 śtarvardeś / śtardeśa

90 enǎvardeś / enǎdeśa

100 jekh śel

200 duj śela

...

200〜900で śel は複数形 śela となる。

1000以上:不明

標準ロマニ語の発音

世界共通ロマニ語アルファベット

a b c ć ćh d e f g x h i j k kh l m n o p r rr s ś t th u v z ź ʒ

語中のみ使う文字

q θ ç

ǎ ě ǐ ǒ ǔ

世界共通ロマニ語アルファベットは、大部分が発音記号と共通である。

y は使わない。

注意すべき綴り字と発音

c [t͡s]

ć [t͡ʃ]

ś [ʃ]

ź [ʒ]

ʒ [d͡ʒ]

j [j] ([d͡ʒ]ではない!)

x [x] ([ks]ではない!)

IPAに詳しい人ほど ź と ʒ の読み方に注意。どうしてこうなった

ǎ ǐ ǔ ě ǒ はヤ行でヨシ。

q, θ, ç は格語尾専用。語頭には来ないので大文字は使わない。

それぞれふた通り読み方がある。なおIPAとは関係ないので混同しないように。

q: nの後は[ɡ]、それ以外は[k]

θ: nの後は[d]、それ以外は[t]

ç: nの後は[t͡s]、それ以外は[s]

kh, th, ph はそれぞれ k, t, p の発音に息が混ざった発音(有気音) r はいわゆる巻舌。rr は r を長めに発音するか、直前に「ン」的な鼻に抜ける感じを伴う。二つの区別をしっかり。

アクセント

アクセントは原則として単語の最後の音節に来る。新参語(借用語とか外来語みたいなもの)は規則外なのでアクサングラーヴ記号( ̀)でアクセント位置を示す。

格語尾が付く場合はアクセントは格語尾の直前の音節にある。

はてなブログでHTMLを使ってヘブライ語を記述する

בראשית ברא אלוהים את השמים ואת הארץ. והארץ היתה תהו ובהו וחשך על־פני תהום ורוח אלוהים מרחפת על־פני המים.

適切なタグを使わないと、最後の句点の位置がおかしくなる。

日本語テキスト内にヘブライ語を記述する

bdo dir="rtl"タグを使う。

<p>
<bdo lang="he" dir="rtl">
בראשית ברא אלוהים את השמים ואת הארץ. והארץ היתה תהו ובהו וחשך על־פני תהום ורוח אלוהים מרחפת על־פני המים.
</bdo>
</p>

בראשית ברא אלוהים את השמים ואת הארץ. והארץ היתה תהו ובהו וחשך על־פני תהום ורוח אלוהים מרחפת על־פני המים.

句点の位置は正しくなるが、テキストは右揃えにならない。 日本語とヘブライ語が混在したテキストならこれで良いだろう。

「ごきげんいかがですか?」は、接尾代名詞の付いた שלום shalom を用い、מה שלומך?(男性には ma shlomkha?、女性には ma shlomekh?)と言います。 山田恵子 ニューエクスプレス 現代ヘブライ語 p.47)

ヘブライ語のみのテキストブロックを記述する

pタグにスタイル style="direction: rtl;" を適用する。

<p lang="he" style="direction: rtl;">
בראשית ברא אלוהים את השמים ואת הארץ. והארץ היתה תהו ובהו וחשך על־פני תהום ורוח אלוהים מרחפת על־פני המים.
</p>

בראשית ברא אלוהים את השמים ואת הארץ. והארץ היתה תהו ובהו וחשך על־פני תהום ורוח אלוהים מרחפת על־פני המים.

句点の位置も正しくテキストも右揃えになった。 ヘブライ語のみのテキストを書くならこれを使おう。

ルビ、ヘブライ語表記

ルビ

曲折きょくせつ

死が奏で合う劇場モト劇場

チャク棍法術こんぽうじゅつ奥義おうぎ纏欬てんがいしんだん

ヘブライ語の記述(bdoタグ不使用)

שני לומד עברית.

‏句点の位置がおかしい。

ヘブライ語の記述(bdoタグ使用)

אני לומד עברית.

句点の位置が正しい。

アムハライさんカレー 2020年1月版

材料(4〜6人分)

カレーベース

  • アムハライさんカレー粉 または市販のカレー粉 大さじ1
  • 薄力粉または米粉 大さじ1
  • 油 大さじ1 またはバター10g
  • 玉ねぎ 1〜2個

具材

  • 牛豚合挽き肉 120〜150g

スープ

  • 野菜ジュース(伊藤園 1日分の野菜) 200mL
  • 水 300mL
  • 牛乳 大さじ1〜100mL
  • コンソメ 顆粒小さじ2 またはキューブ2個

調味料(お好みで調節)

  • ウスターソース 大さじ1
  • 麺つゆ 大さじ1
  • 赤ワイン 大さじ1
  • デミグラスソース 大さじ1

お好みで追加

  • コーヒー粉末 小さじ1〜2
  • ココアパウダー 小さじ1〜2

+α(なくても全然構わないのだ)

  • クミンシード 2〜3振り

作り方

  1. 玉ねぎを薄切りかみじん切りにするのだ

  2. 合挽き肉を冷凍している場合は解凍あたためしておくのだ(約2分)

  3. 鍋またはフライパンで油またはバターを温めるのだ(クミンシードがあればここでしばらく炒る)

  4. 玉ねぎを茶色になるまで炒めるのだ(5〜10分)

  5. 合挽き肉を混ぜて炒めるのだ

  6. お肉に十分熱が通ったらカレー粉と薄力粉または米粉を加えて1〜2分炒めるのだ

  7. 火を止めて野菜ジュースと水、牛乳を加えて煮込むのだ

  8. 調味料を加えて煮立ったら完成なのだ

できあがり

できあがり例はにんじんさんも入れたのだ! いただきますなのだ!

アムハラ語学習 連体形(続き)ほか

Leslau第32課

連体形を使った強調構文

አባቴ ነሙ የወደደቀው። 倒れたのは私の父です。

連体形+「〜ので」「〜まで」「〜こと」も登場。

この辺はニューエクスプレス14課でも取り扱ってた。

ቅጠሉ አይደለም የሚበላው። 葉っぱじゃないよ、食べられるのは。

ምንድን ነው የምትፈልገው? あなたが欲しいのは何ですか?

日本語の倒置文のような形をしている。

他はአለの過去形・未来形と、XYY型の動詞だった。