gpt4 book ai didi

javascript - 2 维有序数

转载 作者:行者123 更新时间:2023-12-03 10:36:58 25 4
gpt4 key购买 nike

我有一个问题,对您来说可能很简单,但我不知道如何使用简单而强大的解决方案来解决它。

所以,让我们假设我们有一个像这样的数字矩形:

154784587
251436258
748541254
965874584
521414174

我如何抓取它以找到水平或垂直方向上 3 的倍数(例如)?我考虑过将其转换为二维数组:

var arr = [
[1,5,4,7,8,4,5,8,7],
...
]

然后双循环进入其中(水平和垂直)。但这听起来很困惑,你知道我如何以干净简单的方式实现这一目标吗?

最佳答案

要求

根据您的评论,这就是我的理解:

  • 查找水平和垂直方向上所有能被 3 整除的值
  • 所有值均包含所有数字的组合。例如,如果一行包含 9 个项目,则必须考虑所有个位数、两位数、三位数……9 位数字的值。

假设

我假设输入值是一个字符串,并且可以使用 mapreducefilter 方法。

输入

var stream = "154784587251436258748541254965874584521414174";
var columns = 9;

助手

需要三个助手:

  • 根据字符串输入将值分组在一起。
  • 从字符串中返回一个字符。
  • 创建一个谓词来测试可被 3 整除的值。
  • 用于将字符串解析为整数并提取所有可整除的值。

其中一些函数看起来很简单,但这样做是为了增强代码的可读性:

function groupChars(stringValue, numberOfCharacters) {
var regex = new RegExp(".{1," + numberOfCharacters + "}", "g");
return stringValue.match(regex);
}

function getNthCharacter(stringValue, index) {
return stringValue[index];
}

function isDivisibleBy(divisor) {
return function(value) {
return value % divisor === 0;
}
}

function getValuesDivisibleBy(stringValues, divisor) {
return stringValues.map(function(item) {
return parseInt(item, 10);
}).filter(isDivisibleBy(3));
}

矩形数据生成

使用这些助手,通过按列数将字符分组来捕获行(或水平)数据。给定一组行,然后可以提取列(或垂直)数据。

function getRowData(stream, columns) {
return groupChars(stream, columns);
}

function getColumnData(rowData, columns) {
var columnData = [];
for (var i = 0; i < columns; i++) {
columnData.push(rowData.map(function(row) {
return row[i]
}).join(''));
}
return columnData;
}

创建水平和垂直值的平面数组

然后通过首先提取行然后提取列来从流中提取值。这生成了一个表示行和列值的字符串数组。

function getBoxedData(stream, columns) {
var data = {};
data.rows = getRowData(stream, columns);
data.columns = getColumnData(data.rows, columns);
return data.rows.concat(data.columns);
}

减少数据集

最终处理是通过获取每个字符串并根据列数将其解析为数字或数字组来完成的。需要一个循环将值分组为一位数、两位数和最多 n 位值。每个值都被解析为整数,然后验证它是否能被 3 整除。

var set = getBoxedData(stream, columns);

var results = set.reduce(function(result, item) {
for(var i = 0; i < item.length;) {
var values = groupChars(item, ++i);
var valuesByDivisibleThree = getValuesDivisibleBy(values, 3);
result.push.apply(result, valuesByDivisibleThree);
}
return result;
}, []);

最终结果:

您可以通过对最终结果应用过滤器来获取所有唯一值。

var stream = "154784587251436258748541254965874584521414174";
var columns = 9;

function groupChars(stringValue, numberOfCharacters) {
var regex = new RegExp(".{1," + numberOfCharacters + "}", "g");
return stringValue.match(regex);
}

function getNthCharacter(stringValue, index) {
return stringValue[index];
}

function isDivisibleBy(divisor) {
return function(value) {
return value % divisor === 0;
}
}

function getRowData(stream, columns) {
return groupChars(stream, columns);
}

function getColumnData(rowData, columns) {
var columnData = [];
for (var i = 0; i < columns; i++) {
columnData.push(rowData.map(function(row) {
return row[i]
}).join(''));
}
return columnData;
}


function getValuesDivisibleBy(stringValues, divisor) {
return stringValues.map(function(item) {
return parseInt(item, 10);
}).filter(isDivisibleBy(divisor));
}

function getBoxedData(stream, columns) {
var data = {};
data.rows = getRowData(stream, columns);
data.columns = getColumnData(data.rows, columns);
return data.rows.concat(data.columns);
}

var set = getBoxedData(stream, columns);

var results = set.reduce(function(result, item) {
for (var i = 0; i < item.length;) {
var values = groupChars(item, ++i);
var valuesByDivisibleThree = getValuesDivisibleBy(values, 3);
result.push.apply(result, valuesByDivisibleThree);
}
return result;
}, []);

console.log(results);
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

<小时/>

出于历史原因的原始答案:

使用二维数组

也许reducefilter会清理它?不需要循环...即使有循环在后台运行。

var dataset = [
[1, 5, 4, 7, 8, 4, 5, 8, 7],
[2, 5, 1, 4, 3, 6, 2, 5, 8],
[7, 4, 8, 5, 4, 1, 2, 5, 4],
[9, 6, 5, 8, 7, 4, 5, 8, 4],
[5, 2, 1, 4, 1, 4, 1, 7, 4]
];

function isDivisibleBy(divisor) {
return function(value) {
return value % divisor === 0;
}
}

var divisibleByThree = dataset.reduce(function(accumulator, row) {
return accumulator.concat(row.filter(isDivisibleBy(3)));
}, []);

console.log(divisibleByThree)
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

直接解析字符串

或者,您可以只解析字符串并使用正则表达式清理它。使用 mapfilter 也会提供相同的结果。如果您可以访问一维数组的数据,这将是相同的解决方案。

var stream = "154784587251436258748541254965874584521414174";
var data = stream.split(/(?!^)/);

function isDivisibleBy(divisor) {
return function(value) {
return value % divisor === 0;
}
}

var divisibleByThree = data.map(function(item) {
return parseInt(item, 10);
}).filter(isDivisibleBy(3));

console.log(divisibleByThree);
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

关于javascript - 2 维有序数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28945014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com