console.log("hw7.js");
var ensure = function(condition) {
// 在条件不成立的时候, 输出 message
if(!condition) {
console.log('*** 测试失败 ')
}
else {
console.log("succeed!");
}
}
// 定义一个增强的 ensureEqual
var ensureEqual = function(a, b) {
if (a != b) {
console.log(`*** 测试失败, ${a} 不等于 ${b}`)
}
else {
console.log("succeed!");
}
}
function arrayEqual(a, b) {
if (a.length != b.length) return false;
for (let i = 0; i < a.length; i++) {
if (a[i] != b[i]) return false;
}
return true;
}
// 作业 1
// 实现函数
// 多看提示多讨论
/*
delimiter 是 string
array 是包含 string 的 array
把 array 中的元素用 delimiter 连接成一个字符串并返回
*/
function join(delimiter, array) {
let ans = '';
for (let i = 0; i < array.length - 1; i++) {
ans += ( array[i]+ delimiter)
}
ans += array[array.length - 1]
return ans;
}
function test_join() {
ensure(join('#', ['hello', 'gua']) == 'hello#gua')
ensure(join(' ', ['hello', 'gua']) == 'hello gua')
ensure(join('\n', ['multi', 'line', 'string']) == 'multi\nline\nstring')
}
// 作业 2
// 实现函数
/*
s 是 string
delimiter 是 string, 默认为空格 '
以 delimiter 为分隔符号, 返回一个 array
例如
split('1 2 3') 返回 ['1', '2', '3']
split('a=b&c=d', '&') 返回 ['a=b', 'c=d']
注意, 测试 array 是否相等得自己写一个函数用循环来
0123456789
'a=bc=def'
[0, 1, 4, s.length]
(0, 1)
(1, 4)
(4, s.length)
*/
function split(s, delimiter = ' ') {
let l = []
let space = delimiter.length
let start = 0
for(let i = 0; i < s.length; i++) {
if (s.slice(i, i + space) === delimiter) {
l.push(s.slice(start, i))
start = i + space
}
}
l.push(s.slice(start))
return l
}
function test_split() {
ensure(arrayEqual(split("abcdecfgc", 'c'), ['ab', 'de', 'fg', '']))
ensure(arrayEqual(split("abcdecfgc", 'b'), ['a', 'cdecfgc']))
ensure(arrayEqual(split("abcdacfgc", 'a'), ['', 'bcd', 'cfgc']))
}
// 作业 3
// 实现函数
/*
s old newString 都是 string
返回一个「将 s 中出现的所有 old 字符串替换为 new 字符串」的字符串
*/
function replaceAll(s, old, newString) {
let s1 = split(s, old)
let s2 = join(newString, s1)
return s2
}
// 作业 4
// 实现函数
/*
n 是 int
返回这样规律的字符串, 特殊情况不考虑
n 返回值
1 '1'
2 '121'
3 '12321'
1-n
(n-1)-1
*/
function str1(n) {
let s = ''
for (let i = 1; i <= n; i++) {
s += String(i)
}
for (let i = n - 1; i > 0; i--) {
s += String(i)
}
return s
}
// 作业 5
// 实现函数
/*
n 是 int
返回这样规律的字符串, 特殊情况不考虑
n 返回值
1 'A'
2 'ABA'
3 'ABCBA'
*/
// 用下标来取字符
function str2(n) {
//n <27
let upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
let s = ''
// 左边
for (let i = 0; i < n; i++) {
s += upper[i]
}
// 右边, 注意下标
for (let i = n - 2; i >= 0; i--) {
s += upper[i]
}
return s
}
// 作业 6
// 实现加法口诀表
//
function addLine(number) {
let s = ''
for (let i = 0; i < number; i++) {
let n = i + 1
s += `${number} + ${n} = ${number+n} `
}
return s
}
/*
返回这样格式的加法口诀表(没写全, 但是要返回完整的)
注意, 这只是我输入的内容
实际上你普通 log 出来是不会有回车的
[
'1 + 1 = 2',
'2 + 1 = 3 2 + 2 = 4',
'3 + 1 = 4 3 + 2 = 5 3 + 3 = 6',
]
*/
function addTable() {
var table = []
for (var i = 1; i <= 9; i++) {
var line = addLine(i)
table.push(line)
}
return join('\n', table)
}
// 作业 7
// 实现函数
/*
start end 都是 int
返回一个 array, 假设 start 为 1, end 为 5, 返回数据如下
[1, 2, 3, 4]
*/
function range1(start, end) {
let l = [];
for (let i = start; i < end; i++) {
l.push(i);
}
return l;
}
// 作业 8
// 实现函数
/*
start end step 都是数字
step 是大于 0 的正整数
返回一个 array
假设 start=1, end=5, step=1 返回数据如下
[1, 2, 3, 4]
假设 start=0, end=6, step=2 返回数据如下
[0, 2, 4]
*/
function range2(start, end, step=1) {
let l = [];
for (let i = start; i < end; i += step) {
l.push(i);
}
return l;
}
// 作业 9
// 实现函数
// start end step 都是数字
// 和 range2 一样, 但是要求支持负数 step
// 使用 while 循环
// 返回一个 array
// 假设 start=1, end=5, step=1 返回数据如下
// [1, 2, 3, 4]
// 假设 start=6, end=0, step=-1 返回数据如下
// [6, 5, 4, 3, 2, 1]
function range3(start, end, step=1) {
let l = [];
for (let i = start; step > 0? i < end : i > end; i += step) {
l.push(i);
}
return l;
}
// 作业 10
// 实现函数
/*
js 标准数学库有一个随机数函数
Math.random()
它返回 0 - 1 之间的小数
用它实现本函数, 返回 0 或 1
*/
// r 是一个 0 - 1 的小数
function random01() {
let a = Math.random()
return a > 0.5 ? 1 : 0;
}
// 作业 11
// 实现函数
/*
返回一个只包含了 0 1 的随机 array, 长度为 n
假设 n 为 5, 返回的数据格式如下(这是格式范例, 真实数据是随机的)
[0, 0, 1, 0, 1]
*/
function randomLine01(n) {
let l = [];
for (let i = 0; i < n; i++) {
l.push(random1())
}
return l;
}
// 作业 12
/*
返回以下格式的数据
假设 n 为 3, 返回的数据格式如下(这是格式范例, 真实数据是随机的)
注意, 这只是一个 array, 并不是它显示的样子
注意, 这是一个 array 不是 string
[
[0, 0, 1],
[1, 0, 1],
[0, 0, 0],
]
返回, 包含了 n 个『只包含 n 个「随机 0 1」的 array』的 array
*/
function randomSquare01(n) {
let l = [];
for (let i = 0; i < n; i++) {
l.push(randomLine1());
}
return l;
}
// 作业 13
/*
返回一个只包含了 0 9 的随机 array, 长度为 n
假设 n 为 5, 返回的数据格式如下(这是格式范例, 真实数据是随机的)
[0, 0, 9, 0, 9]
上上期有初学编程的同学用了一个很优雅的办法, 我就想不到
*/
// 额外的 2 种方法
// 1,取下标法
// var numbers = [0, 9, 7]
// var index = randomLine01(n)
// var n = numbers[index]
// 2,直接 * 9
// var n = random01() * 9
function randomLine09(n) {
let l = [];
for (let i = 0; i < n; i++) {
l.push(random01() * 9)
}
return l;
}
function randomSquare09(n) {
let l = [];
for (let i = 0; i < n; i++) {
l.push(randomLine09(n));
}
return l;
}
// 作业 14
// 更好的思路是把9左右两边的数字加一
/*
array 是一个只包含了 0 9 的 array
返回一个标记过的 array
** 注意, 使用一个新数组来存储结果, 不要直接修改老数组
复制数组用 array.slice(0) 实现
标记规则如下
对于下面这样的 array
[0, 0, 9, 0, 9]
标记后是这样
[0, 1, 9, 2, 9]
规则是, 0 会被设置为左右两边 9 的数量
*/
function markedLine(array) {
let a = array.slice(0);
for (let i = 0; i < a.length; i++) {
if (a[i] === 0) {
if (i > 0 && i < a.length - 1) {
if (a[i - 1] === 9 && a[i + 1] !== 9) {
a[i] = 1;
}
else if (a[i - 1] === 9 && a[i + 1] === 9) {
a[i] = 2;
}
else if (a[i - 1] !== 9 && a[i + 1] === 9) {
a[i] = 1;
}
}
else if (i == 0 && a[i + 1] === 9) {
a[i] = 1;
}
else if (i == a.length - 1 && a[i - 1] === 9) {
a[i] = 1;
}
}
}
return a;
}
// 作业 15
/*
array 是一个「包含了『只包含了 0 9 的 array』的 array」
返回一个标记过的 array
** 注意, 使用一个新数组来存储结果, 不要直接修改老数组
范例如下, 这是 array
[
[0, 9, 0, 0],
[0, 0, 9, 0],
[9, 0, 9, 0],
[0, 9, 0, 0],
]
这是标记后的结果
[
[1, 9, 2, 1],
[2, 4, 9, 2],
[9, 4, 9, 2],
[2, 9, 2, 1],
]
规则是, 0 会被设置为四周 8 个元素中 9 的数量
*/
function clonedSquare(array) {
let s = []
for (let i = 0; i < array.length; i++) {
let line = []
for (let j = 0; j < array[i].length; j++) {
line.push(array[i][j])
}
s.push(line)
}
return s
}
function markedSquare(array) {
let a = clonedSquare(array);
let x = [0, 1, -1];
let y = [0, 1, -1];
for (let i = 0; i < a.length; i++) {
for (let j = 0; j < a[i].length; j++) {
if (a[i][j] == 9) {
for (let x1 = 0; x1 < x.length; x1++) {
for (let y1 = 0; y1 < y.length; y1++) {
let m = i + x[x1];
let n = j + y[y1];
if (m >= 0 && n >= 0 && m < a.length && n < a[i].length && a[m][n] !== 9) {
a[m][n]++;
}
}
}
}
}
}
return a;
}
标签:function,return,++,js,length,let,hw7,array
From: https://www.cnblogs.com/echoT/p/17015100.html