Bash 2022 day 12 (parts 1 & 2), before cleaning code
This commit is contained in:
0
2022/day11/common.bash
Executable file → Normal file
0
2022/day11/common.bash
Executable file → Normal file
111
2022/day12/Makefile
Normal file
111
2022/day12/Makefile
Normal file
@@ -0,0 +1,111 @@
|
||||
# AOC daily Makefile - GNU make only.
|
||||
#
|
||||
# Copyright (C) 2021-2022 Bruno Raoult ("br")
|
||||
# Licensed under the GNU General Public License v3.0 or later.
|
||||
# Some rights reserved. See COPYING.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with this
|
||||
# program. If not, see <https://www.gnu.org/licenses/gpl-3.0-standalone.html>.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later <https://spdx.org/licenses/GPL-3.0-or-later.html>
|
||||
#
|
||||
|
||||
INPUT := input/input.txt
|
||||
SHELL := /bin/bash
|
||||
|
||||
CC := gcc
|
||||
BEAR := bear
|
||||
CCLSFILE:= compile_commands.json
|
||||
|
||||
LIB := aoc_$(shell uname -m)
|
||||
INCDIR := ../include
|
||||
LIBDIR := ../lib
|
||||
LDFLAGS := -L$(LIBDIR)
|
||||
#LDLIB := -l$(LIB) -lm
|
||||
LDLIB := -l$(LIB)
|
||||
|
||||
export LD_LIBRARY_PATH = $(LIBDIR)
|
||||
|
||||
CFLAGS += -std=gnu11
|
||||
CFLAGS += -O2
|
||||
CFLAGS += -g
|
||||
# for gprof
|
||||
# CFLAGS += -pg
|
||||
CFLAGS += -Wall
|
||||
CFLAGS += -Wextra
|
||||
CFLAGS += -march=native
|
||||
# Next one may be useful for valgrind (some invalid instructions)
|
||||
# CFLAGS += -mno-tbm
|
||||
CFLAGS += -Wmissing-declarations
|
||||
CFLAGS += -Wno-unused-result
|
||||
|
||||
CFLAGS += -DDEBUG_DEBUG # activate general debug (debug.c)
|
||||
CFLAGS += -DDEBUG_POOL # memory pools management
|
||||
|
||||
VALGRIND := valgrind
|
||||
VALGRINDFLAGS := --leak-check=full --show-leak-kinds=all --track-origins=yes \
|
||||
--sigill-diagnostics=yes --quiet --show-error-list=yes
|
||||
|
||||
|
||||
TIME := \time -f "\ttime: %E real, %U user, %S sys\n\tcontext-switch:\t%c+%w, page-faults: %F+%R\n"
|
||||
export PATH := .:$(PATH)
|
||||
|
||||
.PHONY: clean all compile assembly memcheck memcheck1 memcheck2 part1 part2 ccls bear org
|
||||
|
||||
all: README.org ccls part1 part2
|
||||
|
||||
memcheck: memcheck1 memcheck2
|
||||
|
||||
memcheck1: aoc-c
|
||||
@$(VALGRIND) $(VALGRINDFLAGS) aoc-c -p 1 < $(INPUT)
|
||||
|
||||
memcheck2: aoc-c
|
||||
@$(VALGRIND) $(VALGRINDFLAGS) aoc-c -p 2 < $(INPUT)
|
||||
@#@valgrind -s --track-origins=yes aoc-c -p 2 < $(INPUT)
|
||||
|
||||
compile: aoc-c
|
||||
|
||||
cpp: aoc-c.i
|
||||
|
||||
assembly: aoc-c.s
|
||||
|
||||
part1: aoc-c
|
||||
@$(TIME) aoc.bash -p 1 < $(INPUT) 2>&1
|
||||
@$(TIME) aoc-c -p 1 < $(INPUT)
|
||||
|
||||
part2: aoc-c
|
||||
@$(TIME) aoc.bash -p 2 < $(INPUT) 2>&1
|
||||
@$(TIME) aoc-c -p 2 < $(INPUT)
|
||||
|
||||
ccls: $(CCLSFILE)
|
||||
|
||||
clean:
|
||||
@rm -f aoc-c core* vgcore* gmon.out aoc-c.s aoc-c.i README.html compile_commands.json
|
||||
|
||||
aoc-c: aoc-c.c common.c
|
||||
@echo compiling $<
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -I $(INCDIR) $^ $(LDLIB) -o $@
|
||||
|
||||
# generate pre-processed file (.i) and assembler (.s)
|
||||
%.i: %.c
|
||||
@echo generating $@
|
||||
@$(CC) -E $(CFLAGS) -I $(INCDIR) $< -o $@
|
||||
|
||||
%.s: %.c
|
||||
@echo generating $@
|
||||
@$(CC) -S -fverbose-asm $(CFLAGS) -I $(INCDIR) $< -o $@
|
||||
|
||||
# generate README.org from README.html (must cleanup !)
|
||||
org: README.org
|
||||
|
||||
%.org: %.html
|
||||
@echo generating $@. Cleanup before commit !
|
||||
@pandoc $< -o $@
|
||||
|
||||
# generate compile_commands.json
|
||||
$(CCLSFILE): aoc-c.c Makefile
|
||||
$(BEAR) -- make clean compile
|
||||
|
||||
bear: clean
|
||||
@touch .ccls-root
|
||||
@$(BEAR) -- make compile
|
100
2022/day12/README.org
Normal file
100
2022/day12/README.org
Normal file
@@ -0,0 +1,100 @@
|
||||
** --- Day 12: Hill Climbing Algorithm ---
|
||||
You try contacting the Elves using your handheld device, but the river
|
||||
you're following must be too low to get a decent signal.
|
||||
|
||||
You ask the device for a heightmap of the surrounding area (your puzzle
|
||||
input). The heightmap shows the local area from above broken into a
|
||||
grid; the elevation of each square of the grid is given by a single
|
||||
lowercase letter, where =a= is the lowest elevation, =b= is the
|
||||
next-lowest, and so on up to the highest elevation, =z=.
|
||||
|
||||
Also included on the heightmap are marks for your current position (=S=)
|
||||
and the location that should get the best signal (=E=). Your current
|
||||
position (=S=) has elevation =a=, and the location that should get the
|
||||
best signal (=E=) has elevation =z=.
|
||||
|
||||
You'd like to reach =E=, but to save energy, you should do it in /as few
|
||||
steps as possible/. During each step, you can move exactly one square
|
||||
up, down, left, or right. To avoid needing to get out your climbing
|
||||
gear, the elevation of the destination square can be /at most one
|
||||
higher/ than the elevation of your current square; that is, if your
|
||||
current elevation is =m=, you could step to elevation =n=, but not to
|
||||
elevation =o=. (This also means that the elevation of the destination
|
||||
square can be much lower than the elevation of your current square.)
|
||||
|
||||
For example:
|
||||
|
||||
#+begin_example
|
||||
Sabqponm
|
||||
abcryxxl
|
||||
accszExk
|
||||
acctuvwj
|
||||
abdefghi
|
||||
#+end_example
|
||||
|
||||
Here, you start in the top-left corner; your goal is near the middle.
|
||||
You could start by moving down or right, but eventually you'll need to
|
||||
head toward the =e= at the bottom. From there, you can spiral around to
|
||||
the goal:
|
||||
|
||||
#+begin_example
|
||||
v..v<<<<
|
||||
>v.vv<<^
|
||||
.>vv>E^^
|
||||
..v>>>^^
|
||||
..>>>>>^
|
||||
#+end_example
|
||||
|
||||
In the above diagram, the symbols indicate whether the path exits each
|
||||
square moving up (=^=), down (=v=), left (=<=), or right (=>=). The
|
||||
location that should get the best signal is still =E=, and =.= marks
|
||||
unvisited squares.
|
||||
|
||||
This path reaches the goal in =31= steps, the fewest possible.
|
||||
|
||||
/What is the fewest steps required to move from your current position to
|
||||
the location that should get the best signal?/
|
||||
|
||||
Your puzzle answer was =408=.
|
||||
|
||||
** --- Part Two ---
|
||||
As you walk up the hill, you suspect that the Elves will want to turn
|
||||
this into a hiking trail. The beginning isn't very scenic, though;
|
||||
perhaps you can find a better starting point.
|
||||
|
||||
To maximize exercise while hiking, the trail should start as low as
|
||||
possible: elevation =a=. The goal is still the square marked =E=.
|
||||
However, the trail should still be direct, taking the fewest steps to
|
||||
reach its goal. So, you'll need to find the shortest path from /any
|
||||
square at elevation =a=/ to the square marked =E=.
|
||||
|
||||
Again consider the example from above:
|
||||
|
||||
#+begin_example
|
||||
Sabqponm
|
||||
abcryxxl
|
||||
accszExk
|
||||
acctuvwj
|
||||
abdefghi
|
||||
#+end_example
|
||||
|
||||
Now, there are six choices for starting position (five marked =a=, plus
|
||||
the square marked =S= that counts as being at elevation =a=). If you
|
||||
start at the bottom-left square, you can reach the goal most quickly:
|
||||
|
||||
#+begin_example
|
||||
...v<<<<
|
||||
...vv<<^
|
||||
...v>E^^
|
||||
.>v>>>^^
|
||||
>^>>>>>^
|
||||
#+end_example
|
||||
|
||||
This path reaches the goal in only =29= steps, the fewest possible.
|
||||
|
||||
/What is the fewest steps required to move starting from any square with
|
||||
elevation =a= to the location that should get the best signal?/
|
||||
|
||||
Your puzzle answer was =399=.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
200
2022/day12/aoc.bash
Executable file
200
2022/day12/aoc.bash
Executable file
@@ -0,0 +1,200 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# aoc.bash: Advent of Code 2022, day 12
|
||||
#
|
||||
# Copyright (C) 2022 Bruno Raoult ("br")
|
||||
# Licensed under the GNU General Public License v3.0 or later.
|
||||
# Some rights reserved. See COPYING.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with this
|
||||
# program. If not, see <https://www.gnu.org/licenses/gpl-3.0-standalone.html>.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later <https://spdx.org/licenses/GPL-3.0-or-later.html>
|
||||
|
||||
. common.bash
|
||||
|
||||
#declare -a map map2
|
||||
declare -A height map visited
|
||||
declare -i X Y
|
||||
declare start end push=push1
|
||||
declare -a queue
|
||||
|
||||
printmap() {
|
||||
local -i x y
|
||||
for (( y = 0; y < Y; ++y )); do
|
||||
for (( x = 0; x < X; ++x )); do
|
||||
printf "%2d " "${map["$x,$y"]}"
|
||||
done
|
||||
echo
|
||||
done
|
||||
}
|
||||
|
||||
printvis() {
|
||||
local -i x y
|
||||
for (( y = 0; y < Y; ++y )); do
|
||||
for (( x = 0; x < X; ++x )); do
|
||||
printf "%2d " "${visited["$x,$y"]}"
|
||||
done
|
||||
echo
|
||||
done
|
||||
}
|
||||
|
||||
push1() { # push part 1
|
||||
local -i _d="$1" _x="$2" _y="$3" _h="$4"
|
||||
local _c="$_x,$_y"
|
||||
printf "push d=%d x=%d y=%d h=%d nh=%d... " "$_d" "$_x" "$_y" "$_h" \
|
||||
"${map[$_c]}"
|
||||
if (( !visited[$_c] && map[$_c] <= (_h + 1) )); then
|
||||
(( _d++ ))
|
||||
visited["$_c"]=$_d
|
||||
queue+=("$_d:$_c")
|
||||
echo "$_d:$_c" pushed.
|
||||
else
|
||||
echo not pushed.
|
||||
fi
|
||||
#local str="$_d:$_x-$_y"
|
||||
#queue+=("$1")
|
||||
}
|
||||
|
||||
push2() { # push part 2
|
||||
local -i _d="$1" _x="$2" _y="$3" _h="$4"
|
||||
local _c="$_x,$_y"
|
||||
printf "push d=%d x=%d y=%d h=%d nh=%d... " "$_d" "$_x" "$_y" "$_h" \
|
||||
"${map[$_c]}"
|
||||
if (( !visited[$_c] && map[$_c] >= (_h - 1) )); then
|
||||
(( _d++ ))
|
||||
visited["$_c"]=$_d
|
||||
queue+=("$_d:$_c")
|
||||
echo "$_d:$_c" pushed.
|
||||
else
|
||||
echo not pushed.
|
||||
fi
|
||||
#local str="$_d:$_x-$_y"
|
||||
#queue+=("$1")
|
||||
}
|
||||
|
||||
pop() {
|
||||
local -n _d="$1" _x="$2" _y="$3"
|
||||
local head
|
||||
((!${#queue[@]})) && echo pop: queue empty. && return 1
|
||||
head="${queue[0]}"
|
||||
#echo "Q=${#queue[@]}=${queue[*]} head=$head"
|
||||
# shellcheck disable=2034
|
||||
printf "pop: %s\t" "$head"
|
||||
_d=${head%:*}
|
||||
# shellcheck disable=2034
|
||||
head=${head#*:}
|
||||
_x=${head%,*}
|
||||
_y=${head#*,}
|
||||
unset 'queue[0]'
|
||||
queue=("${queue[@]}")
|
||||
printf "pop: d=%d x=%d y=%d remain=%d\n" "$_d" "$_x" "$_y" "${#queue[@]}"
|
||||
#echo "Q=${#queue[@]}=${queue[*]} head=$head"
|
||||
return 0
|
||||
}
|
||||
|
||||
# initialize height values
|
||||
init() {
|
||||
declare -i i=1
|
||||
for c in {a..z}; do
|
||||
(( height[$c] = i++ ))
|
||||
#echo
|
||||
done
|
||||
height[S]=1
|
||||
height[E]=26
|
||||
}
|
||||
|
||||
parse() {
|
||||
local -i part="$1"
|
||||
local -a _map
|
||||
local -i x y
|
||||
local c
|
||||
((part == 2)) && push=push2
|
||||
|
||||
init
|
||||
readarray -t _map
|
||||
X=${#_map[0]}
|
||||
Y=${#_map[@]}
|
||||
echo "X=$X Y=$Y"
|
||||
# create array map[x,y]
|
||||
for (( y = 0; y < Y; ++y )); do
|
||||
for (( x = 0; x < X; ++x )); do
|
||||
c=${_map[$y]:x:1}
|
||||
# printf "y=%d x=%d c=%s h=%d " "$y" "$x" "$c" "${height[$c]}"
|
||||
map["$x,$y"]=${height[$c]}
|
||||
# printf "M=%s\n" "${map["$x,$y"]}"
|
||||
case "$c" in
|
||||
S) start="$x,$y"
|
||||
((part == 1)) && $push 0 "$x" "$y" 1
|
||||
#printf "\tstart\n"
|
||||
;;
|
||||
E) end="$x,$y"
|
||||
((part == 2)) && $push 0 "$x" "$y" 1
|
||||
#printf "\tend\n"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
done
|
||||
printf "start=%s end=%s\n" "$start" "$end"
|
||||
printmap
|
||||
}
|
||||
|
||||
solve() {
|
||||
#local depth coord
|
||||
local -i h d x y
|
||||
|
||||
|
||||
#push 0 ${start%-*} ${start#*-} 1
|
||||
#push "11:46-55"
|
||||
while pop d x y; do
|
||||
(( h=${map["$x,$y"]} ))
|
||||
if [[ $part == 1 ]]; then
|
||||
if [[ "$x,$y" == "$end" ]]; then
|
||||
res=$((d-1))
|
||||
printmap
|
||||
echo
|
||||
printvis
|
||||
return
|
||||
fi
|
||||
else
|
||||
if [[ "${map["$x,$y"]}" == 1 ]]; then
|
||||
res=$((d-1))
|
||||
printmap
|
||||
echo
|
||||
printvis
|
||||
return
|
||||
fi
|
||||
fi
|
||||
if ((y > 0)); then # north
|
||||
$push "$d" "$x" "$((y-1))" "$h"
|
||||
fi
|
||||
if ((x+1 < X)); then # east
|
||||
$push "$d" "$((x+1))" "$y" "$h"
|
||||
fi
|
||||
if ((y+1 < Y)); then # south
|
||||
$push "$d" "$x" "$((y+1))" "$h"
|
||||
fi
|
||||
if ((x > 0)); then # west
|
||||
$push "$d" "$((x-1))" "$y" "$h"
|
||||
fi
|
||||
#echo "d=$d x=$x y=$y"
|
||||
echo
|
||||
done
|
||||
#push "10:45-54"
|
||||
# push "11:46-55"
|
||||
# pop dep x y
|
||||
# echo "d=$d x=$x y=$y"
|
||||
# pop dep x y
|
||||
# echo "d=$d x=$x y=$y"
|
||||
# push "78:1-2"
|
||||
# pop dep x y
|
||||
# echo "d=$d x=$x y=$y"
|
||||
# #pop d c
|
||||
# #echo "d=$d c=$c"
|
||||
|
||||
# :
|
||||
# #(( part == 2 )) && (( _loops = 10000, divisor = 1 ))
|
||||
}
|
||||
|
||||
main "$@"
|
||||
exit 0
|
17
2022/day12/aoc.h
Normal file
17
2022/day12/aoc.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/* aoc.c: Advent of Code 2022
|
||||
*
|
||||
* Copyright (C) 2022 Bruno Raoult ("br")
|
||||
* Licensed under the GNU General Public License v3.0 or later.
|
||||
* Some rights reserved. See COPYING.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with this
|
||||
* program. If not, see <https://www.gnu.org/licenses/gpl-3.0-standalone.html>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later <https://spdx.org/licenses/GPL-3.0-or-later.html>
|
||||
*/
|
||||
#ifndef _AOC_H_
|
||||
#define _AOC_H_
|
||||
|
||||
extern int parseargs(int ac, char**av);
|
||||
|
||||
#endif /* _AOC_H_ */
|
68
2022/day12/common.bash
Normal file
68
2022/day12/common.bash
Normal file
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# common.bash: Advent of Code 2022, common bash functions
|
||||
#
|
||||
# Copyright (C) 2022 Bruno Raoult ("br")
|
||||
# Licensed under the GNU General Public License v3.0 or later.
|
||||
# Some rights reserved. See COPYING.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with this
|
||||
# program. If not, see <https://www.gnu.org/licenses/gpl-3.0-standalone.html>.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later <https://spdx.org/licenses/GPL-3.0-or-later.html>
|
||||
|
||||
# shellcheck disable=2034
|
||||
export cmdname=${0##*/}
|
||||
export debug=0
|
||||
export res
|
||||
export LANG=C
|
||||
|
||||
shopt -s extglob
|
||||
set -o noglob
|
||||
|
||||
usage() {
|
||||
printf "usage: %s [-d DEBUG] [-p PART]\n" "$cmdname"
|
||||
exit 1
|
||||
}
|
||||
|
||||
checkargs() {
|
||||
local part=1
|
||||
while getopts p:d: todo; do
|
||||
case "$todo" in
|
||||
d)
|
||||
if [[ "$OPTARG" =~ ^[[:digit:]+]$ ]]; then
|
||||
debug="$OPTARG"
|
||||
else
|
||||
printf "%s: illegal [%s] debug level.\n" "$CMD" "$OPTARG"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
p)
|
||||
if [[ "$OPTARG" =~ ^[12]$ ]]; then
|
||||
part="$OPTARG"
|
||||
else
|
||||
printf "%s: illegal [%s] part.\n" "$CMD" "$OPTARG"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
done
|
||||
# Now check remaining argument (backup directory)
|
||||
shift $((OPTIND - 1))
|
||||
|
||||
(( $# > 1 )) && usage
|
||||
return "$part"
|
||||
}
|
||||
|
||||
main() {
|
||||
local -i part
|
||||
|
||||
checkargs "$@"
|
||||
part=$?
|
||||
parse "$part"
|
||||
solve "$part"
|
||||
printf "%s: res=%s\n" "$cmdname" "$res"
|
||||
}
|
49
2022/day12/common.c
Normal file
49
2022/day12/common.c
Normal file
@@ -0,0 +1,49 @@
|
||||
/* common.c: Advent of Code 2022, common functions
|
||||
*
|
||||
* Copyright (C) 2022 Bruno Raoult ("br")
|
||||
* Licensed under the GNU General Public License v3.0 or later.
|
||||
* Some rights reserved. See COPYING.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with this
|
||||
* program. If not, see <https://www.gnu.org/licenses/gpl-3.0-standalone.html>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later <https://spdx.org/licenses/GPL-3.0-or-later.html>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "aoc.h"
|
||||
#include "debug.h"
|
||||
|
||||
static int usage(char *prg)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s [-d debug_level] [-p part] [-i input]\n", prg);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int parseargs(int ac, char **av)
|
||||
{
|
||||
int opt, part = 1;
|
||||
|
||||
while ((opt = getopt(ac, av, "d:p:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'd':
|
||||
debug_level_set(atoi(optarg));
|
||||
break;
|
||||
case 'p': /* 1 or 2 */
|
||||
part = atoi(optarg);
|
||||
if (part < 1 || part > 2)
|
||||
return usage(*av);
|
||||
break;
|
||||
case 'i':
|
||||
|
||||
default:
|
||||
return usage(*av);
|
||||
}
|
||||
}
|
||||
if (optind < ac)
|
||||
return usage(*av);
|
||||
return part;
|
||||
}
|
5
2022/day12/input/example.txt
Normal file
5
2022/day12/input/example.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
Sabqponm
|
||||
abcryxxl
|
||||
accszExk
|
||||
acctuvwj
|
||||
abdefghi
|
41
2022/day12/input/input.txt
Normal file
41
2022/day12/input/input.txt
Normal file
@@ -0,0 +1,41 @@
|
||||
abaaaaaccccccccccccccccccaaaaaaaaaaaaaccccaaaaaaaccccccccccccccccccccccccccccaaaaaa
|
||||
abaaaaaaccaaaacccccccccccaaaaaaaaacaaaacaaaaaaaaaacccccccccccccccccccccccccccaaaaaa
|
||||
abaaaaaacaaaaaccccccccccaaaaaaaaaaaaaaacaaaaaaaaaacccccccccccccaacccccccccccccaaaaa
|
||||
abaaaaaacaaaaaacccccccccaaaaaaaaaaaaaaccaaacaaaccccccccccccccccaacccccccccccccccaaa
|
||||
abccaaaccaaaaaacccaaaaccaaaaaaaaaaaaaccccaacaaacccccccccaacaccccacccccccccccccccaaa
|
||||
abcccccccaaaaaccccaaaacccccaaaaacccaaaccaaaaaaccccccccccaaaaccccccccccccccccccccaac
|
||||
abcccccccccaaaccccaaaacccccaaaaacccccccccaaaaaccccccccccklllllccccccccccccccccccccc
|
||||
abcccccccccccccccccaaccccccccaaccccccccaaaaaaaccccccccckklllllllcccccddccccaacccccc
|
||||
abaccccccccccccccccccccccccccaaccccccccaaaaaaaaccccccckkkklslllllcccddddddaaacccccc
|
||||
abacccccccccccccccccccccccccccccccaaaccaaaaaaaaccccccckkkssssslllllcddddddddacccccc
|
||||
abaccccccccccccccccccccccccccccccccaaaaccaaacaccccccckkksssssssslllmmmmmdddddaacccc
|
||||
abcccccccccccccccaaacccccccccccccaaaaaaccaacccccccccckkkssssusssslmmmmmmmdddddacccc
|
||||
abcccccccaaccccaaaaacccccccccccccaaaaaccccccaaaaaccckkkrssuuuussssqmmmmmmmmdddccccc
|
||||
abcccccccaaccccaaaaaacccccccaaccccaaaaacccccaaaaacckkkkrruuuuuussqqqqqqmmmmdddccccc
|
||||
abccccaaaaaaaacaaaaaacccccccaaaaccaaccaccccaaaaaacjkkkrrruuuxuuusqqqqqqqmmmmeeccccc
|
||||
abcaaaaaaaaaaacaaaaaccccccaaaaaacccccaaccccaaaaajjjjrrrrruuuxxuvvvvvvvqqqmmmeeccccc
|
||||
abcaacccaaaaccccaaaaaaacccaaaaacccacaaaccccaaaajjjjrrrrruuuxxxxvvvvvvvqqqmmeeeccccc
|
||||
abaaaaccaaaaacccccccaaaccccaaaaacaaaaaaaacccaajjjjrrrrtuuuuxxxyvyyyvvvqqqnneeeccccc
|
||||
abaaaaaaaaaaacccaaaaaaaccccaacaacaaaaaaaacccccjjjrrrttttuxxxxxyyyyyvvvqqnnneeeccccc
|
||||
abaaaaaaaccaacccaaaaaaaaacccccccccaaaaaaccccccjjjrrrtttxxxxxxxyyyyyvvvqqnnneeeccccc
|
||||
SbaaaaaacccccccccaaaaaaaaaccccccccaaaaacccccccjjjrrrtttxxxEzzzzyyyvvrrrnnneeecccccc
|
||||
abaaaaacccccccccccaaaaaaacccccccccaaaaaaccccccjjjqqqtttxxxxxyyyyyvvvrrrnnneeecccccc
|
||||
abaaacccccccccccaaaaaaaccaaccccccccccaaccaaaaajjjqqqttttxxxxyyyyyyvvrrrnnneeecccccc
|
||||
abaaacccccccccccaaaaaaaccaaacaaacccccccccaaaaajjjjqqqtttttxxyywyyyywvrrnnnfeecccccc
|
||||
abcaaacccccccaaaaaaaaaaacaaaaaaaccccccccaaaaaaciiiiqqqqtttxwyywwyywwwrrrnnfffcccccc
|
||||
abcccccccccccaaaaaaaaaaccaaaaaacccccccccaaaaaacciiiiqqqqttwwywwwwwwwwrrrnnfffcccccc
|
||||
abccccccccccccaaaaaacccaaaaaaaacccccccccaaaaaaccciiiiqqqttwwwwwswwwwrrrrnnfffcccccc
|
||||
abccccccccccccaaaaaacccaaaaaaaaacccccccccaaacccccciiiqqqtswwwwssssrrrrrroofffcccccc
|
||||
abccccccaaaaacaaaaaacccaaaaaaaaaaccccccccccccccccciiiqqqssswsssssssrrrrooofffaccccc
|
||||
abccccccaaaaacaaccaaccccccaaacaaacccccccccccccccccciiiqqssssssspoorrrooooofffaacccc
|
||||
abcccccaaaaaacccccccccccccaaacccccccccccccccccccccciiiqppssssspppooooooooffffaacccc
|
||||
abcccccaaaaaacccccccccccccaacccccccccccccccccccccccciipppppppppppoooooooffffaaccccc
|
||||
abcccccaaaaaaccccccccccccccccccccccccccccccccccccccciihppppppppgggggggggfffaaaccccc
|
||||
abccccccaaacccccccccccccccccccccccaccccccccccccccccchhhhpppppphggggggggggfaaaaccccc
|
||||
abaaaccccccccccccccccccccccaccccaaacccccccccccccccccchhhhhhhhhhgggggggggcaacccccccc
|
||||
abaaccaaaccaccccccccccccccaaacccaaacaacccaaaaacccccccchhhhhhhhhgaaccccccccccccccccc
|
||||
abaaacaaacaacccccccccaaaccaaaacaaaaaaaaccaaaaaccccccccchhhhhhaaaaacccccccccccccccca
|
||||
abaaaccaaaaaccccccccccaaacaaaaaaaacaaaaccaaaaaaccccccccccaaacccaaaacccccccccccaccca
|
||||
abcccaaaaaaccccccccccaaaaaaaaaaaaacaaaaccaaaaaaccccccccccaaaccccaaaccccccccccaaaaaa
|
||||
abcccaaaaaaaacccccccaaaaaaaaaaaaaaaaaccccaaaaaacccccccccccccccccccccccccccccccaaaaa
|
||||
abcccaacaaaaaccccccaaaaaaaaaaaaaaaaaaacccccaacccccccccccccccccccccccccccccccccaaaaa
|
@@ -24,6 +24,16 @@
|
||||
#define _pjw_inline static inline
|
||||
#endif
|
||||
|
||||
/**
|
||||
* unsigned int pjwhash - PJW hash function
|
||||
* @key: the key address.
|
||||
* @length: the length of key.
|
||||
*
|
||||
* This hash was created by Peter Jay Weinberger (AT&T Bell Labs):
|
||||
* https://en.wikipedia.org/wiki/PJW_hash_function
|
||||
*
|
||||
* Return: the PJW hash.
|
||||
*/
|
||||
_pjw_inline unsigned int pjwhash(const void* key, uint length)
|
||||
{
|
||||
uint hash = 0, high;
|
||||
|
Reference in New Issue
Block a user