-
Notifications
You must be signed in to change notification settings - Fork 14.2k
code: update zig 0.14.1 for the chapter of array_and_linkedlist and computational_complexity #1787
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 2 commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,4 @@ | ||
zig-out/ | ||
zig-cache/ | ||
zig-out | ||
zig-cache | ||
.zig-cache | ||
!/.vscode/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
{ | ||
"version": "0.2.0", | ||
"configurations": [ | ||
{ | ||
"name": "Debug", | ||
"type": "lldb", | ||
"request": "launch", | ||
"program": "${workspaceFolder}/zig-out/bin/${fileBasenameNoExtension}", | ||
"args": [], | ||
"cwd": "${workspaceFolder}", | ||
"preLaunchTask": "build" | ||
} | ||
] | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"zig.testArgs": ["build", "test", "-Dtest-filter=${filter}"] | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
{ | ||
"version": "2.0.0", | ||
"tasks": [ | ||
{ | ||
"label": "build", | ||
"type": "shell", | ||
"command": "zig build", | ||
} | ||
] | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
# 如何运行代码 | ||
|
||
支持丰富的调试和运行方式,让你随心所欲 | ||
|
||
## 命令行运行 | ||
|
||
```sh | ||
zig build run_array # zig build run_{file} | ||
``` | ||
|
||
```sh | ||
zig build test # 运行所有的算法代码 | ||
``` | ||
|
||
```sh | ||
zig build test -Dtest-filter="basic array" # 过滤运行某个代码 | ||
``` | ||
|
||
## vscode 运行 | ||
CreatorMetaSky marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
**运行单个代码** | ||
|
||
- 直接点击 vscode 每个测试上的绿色对勾即可运行 | ||
- 直接点击 F5 也可以运行只不过是在 Debug 模式下 | ||
|
||
**调试单个代码** | ||
|
||
- 打开单个 zig 文件 | ||
- 在需要的代码上打断点 | ||
- 直接点击 F5 运行 |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
.{ | ||
// This is the default name used by packages depending on this one. For | ||
// example, when a user runs `zig fetch --save <url>`, this field is used | ||
// as the key in the `dependencies` table. Although the user can choose a | ||
// different name, most users will stick with this provided value. | ||
// | ||
// It is redundant to include "zig" in this name because it is already | ||
// within the Zig package namespace. | ||
.name = .zig, | ||
|
||
// This is a [Semantic Version](https://semver.org/). | ||
// In a future version of Zig it will be used for package deduplication. | ||
.version = "0.0.0", | ||
|
||
// Together with name, this represents a globally unique package | ||
// identifier. This field is generated by the Zig toolchain when the | ||
// package is first created, and then *never changes*. This allows | ||
// unambiguous detection of one package being an updated version of | ||
// another. | ||
// | ||
// When forking a Zig project, this id should be regenerated (delete the | ||
CreatorMetaSky marked this conversation as resolved.
Show resolved
Hide resolved
|
||
// field and run `zig build`) if the upstream project is still maintained. | ||
// Otherwise, the fork is *hostile*, attempting to take control over the | ||
// original project's identity. Thus it is recommended to leave the comment | ||
// on the following line intact, so that it shows up in code reviews that | ||
// modify the field. | ||
.fingerprint = 0xc1ce1081de8293fc, // Changing this has security and trust implications. | ||
|
||
// Tracks the earliest Zig version that the package considers to be a | ||
// supported use case. | ||
.minimum_zig_version = "0.14.1", | ||
|
||
// This field is optional. | ||
// Each dependency must either provide a `url` and `hash`, or a `path`. | ||
// `zig build --fetch` can be used to fetch all dependencies of a package, recursively. | ||
// Once all dependencies are fetched, `zig build` no longer requires | ||
// internet connectivity. | ||
.dependencies = .{ | ||
// See `zig fetch --save <url>` for a command-line interface for adding dependencies. | ||
//.example = .{ | ||
// // When updating this field to a new URL, be sure to delete the corresponding | ||
// // `hash`, otherwise you are communicating that you expect to find the old hash at | ||
// // the new URL. If the contents of a URL change this will result in a hash mismatch | ||
// // which will prevent zig from using it. | ||
// .url = "https://example.com/foo.tar.gz", | ||
// | ||
// // This is computed from the file contents of the directory of files that is | ||
// // obtained after fetching `url` and applying the inclusion rules given by | ||
// // `paths`. | ||
// // | ||
// // This field is the source of truth; packages do not come from a `url`; they | ||
// // come from a `hash`. `url` is just one of many possible mirrors for how to | ||
// // obtain a package matching this `hash`. | ||
// // | ||
// // Uses the [multihash](https://multiformats.io/multihash/) format. | ||
// .hash = "...", | ||
// | ||
// // When this is provided, the package is found in a directory relative to the | ||
// // build root. In this case the package's hash is irrelevant and therefore not | ||
// // computed. This field and `url` are mutually exclusive. | ||
// .path = "foo", | ||
// | ||
// // When this is set to `true`, a package is declared to be lazily | ||
// // fetched. This makes the dependency only get fetched if it is | ||
// // actually used. | ||
// .lazy = false, | ||
//}, | ||
}, | ||
|
||
// Specifies the set of files and directories that are included in this package. | ||
// Only files and directories listed here are included in the `hash` that | ||
// is computed for this package. Only files listed here will remain on disk | ||
// when using the zig package manager. As a rule of thumb, one should list | ||
// files required for compilation plus any license(s). | ||
// Paths are relative to the build root. Use the empty string (`""`) to refer to | ||
// the build root itself. | ||
// A directory listed here means that all files within, recursively, are included. | ||
.paths = .{ | ||
"build.zig", | ||
"build.zig.zon", | ||
"src", | ||
// For example... | ||
//"LICENSE", | ||
//"README.md", | ||
}, | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,26 +1,32 @@ | ||
// File: array.zig | ||
// Created Time: 2023-01-07 | ||
// Author: codingonion ([email protected]) | ||
// Author: codingonion ([email protected]), CreatorMetaSky ([email protected]) | ||
|
||
const std = @import("std"); | ||
const inc = @import("include"); | ||
// const utils = @import("utils"); | ||
const utils = if (@import("builtin").is_test) | ||
@import("../utils/utils.zig") | ||
else | ||
@import("utils"); | ||
|
||
// 随机访问元素 | ||
pub fn randomAccess(nums: []i32) i32 { | ||
pub fn randomAccess(nums: []const i32) i32 { | ||
// 在区间 [0, nums.len) 中随机抽取一个整数 | ||
var randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len); | ||
const randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len); | ||
CreatorMetaSky marked this conversation as resolved.
Show resolved
Hide resolved
|
||
// 获取并返回随机元素 | ||
var randomNum = nums[randomIndex]; | ||
const randomNum = nums[randomIndex]; | ||
return randomNum; | ||
} | ||
|
||
// 扩展数组长度 | ||
pub fn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 { | ||
pub fn extend(allocator: std.mem.Allocator, nums: []const i32, enlarge: usize) ![]i32 { | ||
// 初始化一个扩展长度后的数组 | ||
var res = try mem_allocator.alloc(i32, nums.len + enlarge); | ||
const res = try allocator.alloc(i32, nums.len + enlarge); | ||
@memset(res, 0); | ||
|
||
// 将原数组中的所有元素复制到新数组 | ||
std.mem.copy(i32, res, nums); | ||
std.mem.copyForwards(i32, res, nums); | ||
|
||
// 返回扩展后的新数组 | ||
return res; | ||
} | ||
|
@@ -46,18 +52,26 @@ pub fn remove(nums: []i32, index: usize) void { | |
} | ||
|
||
// 遍历数组 | ||
pub fn traverse(nums: []i32) void { | ||
pub fn traverse(nums: []const i32) void { | ||
var count: i32 = 0; | ||
|
||
// 通过索引遍历数组 | ||
var i: i32 = 0; | ||
var i: usize = 0; | ||
while (i < nums.len) : (i += 1) { | ||
count += nums[i]; | ||
} | ||
count = 0; | ||
|
||
// 直接遍历数组元素 | ||
count = 0; | ||
for (nums) |num| { | ||
count += num; | ||
} | ||
|
||
// 同时遍历数据索引和元素 | ||
for (nums, 0..) |num, index| { | ||
count += nums[index]; | ||
count += num; | ||
} | ||
} | ||
|
||
// 在数组中查找指定元素 | ||
|
@@ -69,49 +83,51 @@ pub fn find(nums: []i32, target: i32) i32 { | |
} | ||
|
||
// Driver Code | ||
pub fn main() !void { | ||
// 初始化内存分配器 | ||
var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); | ||
defer mem_arena.deinit(); | ||
const mem_allocator = mem_arena.allocator(); | ||
|
||
pub fn run() !void { | ||
// 初始化数组 | ||
var arr = [_]i32{0} ** 5; | ||
std.debug.print("数组 arr = ", .{}); | ||
inc.PrintUtil.printArray(i32, &arr); | ||
const arr = [_]i32{0} ** 5; | ||
std.debug.print("数组 arr = {}\n", .{utils.fmt.slice(&arr)}); | ||
|
||
// 数组切片 | ||
var array = [_]i32{ 1, 3, 2, 5, 4 }; | ||
var known_at_runtime_zero: usize = 0; | ||
var nums = array[known_at_runtime_zero..]; | ||
std.debug.print("\n数组 nums = ", .{}); | ||
inc.PrintUtil.printArray(i32, nums); | ||
_ = &known_at_runtime_zero; | ||
var nums = array[known_at_runtime_zero..array.len]; // 通过 known_at_runtime_zero 运行时变量将指针变切片 | ||
std.debug.print("数组 nums = {}\n", .{utils.fmt.slice(nums)}); | ||
|
||
// 随机访问 | ||
var randomNum = randomAccess(nums); | ||
std.debug.print("\n在 nums 中获取随机元素 {}", .{randomNum}); | ||
const randomNum = randomAccess(nums); | ||
std.debug.print("在 nums 中获取随机元素 {}\n", .{randomNum}); | ||
|
||
// 初始化内存分配器 | ||
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); | ||
defer arena.deinit(); | ||
const allocator = arena.allocator(); | ||
|
||
// 长度扩展 | ||
nums = try extend(mem_allocator, nums, 3); | ||
std.debug.print("\n将数组长度扩展至 8 ,得到 nums = ", .{}); | ||
inc.PrintUtil.printArray(i32, nums); | ||
nums = try extend(allocator, nums, 3); | ||
std.debug.print("将数组长度扩展至 8 ,得到 nums = {}\n", .{utils.fmt.slice(nums)}); | ||
|
||
// 插入元素 | ||
insert(nums, 6, 3); | ||
std.debug.print("\n在索引 3 处插入数字 6 ,得到 nums = ", .{}); | ||
inc.PrintUtil.printArray(i32, nums); | ||
std.debug.print("在索引 3 处插入数字 6 ,得到 nums = {}\n", .{utils.fmt.slice(nums)}); | ||
|
||
// 删除元素 | ||
remove(nums, 2); | ||
std.debug.print("\n删除索引 2 处的元素,得到 nums = ", .{}); | ||
inc.PrintUtil.printArray(i32, nums); | ||
std.debug.print("删除索引 2 处的元素,得到 nums = {}\n", .{utils.fmt.slice(nums)}); | ||
|
||
// 遍历数组 | ||
traverse(nums); | ||
|
||
// 查找元素 | ||
var index = find(nums, 3); | ||
std.debug.print("\n在 nums 中查找元素 3 ,得到索引 = {}\n", .{index}); | ||
const index = find(nums, 3); | ||
std.debug.print("在 nums 中查找元素 3 ,得到索引 = {}\n", .{index}); | ||
} | ||
|
||
_ = try std.io.getStdIn().reader().readByte(); | ||
pub fn main() !void { // todo: - debug it | ||
CreatorMetaSky marked this conversation as resolved.
Show resolved
Hide resolved
|
||
try run(); | ||
} | ||
|
||
test "basic array" { // todo: - 精确匹配 | ||
CreatorMetaSky marked this conversation as resolved.
Show resolved
Hide resolved
|
||
try run(); | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.