No.6ベストアンサー
- 回答日時:
こんなふうでしょうか。
<script>
/**
* HTML の <table> 系に出力する (1)
* 0000 から 9999 を作りたい (2)
* 1. 縦軸に各桁の同じ合計値を並べたい (3)
* 2. 桁に表示されている数値を最小値でまとめたい (4)
*/
// (2)
const array = new Array(10000).fill(0).map((_, i) => i.toString().padStart(4, '0'));
// (4)
const array2 = array.filter(v => {
const b = v.split('');
return !(b[0] > b[1] || b[1] > b[2] || b[2] > b[3]);
});
// (3)
const result = [];
array2.forEach(v => {
const sum = v.split('').reduce((p, c) => p * 1 + c * 1);
if(!result[sum]) {
result[sum] = [];
}
result[sum].push(v);
});
console.log(result);
// (4)
const table = document.createElement('table');
const tHead = table.createTHead();
const tBody = table.createTBody();
const headTr = tHead.insertRow(-1);
result.forEach((_, i) => {
headTr.appendChild(Object.assign(
document.createElement('th'),
{
textContent: i.toString().padStart(4, '0'),
style: 'border-bottom: thin solid #333;'
}
));
});
const rowLength = result.reduce((p, c) => Math.max(p, c.length), 0);
for (let i = 0; i < rowLength; i++){
const bodyTr = tBody.insertRow(-1);
result.forEach(v => {
const td = bodyTr.insertCell(-1);
td.textContent = v[i] ?? '';
});
}
document.body.appendChild(table);
</script>
No.5
- 回答日時:
No2です。
>縦のラインに、他の合計数のものが並んでいます。
>1 ラインに 1 つの合計値が望ましいです。
確認しましたが、同じ数しか並んでいませんね。
(そうなるようにしたはずなので、当然ですが・・)
<確認処理>
tbl.querySelectorAll('td').forEach( e => {
const t = e.textContent;
if(t.length > 3 ){
let s = t * 1;
while(s > 9) s = (s + '').split('').reduce((a, b) => a*1 + b*1, 0);
e.textContent = t + `(${s})`;
}
});
桁の合計を1回しか行わないという意味なら、ご提示の例がミスディレクションなのか、普通では推測できない特殊なルールになっているものと想像します。
(こちらでは、どのようなルールなのか判断できません)
単純に1度しか各桁の加算を行わないという意味なら、分類の数(=列数)を n*9+1 にして、加算を1度だけ行うように修正すればそのような結果になります。
(37列からなる横長の表になります)
とはいえ、もともとのご質問が、
>Javascript だとどのようなプログラムになりますか ?
なので、似たものになっていれば、例示としては十分なのかなとも思いますけれど・・
No.4
- 回答日時:
#3です
訂正
B.forEach (a=> C[a.reduce (sum, 0) % 10].push (a.join``.padStart (4,0)));
今気づく、なんだか Fujillin さんと結果(最後の方)が違う
No.3
- 回答日時:
面白そうだったので。
sort を使わないので速いと思ふ。
短くしたので理解しやすいと思いますが、されることはないでしょう。
<!DOCTYPE html>
<title></title>
<meta charset="utf-8">
<style>
td { text-align: right; width: 6em;}
</style>
<body>
<table border="1" id="T"></table>
<script>
const
//配列を表に
ary2tbody=(a,b=document.createElement('tbody'))=>a.reduce((b,a)=>(a.reduce((c,d)=>(c.insertCell().append(d||''),c),b.insertRow()),b),b),
//配列の転置
transpose=a=>a[0].map((_,i)=>a.map(b=>b[i])),
//組み合わせ
mathematics=((f=(a=[],b=a.length)=>b==1?a.map(c=>[c]):a.flatMap((c,d)=>f(a.slice(d),b-1).map(d=>[c,...d])))=>f)(),
//加算
sum=(a,b)=>a+b;
const A = [1, 2, 3, 4, 5, 6, 7, 8, 9];//0は無視
const B = [[0], ...mathematics (A,1), ...mathematics (A,2), ...mathematics (A,3), ...mathematics (A,4)];//1-4桁の組み合わせ
const C = [...Array(10)].map (()=>[]);//配列の初期化
B.forEach (a=> C[i = a.reduce (sum, 0) % 10].push (a.join``.padStart (4,0)));//桁の合計をインデクスにして4桁の文字列を生成
ary2tbody (transpose(C), T);//転置して表にする
</script>
No.2
- 回答日時:
No1です。
無駄に変数を使ってたのと、誤記があったので訂正しておきます。
誤 : 結果は 0~9 の9列に~
正 : 結果は 0~9の10列に~
const n = 4; // 桁数
const pad = '0'.repeat(n);
const T = [...new Array(10)].map(e => new Object());
let i, mx = 0;
for(i = 0; i < Math.pow(10, n); i++){
const v = (pad + i).substr(-n).split('').sort().join('');
let s = v * 1;
while(s > 9) s = (s + '').split('').reduce((a, b) => a*1 + b*1, 0);
T[s][v] = 1;
}
T.forEach((e, i) => {
T[i] = Object.keys(e).sort();
mx = Math.max(mx, T[i].length);
});
const tbl = document.querySelector('body').appendChild(
document.createElement('table')).createTBody();
tbl.parentNode.border = 1;
for(i = 0; i < mx; i++){
const td = T.map( e => `<td>${e[i] || ' '}</td>`).join('');
tbl.insertAdjacentHTML('beforeend', `<tr>${td}</tr>`);
}
No.1
- 回答日時:
こんばんは
>例
>0010
>0019
>0028
普通に各桁を加算すると、1、10、10となって一致しませんけれど・・
一桁になるまで同じ操作を繰り返して、10→1 と評価するってことでしょうかね。
そう考えるなら、結果は 0~9 の9列に並べればよいということと解釈しました。
以下は、書きっぱなしのままなのであまり効率は良くないかもしれませんが、一応、結果は得られますので、ご参考までに。
const n = 4; // 桁数
const pad = '0'.repeat(n);
const R = [];
const T = [...new Array(10)].map(e => new Object());
let i, mx = 0;
for(i = 0; i < Math.pow(10, n); i++){
const v = (pad + i).substr(-n).split('').sort().join('');
let s = v * 1;
while(s > 9) s = (s + '').split('').reduce((a, b) => a*1 + b*1, 0);
T[s][v] = 1;
}
for(i = 0; i < T.length; i++){
R[i] = Object.keys(T[i]).sort();
mx = mx<R[i].length? R[i].length:mx;
}
const tbl = document.querySelector('body').appendChild(
document.createElement('table')).createTBody();
tbl.parentNode.border = 1;
for(i = 0; i < mx; i++){
const td = R.map( e => `<td>${e[i] || ''}</td>`).join('');
tbl.insertAdjacentHTML('beforeend', '<tr>' + td + '</tr>');
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseでコンソールのピン留め...
-
flush()とclose()について
-
POIでExcelに時刻(h:mm)の値を...
-
System.err. printlnとSystem.o...
-
1~100までの数字を表示し、か...
-
System.out.printlnの意味がよ...
-
getName()で取得したファイル名...
-
バイトスワップ
-
javaにおけるCSV出力時の文字コ...
-
大容量のテキストファイルの内...
-
javaのUDP受信プログラムについて
-
java
-
stderrとstdout
-
[JAVA]try 内の変数を外で!?
-
VBAで配列の計算
-
【Java8以降】csvファイルの複...
-
プログラミングの問題です。大...
-
Java配列でNullPointerExceptio...
-
オブジェクトの中のプロパティ...
-
JPanelの切り替えと再描画
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
-
Eclipseのコンソールを常に表示...
-
1~100までの数字を表示したい
-
StringBufferで改ページ処理を...
-
JavaScriptの変数をjavaのメソ...
-
Log4Jではログを改行できない?
-
javaにおけるCSV出力時の文字コ...
-
テキストエリアで改行する
-
switch分が機能しません。
-
Tomcatが無応答となる現象が起...
-
一定のスペースを空けて端を揃...
-
JAVAのServletで、画像表示につ...
-
バイトスワップ
-
InputStreamはreadが1回しかで...
おすすめ情報
縦のラインに、他の合計数のものが並んでいます。
1 ラインに 1 つの合計値が望ましいです。