HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0106
かけたおちゃわん百人一首で、与えられた文字列から、決まり字であるか否かを判断するには?4解決


かけたおちゃわん

リンク

2019/1/6(Sun) 03:19:49|NO.86268

例えば小倉百人一首では「め」だけで
「めぐりあひてみしやそれともわかぬまにくもがくれにしよはのつきかな」が確定します。
このような感じで

dic.txt


あきのたのかりほのいほのとまをあらみわがころもではつゆにぬれつつ はるすぎてなつきにけらししろたへのころもほすてふあまのかぐやま ・・・

といったように登録されている文字列の中から、最初の数文字だけ入力して、決まり字かどうかを調べたい
と考えています(「dic.txt」は小倉百人一首で100行ある想定)。
決まり字ではない場合、該当する文字列を全て表示させたいと考えています。

存在するかどうかだけなら以下の方法で行けると思うのですが
http://hsp.tv/play/pforum.php?mode=pastwch&num=14357
例えば「あさぼらけ」と指定した場合、「あさぼらけ」から始まる文字列は存在することはわかりますが、
「あさぼらけありあけつきとみるまでに〜〜」か「あさぼらけうぢのかはぎりたえだえに〜〜」と2つあるため
「決まり字ではない」という結果がほしいのですが、それはできない認識です。
(存在するか否かしかこの方法では確認できない)

また、ここでは百人一首を例にあげているのでたかだか100ですが、
これを1000とか10000とかに拡張しても、高速に動作する方法がほしいです。



この記事に返信する


KA

リンク

2019/1/6(Sun) 06:27:19|NO.86269

最初に50音順でソートしておけば簡単です。



さか

リンク

2019/1/6(Sun) 11:06:57|NO.86270

noteselで行うのであればヒットした行を削除したらどうですか。
削除するので検索する最初にnoteselでデータを再指定する必要があります
がそれ自体は時間かからないです。
処理時間ですが以下で20万行を超えると自分のPCだと2秒以上かかります
が1万くらいであれば問題ないのではと思います。
数十万以上を扱うのであればsqlite(sqlele.hsp)を使うのがいいと思いま
す。


sdim ss, 999999 ss={" あさぼらけうぢのかはぎりたえだえにあらはれわたるせぜのあじろぎ こころあてにをらばやをらむはつしものおきまどはせるしらぎくのはな あさぼらけありあけのつきとみるまでによしののさとにふれるしらゆき わたのはらこぎいでてみればひさかたのくもゐにまがふおきつしらなみ "} repeat 11 ss+=ss loop notesel ss mes notemax mes notesize ff="あさぼらけ" repeat ix = notefind( ff, 1 ) ; ffで始まる行番号を取得 if ix == -1: break ; なければ終わり noteget aa, ix ; 行番号を取得 mes aa notedel ix ; 行番号を削除 loop title "end"



かけたおちゃわん

リンク

2019/1/6(Sun) 12:37:19|NO.86271

notefindという命令があることを知りませんでした。
まずはnotefindで試し、もしnotefindで遅いようであればsqliteの方を試してみようと思います。



zakki

リンク

2019/1/6(Sun) 23:17:54|NO.86277

かなり大量のデータを高速に扱いたいとするとトライ木のようなツリー構造がいいんじゃないかと思います
HSPでの実装は面倒そうですし恐らく1000程度だと線形探索で十分そうな気がしますが…



ONION software Copyright 1997-2023(c) All rights reserved.