Compare commits
3 Commits
acbded514c
...
60201ec28a
Author | SHA1 | Date |
---|---|---|
Bananymous | 60201ec28a | |
Bananymous | 7298e6ba5d | |
Bananymous | 773e92fece |
|
@ -106,6 +106,7 @@ namespace Kernel
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// In other revision superblock backups are on blocks 1 and powers of 3, 5 and 7
|
// In other revision superblock backups are on blocks 1 and powers of 3, 5 and 7
|
||||||
|
if (1 < number_of_block_groups)
|
||||||
TRY(m_superblock_backups.push_back(1));
|
TRY(m_superblock_backups.push_back(1));
|
||||||
for (uint32_t i = 3; i < number_of_block_groups; i *= 3)
|
for (uint32_t i = 3; i < number_of_block_groups; i *= 3)
|
||||||
TRY(m_superblock_backups.push_back(i));
|
TRY(m_superblock_backups.push_back(i));
|
||||||
|
@ -275,11 +276,10 @@ namespace Kernel
|
||||||
const uint32_t sector_size = m_block_device->blksize();
|
const uint32_t sector_size = m_block_device->blksize();
|
||||||
const uint32_t block_size = this->block_size();
|
const uint32_t block_size = this->block_size();
|
||||||
const uint32_t sectors_per_block = block_size / sector_size;
|
const uint32_t sectors_per_block = block_size / sector_size;
|
||||||
const uint32_t sectors_before = 2048 / sector_size;
|
|
||||||
|
|
||||||
ASSERT(block >= 2);
|
ASSERT(block >= superblock().first_data_block + 1);
|
||||||
ASSERT(buffer.size() >= block_size);
|
ASSERT(buffer.size() >= block_size);
|
||||||
MUST(m_block_device->read_blocks(sectors_before + (block - 2) * sectors_per_block, sectors_per_block, buffer.span()));
|
MUST(m_block_device->read_blocks(block * sectors_per_block, sectors_per_block, buffer.span()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ext2FS::write_block(uint32_t block, const BlockBufferWrapper& buffer)
|
void Ext2FS::write_block(uint32_t block, const BlockBufferWrapper& buffer)
|
||||||
|
@ -289,11 +289,10 @@ namespace Kernel
|
||||||
const uint32_t sector_size = m_block_device->blksize();
|
const uint32_t sector_size = m_block_device->blksize();
|
||||||
const uint32_t block_size = this->block_size();
|
const uint32_t block_size = this->block_size();
|
||||||
const uint32_t sectors_per_block = block_size / sector_size;
|
const uint32_t sectors_per_block = block_size / sector_size;
|
||||||
const uint32_t sectors_before = 2048 / sector_size;
|
|
||||||
|
|
||||||
ASSERT(block >= 2);
|
ASSERT(block >= superblock().first_data_block + 1);
|
||||||
ASSERT(buffer.size() >= block_size);
|
ASSERT(buffer.size() >= block_size);
|
||||||
MUST(m_block_device->write_blocks(sectors_before + (block - 2) * sectors_per_block, sectors_per_block, buffer.span()));
|
MUST(m_block_device->write_blocks(block * sectors_per_block, sectors_per_block, buffer.span()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ext2FS::sync_superblock()
|
void Ext2FS::sync_superblock()
|
||||||
|
@ -472,9 +471,8 @@ namespace Kernel
|
||||||
const uint32_t block_group_count = BAN::Math::div_round_up(superblock().inodes_count, superblock().inodes_per_group);
|
const uint32_t block_group_count = BAN::Math::div_round_up(superblock().inodes_count, superblock().inodes_per_group);
|
||||||
ASSERT(group_index < block_group_count);
|
ASSERT(group_index < block_group_count);
|
||||||
|
|
||||||
// Block Group Descriptor table is always after the superblock
|
// Block Group Descriptor table is in the block after superblock
|
||||||
// Superblock begins at byte 1024 and is exactly 1024 bytes wide
|
const uint32_t bgd_byte_offset = (superblock().first_data_block + 1) * block_size + sizeof(Ext2::BlockGroupDescriptor) * group_index;
|
||||||
const uint32_t bgd_byte_offset = 2048 + sizeof(Ext2::BlockGroupDescriptor) * group_index;
|
|
||||||
|
|
||||||
return
|
return
|
||||||
{
|
{
|
||||||
|
|
|
@ -47,6 +47,7 @@ add_library(libc ${LIBC_SOURCES})
|
||||||
add_dependencies(libc headers crtx-install)
|
add_dependencies(libc headers crtx-install)
|
||||||
|
|
||||||
target_compile_options(libc PRIVATE -g -Wstack-usage=512)
|
target_compile_options(libc PRIVATE -g -Wstack-usage=512)
|
||||||
|
target_compile_options(libc PUBLIC -Wall -Wextra -Werror -Wno-error=stack-usage=)
|
||||||
|
|
||||||
add_custom_target(libc-install
|
add_custom_target(libc-install
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/libc.a ${BANAN_LIB}/
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/libc.a ${BANAN_LIB}/
|
||||||
|
|
|
@ -104,7 +104,7 @@ struct passwd* getpwnam(const char* name)
|
||||||
{
|
{
|
||||||
passwd* pwd;
|
passwd* pwd;
|
||||||
setpwent();
|
setpwent();
|
||||||
while (pwd = getpwent())
|
while ((pwd = getpwent()))
|
||||||
if (strcmp(pwd->pw_name, name) == 0)
|
if (strcmp(pwd->pw_name, name) == 0)
|
||||||
return pwd;
|
return pwd;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -114,7 +114,7 @@ struct passwd* getpwuid(uid_t uid)
|
||||||
{
|
{
|
||||||
passwd* pwd;
|
passwd* pwd;
|
||||||
setpwent();
|
setpwent();
|
||||||
while (pwd = getpwent())
|
while ((pwd = getpwent()))
|
||||||
if (pwd->pw_uid == uid)
|
if (pwd->pw_uid == uid)
|
||||||
return pwd;
|
return pwd;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -13,7 +13,7 @@ struct FILE
|
||||||
bool eof { false };
|
bool eof { false };
|
||||||
bool error { false };
|
bool error { false };
|
||||||
|
|
||||||
unsigned char buffer[BUFSIZ];
|
unsigned char buffer[BUFSIZ] {};
|
||||||
uint32_t buffer_index { 0 };
|
uint32_t buffer_index { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -260,7 +260,7 @@ size_t fread(void* buffer, size_t size, size_t nitems, FILE* file)
|
||||||
|
|
||||||
while (nread < target)
|
while (nread < target)
|
||||||
{
|
{
|
||||||
size_t ret = syscall(SYS_READ, file->fd, (uint8_t*)buffer + nread, target - nread);
|
ssize_t ret = syscall(SYS_READ, file->fd, (uint8_t*)buffer + nread, target - nread);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
file->error = true;
|
file->error = true;
|
||||||
|
|
|
@ -87,7 +87,7 @@ sudo partprobe $LOOP_DEV
|
||||||
PARTITION1=${LOOP_DEV}p1
|
PARTITION1=${LOOP_DEV}p1
|
||||||
PARTITION2=${LOOP_DEV}p2
|
PARTITION2=${LOOP_DEV}p2
|
||||||
|
|
||||||
sudo mkfs.ext2 -b 1024 -q $PARTITION2
|
sudo mkfs.ext2 -q $PARTITION2
|
||||||
|
|
||||||
sudo mkdir -p $MOUNT_DIR || { echo "Failed to create banan mount dir."; exit 1; }
|
sudo mkdir -p $MOUNT_DIR || { echo "Failed to create banan mount dir."; exit 1; }
|
||||||
|
|
||||||
|
|
|
@ -600,7 +600,6 @@ int execute_piped_commands(BAN::Vector<BAN::Vector<BAN::String>>& commands)
|
||||||
int next_stdin = STDIN_FILENO;
|
int next_stdin = STDIN_FILENO;
|
||||||
for (size_t i = 0; i < commands.size(); i++)
|
for (size_t i = 0; i < commands.size(); i++)
|
||||||
{
|
{
|
||||||
bool first = (i == 0);
|
|
||||||
bool last = (i == commands.size() - 1);
|
bool last = (i == commands.size() - 1);
|
||||||
|
|
||||||
int pipefd[2] { -1, STDOUT_FILENO };
|
int pipefd[2] { -1, STDOUT_FILENO };
|
||||||
|
@ -831,7 +830,7 @@ int prompt_length()
|
||||||
void print_prompt()
|
void print_prompt()
|
||||||
{
|
{
|
||||||
auto prompt = get_prompt();
|
auto prompt = get_prompt();
|
||||||
fprintf(stdout, "%.*s", prompt.size(), prompt.data());
|
fprintf(stdout, "%.*s", (int)prompt.size(), prompt.data());
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ set(AOC2023_PROJECTS
|
||||||
day7
|
day7
|
||||||
day8
|
day8
|
||||||
day9
|
day9
|
||||||
|
day10
|
||||||
)
|
)
|
||||||
|
|
||||||
set(BANAN_AOC2023_BIN ${BANAN_BIN}/aoc2023)
|
set(BANAN_AOC2023_BIN ${BANAN_BIN}/aoc2023)
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
cmake_minimum_required(VERSION 3.26)
|
||||||
|
|
||||||
|
project(aoc2023_day10 CXX)
|
||||||
|
|
||||||
|
set(SOURCES
|
||||||
|
main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(aoc2023_day10 ${SOURCES})
|
||||||
|
target_compile_options(aoc2023_day10 PUBLIC -O2 -g)
|
||||||
|
target_link_libraries(aoc2023_day10 PUBLIC libc ban)
|
||||||
|
|
||||||
|
add_dependencies(aoc2023_day10 libc-install ban-install)
|
||||||
|
|
||||||
|
add_custom_target(aoc2023_day10-install
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day10 ${BANAN_AOC2023_BIN}/day10
|
||||||
|
DEPENDS aoc2023_day10
|
||||||
|
DEPENDS aoc2023_always
|
||||||
|
)
|
||||||
|
|
||||||
|
add_dependencies(aoc2023 aoc2023_day10)
|
||||||
|
add_dependencies(aoc2023-install aoc2023_day10-install)
|
|
@ -0,0 +1,279 @@
|
||||||
|
#include <BAN/Array.h>
|
||||||
|
#include <BAN/String.h>
|
||||||
|
#include <BAN/Vector.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
using i32 = int32_t;
|
||||||
|
using i64 = int64_t;
|
||||||
|
|
||||||
|
using u32 = uint32_t;
|
||||||
|
using u64 = uint64_t;
|
||||||
|
|
||||||
|
enum class Direction
|
||||||
|
{
|
||||||
|
North,
|
||||||
|
East,
|
||||||
|
South,
|
||||||
|
West
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Position
|
||||||
|
{
|
||||||
|
size_t x;
|
||||||
|
size_t y;
|
||||||
|
Direction from;
|
||||||
|
};
|
||||||
|
|
||||||
|
using Grid = BAN::Vector<BAN::Vector<u32>>;
|
||||||
|
|
||||||
|
Grid parse_grid(FILE* fp)
|
||||||
|
{
|
||||||
|
Grid grid;
|
||||||
|
char buffer[256];
|
||||||
|
while (fgets(buffer, sizeof(buffer), fp))
|
||||||
|
{
|
||||||
|
if (strlen(buffer) < 2)
|
||||||
|
continue;
|
||||||
|
MUST(grid.emplace_back(strlen(buffer) - 1));
|
||||||
|
for (size_t i = 0; buffer[i + 1]; i++)
|
||||||
|
grid.back()[i] = buffer[i];
|
||||||
|
}
|
||||||
|
return grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool can_enter_tile_from(char tile, Direction from)
|
||||||
|
{
|
||||||
|
switch (from)
|
||||||
|
{
|
||||||
|
case Direction::North:
|
||||||
|
return tile == '|' || tile == 'L' || tile == 'J';
|
||||||
|
case Direction::South:
|
||||||
|
return tile == '|' || tile == '7' || tile == 'F';
|
||||||
|
case Direction::West:
|
||||||
|
return tile == '-' || tile == 'J' || tile == '7';
|
||||||
|
case Direction::East:
|
||||||
|
return tile == '-' || tile == 'L' || tile == 'F';
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Direction tile_exit_direction(char tile, Direction enter)
|
||||||
|
{
|
||||||
|
switch (tile)
|
||||||
|
{
|
||||||
|
case '|': return (enter == Direction::North) ? Direction::South : Direction::North;
|
||||||
|
case '-': return (enter == Direction::East) ? Direction::West : Direction::East;
|
||||||
|
case 'L': return (enter == Direction::North) ? Direction::East : Direction::North;
|
||||||
|
case 'J': return (enter == Direction::North) ? Direction::West : Direction::North;
|
||||||
|
case '7': return (enter == Direction::South) ? Direction::West : Direction::South;
|
||||||
|
case 'F': return (enter == Direction::South) ? Direction::East : Direction::South;
|
||||||
|
}
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
};
|
||||||
|
|
||||||
|
BAN::Array<Position, 2> find_grid_first_moves(const Grid& grid)
|
||||||
|
{
|
||||||
|
BAN::Array<Position, 2> positions;
|
||||||
|
for (size_t y = 0; y < grid.size(); y++)
|
||||||
|
{
|
||||||
|
for (size_t x = 0; x < grid.size(); x++)
|
||||||
|
{
|
||||||
|
if (grid[y][x] == 'S')
|
||||||
|
{
|
||||||
|
size_t index = 0;
|
||||||
|
if (index < 2 && can_enter_tile_from(grid[y - 1][x], Direction::South))
|
||||||
|
positions[index++] = { x, y - 1, Direction::South };
|
||||||
|
if (index < 2 && can_enter_tile_from(grid[y + 1][x], Direction::North))
|
||||||
|
positions[index++] = { x, y + 1, Direction::North };
|
||||||
|
if (index < 2 && can_enter_tile_from(grid[y][x - 1], Direction::East))
|
||||||
|
positions[index++] = { x - 1, y, Direction::East };
|
||||||
|
if (index < 2 && can_enter_tile_from(grid[y][x + 1], Direction::West))
|
||||||
|
positions[index++] = { x + 1, y, Direction::West };
|
||||||
|
ASSERT(index == 2);
|
||||||
|
return positions;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
|
i64 puzzle1(FILE* fp)
|
||||||
|
{
|
||||||
|
auto grid = parse_grid(fp);
|
||||||
|
auto positions = find_grid_first_moves(grid);
|
||||||
|
|
||||||
|
for (i64 distance = 1;; distance++)
|
||||||
|
{
|
||||||
|
if (positions[0].x == positions[1].x && positions[0].y == positions[1].y)
|
||||||
|
return distance;
|
||||||
|
|
||||||
|
for (auto& position : positions)
|
||||||
|
{
|
||||||
|
Direction direction = tile_exit_direction(grid[position.y][position.x], position.from);
|
||||||
|
switch (direction)
|
||||||
|
{
|
||||||
|
case Direction::North: position.y--; position.from = Direction::South; break;
|
||||||
|
case Direction::South: position.y++; position.from = Direction::North; break;
|
||||||
|
case Direction::West: position.x--; position.from = Direction::East; break;
|
||||||
|
case Direction::East: position.x++; position.from = Direction::West; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i64 puzzle2(FILE* fp)
|
||||||
|
{
|
||||||
|
enum Flag : u32
|
||||||
|
{
|
||||||
|
Path = 1 << 8,
|
||||||
|
Left = 1 << 9,
|
||||||
|
Right = 1 << 10,
|
||||||
|
Mask = Path | Left | Right,
|
||||||
|
};
|
||||||
|
|
||||||
|
auto grid = parse_grid(fp);
|
||||||
|
auto position = find_grid_first_moves(grid)[0];
|
||||||
|
|
||||||
|
while ((grid[position.y][position.x] & ~Flag::Mask) != 'S')
|
||||||
|
{
|
||||||
|
Direction direction = tile_exit_direction(grid[position.y][position.x] & ~Flag::Mask, position.from);
|
||||||
|
|
||||||
|
switch (grid[position.y][position.x] & ~Flag::Mask)
|
||||||
|
{
|
||||||
|
case '|':
|
||||||
|
if (position.x > 0)
|
||||||
|
grid[position.y][position.x - 1] |= (direction == Direction::North) ? Flag::Left : Flag::Right;
|
||||||
|
if (position.x < grid[position.y].size() - 1)
|
||||||
|
grid[position.y][position.x + 1] |= (direction == Direction::North) ? Flag::Right : Flag::Left;
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
if (position.y > 0)
|
||||||
|
grid[position.y - 1][position.x] |= (direction == Direction::East) ? Flag::Left : Flag::Right;
|
||||||
|
if (position.y < grid.size() - 1)
|
||||||
|
grid[position.y + 1][position.x] |= (direction == Direction::East) ? Flag::Right : Flag::Left;
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
if (position.x > 0)
|
||||||
|
grid[position.y][position.x - 1] |= (direction == Direction::North) ? Flag::Left : Flag::Right;
|
||||||
|
if (position.y < grid.size() - 1)
|
||||||
|
grid[position.y + 1][position.x] |= (direction == Direction::North) ? Flag::Left : Flag::Right;
|
||||||
|
break;
|
||||||
|
case 'J':
|
||||||
|
if (position.x < grid[position.y].size() - 1)
|
||||||
|
grid[position.y][position.x + 1] |= (direction == Direction::West) ? Flag::Left : Flag::Right;
|
||||||
|
if (position.y < grid.size() - 1)
|
||||||
|
grid[position.y + 1][position.x] |= (direction == Direction::West) ? Flag::Left : Flag::Right;
|
||||||
|
break;
|
||||||
|
case '7':
|
||||||
|
if (position.y > 0)
|
||||||
|
grid[position.y - 1][position.x] |= (direction == Direction::South) ? Flag::Left : Flag::Right;
|
||||||
|
if (position.x < grid[position.y].size() - 1)
|
||||||
|
grid[position.y][position.x + 1] |= (direction == Direction::South) ? Flag::Left : Flag::Right;
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
if (position.y > 0)
|
||||||
|
grid[position.y - 1][position.x] |= (direction == Direction::East) ? Flag::Left : Flag::Right;
|
||||||
|
if (position.x > 0)
|
||||||
|
grid[position.y][position.x - 1] |= (direction == Direction::East) ? Flag::Left : Flag::Right;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
grid[position.y][position.x] |= Flag::Path;
|
||||||
|
|
||||||
|
switch (direction)
|
||||||
|
{
|
||||||
|
case Direction::North: position.y--; position.from = Direction::South; break;
|
||||||
|
case Direction::South: position.y++; position.from = Direction::North; break;
|
||||||
|
case Direction::West: position.x--; position.from = Direction::East; break;
|
||||||
|
case Direction::East: position.x++; position.from = Direction::West; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark start tile as part of the path
|
||||||
|
grid[position.y][position.x] |= Flag::Path;
|
||||||
|
|
||||||
|
// Clean up flags
|
||||||
|
for (auto& row : grid)
|
||||||
|
{
|
||||||
|
for (u32& tile : row)
|
||||||
|
{
|
||||||
|
// Remove left and right from path
|
||||||
|
if (tile & Flag::Path)
|
||||||
|
tile &= ~(Flag::Left | Flag::Right);
|
||||||
|
// Tile should never be both left and right
|
||||||
|
ASSERT(!((tile & Flag::Left) && (tile & Flag::Right)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine whether left or right is enclosed by loop
|
||||||
|
Flag enclosed = Flag::Path;
|
||||||
|
for (const auto& row : grid)
|
||||||
|
{
|
||||||
|
for (u32 tile : row)
|
||||||
|
{
|
||||||
|
if ((tile & (Flag::Right | Flag::Left)))
|
||||||
|
{
|
||||||
|
enclosed = (tile & Flag::Right) ? Flag::Left : Flag::Right;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (enclosed != Flag::Path)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ASSERT(enclosed != Flag::Path);
|
||||||
|
|
||||||
|
// Expand all enclosed areas
|
||||||
|
bool modified = true;
|
||||||
|
while (modified)
|
||||||
|
{
|
||||||
|
modified = false;
|
||||||
|
for (size_t y = 1; y < grid.size(); y++)
|
||||||
|
{
|
||||||
|
for (size_t x = 1; x < grid[y].size(); x++)
|
||||||
|
{
|
||||||
|
if (grid[y][x] & Flag::Mask)
|
||||||
|
continue;
|
||||||
|
if ((grid[y - 1][x] & enclosed) || (grid[y][x - 1] & enclosed))
|
||||||
|
{
|
||||||
|
grid[y][x] |= enclosed;
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate number of enclosed tiles
|
||||||
|
i64 result = 0;
|
||||||
|
for (const auto& row : grid)
|
||||||
|
for (u32 c : row)
|
||||||
|
result += !!(c & enclosed);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
const char* file_path = "/usr/share/aoc2023/day10_input.txt";
|
||||||
|
|
||||||
|
if (argc >= 2)
|
||||||
|
file_path = argv[1];
|
||||||
|
|
||||||
|
FILE* fp = fopen(file_path, "r");
|
||||||
|
if (fp == nullptr)
|
||||||
|
{
|
||||||
|
perror("fopen");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("puzzle1: %" PRId64 "\n", puzzle1(fp));
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
|
printf("puzzle2: %" PRId64 "\n", puzzle2(fp));
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
}
|
|
@ -64,7 +64,7 @@ int puzzle2(FILE* fp)
|
||||||
continue;
|
continue;
|
||||||
ptr += 5;
|
ptr += 5;
|
||||||
|
|
||||||
int id = parse_int_and_advance(ptr);
|
parse_int_and_advance(ptr);
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
|
|
||||||
int needed_red = 0;
|
int needed_red = 0;
|
||||||
|
|
|
@ -21,9 +21,9 @@ int puzzle1(FILE* fp)
|
||||||
|
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
for (ssize_t y = 0; y < lines.size(); y++)
|
for (size_t y = 0; y < lines.size(); y++)
|
||||||
{
|
{
|
||||||
for (ssize_t x = 0; x < lines[y].size(); x++)
|
for (size_t x = 0; x < lines[y].size(); x++)
|
||||||
{
|
{
|
||||||
if (!isdigit(lines[y][x]))
|
if (!isdigit(lines[y][x]))
|
||||||
continue;
|
continue;
|
||||||
|
@ -32,14 +32,14 @@ int puzzle1(FILE* fp)
|
||||||
|
|
||||||
for (ssize_t y_off = -1; y_off <= 1; y_off++)
|
for (ssize_t y_off = -1; y_off <= 1; y_off++)
|
||||||
{
|
{
|
||||||
if (y + y_off < 0)
|
if ((ssize_t)y < y_off)
|
||||||
continue;
|
continue;
|
||||||
if (y + y_off >= lines.size())
|
if (y + y_off >= lines.size())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
for (ssize_t x_off = -1;; x_off++)
|
for (ssize_t x_off = -1;; x_off++)
|
||||||
{
|
{
|
||||||
if (x + x_off < 0)
|
if ((ssize_t)x < x_off)
|
||||||
continue;
|
continue;
|
||||||
if (x + x_off >= lines[y + y_off].size())
|
if (x + x_off >= lines[y + y_off].size())
|
||||||
break;
|
break;
|
||||||
|
@ -94,9 +94,9 @@ int puzzle2(FILE* fp)
|
||||||
// Map numbers next to '*' to asterisk's coordinates.
|
// Map numbers next to '*' to asterisk's coordinates.
|
||||||
HashMap<uint32_t, Vector<int>> gears;
|
HashMap<uint32_t, Vector<int>> gears;
|
||||||
|
|
||||||
for (ssize_t y = 0; y < lines.size(); y++)
|
for (size_t y = 0; y < lines.size(); y++)
|
||||||
{
|
{
|
||||||
for (ssize_t x = 0; x < lines[y].size(); x++)
|
for (size_t x = 0; x < lines[y].size(); x++)
|
||||||
{
|
{
|
||||||
if (!isdigit(lines[y][x]))
|
if (!isdigit(lines[y][x]))
|
||||||
continue;
|
continue;
|
||||||
|
@ -111,14 +111,14 @@ int puzzle2(FILE* fp)
|
||||||
|
|
||||||
for (ssize_t y_off = -1; y_off <= 1; y_off++)
|
for (ssize_t y_off = -1; y_off <= 1; y_off++)
|
||||||
{
|
{
|
||||||
if (y + y_off < 0)
|
if ((ssize_t)y < y_off)
|
||||||
continue;
|
continue;
|
||||||
if (y + y_off >= lines.size())
|
if (y + y_off >= lines.size())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
for (ssize_t x_off = -1;; x_off++)
|
for (ssize_t x_off = -1;; x_off++)
|
||||||
{
|
{
|
||||||
if (x + x_off < 0)
|
if ((ssize_t)x < x_off)
|
||||||
continue;
|
continue;
|
||||||
if (x + x_off >= lines[y + y_off].size())
|
if (x + x_off >= lines[y + y_off].size())
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include <BAN/HashMap.h>
|
#include <BAN/HashMap.h>
|
||||||
#include <BAN/Vector.h>
|
#include <BAN/Vector.h>
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
using i64 = int64_t;
|
using i64 = int64_t;
|
||||||
|
@ -31,7 +32,7 @@ i64 puzzle1(FILE* fp)
|
||||||
line = line.substring(0, line.size() - 1);
|
line = line.substring(0, line.size() - 1);
|
||||||
|
|
||||||
auto seeds_str = MUST(line.split(' '));
|
auto seeds_str = MUST(line.split(' '));
|
||||||
for (i64 i = 1; i < seeds_str.size(); i++)
|
for (size_t i = 1; i < seeds_str.size(); i++)
|
||||||
MUST(current.emplace_back(parse_i64(seeds_str[i]), 0));
|
MUST(current.emplace_back(parse_i64(seeds_str[i]), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +93,7 @@ i64 puzzle2(FILE* fp)
|
||||||
BAN::StringView line(buffer);
|
BAN::StringView line(buffer);
|
||||||
line = line.substring(0, line.size() - 1);
|
line = line.substring(0, line.size() - 1);
|
||||||
auto seeds_str = MUST(line.split(' '));
|
auto seeds_str = MUST(line.split(' '));
|
||||||
for (i64 i = 1; i < seeds_str.size(); i += 2)
|
for (size_t i = 1; i < seeds_str.size(); i += 2)
|
||||||
MUST(current.emplace_back(parse_i64(seeds_str[i]), parse_i64(seeds_str[i + 1]), 0));
|
MUST(current.emplace_back(parse_i64(seeds_str[i]), parse_i64(seeds_str[i + 1]), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,11 +180,11 @@ int main(int argc, char** argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("puzzle1: %lld\n", puzzle1(fp));
|
printf("puzzle1: %" PRId64 "\n", puzzle1(fp));
|
||||||
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
printf("puzzle2: %lld\n", puzzle2(fp));
|
printf("puzzle2: %" PRId64 "\n", puzzle2(fp));
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include <BAN/Vector.h>
|
#include <BAN/Vector.h>
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
@ -112,11 +113,11 @@ int main(int argc, char** argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("puzzle1: %lld\n", puzzle1(fp));
|
printf("puzzle1: %" PRId64 "\n", puzzle1(fp));
|
||||||
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
printf("puzzle2: %lld\n", puzzle2(fp));
|
printf("puzzle1: %" PRId64 "\n", puzzle2(fp));
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <BAN/String.h>
|
#include <BAN/String.h>
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
@ -142,11 +143,11 @@ int main(int argc, char** argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("puzzle1: %lld\n", puzzle(fp, false));
|
printf("puzzle1: %" PRId64 "\n", puzzle(fp, false));
|
||||||
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
printf("puzzle2: %lld\n", puzzle(fp, true));
|
printf("puzzle2: %" PRId64 "\n", puzzle(fp, true));
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <BAN/String.h>
|
#include <BAN/String.h>
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
@ -121,11 +122,11 @@ int main(int argc, char** argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("puzzle1: %lld\n", puzzle1(fp));
|
printf("puzzle1: %" PRId64 "\n", puzzle1(fp));
|
||||||
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
printf("puzzle2: %lld\n", puzzle2(fp));
|
printf("puzzle2: %" PRId64 "\n", puzzle2(fp));
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <BAN/Vector.h>
|
#include <BAN/Vector.h>
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
@ -114,11 +115,11 @@ int main(int argc, char** argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("puzzle1: %lld\n", puzzle1(fp));
|
printf("puzzle1: %" PRId64 "\n", puzzle1(fp));
|
||||||
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
printf("puzzle2: %lld\n", puzzle2(fp));
|
printf("puzzle2: %" PRId64 "\n", puzzle2(fp));
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
F7---|FJ-L-|7-7F-7.F7|-|F-L7F7--7F---FJ7-F-F.FF.J---|77--7FF-7.-7-|.7FF-77F|77.|7-FF7FJFJ7-7FF77L77F7-F.|FFJ.-|-77.JFF-|J-|F|77F77.F7-F7-FF7
|
||||||
|
LF7J.L7J7LFJF.FL-|-|LL.L7LL7-|7JFL|FJ.|.7.LL7J--JJ.LL-J7|JF|FJ7.F7---7J-|F|J77..7FJJ||F-7|.LFJ-F7--F7-L.LFJF77|LJF7--7.L7LF7L-7L777JFJ|FFL7-
|
||||||
|
|J|.FL7F7.L-7-77.F.|..LFL.LJ-J-77.L-|-..F7LLJF|.F.FF--7FFF-JL7FF7J.|L-77L7L|.FFLLJ7.JFL-F77..FLJ||.LF7J7F.F7.F--FL77LJ7F|.J7L|L7LLF-7-F7FJ|L
|
||||||
|
|-JFJ--777.F|FLL-|-7-F-|JL.L7|7|L-J||.LFL7...FL7||LJ.F7|||F-7L-J|..77-JJ.|7JFL7J7FJ7|FJ7L77FF7JFJF-77J77L.L|LJJ-L7|L|J|F-7-J-FL--|LJ|-7L|LF.
|
||||||
|
L7.LF|JLJ---|-JL-J.J-F.F-JF|FJJL-J.F7J7|.J-F|7FJ-F-J7F77LLJ.|F--JJFLL7JL-JJ-LJ|FFL|-||.7J|JFJL7.LL7L-7F|-L.LJ..LFF7---JJJF7-7FFJFLJL|L-F--JL
|
||||||
|
|F-JLL--J|L|JL7L||F..L|J.|FL77L7|7-||7FJ.FLLJ|7|L|L|-7.7F|FFJL-7FL7|||F|L|J||FL-J7|-|LF77F7|F7|77FJF-J7J7-LJ|F---FJLLF.|.|JFJ7|JFJ-FJ..|L||.
|
||||||
|
FJ7|.FJ-||-7F||7LFL.L-JJ7F-J||LLJJ.L|7||F-.J-|FJ-|J|-F-77F7L7F7L7L|FFLF77L--F.LLJ-|7JFLJF||LJ||77L7|F777F-J-J|.J7L..L|F-|.F-LLL77J.L777|7LF-
|
||||||
|
|.F|7JJ7L|.||F-J-J.-J.|FLFJFLJ-|LF-.||77JFJJL-J7..F7-L7L7|L-J|L-JF-77J.F-7LJ|777..L--LLFFJL7FJL---J||L7F||L7.|7.JJ-|LJ-.J.|-|.|LJ.-FFLLL---.
|
||||||
|
F-FFF.J|F7--|7|FL7F-J7FFLJ|.|FFLFJLLF|J..|-FF|L-|-LF--JFJL--7L--7L7|FF7|FJ.F77F|.FL|7LFFJF7|L--7F--J|FJ-F7JFJL77F|-L7|J-FFJJ.LJ7...JL|LFL-F|
|
||||||
|
.FJ7L7.F|J|.|7J7JLJ7JF7|-FJ.7-F7L.FF|F777|.L7FF7.-.L-7FJF7F7|F--JL||FJ|||J|-L7|..7FL7--L-J|L--7||7F7|L7|||.|JF7F-7.L|F-FJJL-L7-|-F..-7-|JFLJ
|
||||||
|
7--.FL7-J7.F.--F7F-|7F7|FJFFJ-L|JF-F|J||FJ-LF7J|7.FF7|L7|LJ||L7F7J|||FJ|L-7LLJ-|.|7FFF7F-7L--7||L7|||FJFJ|F7FJ||FJ7.FJ-|F|..L--7F--F|JF7-F-7
|
||||||
|
LLJF-JL7|-7JF|F-J-7L-L7LJJ-F7J|.||FF7|L-7|-LJF77-F7|||FJL-7||FJ||FJLJL-JF7L7J.||FJLF7F7L7L-7FJ|L7||||L7|FJ||L7LJ|JF-J|FJ7F7-LL-JJ.F-JF|J7F-L
|
||||||
|
L-7L|.LJJ7LJJL7J-|LJF7J-||||F---7F-JL7.F7F7.FJ|JJ|LJ|||F--J|||FJ|L-7F7F-JL-JFF7F7-7||||-L-7|L7L7||||L7LJL-J|FJF-J7--F||FJJJ.7-|7LF|L-J.LL|F|
|
||||||
|
F7J-77.F-|JJ---77-.FF7LF7F|-L-7FJL7F-JFJLJL7|FJ|FL-7|||L--7LJLJFJF7||LJF7.LF-J|||-FJ||L---JL-JFJ|LJL7|F----JL7|LF7-F||F|77.---.-7FL7LL7|-L-7
|
||||||
|
F-J.L7-7LJF7FLL|JJFFJ|F||J7FF-JL7FJL-7L-7F-J||LF7-FJLJL---JF---JFJLJL7FJL7JL-7LJL7|FJ|F------7L7|F-7||L-7F7.FJL-JL--7---F7FJLJ7LJ.FJJ.J777JJ
|
||||||
|
||--.LLLF.--7-|J|JFL7|FJ|7FFJF7FJL--7L--J|F-JL7||FJF7F--7F7L--7FJF-7FJ|F-JF77L7F7LJL7LJF7-F7FL7|LJFJ||F-J||FJF7F7F7FJ.L-L-7J7LJ7F-7J7F.LFJ..
|
||||||
|
7J.|-FFLLFJF-FF--7F-J||FJF7L7|LJF7F7|F---JL7F7LJ|L-JLJF7LJL7F-JL7|FLJ7|L--J|F7LJL7F7L7FJL7||F7||F7L7LJL--JLJFJLJLJLJ..|F||L7F-7|J7L7-77.J.FL
|
||||||
|
.LL|-F7FLJ-7J|L-7|L-7||L7|L-JL7FJLJ|||F-7F7||L--JF7F--JL7F-JL---JL---7L7F--J|L7F7||L-JL-7|||||||||L|F7F----7|F-7FF7J7FFJ.F--.LJLJ7L7|L-7.L7|
|
||||||
|
-.|.FJLFF.FJLLLFJL-7|||FJL-7F7|L--7||||FJ|||L7F7F||L---7|L-7F---7F---JJ||F7-L7|||||F7.F-JLJLJLJ||L7||LJF--7LJ|FJFJL---7J-|-F-F|FFJLL|-FF-7J7
|
||||||
|
.FJ7.FFL7--..LFL--7LJ||L-7-LJ|L7F-JLJ|||FJLJFJ||FJL7F--J|F7||FF7LJF7F--J|||F-J||LJ||L7L-------7|L7||L-7|F7L-7|L-JF----J.|.|L-J7F7JL7JJL|FJ.|
|
||||||
|
.7.F7F|7|7J-FLJF-7L-7||F-JF7FJFJL---7|||L7F7L7||L7FJL--7LJLJL7|L-7||L-7FJ||L-7||F-JL7L-7-F7F7FJL-J||F-J||L7FJ|F--JF7F-77777J.JJFLFFJ-FF-7.F7
|
||||||
|
7LFLL-JJJ||F|-FL7L--J|||F7||L7L-7F7FJ||L7LJL7||L7|L7F7-L7F-7FJL-7LJ|F7|L7||F7||||F7FJF7|FJLJ|L---7LJL--JL7|L7|L---J||FJF7J.F|.FF-|L7-|JFJF-J
|
||||||
|
JLF.||.LLJFFF77FJF7F7LJLJ||L7L-7|||L7|L7L7F-JLJFJL7||L-7LJFJL7F7|F-J|||FJ|||||||LJ||FJLJL--7L7JF-JF------JL-J|F----J|L-J||.|7|7L7.-|L|F|-LF-
|
||||||
|
.FJFF-F--L-FJL7L7|LJL7F-7|L7|F7|LJL7|L7|FJL-7F-JF-J|L-7|7FJF7||||L7FJ|||FJ||LJLJF-J|L7LF7F7L7L7|F7L-------7F-JL--7F-JF7FJ7FF777F77|.|LJLJ-|J
|
||||||
|
.|LLJJ|J.LJ|F7L7LJ|F7LJFJL7||||L-7FJ|FJ||F7FJL--JF-JF-JL7L-J|LJ||FJ|FJ|||FJL--7FJF7L7L-J||L-JFJLJ|F-------JL7F7F-J|F-JLJF-7|L7FJL7J-J||FJFL7
|
||||||
|
L|7--FJFFJ7LJ|FJF7FJL-7L-7|||||FFJ|FJ|FJ||LJF--7FJF7L-7FJJF-JF-J||FJL7|||L-7F-JL7||7L--7|L--7|F-7|L-----7-F7LJ||F7||F7|JL7|L7||F-JFL|F----FJ
|
||||||
|
|L-JLF7-7-F.F||7||L7F7L--JLJLJL7|FJL7|L7|L-7L-7LJ-|||FJL-7L-7|7FJ|L-7LJLJF-JL-7FJ||F-7FJ|F7L||L7||F-7F-7L-JL7FJ||||||L-7FJ|FJLJL--7.-7FJJ.LJ
|
||||||
|
L7|FLLJ.F777FJL-JL7LJ|F----7F--J||LL||FJL7FJF7|F-7|L7L7F-JF7|L7L7L-7L7F--JF7LFJL7|||FJL7LJ|FJL-JLJL7LJLL---7LJFJ|||||F-JL7|L-7F-7FJ-|.LJFF.|
|
||||||
|
FLL--J-FJL-7L---7FJF-J|7F--JL7F7|L7FJ|L7FJ|FJLJL7||FJFJL7FJLJFJ||F-JF|L7F-JL7L-7|||||F7|F-JL7F7F---JLF7F--7L--JFJLJ||L7|FJL--JL7||7-L7J7F.7|
|
||||||
|
F77L|J.|F-7L-7F7|L7L--JFJF--7LJ|L7|L7L7|L-J|F7-FJ||L7L-7|L--7|F7|L7F-JFJL7F-JF-J||||||LJL-7|LJ||F-7F7|||F-JLF7FJF--J|FJFJF-7F7FJ||-7JJFJL-J|
|
||||||
|
LL-F77FLJFJF7LJ||FJF7F7L-JF7|F-JFJL7|FJL--7LJL7L7LJFJ-FJL-7.||||L7|L-7|F7|L-7L-7LJLJ|L7F--JF-7|||FJ||||||F-7|||FJF7FJL-JFJFJ|LJJLJF7--J||.|7
|
||||||
|
F|-|L--F-JFJL-7LJ|L|LJL7-FJLJ|F7L-7|||F-7J|F--JFL-7L7FJF--JFJ||L7||7FJ||||F-JF7L--7FJFJL7F7L7LJLJL7||||||L7LJ||L7|LJF7F7L7|FJ.FF|7L|JL-77-F-
|
||||||
|
|.|..|7L7FJF7-L-7L7L--7L7L-7FJ||F-J|||L7|FJL7F7F7FL7|L7|F-7L7||FJ|L-JFJ|||L7J||-F7||LL7FJ|L7L-7F--J|LJLJ|FJF-J|FJ|F-JLJL-JLJLFF-77.J7|JL7FL7
|
||||||
|
F|-F|F7-||FJL7F7L7L--7L7||FJL7||L-7|||FJLJF-J|LJ|F7||FJLJFJFJ||L7L--7L7|||FJFJ|FJLJ|F7||FJFJ.FJ|F-7|F---JL7L--JL-JL7F-----7F77|FJ-JF-7.LFJFL
|
||||||
|
L|.F----J|L-7LJL7|F7FJL|L7L-7|||F7||||L--7|F7L7FJ||||L7F-J-L7||FJ.F7L7|||||JL7|L--7||||||FJF7L7|L7|||F7F7-|F------7LJF----J|L-JL7JJJ7|FL|-FJ
|
||||||
|
L|.L-----JF7L--7|LJ||F7L7|F7|||||LJLJ|F7FJ||L7||FJ|||FJL7F7FJ|||F7||FJ||LJ|F7||F7FJ||||||L7||FJL7|||LJ||L-JL7F---7|F7L7F-7-L7F--J.|-7JFL--J7
|
||||||
|
..7|FLF---JL7F7||F-JLJL-JLJLJLJ|L---7|||L7|L7|||L7LJ|L7FJ||L7||||||LJFJL7LLJ||||||FJ|LJ||FJ|||.F|||L-7LJLF7FJ|F--J|||FJ|FJF7||-LL---|.77L|F7
|
||||||
|
|J--FJL----7LJLJLJF-7F--7F7F7F7L----J|||FJ|FJ|||FJ-FJFJ|FJ|FJ||||||.FJF7L--7||LJ||L7L-7|||FJ|L7FJ|L7FJF-7||L-J|F7L|||L-JL-JLJL7JLLL7|7|JLJ..
|
||||||
|
LJ|FF-7F7F7|F-7F7FJL||F-J|||LJL-----7||LJ-LJFJ|||F-JFJF||FJ|FLJLJ|L7L7|L7F-J|L-7||FJF7||||L7|FJL-J||L7L7LJL--7LJL7LJL7F-7F---7L-7J.LL77.FL-J
|
||||||
|
|-F-L7LJLJLJ||LJ||F-J||F7|LJLF7F----JLJF---7L7||||F7L7FJ|L7L-7JFFJFJFJL7|L7LL7FJLJL7|||||L7||L7F---JFJLL----7|F-7L--7LJFJL--7|F-JLLJLJ||F||7
|
||||||
|
|F7J-L---7F7L7F7LJL-7|||LJ|F-J|L----7F7|F--JF||||||L-J|FJ7L-7L7FJFJFJF-JL7L-7|L7F7FJ||||L7LJ|FJL-7F7|F-----7|||FJF7FJF7L-7F7|||F7.|.FL--LL7J
|
||||||
|
LLJF7|LLFJ||FJ|L-7F7LJLJF--JF7L-----J|LJL---7LJ||LJF--JL-7F-JFJ|FJJL7L7F-JF-JL7LJ|L7||||FJF-JL-7FJ||||F---7LJLJL-JLJ|||F7LJLJ|LJL7.F7J-|-J.|
|
||||||
|
|J.7||.FJFJLJ-|F7LJL7F7FJF7FJL-7F7F7FJF-----JLFJL7L|F7F--J|F7L7|L7F-JFJL-7L-7FJF7L7||LJ|L7L-7F-JL7|LJLJF7FJF-7F7F7F7FJLJL-7-LL7F7L7---7|L|JJ
|
||||||
|
777LLF-JFJ7F--J|L--7LJ|L-JLJF--J|LJLJFJF---7F7|F7L7LJ|L7F-J||FJL7||F-JF--JF-J|FJL7||L7|L-JF-JL-7FJ|F---JLJ||FJ|||LJ||F----J7.F|||FJ7|FLL7|..
|
||||||
|
|-F77L-7|F7L-7FJF7-|F7L-7F7FJF-7|F---JFJF-7LJ|||L-JF-JFJL7FJ|L-7||LJF-JF-7L-7|L-7||L7L7F7-L-7F-J|FJ|F7F7F7FJL-JLJF7LJL-----7J-|||||7|-.LFL-J
|
||||||
|
|-FF-7L||||F7LJFJL-J||F7LJLJFJJLJL----JFJ.L--J|L-7.L-7L-7|L7|F-JLJF-JF7|FJF-JL7FJ|L7L7||L---JL-7||FJ|LJLJLJF7F7F7|L7F------JJ-||LJ--J.|-||L|
|
||||||
|
7.FJFJLLJ|LJL--JF---JLJL----JF7F----7F7L-----7|F7|F7FJF7|L-J||F-7LL-7|LJL7L7||LJL|FJFJ|L-7F7F7FJLJL-JF7F---JLJLJLJ7|L----7F7|FLJLL-F-.7-LL7L
|
||||||
|
|-|J-JFFF|F7F7F7|F-----------J|L---7||L---7F-J||LJ||L7|||F--JLJFJF--JL--7L7L7F--7|L7|FJF-J||||L7JF7F-J|L------77F-7L-----J|L--7L7LFLJFJ|.L|J
|
||||||
|
F.JFLFLLFJ||||||||F------7F7F7L----J|L---7|L-7LJF-JL-J||||F--7FJ|L7F7F-7||L7LJF-JL-J||FJF7|LJ|FJFJ|L-7L------7L7L7|F7F----JF--JF7L--FF--7.|7
|
||||||
|
L-.J.||LL-JLJLJLJLJF-----J||||F7F7F7L--7FJL--JF7L-7F--J||LJ-FJL7F-J||L7LJF-JF-JF--7FJ||FJ||F-JL7L7|F7L------7L7L7|||||F7F--JF--J|-.F|.-.F.F7
|
||||||
|
JF--7J---L.LF---7F7|F---7FJ||LJLJLJL--7LJF7F7J|L7FJL--7||F--JF-J|F-JL7L-7L-7L-7|F-JL-JLJFJ||F--JFJLJL-------J.L7LJLJ|||LJF-7|F7FJ|F-JFL-JLJ|
|
||||||
|
|FFLJLL|||.FL7F7LJ|LJLF7LJ.||F---7F--7L--JLJL-JFJL----JLJL7F7L7FJL-7FJF-JF-JF7LJ|F-7F---JFJ|||F7L---7F---7F77F7L----J|L-7L7|||LJ-|J|FJJL7.77
|
||||||
|
LJFJ7.--J77FFLJ|F7|F7FJL7F-J|L--7|L-7|F7F7F7F-7L--7F-7F7F-J||FJ|F7FJL7L-7L7FJ|F7LJFJ|F7F7L7LJFJL----J|F--J|L-JL-7|F--JF7L7|LJL77-|JLJFFFJFL7
|
||||||
|
|FJJL7FJ|LLF--7|||LJLJF7|L--JJF-JL--JLJLJ||LJ-L7F7LJFJ||L-7|||FJ||L7FJF-JFJL7|||F-JFJ||||FJF-JF--7F--JL---JF7F-7L-JF--JL-J|F--JF-7.|FL7J-7.|
|
||||||
|
L7FF-L-|-F7L-7|LJL-7F-J|||F7F7L--7F-7F7F7LJJF7-LJL-7L-JL-7||||L7|L7|L7|F7L7FJLJ||F7L7|||LJFJF7|-FJ|F7F-7F--JLJJL-7FJF-7-F-JL7F-JFJ-L77.||JF|
|
||||||
|
7|LJ|F.-7|FF-JL--77LJF-JL-J||L---J|FJ||||F7FJL----7L-7F7FJLJ|L7|L7||FJLJ|L|L--7|LJL7|||L7FJFJ||FJFJ|||FJL-------7|L7|FJFJF--J|F7L-7.LJ7L-77|
|
||||||
|
--J.||.|LLFL----7L-7FJF7F-7|L-----JL-JLJLJLJF-----JF7LJLJ7F-JFJ|FJLJL7F-JFJF--J|F-7|LJL-JL7L7||L7|FJLJL---------JL-J|L7L7|-F7||L--J7JLLL7L-7
|
||||||
|
|J|LF7F|-LFF--7LL-7|L-JLJFJL7F-7FF---7F-7F-7L------JL--7F7L-7|LLJF---JL-7L7L--7LJJLJF7F7|FJFJ|L7LJL--7F------7F7JF-7L7L-JL-JLJL--77FF-..LL|7
|
||||||
|
L.JF|FF7.F-JF7L7F7||F7LF7L7FJL7L7L--7|L7|L7|F-7F7F7F7F-J||.FJL--7L-7F-7FJL|F-7L7F7F-JLJL7L-J-L-JF---7||F--7F7LJL7|FJJ|F----7F7F-7|-J-|-F--|7
|
||||||
|
FJLLF7||.L--JL7|||||||FJL-JL7-|FJF7FJL-JL7|LJLLJLJLJ|L--JL7L-7F7L-7LJFJL-7|L7|FJ||L---7FJF-7F--7L7F7LJ|L-7||L---J|L-7|L-7F7LJLJJ||L|FL-JL|.|
|
||||||
|
J7F.|LJL7.F7FFJLJLJLJLJF---7L-JL7||L-7F-7LJF7F7F7F7JL-7F-7L7J|||F7L-7L7F7|L7|||FJL--7FJL7L7||F-JFLJL-7|F-JLJF7JF7|F-J|F-J|L----7LJJLF.L.F7F|
|
||||||
|
L-7FL7F7L-JL-JF-----7F7|F--JF--7LJL--J|FJF7|LJLJ|||F-7|||L7L7||||L7FJFJ||L7||LJL-7F7LJF7|FJLJL7F----7|||F7-FJL-JLJL7F|L--JF7F--J-|JF|FL-J7J.
|
||||||
|
L-JF-LJL7F-7F-JLF-77LJLJL7F-JF-JF7F---JL-JLJF7F-J|LJFJ||F-JFJ||LJ7LJFL7||FJ||F---J||F-J||L7F--JL---7|||LJL-JF-7F7F7L-JF-7FJLJF77JJFLJ7.|L777
|
||||||
|
.LJ.|.|LLJFJ|F-7L7|F7LF77LJF-JF7|LJF--7F7F-7||L--JF7L7LJ|F7L7LJJ.FLJ-|LJ||LLJL---7|||F-JL7||JF7F7F-J|LJF7F--JJLJLJL-7FJ|LJF--JL7--LFJ|F|7F7J
|
||||||
|
L7F|77F7|JL-J|FJFJLJL-J|F7-L--JLJJFJF7LJ||7LJL7F7FJL-JF|LJL7L777|J|7.|FFLJLF----7LJLJL--7LJ|FJLJ|L-7|F7|LJ7F--7F7F77||F---JF7F-J.F-|.F-|-L.|
|
||||||
|
LFJ.|FLF-----JL-JF----7|||F7F7F7F7L-JL-7LJF7F7LJLJF7FLF7F--JFJ7-7|FJ-|F-|--L7F-7L----77FJF7LJF--JF-JLJ|L-7FJF7LJLJ|FJLJF7F7||L--7-.L--..FJ-L
|
||||||
|
L7..FJ.L--7F--7F-JF---JLJLJLJLJLJL-----JF-JLJL---7|L7FJ|L-7FJ-F7LJLJ-LF7||JFLJFJF-7F7L-JFJL7FJ7F7L---7|F7LJFJL----JL--7|LJLJL--7|77J|7FF|7J|
|
||||||
|
||L.|L7LJJLJF-J|F-JF--7F-7F-7F7F7F------JF-7F----J|FJ|FJ|-LJJFLJ-J-|J||7---J7-L-JFLJL7F-JF7||F7||F7F-JLJL--JF7F7F-7F7LLJF7F7F7|LJ-L7||-FL7FF
|
||||||
|
FJ|F|7F7.|F7L--JL-7|F-J|-|L7||||||F-7F7F7L7LJF77F-JL-JL-7F77LLJ|.|JF.|J|.L||L-F---7F7LJF-JLJLJ|||||L--7F---7|||||FJ|L7F7|LJLJ|F-7|F-JJ-|||.|
|
||||||
|
..L7|F7FFF|L---7F7LJL7FJFJFJ||||||L7LJLJL7L--JL7|F--7F--J||-77|-7J.L7F.F-.F-..L7F7LJL--JF7F7F7LJLJ|F7.LJFF7LJ|||||7|FJ|LJF---J|FJ-7J.F-77J-F
|
||||||
|
--7|-FLLLFJF--7LJL7F-JL7L7|.LJLJLJFL---7.L7F7F7LJL-7|L-7FJ|7-JJJ.-F--J-LL7|-7.LLJ|F7F7F7|||||L7F-7LJ|F7F-JL--J|LJL-JL7|F-JF7F-J|FLF.-|JF7---
|
||||||
|
||L77JL||L-JF7|F-7LJF7FJLLJF-7F7F------JF7LJLJL----JL--J|FJJ-J7JLJFJLL..||7L-LFF7LJLJLJLJ||||J||-L-7|||L---7F7|F-----J||F7|||F-J7|F7FL.L7|L|
|
||||||
|
--.L|7J|F---JLJ|FJF7|LJF7F7L7|||L-------JL7F7F----7F7F--JL7J7.-7L||7.F|7LJF7-|FJL--7F----J|LJFJ|F--J|||F7F-J|LJL------JLJLJLJL--77|JF77|.|7J
|
||||||
|
FLF.LF.-L------JL-JLJF-JLJL-J||L7.F---7F7FJ|LJF---J|LJF---JL-7|FF-F7.|L7J.LJF-L---7|L---7FJF-JFJL--7LJLJLJ|FJF7F------7F--------J7|F-77J-L7J
|
||||||
|
L77.L|FFJLF-7JF7F7F7JL--7F--7|L7L7L--7LJLJFJF-JF7F7L7FJ|F7|.|LJ7JJ|JF|F|7--L|.LF--JL----J|FL7FJF---JF7F---7|FJLJF7F-7FJL-7F--7F--7-L7L7JF.|7
|
||||||
|
FJ-7.J7|J|L7L-JLJ|||F7F7LJF-JL7L7L--7L----JFJFFJLJL-JL--JL--77.|F-|7|7F-...|L7.L-----7F7FJF-J|JL----JLJF--J||F7FJLJFJL7F7||F-J|F-JF7|FJ|LFL7
|
||||||
|
-J-7-L7L-7F|F7F-7LJLJLJ|F7L--7L-JF-7L---7F-JF7|F----7F-7F---J77-||.L.J7.F7-JJFFF7F---J||L7L--JF-7F-7F7LL---JLS||F--JF7LJLJ|L7.||F7||||-7-7--
|
||||||
|
L|L7FL|FFF-J|||FJF7F--7LJL--7L---JJL---7LJ|FJLJL---7LJ.LJ-F7F77F|-7FL---J77.FF7||L---7|L-JF--7|FJL7LJL-----7F7LJL--7|L-7F7L7L-JLJLJLJL-7F7J7
|
||||||
|
.|FLF-|F-|F7|LJL-J||F7L--7F7L-----7F7F-JF-7L7F-----JF7-FF7||||FF7-77JFJFLF7F7||||F---J|JF7L-7LJ|F7|F-7F---7LJ|F7F--J|F-J||FJF7F7F7F-7F7LJ|.F
|
||||||
|
FF|J.LLFJLJLJF77F-J||L---J||F7F--7LJLJF-JFJFJL----7.|L7FJLJLJL7||-|7-|---|LJ||LJ|L-7F7|FJL-7L-7LJ|LJFJ|F--JF7LJ|L--7|L-7|LJFJ||||LJFJ|L--J--
|
||||||
|
-JJ.|7|L|JJFFJL-JF-JL7F7F7|||LJF7L--7FJF-J7L7F----JFJFJL7F--7FJ||JLJ-7|7LL7FJL-7|F7LJLJL--7|F7L-7L--JFJL---JL-7|F7FJ|F7LJF7|JLJ|L-7L7L-7LL.|
|
||||||
|
.|-JJLJ||L--L7F7FJF7LLJLJLJLJF-JL-7FJ|FJF7F7||F7F77L7L--JL-7LJFJL-777|FF--JL7|FJLJ|JF7F7F7||||F7L---7|F-------JLJ|L-J|L7FJ|L7F-JF7L7L7FJ-|F|
|
||||||
|
7-JL7-LL|LLJLLJ||FJ|F7F7F----JF--7|L-JL7|LJLJLJLJL7-L7F---7L7LL--7|F7-FL---7L7|F-7L7|||LJLJLJLJL7F7FJ||F--------7L7F7L7|L7|FJL7FJ|FJFJ|J.|FJ
|
||||||
|
L|7LL-7J.|.|FFFJ|L7LJLJ|L-----JF7|L----J|F--------JF7|L--7L-J-.F-JLJ|F7F7F7|FJLJ-L7LJLJF7F-7F7F7LJLJFJLJF--7F--7|J|||FJL7||L-7LJFJ|.L7|.FF7|
|
||||||
|
JL|.JFJ.77.7.FL-JLL7F-7L--7F---JLJF--7F7|L-7JF7FF7FJLJF--JF7J|FL-7F-J|LJ||LJL7LFF7L--7FJLJ|LJ||L7F-7|F7.L-7|L7FJL7||||F7|||F-JF7L7L-7LJ---|J
|
||||||
|
F7L-J|L-JF777F.F7F7LJ.L--7|L------JF-J|LJF7L-JL-JLJF--JF7FJL77F7FJ|F7L7FJL--7L7F||F-7LJF7F7F7LJFJ||LJ|L---JL-JL-7||||LJ|LJLJF7||FL7FJ|||J|J|
|
||||||
|
7.L|FFJJFFJF---JLJ|F7F7F-JL--------JF7|F-J|F7F7F-7FJF-7|||F7|FJ|L7|||FJ|F7F-JFJFJ|L7|F7|||||L7LL7|F--JF7F7F7F7F7LJLJ|F7L----JLJL-7LJL|-7L7-J
|
||||||
|
JFFF-|-FF-7L---7F7LJLJLJF7F-7F-7F---JLJL7FLJLJ|L7|L-JFJ||LJ|LJFJFJ||||FJ||L-7L7L7L7|||LJLJLJFJF7LJL---JLJ||LJLJ|F-7FJ|L7F7F7F7F-7L777JJ|7|.7
|
||||||
|
FFLJJF7..LF|F|FJ|L--7F-7|||FJ|LLJF7F----JF--7-L7||F-7L7|L-7L-7|LL7||||L7||F7|FJFJFJ||L----7FJ-|L----7F--7LJF---J|FJL7L7LJLJLJLJ-L7L7J7FLF-77
|
||||||
|
F7L--.|.--F---JFJF--J|FJ|||L-JF--JLJF----JF7L-7|||L7L-J|F-JF7||F7|||||FJ|||LJ|-|FJFJ|F7F7FJL-7L----7LJF7L--JF7F7||F7L7L7F7F-----7L-JL7.J.J|.
|
||||||
|
7J|FL-FJLLL7F7FJ-L---JL-J||F-7L-----JF7F7FJL7FJLJL7L7F7|L-7|LJ||||LJLJL7|||F7L7|L7L7|||||L7F-JF----JF7|L----JLJLJ||L7L7LJLJF----J|.|-77LL.77
|
||||||
|
|7-|-|FJ.|.LJLJF7F------7LJL7|FF-----JLJLJFFJL--7-L-J|LJF-JL-7LJ|L7F---J||LJL7|L7|FJLJLJL-JL77L7F---JLJF--7F-----J|FJFJF7F7L-----7.LFJJ7LJ..
|
||||||
|
LL.|L-J|F-JJF7FJLJF7F--7|JF-JL-JF---------7|F7F-JF--7L-7|F7F7L-7|FJL7F-7|L7F-J|L||L--7F---7FJF7LJF77F7-L-7LJF-----JL7L7||||F--7F-J--F7.FF|.L
|
||||||
|
FL-F-J|7-||F|LJF7FJLJF-JL7L7F7F7|F--------JLJ|L-7L-7L7L|||||||FJ||F-J|FJ|FJL-7|FJL--7LJF7.|L-JL7FJ|FJL---JF7|F-7F7F7L7|||||L-7LJJ..-77.-7F-7
|
||||||
|
.LFL|LFF7JF7L--JLJF-7L-7FJFLJ||LJL-7F------7JL-7|F7L7L-JLJLJL7L7||L7FJ|FJL7F-JLJF-7FJF7||FJF-7FJL7|L------J||L7LJLJ|FJ|||||F7L77777LLF-.--|7
|
||||||
|
F.L7|FF7|FJL7F7F7-L7|F7|L7F--JL7-F7LJF-7F--JF7LLJ|L7L---7F-7FJFJ|L7|L7|L7FJ|F7F7L7||FJLJLJFJJLJF7||F--7F7F7LJFJJF7JLJLLJ||LJL7L-777.FF7.||JL
|
||||||
|
J.|L7L|L7L-7LJ||L--JLJLJFJL----JFJL--JFLJF7FJL-7FJFJF7F7LJFJ||L7|FJL7|L-JL7LJ|||FJLJL----7|F7F7||||L-7LJLJ|F7|F-JL-----7|L-7FJF-J|-|-J-FJL7J
|
||||||
|
FF7||7L7|F7|F7LJF7F-7F-7L7F--7F-JF-7F-7F-JLJF7FJL7|FJLJ|F7L7L77|LJF7|L--7FJF7LJ|L-7FF7F--JLJ||||LJL-7L7F-7LJ|LJF-------JL--JL-JL|-7J7|.JFJ.|
|
||||||
|
FJFF-7FJLJ|LJL7FJLJ7LJ7L7|L-7|L7FJFLJFJL7F--JLJF-J|L--7|||FJFJFJF7|||F7FJL-J|F-JF-JFJ||F-7F-J||L-7F-JJLJ7L-7|F7|F7F7F7F---7F-7-L.F7L|.F-LJ7.
|
||||||
|
|LFL7|L--7L7F7LJ.F------JL--JL7LJF7F7L-7|L-7F-7L-7|F77|||||FJ-L7|LJLJ|||F---JL-7L-7L7|LJFJL7||L7FJ|F7F7JF--J|||LJLJLJLJF--J|FJ-|-LJF|-JJ|-77
|
||||||
|
J-F-J|F7FJFJ||F-7|F--7F------7|FFJLJL--J|F-J|FJF7||||FJLJ|||F--JL7F7FJ|||F7F7F7L7FJFJL7FJF7L7|FJL7||LJL7L7F7LJL7F-7F---JF7F|L77|.L.-|77FFF-7
|
||||||
|
LFJF7LJ|L7|FJ|L7|LJF7LJF7F---JL-JF-7F7F7|L-7|L7||||||L7F7||LJF---J||L7||LJ||||L7|L7|F-JL-JL7||||FJ|L7F-J7LJL--7|L7|L---7||FJFJ-J7--.LF7--JLJ
|
||||||
|
.L-J|F7L7||L7|FJL7FJL--JLJF7F-7F-J7LJ||||F-JL7|||||||J||LJL7FJ7F7FJ|FJ||F-J||L7||FJ|L7F-7F-JLJL7L7L7||-F------JL-JL7F7FJ||L7|F7J77|-FL--J..7
|
||||||
|
-JJJ||L7LJL-JLJF-JL------7||||||F-7F-J|||L7F7|||LJLJL7|L7F7|L7FJ||FJL7|||F7|L-J|||FJFJL7|L-7F--JFJFJ|L7L---7F-----7||LJFJL-JLJL77|F7L-J7F|7|
|
||||||
|
||7L||JL7F7F7F7L7F7F7F7F-J|||FJ|L7LJF7|||FJ||||L---7FJ|FJ|||FJL7|||F7||||||L-7FJ|||FJ7.||F7||7F7|FJL|FJF7F7LJF----J|L7FJF7F7F-7|L7LJJJLF|J|J
|
||||||
|
L--FLJF7||LJLJL7||||LJLJF7|||L7|-L7FJ||LJL7|||L7F-7|L7|L7|||L7FJ|||||||||||F7||FJ|||F7FJ||||L7||||F7|L7||||F7L--7F7L-J|FJLJLJ.LJ7F7.|-L-L7||
|
||||||
|
FJ.LF-JLJL-7F--JLJLJF7F7|LJ||FJ|F-JL7|L-7FJ||L7|L7LJ|LJFJ||L7LJ|||||||||LJ||||||FJ||||L7||||FJ|||||||FJ|LJ||L7F-J|L-7J|L---7J-|L|L-77...FL|7
|
||||||
|
LF7JL--7F-7|L---7F7FJLJ||.FJ|L-JL7F7||F-JL7||FJL7L----7|FJ|FJF--J|||||||F-J|||||L7|||L7|LJ||L7|LJLJ||L7L-7LJLLJF7|F-JFJF---J|JJL.7L|L7|-7J||
|
||||||
|
.L7FLLFJL7||F--7LJLJF--JL7|FJF---J|LJ||F--J||L-7|F7F7FJ||.|L7L-7FJ||||LJL-7|||||FJ|||FJL7-LJFJL-7.FJ|F|F7|F----JLJ|F7|FJF7-F777.F7|F|7L.|7F|
|
||||||
|
L-L-L.L7FJLJL-7L----JF7F-J||JL-7F7L7JLJL7F7|L7FJ|||||L7|L7|FJF7||.||LJFF--J|LJLJL7|||L7FJF--JF-7L7|FJFJ||LJF7F----J|LJL-JL7|L--7LL--7JJ-FFF|
|
||||||
|
|.L.FFL||F---7|F--7F7||L77LJF-7LJL-JF7F-J||L7|L7||||L7|L-JLJJ|LJL7||F--JF-7L--7F7|||L7|L7L7F7L7L7||L7L7||F-J|L-----JF7F--7LJF--J-L.FL||.7.LJ
|
||||||
|
JJ.|7FFJ|L7F7LJ|F-J|||L7L--7|FJF----JLJF-J|FJL7|||||FJL---7|FJF7FJLJ|F7FJFL7F-J|LJ|L7||FJ|LJ|FJJLJL7L7|||L-7L--7F7F7||L-7L--JFJJJJFL7L7-L7..
|
||||||
|
|JF|--L-JJLJL-7||F7||L7L7F7||L7L----7F7|F-J|JFJ|LJ||L7F7F7L7L7||L--7||||F--JL7JL7FJFJ||L7F--JL7F---JFJLJL--JF7L|||||||F7L-7JJJ-JJ-||-LJFL77L
|
||||||
|
F--FJJ||||F---J||||||FJFJ|||L7L----7||LJ|F7L7L7L77LJF||||L7L7LJL7F-JLJ||L7F-7L-7|L7L7||FJL7F7FJ|F7F7L-------JL7LJLJLJ||L7FJ7LL|L|JLLJ|FL7JLJ
|
||||||
|
7-|J|.7L--|F7F7|||||||-|FJLJ.L----7LJL-7LJL7|FJFJF---J||L7|FJF--JL---7LJFLJ7|F7||FJFJ|LJJ-LJ||JLJ|||F7F7F7F7F-JF7F--7LJ|||FJJFF-7|-F-F--L7LL
|
||||||
|
-7FF-7|-L-LJ||||||LJLJFJL-7F-7F---JF--7L7JFJ||FJ|L7F7FJ|FJLJ.|F7F7F--JF-7F-7||||||-L7L7F7F7FJL7-FJ|LJ|||||||L--JLJF7L-7FJL7LFJL-|-77.L.LL--7
|
||||||
|
LLFJLL-7F7.F||||||F-7FJF7FJL7||F-7FJF7L7L7L7||L--7LJ||||L-7F7|||||L---JFJL7LJ|||LJF-JFJ|LJLJF-JFJFJ7FJ|||||L7F-7F-JL--JL7FJ7JL7-L-LF--|JJ|L-
|
||||||
|
|L|.F7.-|77-LJLJ||L7LJFJLJF7|LJ|FJL-JL7L7L7|||F-7|F-J|FJF7LJ|||||L7F---J7JL7FJ||F7|F7L7|F--7L7FJFJF-JFJLJLJFJL7|L------7LJLJ7|.7JL|.L-J..7J.
|
||||||
|
L7L-LF7JL.|.L|LJLJFJF7|F--JLJF-JL7F-7FJFJFJLJ|L7||L-7|L7|L7FJLJ|L7|L--7F77FJL7|||LJ||FJ||F-JFJL7L7L-7|F7|F-JF7|L7F----7|F|.L|FFL7.-7-J.F7J|L
|
||||||
|
|JF-FL7.|F.F-JF7LLL-J|||F----JF7FJL7|L7L7L--7|FJ||F-J|FJL7|L--7L-JL7F7LJL7L7FJ|||F7||L7||L7FJF-JFJ-FJLJL7L7FJ|L7|L--7-LJ-7--.|J.L7-|-|7FJ.||
|
||||||
|
|FF-JL-7-L|-.FF7.F7F-J|||F----J|L7FJL-JFJF7FJ|L7||L7FJL7FJL7F7L--7J|||F-7|FJL7||LJ|||FJLJFJ|||F-JF7|F-7FJ.|L7L7|L7F-J7-LL|-.LJFF.-J.FJJL7.|7
|
||||||
|
F-J|J.L7-JJ..LJ7.LFL7FJLJL--7F7L-J|F-7FJFJLJF|FJLJFJ|F-JL-7||L7F7L7LJ||.LJL7FJ||F-J||L--7L7L7|||FJLJL7|L-7|FJFJ|FJL--7.L-JL|.LL|7LF7|L7.|-J|
|
||||||
|
.LF|.-.J.|F77-|LJ-FFJL7J-F--J||F-7LJFJL7|F7F-JL--7L7|L-7F-J|L7||L7L-7|L---7|L7LJL7FJ|F--J7L-JLJFJF-7FJ|F-JLJFJFJL7F7FJ7.L77.F|FLJ--F-.J-|JL7
|
||||||
|
|7FJJJ..FF-||FJ.LJLL-7|F-JF--J|L7|F7|FFJLJ|L7F---JJ||.FJL7FJFJ||||F7|L-7F-JL7L7F-JL7|L-7LF7F7F7L7||LJFJL---7L7L-7||LJJ|7---|7.F|F7|.FF|7FF7.
|
||||||
|
|F|7|F7FF-7F-7.L77|.|||L--JF--JFJ|||L7L7F-JFJL----7LJFJF7|L7L7||FJ||L7FJL7LFJFJL-7FJ|F-JFJLJLJL-JL7|FJF-7F7L7|F7||L7JLFJ-J.|77-LLJFLFJJFLJJ7
|
||||||
|
L77J-J|F.LFJ.F-FJJL|FLJF---JF-7|-|||FJFJL-7L7F----JF7L7||L7L7|LJ|FJL7||F-JLL-J|F-J|FJL-7L7F7F7F-7FJFJFJFJ|L7||||||FJJ.|-LLFL|JJ7..FLL7.||JF|
|
||||||
|
L|FJ|L|L-7JF-7.7J77|L|-L7F7FJFJL7||||LL7F-JL|L----7|L-J||FJ||L7-||FL|||||.|-FL-L-7||F7FJFJ|LJLJFJL7L7|FJFJ|||LJLJLJ|.FJ7L--J|FL|FJ-.FL7L7.||
|
||||||
|
.L77|-.FF|-J7J.|.L-L-7JFJ|||.L-7||||L7FJL7JFJF7F--JL7F7|LJ7FJFJ-||-7|||L7JJ7F|JFFJ|||LJ7L-J-F--JF-JF||L7L-7|L-7LLJ.J-L-7.L--7|.LJJJ-JL--J.--
|
||||||
|
JF|--JFF-|L|L7-77.FF7J.L-J||F--J||||FJ|F-JFJFJ|L--7|LJ|L-7FJFJJFJ|.-LJL-J7|L77.FL7||L7--|J||L7F7L7FFJL7|F-JL7FJ-J-L.L||.7F7|L77..|-7|7.L|F|J
|
||||||
|
L-J|L--JF7.-JL-.777LJLF.LFLJL7F-J||||FLJJJL-JL|F--JF77|F-JL-J.LL7|..LJ||LF7JL77F-|||FJ|||JL|FLJL7L7L7FJLJ|-LLJ.|..LF.F77FF|7FJ7--7|FJF-FL-L.
|
||||||
|
--L|LF|7J|7.|7FLLLFJ|7L|LF-|L|||7LJ||J-L||LF--JL--7||FJ|.|-|F7.|LJ77.L|-LJLF7L|L-LJLJ.F7..FJJ.F-JFJF|||JF--LJ7JJF.-F7J77FJL-|JL7J.|L7J--JJFJ
|
||||||
|
LF-7F7L-FJ|7LFF.|J.|||.LFLF7.LJ7-F-J|JFLF-JL7F7F-7LJ|L-J-J.LFJ-||7.--.|LLF.||-|7.LFJ-FJF7F-..FL--JFF|L7JFJ7.FL.LFL-JJ-L--J-F|-LJ7FF|JF-7|7J.
|
||||||
|
||-LF7JL|7F-.FJL-.|LL-7FFJ||F7LJLL7FJFLFJ.--LJ||F|F-JJFL|-F|.-7.L77-L7J.||FLJF7777L7|.-7FJ|LL7|FFJFLL-J7L77F7LF-|7|J-7|LJ.FLJ7.|F|JL|J.7JF.F
|
||||||
|
JF-7LFJ.||7|7|7JF-JL|L-FJ-J-LJ.F|FLJL7J|F7F|LFJ|FJL-7-L7FJLFJLF77|7F7J7F77-JL||F-J--L.LJJL7FL-L-7.L|F|.|7LJJ7-|-L|7J7|7.|FF...--|||F7JFL.L-L
|
||||||
|
LF-F7.FF|L|FFL-.-.||.FL|-FLJ.L7L-77|-L7-J|LF-JFJL7F7L7|F|-7L|JF7-777.|LJJ||LJL7FJ.|L7LJJ77.F-JLLL---7-JLF.|L|--.|LF7LF|7JF--|JJLJJ-7LFJ|F.||
|
||||||
|
LJ|L|F77L-LF7LJF.FF7-J.L.|--7.||FL7JFJ.LFL.L-7L7FJ|L-J-F7|--|.L--LJ|.-7|.|FL7FLJ7-|JF|7LFJ---LFF7.FFJJ--.-FJLF|-F-J7|FLJFJ7F-JFJ|.-JJL-JJ7J7
|
||||||
|
|.|.L|L7J.|L77F-7|-||.F|-FFJ.|J-7LJ7|F7-J.FJ-L-J|FJJL|L---7J|-7|FJJ7|FJ-FJFLJ-|JJ7L--FFJLJ7J--7JLL7|J.F-|7|.FFL.|FFLL7L|JFLJ|7J.F-F-7|-7.F.7
|
||||||
|
-.F7-LJ|J.|.J7JLFJL|F7|-FF.F-J.L..LF7|-.|.7.FJJ|||.F|.F|JL-7F-J-J|.|777-7-F.L.L|.7-77||L|L.F-LL7FLFJ-||FL-|F7-|7|77L||7|||.-F---L-|L-JF7F|FJ
|
||||||
|
|FL|7..|-FFF7JF7.77|JF|.J.-J|LL--7JLJJLL-77F||.FLJ7F7--.L|.F--JJ-FLJFF-7J-L|J.FLJ-77--77FJFFJ77F|-7.7L-JL.LFL-77JLJ-J77|7.FJ|LLJL7.L|.JL|-|.
|
||||||
|
JLLLJ.L-F7-JJJL--|-|-JLFJ7-F7-L-LL.JJJJ.J.L---JLL|LL--L-.J-L|-.--LL-|JJ|-----JLL|.L7-LLL.|-F--7-7-J|JLJJ|J-J-LL|.LLL.|JJF.|..LJ-|J-.J.L7JJLL
|
|
@ -4,7 +4,6 @@
|
||||||
bool cat_file(int fd)
|
bool cat_file(int fd)
|
||||||
{
|
{
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
size_t n_read;
|
|
||||||
while (ssize_t n_read = read(fd, buffer, sizeof(buffer)))
|
while (ssize_t n_read = read(fd, buffer, sizeof(buffer)))
|
||||||
{
|
{
|
||||||
if (n_read == -1)
|
if (n_read == -1)
|
||||||
|
|
|
@ -59,7 +59,7 @@ bool copy_file(const BAN::String& source, BAN::String destination)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t written = 0;
|
ssize_t written = 0;
|
||||||
while (written < nread)
|
while (written < nread)
|
||||||
{
|
{
|
||||||
ssize_t nwrite = write(dest_fd, buffer, nread - written);
|
ssize_t nwrite = write(dest_fd, buffer, nread - written);
|
||||||
|
|
|
@ -10,9 +10,7 @@
|
||||||
int parse_int(const char* val)
|
int parse_int(const char* val)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
for (const char* ptr = val; *ptr; ptr++)
|
||||||
const char* ptr = val;
|
|
||||||
while (*ptr)
|
|
||||||
{
|
{
|
||||||
if (!isdigit(*ptr))
|
if (!isdigit(*ptr))
|
||||||
{
|
{
|
||||||
|
@ -20,9 +18,7 @@ int parse_int(const char* val)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
result = (result * 10) + (*ptr - '0');
|
result = (result * 10) + (*ptr - '0');
|
||||||
*ptr++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <BAN/Optional.h>
|
#include <BAN/Optional.h>
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
BAN::Optional<uint64_t> parse_u64(const uint8_t*& data, size_t data_size)
|
BAN::Optional<uint64_t> parse_u64(const uint8_t*& data, size_t data_size)
|
||||||
|
@ -86,7 +87,7 @@ BAN::ErrorOr<BAN::UniqPtr<Image>> load_netbpm(const void* mmap_addr, size_t size
|
||||||
return BAN::Error::from_errno(EINVAL);
|
return BAN::Error::from_errno(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Netbpm image %llux%llu\n", *width, *height);
|
printf("Netbpm image %" PRIuPTR "x%" PRIuPTR "\n", *width, *height);
|
||||||
|
|
||||||
BAN::Vector<Image::Color> bitmap;
|
BAN::Vector<Image::Color> bitmap;
|
||||||
TRY(bitmap.resize(*width * *height));
|
TRY(bitmap.resize(*width * *height));
|
||||||
|
|
|
@ -138,7 +138,7 @@ int list_directory(const BAN::String& path, config_t config)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dirent* dirent;
|
struct dirent* dirent;
|
||||||
while (dirent = readdir(dirp))
|
while ((dirent = readdir(dirp)))
|
||||||
{
|
{
|
||||||
if (!config.all && dirent->d_name[0] == '.')
|
if (!config.all && dirent->d_name[0] == '.')
|
||||||
continue;
|
continue;
|
||||||
|
@ -216,14 +216,14 @@ int list_directory(const BAN::String& path, config_t config)
|
||||||
|
|
||||||
for (const auto& full_entry : full_entries)
|
for (const auto& full_entry : full_entries)
|
||||||
printf("%*s %*s %*s %*s %*s %*s %*s %*s %s\n",
|
printf("%*s %*s %*s %*s %*s %*s %*s %*s %s\n",
|
||||||
max_entry.access.size(), full_entry.access.data(),
|
(int)max_entry.access.size(), full_entry.access.data(),
|
||||||
max_entry.hard_links.size(), full_entry.hard_links.data(),
|
(int)max_entry.hard_links.size(), full_entry.hard_links.data(),
|
||||||
max_entry.owner_name.size(), full_entry.owner_name.data(),
|
(int)max_entry.owner_name.size(), full_entry.owner_name.data(),
|
||||||
max_entry.owner_group.size(), full_entry.owner_group.data(),
|
(int)max_entry.owner_group.size(), full_entry.owner_group.data(),
|
||||||
max_entry.size.size(), full_entry.size.data(),
|
(int)max_entry.size.size(), full_entry.size.data(),
|
||||||
max_entry.month.size(), full_entry.month.data(),
|
(int)max_entry.month.size(), full_entry.month.data(),
|
||||||
max_entry.day.size(), full_entry.day.data(),
|
(int)max_entry.day.size(), full_entry.day.data(),
|
||||||
max_entry.time.size(), full_entry.time.data(),
|
(int)max_entry.time.size(), full_entry.time.data(),
|
||||||
full_entry.full_name.data()
|
full_entry.full_name.data()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
void usage(int ret, char* arg0)
|
void usage(int ret, char* arg0)
|
||||||
{
|
{
|
||||||
FILE* fout = (ret == 0) ? stdout : stderr;
|
FILE* fout = (ret == 0) ? stdout : stderr;
|
||||||
fprintf(fout, "usage: %s [OPTIONS]...\n");
|
fprintf(fout, "usage: %s [OPTIONS]...\n", arg0);
|
||||||
fprintf(fout, " -s, --shutdown Shutdown the system (default)\n");
|
fprintf(fout, " -s, --shutdown Shutdown the system (default)\n");
|
||||||
fprintf(fout, " -r, --reboot Reboot the system\n");
|
fprintf(fout, " -r, --reboot Reboot the system\n");
|
||||||
fprintf(fout, " -h, --help Show this message\n");
|
fprintf(fout, " -h, --help Show this message\n");
|
||||||
|
|
|
@ -54,13 +54,13 @@ bool delete_recursive(const char* path)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void usage(const char* argv0, int ret)
|
void usage(const char* argv0, int ret)
|
||||||
{
|
{
|
||||||
FILE* out = (ret == 0) ? stdout : stderr;
|
FILE* out = (ret == 0) ? stdout : stderr;
|
||||||
fprintf(out, "usage: %s [OPTIONS]... FILE...\n");
|
fprintf(out, "usage: %s [OPTIONS]... FILE...\n", argv0);
|
||||||
fprintf(out, " remove each FILE\n");
|
fprintf(out, " remove each FILE\n");
|
||||||
fprintf(out, "OPTIONS:\n");
|
fprintf(out, "OPTIONS:\n");
|
||||||
fprintf(out, " -r remove directories and their contents recursively\n");
|
fprintf(out, " -r remove directories and their contents recursively\n");
|
||||||
|
|
|
@ -27,7 +27,7 @@ bool g_running = true;
|
||||||
Point g_grid_size = { 21, 21 };
|
Point g_grid_size = { 21, 21 };
|
||||||
Direction g_direction = Direction::Up;
|
Direction g_direction = Direction::Up;
|
||||||
Point g_head = { 10, 10 };
|
Point g_head = { 10, 10 };
|
||||||
int g_tail_target = 3;
|
size_t g_tail_target = 3;
|
||||||
int g_score = 0;
|
int g_score = 0;
|
||||||
BAN::Vector<Point> g_tail;
|
BAN::Vector<Point> g_tail;
|
||||||
Point g_apple;
|
Point g_apple;
|
||||||
|
@ -133,6 +133,8 @@ void update()
|
||||||
if (g_direction != Direction::Left)
|
if (g_direction != Direction::Left)
|
||||||
new_direction = Direction::Right;
|
new_direction = Direction::Right;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,6 +156,8 @@ void update()
|
||||||
case Direction::Right:
|
case Direction::Right:
|
||||||
g_head.x++;
|
g_head.x++;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_head.x < 0 || g_head.y < 0 || g_head.x >= g_grid_size.x || g_head.y >= g_grid_size.y)
|
if (g_head.x < 0 || g_head.y < 0 || g_head.x >= g_grid_size.x || g_head.y >= g_grid_size.y)
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
void print_timestamp(timespec ts)
|
void print_timestamp(timespec ts)
|
||||||
{
|
{
|
||||||
auto time = BAN::from_unix_time(ts.tv_sec);
|
auto time = BAN::from_unix_time(ts.tv_sec);
|
||||||
printf("%04d-%02d-%02d %02d:%02d:%02d.%09d",
|
printf("%04d-%02d-%02d %02d:%02d:%02d.%09ld",
|
||||||
time.year, time.month, time.day,
|
time.year, time.month, time.day,
|
||||||
time.hour, time.minute, time.second,
|
time.hour, time.minute, time.second,
|
||||||
ts.tv_nsec
|
ts.tv_nsec
|
||||||
|
|
|
@ -16,7 +16,7 @@ int main(int argc, char** argv)
|
||||||
|
|
||||||
uint8_t buffer[1024];
|
uint8_t buffer[1024];
|
||||||
while (size_t ret = fread(buffer, 1, sizeof(buffer), fp))
|
while (size_t ret = fread(buffer, 1, sizeof(buffer), fp))
|
||||||
for (int j = 0; j < ret; j++)
|
for (size_t j = 0; j < ret; j++)
|
||||||
sum += buffer[j];
|
sum += buffer[j];
|
||||||
|
|
||||||
if (ferror(fp))
|
if (ferror(fp))
|
||||||
|
|
Loading…
Reference in New Issue