• 締切済み

極小コードに挑戦!part2 数列を漢数字表記で!

前回のカレンダーが 便利というわけではないが・・・ と思われてしまったので、実用的かもしれないお題で! もちろんアルゴリズムは問いません。 ○ 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>

みんなの回答

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答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:'零';} まぁ、しろうとの私のレベルではここまで、ということで・・・ 楽しませていただきました。ありがとう。

noname#84373
質問者

お礼

いったいこれのどこが素人(しろうと)なんでしょうか?^^; もうこれ以上短くできないのではないでしょうか? 正規表現を使い、後ろから4文字づつ取り・・・・ と思いましたが、この短さには収まりませんでした。 あぁ~雑用が多くて自分の考えるアルゴリズムを実現できないでいます 一般の人の質問に答えるほうが、簡単で楽なのですが・・ アルゴリズムを考えるには、静まり返った環境が必要ですね。 我が家はうるさい! 今回は、きちんとしたルールを最初に定義できませんでした。甘かった。>ひたすら反省です。 しめきりはもう少し伸ばします。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.7

「一千万」は、ちょっと迷いもあったんだけど、最初の定義があったので、そのままつっ走ってみました。 でも、改めて言われてみると、そんな気がする。 そうすると、千に関しては一を表示するけれど、ただの1000の場合は千のみということになるのかな? あと、「千五百十万」は「一千五百十万」か、「千五百十万」なのか?  (下の位に数字がある場合は、一が消えるのか?) 桁がもっと上がると例外とかでてくるのだろうか?  (普段あまり使わないのでわからない) うぅ・・・日本語は難しいっ!! (本日はこれまでです)

noname#84373
質問者

補足

マジ微妙ですね~ やっぱり1000の時は一をつけず。 それ以外の一千万とか一千億とかに一は付けますかね~。 過去に http://oshiete1.goo.ne.jp/qa1156274.html なのがありました。 回答も微妙。 今日は私も休みます!ありがとうございました! 明日、じっくり書いていただいたコードを見て勉強します

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.6

ついでに・・・ そちらのロジックだと '10000001'あたりが怪しいですぞ・・・

noname#84373
質問者

補足

正しいものがわからなくなってきた! 10000001はIMEで漢字変換すると確かに「千万一」だけど 発音では一千万一と言わない?俺だけ? お金だったら、イッセンマンなんだけど?!

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答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:'零';}

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答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:'零';}

noname#84373
質問者

補足

ミスを指摘されて考えてました。 下からじゃ~だめみたいですね~ たしかに上から評価しないと・・・・ 盛り上がってるのは二人だけ? ^^;

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

#1、#2です。 とりあえず、alert(kansuji('5000000'));でやると変ですよー! ロジックがけっこう複雑になりそうな気がする。 あとで時間があったら、挑戦してみようかな・・・

noname#84373
質問者

補足

やっと事の難しさが見えてきた!やばいかも <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>

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答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>'; }

noname#84373
質問者

お礼

<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>

noname#84373
質問者

補足

やっと気づいていくれる人が出た~!^^; HTMLの板のほうが目に付いたかな~?

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

こんばんは。 回答ではないので申し訳けありませんが、おそらく、私の書いた『便利というわけではないが・・』をご覧になられたと推察いたしまして、言い訳をしに参りました。 pipi様の回答は、あちこちで読ませていただいて、学習させていただいております。 素人ながら、「なんとなく悲しい」質問の多いなかで、前回のご質問(挑戦!)には思わずにんまりする爽やかさを覚えました。 知的遊び心には、けっこうハマってしまうタイプなので、この手のものが、なかなかに面白いものであることは、門外漢の私でも容易に想像できます。 前回、思わず手が出そうになりましたが、こちらの環境もあり、次に見たのは締切の遥かに後でした。でも、結果を見た途端、「素人が手を出さなくてよかった」とホッとしたものでした。 ネットで拾い読みする程度の知識しか持ち合わせておりませんし、スクリプトを実際に利用することもほとんどないので、とても参加できる技量ではありませんが、いつの日か参加できる日がくることを望みつつ・・・   (う~む、きそうもないな。) とはいうものの、一方で冷静に考えてみると、「必ずしも実用的ではない」のも事実ではなかろうかと思います。 決して、コードそのものが実用的でないという意味ではなく、極小にする努力の量に比してその効果の現実的な意味合いという観点からの話です。 否定的なつもりは全然ありませんし、むしろ、この一見無駄な(またまた失礼!)努力に智恵を絞り、あえて挑戦する人達の遊び心と、その結果の美しさ、また、それに感動できる心の持ち主達に乾杯! です。

noname#84373
質問者

お礼

まずは^^;です。怒ってもいなければ気にもしていませんよ! しいていえば、あなたに与えられた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> というところまで来ました!<おいっ!そっちかよ!という声があちこちで!^^;

noname#84373
質問者

補足

document.getElementsByTagName("iframe")[0].src=((flag*=-1)==1)? ad1: ad2; だよね~ document.getElementsByTagName("iframe")[0].src=(flag=!flag)? ad1: ad2; 3文字減った! ^^;

関連するQ&A