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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0303
シエン数値の特定の桁を抽出したい場合19解決


シエン

リンク

2010/3/3(Wed) 20:07:44|NO.30945

ある数値の特定の桁を抽出したい場合の処理なんですが、

数値を文字列化 → peekで抽出 → 文字コードを数値化

というメンドウな方法しか思いつきませんでした。
これでも可能は可能だったんですが、
もっとスマートな処理方法があるんじゃないかと思い質問しました。
よろしくお願いします。



この記事に返信する


hatter

リンク

2010/3/3(Wed) 20:22:54|NO.30946

文字列として処理すればいいのでは?



kk

リンク

2010/3/3(Wed) 20:31:28|NO.30947

strmid 関数を用いて、文字列の特定の桁を抽出することができます。



a="387" //もとの数値 b=strmid(a,0,1) //1桁目を取り出し、b に代入 c=strmid(a,1,1) //2桁目を取り出し、c に代入 mes "数値は "+a mes "\n1桁目は "+b //"\n"は改行コードです。念のため。 mes "2桁目は "+c stop



GENKI

リンク

2010/3/3(Wed) 20:43:39|NO.30948

整数にすると切り捨てられることを利用して。

a=123456 ;数値指定 b=4 ;桁指定 c = a/powf(10,(b-1)) - a/powf(10,b)*10 mes c



シエン

リンク

2010/3/3(Wed) 21:01:15|NO.30949

>kkさん
ああー、strmidは忘れていました、ずっとstrとstrfで思考が止まってました・・・
このほうがずっとスマートですね。

>GENKIさん
powfとは、自分ではまず出てこない発想でした。これはかなりスマートですね。



ありがとうございました、活用させていただきたいと思います。



窓口

リンク

2010/3/4(Thu) 00:32:35|NO.30954

解決した様ですがせっかくなので投稿させていただきます。
割り算の余りを利用しています。


dig = 100 ; 100 の位を調べる num = 123450 ; 調べる数 rlt = num / dig ; 調べる桁を一の位に合わせる Ans = rlt \ 10 ; それを10で割った余りが答えと成る。 mes strf("%d の %dの位は %d である" ,num,dig,ans)



窓口

リンク

2010/3/4(Thu) 00:41:43|NO.30955

<追記>
繰り返しの中で使うにはこんな感じです。


; 1 調べる数列 ; 2 調べる桁数 ; 1の位を調べるなら 1 ; 10の位を調べるなら 10 を指定する。 #define ctype Digits(%1,%2) ((%1 / %2) \ 10) dig = 1 repeat 4 mes Digits( 123450 , dig ) dig *= 10 loop



ANTARES

リンク

2010/3/4(Thu) 23:41:14|NO.30995

 窓口さんのを汎用化したのがGENKIさんのスクリプトです。
他人の回答を読まずに投稿する人はWOM(Write Only Member)と呼ばれます。



窓口

リンク

2010/3/5(Fri) 00:45:50|NO.31001

すみません。以後気をつけます。



shinkun

リンク

2010/3/5(Fri) 01:07:13|NO.31003

>  窓口さんのを汎用化したのがGENKIさんのスクリプトです。
> 他人の回答を読まずに投稿する人はWOM(Write Only Member)と呼ばれます。

現状では、窓口さんの物より GENKI さんの物の方が使い勝手が良いのは確かです。
ですが、それだけの理由で切り捨ててしまう程、窓口さんのスクリプトは無価値なのでしょうか?

窓口さんと GENKI さんのスクリプトの機能的な差は、powf 関数をたった 1 個付け足すだけで解消されます。

#define ctype digit(%1,%2) ((%1) / powf(10,%2) \ 10) mes digit(12345,0) ; GENKI さんのとは桁の指定がずれるけど、それは気にしない (^^;
これを踏まえて考えた時、少なくとも私は窓口さんのスクリプトの方がずっとスマートだと感じるし、速いコードだろうなぁと思います。
より良いコードを書くヒントとなったというだけでも相当意味のあるレスです。

それに、窓口さん自身、自分のレスが蛇足である事を理解して投稿しています。
2 つ目のレスは余計かなと私も思いますが、解法も異なるのだし、批判だけされるような物ではないように思います。



ANTARES

リンク

2010/3/5(Fri) 01:25:31|NO.31004

 問題は、窓口さんがGENKIさんのスクリプトを理解していなかったことにあります。
窓口さんの記事が無価値などと書いた覚えはありません。

蛇足
>powf 関数をたった 1 個付け足すだけで解消されます。
 だから、窓口さんの記事に価値があるというのは、論理がおかしい。

 WOMまで持ち出したのはちょっときつすぎたかなとは思いました。



Ve

リンク

2010/3/5(Fri) 18:14:53|NO.31020

WOMなんて聞いたことがありませんが…



kk

リンク

2010/3/5(Fri) 23:35:42|NO.31034

補足:気になったのでWOMを調べてみました

WOMはROMの対義語みたいです。


ROM→Read Only Member

WOM→Write Only Member


ホームぺージは参考にしたサイトです。

「WOM」でページ検索でもかけてください。


ちなみに、お二人のやり方で1万回の計算にかかる時間を比較してみると、
こちらの環境では

窓口さん → 60ms 前後

GENKIさん → 150ms 前後

でした。


これが一般的な結果であるかどうかは分かりませんが、

少なくとも自分にとっては窓口さんのスクリプトには十分価値があるようです。


個人的には、色んなスクリプトが見れればそれでいいのでは、と。

根本の考え方は同じでも、少しでも違うなら、

自分の勉強のために見ときたいですね。


蛇足失礼!



Ve

リンク

2010/3/5(Fri) 23:54:19|NO.31035

>「WOM」でページ検索でもかけてください。

今時、目にした事のない言葉だったので、
どこかで使われているのか気になりました。

Goojieで検索してみます。
ありがとうございました。



ANTARES

リンク

2010/3/6(Sat) 01:20:16|NO.31037

>少なくとも自分にとっては窓口さんのスクリプトには十分価値があるようです。
 速度なんか問題にするんじゃ、論点がずれています。
結局、GENKIさんのスクリプトを理解できてる人は少ないってこと?
だとしたら、全然蛇足じゃなかったということになりますが……



通りすがり

リンク

2010/3/6(Sat) 02:03:24|NO.31038

別に悪意があってやった訳でもないのに
なんでそんなに突っかからなきゃいけないんですかね。

GENKIさんのも窓口さんのもやっていることは同じですが、
書き方が丸っきり違うでしょう。
こういう書き方もあるよ、というサンプルは提示してはいけないんでしょうかね?

それにANTARESさん本人が仰った、
>問題は、窓口さんがGENKIさんのスクリプトを理解していなかったことにあります。
は既に解決されているのでは?窓口さんも「以後気をつけます。」と仰っていることですし。

今回の件もそうですが、大したことでもないのに
いちいち突っかかって面倒なことにするのはやめませんかね?
少なくともこういう流れになるのを快く思う人は居ないと思うんですが。



ぼおん

リンク

2010/3/6(Sat) 08:50:03|NO.31039

・整数の割り算は端数を切り捨てるというHSPの仕様を利用している
という点が共通なだけで、GENKI様と窓口様のスクリプトは同じアルゴリズムではないんじゃないでしょうか。

抽出元の数値が負の場合、結果が異なる気がします(今実行環境が無いので試せませんが)



shinkun

リンク

2010/3/6(Sat) 09:59:24|NO.31041

通りすがりさん、一連のやり取りを見てご気分を悪くされた方、申し訳ありません。
ですが、どうしても言っておきたい事があるので、これを最後に言わせてください。

ANTARES さんは、窓口さんが GENKI さんのスクリプトを理解していなかったと述べていますが、ANTARES さんがレスをした時点において、理解していた可能性は全く考えられなかったのでしょうか?
私はどちらとも言えないと思ったので、あのように端から決め付けての批判は行き過ぎだと感じました。

理解していなかったと言い切るのなら、少なくともその根拠を具体的に書いておくべきだったと思います。
汎用性を指摘されていますが、両者のスクリプトにどのような汎用性の違いがあるのかは全く示されてありません。
これがあれば、ANTARES さんのレスは単なる補足と受け取れたと思います(WOM は除いたとして。)が、これが無い為に、汎用性の違いの分からない私にとっては、「他人のレスを読んで下さい」という意味以外に「レベルが下がるようなレスは不要です」という悪意を感じられました。
(ちなみに、この「不要」が私のレスにおける「無価値」で言い表したかった事です。確かにこの言葉には「不要」とは異なるニュアンスが含まれているので、用いるべきではありませんでした。すみません。)
こういう捉え方をする人もいるという事で、今後注意してもらえたらと思います。

今度は私の非を。
窓口さんの謝罪の後のタイミングで批判的なレスをしてあるのは、私がレスを書き始めた時点では窓口さんの謝罪のレスはまだなく、投稿時に最新の状況を確認せず投稿したまま、それに気付いた時には既に私の発言に対するレスが返っていた為消すに消せない状態になっていたからです。今となっては都合の良い言い訳にしかなりませんね。すみませんでした。
今後は投稿時に最新の状況を確認する事、用いる言葉の意味を慎重に考えてレスして行こうと思います。

蛇足
>>powf 関数をたった 1 個付け足すだけで解消されます。
> だから、窓口さんの記事に価値があるというのは、論理がおかしい。
ひとつの段落がスクリプトで分断されたので分かりづらかったのでしょうか?
そこは単なる導入部分で、結論として最後に「より良いコードを書くヒントとなった」からと書いているのですけれど…。

解決済みの、しかも問題とは全く無関係の所でのスレ汚し、大変失礼しました。



GENKI

リンク

2010/3/6(Sat) 12:18:09|NO.31047

いつの間にか知らないところで名前が連呼されている!w
まあいいか。


>>窓口さん(No.30954)

「割り算」と「余り」の発想はなかった。目からうろこです。

文字列から抽出、小数の切捨て、…でうちどめかな。私ではもうこれ以上思いつかないです。


> 抽出元の数値が負の場合、結果が異なる気がします(今実行環境が無いので試せませんが)

窓口さんのも私のも「-123450」で3桁目を抽出したら「-4」を返しました。orz
ということで、改良版。といってもabs使っただけですが。w

a=-123450 ;数値指定 b=3 ;桁指定 c = abs( a/powf(10,(b-1)) - a/powf(10,b)*10 ) mes c




それにしても少し脱線が過ぎますね。シエンすみません。



シエン

リンク

2010/3/9(Tue) 00:50:13|NO.31117

うっ これは・・・。

解決済みにレスがつくと思っていなかったのと、
掲示板に来るのは検索か質問のある時だけだったので気づきませんでした・・・
自分の質問が端を発しておいてなんですが、掲示板が気持ちよく使えるよう
自分も気をつけていこうと思います。

お礼が遅れまして、すいません。

窓口さん、ご回答ありがとうございました。
GENKIさんも、改良版ありがとうございます。さっそく使わせていただきます。



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