前回のカレンダーが
便利というわけではないが・・・
と思われてしまったので、実用的かもしれないお題で!
もちろんアルゴリズムは問いません。
○ 1111 千百十一
× 1111 一千一百一拾一
数列を漢数字表記に変換するコードを匠の技で見せてください!^^;
不可思議とかまでいっちゃってもOK!
<html>
<script>
alert(kansuji('12345678901234'));
function kansuji(num){
var k = ' 一 二 三 四 五 六 七 八 九'.split(' ');
var t = ' 十 百 千'.split(' ')
var u = ' 万 億 兆 京'.split(' ');
var m = num.length;
var r = '';
var c = 0;
var f = 0;
for(var i=0;i<m;i++){
n=num.substr(m-i-1,1);
if(c>3) {c=0;t[0]=u[++f];}
r=((c && n==1)?'':k[n])+t[c]+r;
c++;
}
return r;
}
</script>
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
こんにちは。
きりが悪いと、どうも気持ち悪いので・・・勝手に、以下のルールを作成してみました。
1)一万未満の千の位には、常に一は表示しない。
2)一万以上の4桁区切り内での千の位は、一千丁度のときだけ一を表示し、その他は表示しない。(1001万は「千一万」)
3)他の4桁の状態によらず、4桁ごとに3のルールを適用
( =とりあえず、「一千億千一万」は正とする。)
4桁の単位(万、億、兆・・・)は上から見ていったほうが便利だけれど、このルールだと一千の表示は下から見ていったほうがよさそうというので、一番複雑かなと考えてのことです。
んで、以下の通り。 いやぁ~、長くなっちゃいました。
付け足し的に処理したせいもあるけど・・・
function kansuji(n){
v=',一,二,三,四,五,六,七,八,九,*,,十,百,千,,万,億,兆,京,垓,jo,穣,溝,澗,正,載,極'.split(',');
for(i=0,r=p='',L=n.length;i<L;i++){d=L-i-1;m=d%4;
if(u=n.substr(i,1)*1){p+=v[(u>1)?u:((m>2&&d>3)?10:(m?0:1))]+v[m+11];}
if(!m){r+=p.replace('*',(p.length>2)?'':'一')+v[(p?(d-m)/4:0)+15];p='';}
} return r?r:'零';}
まぁ、しろうとの私のレベルではここまで、ということで・・・
楽しませていただきました。ありがとう。
いったいこれのどこが素人(しろうと)なんでしょうか?^^;
もうこれ以上短くできないのではないでしょうか?
正規表現を使い、後ろから4文字づつ取り・・・・
と思いましたが、この短さには収まりませんでした。
あぁ~雑用が多くて自分の考えるアルゴリズムを実現できないでいます
一般の人の質問に答えるほうが、簡単で楽なのですが・・
アルゴリズムを考えるには、静まり返った環境が必要ですね。
我が家はうるさい!
今回は、きちんとしたルールを最初に定義できませんでした。甘かった。>ひたすら反省です。
しめきりはもう少し伸ばします。
No.7
- 回答日時:
「一千万」は、ちょっと迷いもあったんだけど、最初の定義があったので、そのままつっ走ってみました。
でも、改めて言われてみると、そんな気がする。
そうすると、千に関しては一を表示するけれど、ただの1000の場合は千のみということになるのかな?
あと、「千五百十万」は「一千五百十万」か、「千五百十万」なのか?
(下の位に数字がある場合は、一が消えるのか?)
桁がもっと上がると例外とかでてくるのだろうか?
(普段あまり使わないのでわからない)
うぅ・・・日本語は難しいっ!!
(本日はこれまでです)
この回答への補足
マジ微妙ですね~
やっぱり1000の時は一をつけず。
それ以外の一千万とか一千億とかに一は付けますかね~。
過去に
http://oshiete1.goo.ne.jp/qa1156274.html
なのがありました。
回答も微妙。
今日は私も休みます!ありがとうございました!
明日、じっくり書いていただいたコードを見て勉強します
No.5
- 回答日時:
ふと気がついて確かめたら、余分なことやっとりました。
('111111'で自滅してました)
う~ん、やりだすと止らんなぁ・・・(だから困るんだ)
おかげで、何もしなくても少しだけ短くなった。
(前回投稿の秭は表示不能みたいなので「jo」に変えました)
function kansuji(n){
v=',一,二,三,四,五,六,七,八,九,,十,百,千,,万,億,兆,京,垓,jo,穣,溝,澗,正,載,極'.split(',');
for(i=0,r=p='',L=n.length;i<L;i++){d=L-i-1;m=d%4;
if(u=n.substr(i,1)*1){p+=v[(u>1)?u:((m)?0:1)]+v[m+10];}
if(!m){r+=p+v[(p?(d-m)/4:0)+14];p='';}
} return r?r:'零';}
No.4
- 回答日時:
#3です。
ちょっと時間がとれたのでとりあえず作ってみましたが・・・長いなぁ(私の技量ではこの程度まで)
4桁区切りの一を表示するかどうかは、その上の桁(4桁分)の数があるかないかによるので、対象数を頭から解釈していく方式にしました。(pipiさんと逆順)
式の評価の優先順序に自信がなくて()をつけてるところが一ヶ所あるけど、考え方を変えないと、あまり短くなりそうにないなぁ・・・
(一応、#2のチェックルーチンでは大丈夫みたいですが、限定チェックなので正しいかは不明。おまけで零付き。)
function kansuji(n){
v=',一,二,三,四,五,六,七,八,九,,十,百,千,,万,億,兆,京,垓,秭,穣,溝,澗,正,載,極'.split(',');
for(i=0,r=p='',L=n.length;i<L;i++){d=L-i-1;m=d%4;d=(d-m)/4;
if(u=n.substr(i,1)*1){p+=v[(u>1)?u:((m||(p&&d))?0:1)]+v[m+10];}
if(!m){r+=p+v[(p?d:0)+14];p='';}
} return r?r:'零';}
この回答への補足
ミスを指摘されて考えてました。
下からじゃ~だめみたいですね~
たしかに上から評価しないと・・・・
盛り上がってるのは二人だけ?
^^;
No.3
- 回答日時:
#1、#2です。
とりあえず、alert(kansuji('5000000'));でやると変ですよー!
ロジックがけっこう複雑になりそうな気がする。
あとで時間があったら、挑戦してみようかな・・・
この回答への補足
やっと事の難しさが見えてきた!やばいかも
<html>
<script>
alert(kansuji('5000000'));
function kansuji(num){
var k = ' 一 二 三 四 五 六 七 八 九'.split(' ');
var t = ' 十 百 千'.split(' ')
var u = ' 万 億 兆 京'.split(' ');
var m = num.length;
var r = '';
var c = 0;
var f = 0;
for(var i=0;i<m;i++){
n=num.substr(m-i-1,1);
if(c>3) {c=0;t[0]=u[++f];}
r=(((i==3||c==1||c==2)&&(n==1))? '':k[n]) + ((n==0&&c!=0)?'':t[c])+r;
c++;
}
r=r.replace(/京兆億万/,'京');
r=r.replace(/兆億万/,'兆');
r=r.replace(/億万/,'億');
return r;
}
</script>
No.2
- 回答日時:
おやおや? 今回はあまり反響がないみたいですねぇ。
移動中に頭の中で考えてたのですが、10001の時に「万一」の表示はおかしいので「一万一」ではないだろうか(万、億、兆の桁が1だけの時に限って1を表示)とか、0は零と表示するのかそもそも正の整数だけが対象なのか・・・
と思って、ごく簡単なチェックルーチンを先に作ってみました。
(各桁で0、5の数字を入れて、千兆まで試すという簡単なもの)
で、試してみると・・・ありゃっ?
0の処理はおいといても、なんだかおかしくありませんか?
短くし過ぎでは? (笑
test();
function test(){
var val=5;
var mes='<table border=1><tr>';
mes += set(0)+set(1);
for (var k=2; k<32; k++){
if (k%4==0){mes += '</tr><tr>';}
mes += set(val+1);
val *= (k%2)?5:2;
}
document.write(mes + '</tr></table>');
}
function set(number){
var nums = number + '';
var tmp = '';
for (var j=0; j<nums.length; j++){
tmp += nums.substr(j,1);
if (((nums.length-j-1)%4==0)&&(j<nums.length-1)){tmp += ',';}
}
return '<td>' + tmp + ' :<br>' + kansuji(nums) + '</td>';
}
<html>
<script>
alert(kansuji('10001'));
function kansuji(num){
var k = ' 一 二 三 四 五 六 七 八 九'.split(' ');
var t = ' 十 百 千'.split(' ')
var u = ' 万 億 兆 京'.split(' ');
var m = num.length;
var r = '';
var c = 0;
var f = 0;
for(var i=0;i<m;i++){
n=num.substr(m-i-1,1);
if(c>3) {c=0;t[0]=u[++f];}
r=((c && n==1)?'':k[n])+((n==0)?'':t[c])+r;
c++;
}
return r;
}
</script>
No.1
- 回答日時:
こんばんは。
回答ではないので申し訳けありませんが、おそらく、私の書いた『便利というわけではないが・・』をご覧になられたと推察いたしまして、言い訳をしに参りました。
pipi様の回答は、あちこちで読ませていただいて、学習させていただいております。
素人ながら、「なんとなく悲しい」質問の多いなかで、前回のご質問(挑戦!)には思わずにんまりする爽やかさを覚えました。
知的遊び心には、けっこうハマってしまうタイプなので、この手のものが、なかなかに面白いものであることは、門外漢の私でも容易に想像できます。
前回、思わず手が出そうになりましたが、こちらの環境もあり、次に見たのは締切の遥かに後でした。でも、結果を見た途端、「素人が手を出さなくてよかった」とホッとしたものでした。
ネットで拾い読みする程度の知識しか持ち合わせておりませんし、スクリプトを実際に利用することもほとんどないので、とても参加できる技量ではありませんが、いつの日か参加できる日がくることを望みつつ・・・ (う~む、きそうもないな。)
とはいうものの、一方で冷静に考えてみると、「必ずしも実用的ではない」のも事実ではなかろうかと思います。
決して、コードそのものが実用的でないという意味ではなく、極小にする努力の量に比してその効果の現実的な意味合いという観点からの話です。
否定的なつもりは全然ありませんし、むしろ、この一見無駄な(またまた失礼!)努力に智恵を絞り、あえて挑戦する人達の遊び心と、その結果の美しさ、また、それに感動できる心の持ち主達に乾杯! です。
この回答への補足
document.getElementsByTagName("iframe")[0].src=((flag*=-1)==1)? ad1: ad2;
だよね~
document.getElementsByTagName("iframe")[0].src=(flag=!flag)? ad1: ad2;
3文字減った! ^^;
まずは^^;です。怒ってもいなければ気にもしていませんよ!
しいていえば、あなたに与えられた10点が、あの極小スクリプトを書いた人に、行くべきだったと考えました^^;
>「なんとなく悲しい」
は、よくわかります。すべてに一から十まで答えていては
その人のためにならないのもわかります。
でも、論より証拠。百聞は一見にしかず!で、見てわかる人にわかればよい!でいます。
さて結論は、私もその乾杯に賛成です!大いに参加してくださいよ!
景品もでませんが・・・
で!さっそくですが
<html>
<script>
alert(kansuji('12345678901234'));
function kansuji(num){
var k=' 一 二 三 四 五 六 七 八 九'.split(' '),t=' 十 百 千 万 億 兆 京'.split(' '),r='',c=0,f=4;
for(var m=num.length;m;){n=num.substr(--m,1);if(c>3){c=0;t[0]=t[f++];}r=(c*n==c?'':k[n])+t[c++]+r}return r;
}
</script>
というところまで来ました!<おいっ!そっちかよ!という声があちこちで!^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- C言語・C++・C# C言語の質問です HTMLでこのようなコードを書いたのですがそれをC言語で同じように書きたいです < 1 2022/08/11 23:38
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript gasについて 1 2022/05/31 21:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
第3日曜日のみの日付を取得、...
-
javaScript textareaの一行あた...
-
択一形式のテストをつくりたいです
-
分岐処理(アルゴリズム)
-
特定のclassを表示、非表示にする
-
Javascript で可能でしょうか
-
APIを使って埋め込んだグーグル...
-
ASP.NETのコントロールの値をJa...
-
GoogleMap 住所から座標の取得
-
商品コードを入力で、商品名、...
-
javascriptにお詳しい方に質問...
-
アルファベットABCD…をスマート...
-
JavaScriptのindexedDBに格納し...
-
なぜmatchメソッドがエラーにな...
-
ホームページの最終更新日を他...
-
ページ最終行へジャンプする方法
-
GASでGoogleフォームの自動返信...
-
functionから別のfunctionを実...
-
javascriptで自動計算フォーム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
C#OpenCv V4にのエラーに関する...
-
メールフォームの日付入力フォ...
-
GASでundefinedエラーが出ます
-
ジェネレーターの作り方
-
GASでGoogleフォームの自動返信...
-
なぜmatchメソッドがエラーにな...
-
翌月を取得するGASが分かりません
-
ローカルにあるファイルを検索...
-
HTMLで作った時報アプリが動き...
-
ASP.NETのコントロールの値をJa...
-
C# 演算 奇数と偶数 表現の仕方
-
html javascript リンク先アド...
-
gas スプレッドシートがアクテ...
-
javascriptでテーブルに追加し...
-
VSCODE[Python]の設定について
-
JavaScriptで決まった「時刻」...
-
ASP.NET MVCでObjectをjsに渡す
-
イベントが初めの一回しか起き...
-
jqGridについて
おすすめ情報