投稿
おちゃめ ochame_nako
第2回プチコンコードゴルフを開催します。 今回のお題は「桁数を求めるプログラム」です。 数値変数Aに入っている値の整数部分が何桁かを表示してください。 例えばAの値が1の時は1桁なので「1」と表示、Aの値が10の時は2桁なので「2」と表示、Aの値が100の時は3桁なので「3」と表示します。 Aの値が9.9のように小数である場合は整数部分が9(1桁)であるため「1」と表示、-99のように負数である場合には符号を除いた99(2桁)を元に「2」となるように表示してください。 詳細ルールはコメントにて
7そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
今回は整数部分が16桁までの場合において正しく表示できればOKとします。(もちろん17桁以上に対応させてもOK) ただし、それまでの範囲内ではいかなる数値であっても正しく表示できるような工夫をしてください。 「0」は1桁の数と見なします。(条件判断をする際には0の場合を忘れないように注意) 変数Aは実数型と見なしてください。(Aの値が小数である場合も考慮する)
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
コードゴルフなので文字数の少なさを競うわけですが、文字数のカウント方法は第1回と同じです。(コロン、スペース、改行の無い方が有利) 余力のある人は変数Aが整数型の場合の最短プログラムも作ってみてください。 ネタ投稿も歓迎です。 初心者の方は文字数に拘らず指定されたような動作をするプログラムを作ってみてください。 実数型が難しければ整数型の場合のみでもいいですが、その場合は「整数型のみ」と記入しておいてください。(整数型の場合は9桁まで正しく動作すればOKです)
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
締め切りは明後日6月2日(火)の23時です。 1人で複数投稿は可能なのでより良いものが浮かんだら書き込んでもらって結構ですが、他の人のプログラムを見たあとでの投稿はできるだけ控えてください。 以下にネタバレで実数型の場合の私が作った最短プログラムを書いておきます。 できるだけ投稿前には見ないでください。 見た後でもこれより短いプログラムが書ける人がいればぜひ挑戦してみてください。 整数型の際の最短プログラムはまとめを行うときに書く予定ですがこれより10文字以上短縮可能です。
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
?LEN(FORMAT$("%.F",FLOOR(ABS(A)))) ヒント 計算で桁数を求める場合には計算誤差で正しい桁数が表示できない場合もあるので注意!(Aが1、10、100、1000、10000とキリが良い数字でも正常に表示されない可能性がある)
1そうだね
プレイ済み
返信[5]
親投稿
☆Tatsukin★ tatu_kin1192
ここまでできました。 まだまだできますけどね。
0そうだね
プレイ済み
返信[6]
親投稿
☆Tatsukin★ tatu_kin1192
この場合も大丈夫です。
0そうだね
プレイ済み
返信[7]
親投稿
☆Tatsukin★ tatu_kin1192
これです。
0そうだね
プレイ済み
返信[8]
親投稿
☆Tatsukin★ tatu_kin1192
すみません。訂正します。 これです。
0そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
書き忘れましたが投稿はネタバレ設定を行ってください
0そうだね
プレイ済み
返信[10]
親投稿
otta777 otta777a
整数化したのち0の場合はエラーにならないように例外処理をしてから常用対数を使って桁数を計算しました。
0そうだね
プレイ済み
返信[11]
親投稿
otta777 otta777a
あ~。プチコン3号はFORMAT$で文字列化できるのをすっかり 失念していました。これはシンプルですね。
0そうだね
プレイ済み
返信[12]
親投稿
無駄に長い気がしますが後学のために参加
0そうだね
プレイ済み
返信[13]
親投稿
Godot orz_127
締め切りのコメントがネタバレになっている気がします。 今回は、先にネタバレのところをみているので参加しませんが、普通に9文字は短くなりました。 10文字以上にするには捻りが必要と思いますが、そこまでは思いつきませんでした^^; ちなみに"%D"ではなく、"%.F"とした理由はなんでしょう? 普通にヘルプをみただけでは出てこない書式の気もします。 後で解説があると思うので、コメントつけさせて貰いました。
0そうだね
プレイ済み
返信[14]
親投稿
otta777 otta777a
自分の投稿プログラム、仕様を満たせていませんでした。 解決方法も見通しが立たないので残念ですがこれ以上 手を加えられません。
0そうだね
プレイ済み
返信[15]
親投稿
☆Tatsukin★ tatu_kin1192
おちゃめs»それならあなたが      僕の投稿をネタバレに      すればいいと思いますが…。
0そうだね
プレイ済み
返信[16]
親投稿
けい kei0baisoku
コメントアウトしてない回答2の方です。 誤差やら何やら出るかと思いましたが、自分が試した範囲では大丈夫そうでした。
0そうだね
プレイ済み
返信[17]
親投稿
pinfu ANNAININ
色々試した結果、コレでokっぽい!? が、しかし、よくわからん(笑) 試してるとき、overflowとか、明らかに違う数値をprintしたりしました・・・・ 解説期待のコメント残し!
0そうだね
プレイ済み
返信[18]
親投稿
ヨッシー okkun2002
うーむ、短くするとなると相当短いんだろーなーと思っていましたが、すごい短かった! 一応作りましたが、投稿前に答えを見てしまったので投稿しませんが コメのこし。
0そうだね
プレイ済み
返信[19]
親投稿
おちゃめ ochame_nako
途中報告ですが、現在回答をいただいている方の中で仕様を満たしているものは実数型が1名しか居ません。(整数型は回答者が現在0名) 文字数を考慮しなければ非常に簡単なのですが、文字数を減らそうとした場合には実は例外処理が非常に難しくなるためここで大ヒントを書いておきます。 実数型は少なくともA=-9.999999999999999(9が16個)の時に「1」、A=1000の時に「4」と表示されるようにしてください。 整数型は少なくともA=1000の時に「4」と表示されるようにしてください。 あともう1つは整数型の最短のためのヒントです。 私のネタバレコメントにある実数型の最短リストですが、実は整数型の最短リストを実数型に対応するように改造したものだと15桁までで良ければ実数型の最短をさらに4文字短縮が可能です。 もちろん私が想定してないさらに短い方法があるかもしれません。
0そうだね
プレイ済み
返信[20]
親投稿
おちゃめ ochame_nako
もちろん、すでに投稿されている方もこのヒントを見て修正版を再投稿してもOKです。 まだ投稿してない方、初心者の方もお気軽にご参加ください。
0そうだね
プレイ済み
返信[21]
親投稿
745Lll<3 amakoprg
常用対数の限界に挑戦 誤差大きすぎ その条件では、解法が狭まってしまうのではないでしょうか?
0そうだね
プレイ済み
返信[22]
親投稿
おちゃめ ochame_nako
745Lll<3さんへ 上記コメントの大ヒントは仕様を満たすコードを書くことができるようにするための苦渋の選択です。 知らなければA=1000の時に正しい桁数が表示できないとは思いもしないでしょう。 このヒントによっていかに例外処理を短く済ませるかというのが最短への焦点になってくると思いますが、FizzBuzzで!(I MOD 3)とすれば短く書けるというのが分かったからといって解法が限られるわけではなく無数のやり方があるのと同じことだと思います。
0そうだね
プレイ済み
返信[23]
親投稿
けい kei0baisoku
別解・FORMATより馴染みの深いアノ命令バージョン
0そうだね
プレイ済み
返信[24]
親投稿
けい kei0baisoku
なお私の、ネタじゃない方の回答ですが、あの後ふと気になって別のパターンを確認したら誤差でダメでした(^^; そこを対処しようとしたら、おちゃめさんの回答例より1文字長いだけの回答1しか思い付かないため、ほかの方の回答を見る前の仕様を満たした回答はナシとさせて頂こうと思います(´з`)
0そうだね
プレイ済み
返信[25]
親投稿
おちゃめ ochame_nako
すでに私の回答例を見た方も実数型ではなく整数型の最短にチャレンジしてみてください。 整数型の方は挑戦者が現時点で0名なので仕様を満たすコードを書いた時点で優勝です(あくまで最終的に他に誰も居ない場合に限られるけど)
0そうだね
プレイ済み
返信[26]
親投稿
けい kei0baisoku
というわけで、しゃあしゃあと整数型に参加(^^; コメントアウトしていない回答3です。 今度は、最短かどうかはともかく仕様は満たしてるはず…… そしてお約束のヒドイ別解は一番下のヤツです。 「家康解」とでもお呼び下さい←
0そうだね
プレイ済み
返信[27]
親投稿
さとし SatoshiMcCloud
たぶんこれが一番短いと思いますが、正解として認められるかは自信ないっす
1そうだね
プレイ済み
返信[28]
親投稿
ΖAiR-01 yutaro0515
ちょっと長いですが、これはどうでしょう
0そうだね
プレイ済み
返信[29]
親投稿
ΖAiR-01 yutaro0515
さっきの投稿に、-7も入れてください
0そうだね
プレイ済み
返信[30]
親投稿
☆Tatsukin★ tatu_kin1192
KETAではありませんが、 桁数を返す関数は作りました。 次のコメントで紹介します。
0そうだね
プレイ済み
返信[31]
親投稿
☆Tatsukin★ tatu_kin1192
ア KETA デシタ(後付けではない) でも、()で囲んではありませんので、 KETA(A)には未対応です。 KETA Aならできます。
0そうだね
プレイ済み