(Ebook) JavaScript Data Structures and Algorithms: An Introduction to Understanding and Implementing Core Data Structure and Algorithm Fundamentals by Sammie Bae ISBN 9781484239889, 1484239881 - Download the ebook now for an unlimited reading experience
(Ebook) JavaScript Data Structures and Algorithms: An Introduction to Understanding and Implementing Core Data Structure and Algorithm Fundamentals by Sammie Bae ISBN 9781484239889, 1484239881 - Download the ebook now for an unlimited reading experience
com
https://ebooknice.com/product/javascript-data-structures-
and-algorithms-an-introduction-to-understanding-and-
implementing-core-data-structure-and-algorithm-
fundamentals-52953836
OR CLICK BUTTON
DOWLOAD EBOOK
https://ebooknice.com/product/a-textbook-of-data-structures-and-algorithms-
volume-3-mastering-advanced-data-structures-and-algorithm-design-
strategies-47399684
ebooknice.com
(Ebook) Learning JavaScript Data Structures and Algorithms by Loiane Groner ISBN
9781785285493, 1785285491
https://ebooknice.com/product/learning-javascript-data-structures-and-
algorithms-5847376
ebooknice.com
(Ebook) Data Structures and Algorithms with JavaScript by Michael McMillan ISBN
9781449364939, 1449364934
https://ebooknice.com/product/data-structures-and-algorithms-with-
javascript-37208884
ebooknice.com
https://ebooknice.com/product/java-collections-an-introduction-to-abstract-data-
types-data-structures-and-algorithms-1824036
ebooknice.com
(Ebook) Data structures and algorithms made easy in Java : data structure and
algorithmic puzzles by Narasimha Karumanchi ISBN 9788192107554, 8192107558
https://ebooknice.com/product/data-structures-and-algorithms-made-easy-in-java-
data-structure-and-algorithmic-puzzles-32860808
ebooknice.com
https://ebooknice.com/product/data-structures-algorithms-in-kotlin-implementing-
practical-data-structures-in-kotlin-10996304
ebooknice.com
(Ebook) Learning JavaScript Data Structures and Algorithms: Write complex and
powerful JavaScript code using the latest ECMAScript, 3rd Edition by Loiane Groner
ISBN B077NB5H6Y
https://ebooknice.com/product/learning-javascript-data-structures-and-
algorithms-write-complex-and-powerful-javascript-code-using-the-latest-
ecmascript-3rd-edition-42371476
ebooknice.com
(Ebook) A Common-Sense Guide to Data Structures and Algorithms: Level Up Your Core
Programming Skills by Jay Wengrow ISBN 9781680502442, 1680502441
https://ebooknice.com/product/a-common-sense-guide-to-data-structures-and-
algorithms-level-up-your-core-programming-skills-11733950
ebooknice.com
(Ebook) Introduction to Algorithms & Data Structures 3: Learn Linear Data Structures
with Videos & Interview Questions. by Aremu Bolakale, Jr. Charles Johnson. ISBN
9791222443188, 122244318X
https://ebooknice.com/product/introduction-to-algorithms-data-
structures-3-learn-linear-data-structures-with-videos-interview-
questions-52327550
ebooknice.com
JavaScript Data
Structures and
Algorithms
An Introduction to Understanding and
Implementing Core Data Structure and
Algorithm Fundamentals
—
Sammie Bae
JavaScript Data Structures
and Algorithms
An Introduction to Understanding
and Implementing Core Data
Structure and Algorithm
Fundamentals
Sammie Bae
JavaScript Data Structures and Algorithms
Sammie Bae
Hamilton, ON, Canada
Introduction������������������������������������������������������������������������������������������������������������xxi
v
Table of Contents
vi
Table of Contents
String Shortening������������������������������������������������������������������������������������������������������������������������ 43
Encryption����������������������������������������������������������������������������������������������������������������������������������� 45
RSA Encryption���������������������������������������������������������������������������������������������������������������������� 46
Summary������������������������������������������������������������������������������������������������������������������������������� 50
vii
Table of Contents
Chapter 8: Recursion���������������������������������������������������������������������������������������������� 99
Introducing Recursion����������������������������������������������������������������������������������������������������������������� 99
Rules of Recursion�������������������������������������������������������������������������������������������������������������������� 100
Base Case���������������������������������������������������������������������������������������������������������������������������� 100
Divide-and-Conquer Method����������������������������������������������������������������������������������������������� 101
Classic Example: Fibonacci Sequence�������������������������������������������������������������������������������� 101
Fibonacci Sequence: Tail Recursion������������������������������������������������������������������������������������ 102
Pascal’s Triangle������������������������������������������������������������������������������������������������������������������ 103
Big-O for Recursion������������������������������������������������������������������������������������������������������������������� 105
Recurrence Relations���������������������������������������������������������������������������������������������������������� 105
Master Theorem������������������������������������������������������������������������������������������������������������������ 106
Recursive Call Stack Memory��������������������������������������������������������������������������������������������������� 107
Summary���������������������������������������������������������������������������������������������������������������������������������� 109
Exercises����������������������������������������������������������������������������������������������������������������������������������� 109
viii
Table of Contents
ix
Table of Contents
x
Table of Contents
xi
Table of Contents
xii
Table of Contents
xiii
Table of Contents
Index��������������������������������������������������������������������������������������������������������������������� 351
xiv
About the Author
Sammie Bae is a data engineer at Yelp and previously
worked for the data platform engineering team at
NVIDIA. He developed a deep interest in JavaScript
during an internship at SMART Technologies (acquired by
Foxconn), where he developed Node.js-based JavaScript
APIs for serial port communication between electronic
board drivers and a web application. Despite how relevant
JavaScript is to the modern software engineering industry,
currently no books besides this one teach algorithms and
data structures using JavaScript. Sammie understands how
difficult these computer science concepts are and aims to
provide clear and concise explanations in this book.
xv
About the Technical Reviewer
Phil Nash is a developer evangelist for Twilio, serving
developer communities in London and all over the world.
He is a Ruby, JavaScript, and Swift developer; Google
Developers Expert; blogger; speaker; and occasional brewer.
He can be found hanging out at meetups and conferences,
playing with new technologies and APIs, or writing open
source code.
xvii
Acknowledgments
Thank you, Phil Nash, for the valuable feedback that helped me improve the technical
content of this book with clear explanations and concise code.
Special thanks to the Apress team. This includes James Markham, Nancy Chen, Jade
Scard, and Chris Nelson. Finally, I want to thank Steve Anglin for reaching out to me to
publish with Apress.
xix
Introduction
The motivation for writing this book was the lack of resources available about data
structures and algorithms written in JavaScript. This was strange to me because
today many of the job opportunities for software development require knowledge of
JavaScript; it is the only language that can be used to write the entire stack, including the
front-end, mobile (native and hybrid) platforms, and back-end. It is crucial for JavaScript
developers to understand how data structures work and how to design algorithms to
build applications.
Therefore, this book aims to teach data structure and algorithm concepts from
computer science for JavaScript rather than for the more typical Java or C++. Because
JavaScript follows the prototypal inheritance pattern, unlike Java and C++ (which follow
the inheritance pattern), there are some changes in writing data structures in JavaScript.
The classical inheritance pattern allows inheritance by creating a blueprint-like form
that objects follow during inheritance. However, the prototypal inheritance pattern
means copying the objects and changing their properties.
This book first covers fundamental mathematics for Big-O analysis and then lays out
the basic JavaScript foundations, such as primitive objects and types. Then, this book
covers implementations and algorithms for fundamental data structures such as linked
lists, stacks, trees, heaps, and graphs. Finally, more advanced topics such as efficient
string search algorithms, caching algorithms, and dynamic programming problems are
explored in great detail.
xxi
CHAPTER 1
Big-O Notation
O(1) is holy.
—Hamid Tizhoosh
Before learning how to implement algorithms, you should understand how to analyze
the effectiveness of them. This chapter will focus on the concept of Big-O notation for
time and algorithmic space complexity analysis. By the end of this chapter, you will
understand how to analyze an implementation of an algorithm with respect to both time
(execution time) and space (memory consumed).
1
© Sammie Bae 2019
S. Bae, JavaScript Data Structures and Algorithms, https://doi.org/10.1007/978-1-4842-3988-9_1
Chapter 1 Big-O Notation
The following sections illustrate these common time complexities with some simple
examples.
Common Examples
O(1) does not change with respect to input space. Hence, O(1) is referred to as being
constant time. An example of an O(1) algorithm is accessing an item in the array by its
index. O(n) is linear time and applies to algorithms that must do n operations in the
worst-case scenario.
An example of an O(n) algorithm is printing numbers from 0 to n-1, as shown here:
1 function exampleLinear(n) {
2 for (var i = 0 ; i < n; i++ ) {
2
Chapter 1 Big-O Notation
3 console.log(i);
4 }
5 }
Similarly, O(n2) is quadratic time, and O(n3) is cubic time. Examples of these
complexities are shown here:
1 function exampleQuadratic(n) {
2 for (var i = 0 ; i < n; i++ ) {
3 console.log(i);
4 for (var j = i; j < n; j++ ) {
5 console.log(j);
6 }
7 }
8 }
1 function exampleCubic(n) {
2 for (var i = 0 ; i < n; i++ ) {
3 console.log(i);
4 for (var j = i; j < n; j++ ) {
5 console.log(j);
6 for (var k = j;
j < n; j++ ) {
7 console.log(k);
8 }
9 }
10 }
11 }
2,4,8,16,32,64
3
Chapter 1 Big-O Notation
The efficiency of logarithmic time complexities is apparent with large inputs such
as a million items. Although n is a million, exampleLogarithmic will print only 19
items because log2(1,000,000) = 19.9315686. The code that implements this logarithmic
behavior is as follows:
1 function exampleLogarithmic(n) {
2 for (var i = 2 ; i <= n; i= i*2 ) {
3 console.log(i);
4 }
5 }
4
Chapter 1 Big-O Notation
• Log of a power rule: log(nk) is O(log(n)) for any constant k > 0. With
the log of a power rule, constants within a log function are also
ignored in Big-O notation.
Special attention should be paid to the first three rules and the polynomial rule
because they are the most commonly used. I’ll discuss each of those rules in the
following sections.
This means that both 5f(n) and f(n) have the same Big-O notation of O(f(n)).
Here is an example of a code block with a time complexity of O(n):
1 function a(n){
2 var count =0;
3 for (var i=0;i<n;i++){
4 count+=1;
5 }
6 return count;
7 }
This block of code has f(n) = n. This is because it adds to count n times. Therefore,
this function is O(n) in time complexity:
1 function a(n){
2 var count =0;
3 for (var i=0;i<5*n;i++){
5
Chapter 1 Big-O Notation
4 count+=1;
5 }
6 return count;
7 }
This block has f(n) = 5n. This is because it runs from 0 to 5n. However, the first two
examples both have a Big-O notation of O(n). Simply put, this is because if n is close to
infinity or another large number, those four additional operations are meaningless. It is
going to perform it n times. Any constants are negligible in Big-O notation.
The following code block demonstrates another function with a linear time
complexity but with an additional operation on line 6:
1 function a(n){
2 var count =0;
3 for (var i=0;i<n;i++){
4 count+=1;
5 }
6 count+=3;
7 return count;
8 }
Lastly, this block of code has f(n) = n+1. There is +1 from the last operation
(count+=3). This still has a Big-O notation of O(n). This is because that 1 operation is not
dependent on the input n. As n approaches infinity, it will become negligible.
It is important to remember to apply the coefficient rule after applying this rule.
6
Chapter 1 Big-O Notation
The following code block demonstrates a function with two main loops whose time
complexities must be considered independently and then summed:
1 function a(n){
2 var count =0;
3 for (var i=0;i<n;i++){
4 count+=1;
5 }
6 for (var i=0;i<5*n;i++){
7 count+=1;
8 }
9 return count;
10 }
In this example, line 4 has f(n) = n, and line 7 has f(n) = 5n. This results in 6n.
However, when applying the coefficient rule, the final result is O(n) = n.
The following code block demonstrates a function with two nested for loops for
which the product rule is applied:
1 function (n){
2 var count =0;
3 for (var i=0;i<n;i++){
4 count+=1;
5 for (var i=0;i<5*n;i++){
6 count+=1;
7 }
8 }
9 return count;
10 }
7
Chapter 1 Big-O Notation
In this example, f(n) = 5n*n because line 7 runs 5n times for a total of n iterations.
Therefore, this results in a total of 5n2 operations. Applying the coefficient rule, the result
is that O(n)=n2.
1 function a(n){
2 var count =0;
3 for (var i=0;i<n*n;i++){
4 count+=1;
5 }
6 return count;
7 }
Summary
Big-O is important for analyzing and comparing the efficiencies of algorithms.
The analysis of Big-O starts by looking at the code and applying the rules to simplify
the Big-O notation. The following are the most often used rules:
8
Chapter 1 Big-O Notation
Exercises
Calculate the time complexities for each of the exercise code snippets.
EXERCISE 1
1 function someFunction(n) {
2
3 for (var i=0;i<n*1000;i++) {
4 for (var j=0;j<n*20;j++) {
5 console.log(i+j);
6 }
7 }
8
9 }
EXERCISE 2
1 function someFunction(n) {
2
3 for (var i=0;i<n;i++) {
4 for (var j=0;j<n;j++) {
5 for (var k=0;k<n;k++) {
6 for (var l=0;l<10;l++) {
7 console.log(i+j+k+l);
8 }
9 }
10 }
11 }
12
13 }
9
Chapter 1 Big-O Notation
EXERCISE 3
1 function someFunction(n) {
2
3 for (var i=0;i<1000;i++) {
4 console.log("hi");
5 }
6
7 }
EXERCISE 4
1 function someFunction(n) {
2
3 for (var i=0;i<n*10;i++) {
4 console.log(n);
5 }
6
7 }
EXERCISE 5
1 function someFunction(n) {
2
3 for (var i=0;i<n;i*2) {
4 console.log(n);
5 }
6
7 }
10
Chapter 1 Big-O Notation
EXERCISE 6
1 function someFunction(n) {
2
3 while (true){
4 console.log(n);
5 }
6 }
Answers
1. O(n2)
There are two nested loops. Ignore the constants in front of n.
2. O(n3)
There are four nested loops, but the last loop runs only until 10.
3. O(1)
Constant complexity. The function runs from 0 to 1000. This does
not depend on n.
4. O(n)
Linear complexity. The function runs from 0 to 10n. Constants are
ignored in Big-O.
5. O(log2n)
Logarithmic complexity. For a given n, this will operate only log2n
times because i is incremented by multiplying by 2 rather than
adding 1 as in the other examples.
6. O(∞)
11
CHAPTER 2
J avaScript Scope
The scope is what defines the access to JavaScript variables. In JavaScript, variables
can belong to the global scope or to the local scope. Global variables are variables that
belong in the global scope and are accessible from anywhere in the program.
1 test = "sss";
2 console.log(test); // prints "sss"
However, this creates a global variable, and this is one of the worst practices in
JavaScript. Avoid doing this at all costs. Always use var or let to declare variables.
Finally, when declaring variables that won’t be modified, use const.
Here’s an example:
1 function scope1(){
2 var top = "top";
3 bottom = "bottom";
4 console.log(bottom);
5
6 var bottom;
7 }
8 scope1(); // prints "bottom" - no error
How does this work? The previous is the same as writing the following:
1 function scope1(){
2 var top = "top";
3 var bottom;
4 bottom = "bottom"
5 console.log(bottom);
6 }
7 scope1(); // prints "bottom" - no error
The bottom variable declaration, which was at the last line in the function, is floated
to the top, and logging the variable works.
The key thing to note about the var keyword is that the scope of the variable is the
closest function scope. What does this mean?
In the following code, the scope2 function is the function scope closest to the print
variable:
1 function scope2(print){
2 if(print){
3 var insideIf = '12';
4 }
5 console.log(insideIf);
6 }
7 scope2(true); // prints '12' - no error
14
Chapter 2 JavaScript: Unique Parts
1 function scope2(print){
2 var insideIf;
3
4 if(print){
5 insideIf = '12';
6 }
7 console.log(insideIf);
8 }
9 scope2(true); // prints '12' - no error
In Java, this syntax would have thrown an error because the insideIf variable is
generally available only in that if statement block and not outside it.
Here’s another example:
1 var a = 1;
2 function four() {
3 if (true) {
4 var a = 4;
5 }
6
7 console.log(a); // prints '4'
8 }
4 was printed, not the global value of 1, because it was redeclared and available in
that scope.
1 function scope3(print){
2 if(print){
3 let insideIf = '12';
4 }
15
Chapter 2 JavaScript: Unique Parts
5 console.log(insideIf);
6 }
7 scope3(true); // prints ''
In this example, nothing is logged to the console because the insideIf variable is
available only inside the if statement block.
Variable Types
In JavaScript, there are seven primitive data types: boolean, number, string, undefined,
object, function, and symbol (symbol won’t be discussed). One thing that stands out
here is that undefined is a primitive value that is assigned to a variable that has just been
declared. typeof is the primitive operator used to return the type of a variable.
Truthy/Falsey Check
True/false checking is used in if statements. In many languages, the parameter inside
the if() function must be a boolean type. However, JavaScript (and other dynamically
typed languages) is more flexible with this. Here’s an example:
1 if(node){
2 ...
3 }
Here, node is some variable. If that variable is empty, null, or undefined, it will be
evaluated as false.
Here are commonly used expressions that evaluate to false:
• false
• 0
• undefined
• null
• true
• Non-empty strings
• Non-empty object
17
Chapter 2 JavaScript: Unique Parts
Here’s an example:
=== vs ==
JavaScript is a scripting language, and variables are not assigned a type during
declaration. Instead, types are interpreted as the code runs.
Hence, === is used to check equality more strictly than ==. === checks for both the
type and the value, while == checks only for the value.
"5" == 5 returns true because "5" is coerced to a number before the comparison.
On the other hand, "5" === 5 returns false because the type of "5" is a string, while 5 is
a number.
Objects
Most strongly typed languages such as Java use isEquals() to check whether two objects
are the same. You may be tempted to simply use the == operator to check whether two
objects are the same in JavaScript.
However, this will not evaluate to true.
1 var o1 = {};
2 var o2 = {};
3
4 o1 == o2 // returns false
5 o1 === o2 // returns false
18
Chapter 2 JavaScript: Unique Parts
Although these objects are equivalent (same properties and values), they are not
equal. Namely, the variables have different addresses in memory.
This is why most JavaScript applications use utility libraries such as lodash1 or
underscore,2 which have the isEqual(object1, object2) function to check two objects
or values strictly. This occurs via implementation of some property-based equality
checking where each property of the object is compared.
In this example, each property is compared to achieve an accurate object equality result.
1 function isEquivalent(a, b) {
2 // arrays of property names
3 var aProps = Object.getOwnPropertyNames(a);
4 var bProps = Object.getOwnPropertyNames(b);
5
6 // If their property lengths are different, they're different objects
7 if (aProps.length != bProps.length) {
8 return false;
9 }
10
11 for (var i = 0; i < aProps.length; i++) {
12 var propName = aProps[i];
13
14 // If the values of the property are different, not equal
15 if (a[propName] !== b[propName]) {
16 return false;
17 }
18 }
19
20 // If everything matched, correct
21 return true;
22 }
23 isEquivalent({'hi':12},{'hi':12}); // returns true
1
h ttps://lodash.com/
2
http://underscorejs.org/
19
Chapter 2 JavaScript: Unique Parts
However, this would still work for objects that have only a string or a number as the
property.
This is because functions and arrays cannot simply use the == operator to check for
equality.
Although the two functions perform the same operation, the functions have
different addresses in memory, and therefore the equality operator returns false.
The primitive equality check operators, == and ===, can be used only for strings and
numbers. To implement an equivalence check for objects, each property in the object
needs to be checked.
Summary
JavaScript has a different variable declaration technique than most programming
languages. var declares the variable within the function scope, let declares the variable
in the block scope, and variables can be declared without any operator in the global
scope; however, global scope should be avoided at all times. For type checking, typeof
should be used to validate the expected type. Finally, for equality checks, use == to check
the value, and use === to check for the type as well as the value. However, use these only
on non-object types such as numbers, strings, and booleans.
20
CHAPTER 3
JavaScript Numbers
This chapter will focus on JavaScript number operations, number representation, Number
objects, common number algorithms, and random number generation. By the end of
this chapter, you will understand how to work with numbers in JavaScript as well as how
to implement prime factorization, which is fundamental for encryption.
Number operations of a programming language allow you to compute numerical
values. Here are the number operators in JavaScript:
+ : addition
- : subtraction
/ : division
* : multiplication
% : modulus
These operators are universally used in other programming languages and are not
specific to JavaScript.
N
umber System
JavaScript uses a 32-bit floating-point representation for numbers, as shown in Figure 3-1.
In this example, the value is 0.15625. The sign bit (the 31st bit) indicates that the number
is negative if the sign bit is 1. The next 8 bits (the 30th to 23rd bits) indicate the exponent
value, e. Finally, the remaining 23 bits represent the fraction value.
æ 23
ö
value = ( -1) ´ 2e -127 ´ ç 1 + åb23 -t 2 -t ÷
sign
è t =1 ø
With decimal fractions, this floating-point number system causes some rounding
errors in JavaScript. For example, 0.1 and 0.2 cannot be represented precisely.
Hence, 0.1 + 0.2 === 0.3 yields false.
22
Chapter 3 JavaScript Numbers
Integer Rounding
Since JavaScript uses floating point to represent all numbers, integer division does not work.
Integer division in programming languages like Java simply evaluates division
expressions to their quotient.
For example, 5/4 is 1 in Java because the quotient is 1 (although there is a remainder
of 1 left). However, in JavaScript, it is a floating point.
1 5/4; // 1.25
23
Chapter 3 JavaScript Numbers
This is because Java requires you to explicitly type the integer as an integer.
Hence, the result cannot be a floating point. However, if JavaScript developers want to
implement integer division, they can do one of the following:
Math.floor(0.9); // 0
Math.floor(1.1); // 1
Math.round(0.49); // 0
Math.round(0.5); // 1
Math.round(2.9); // 3
Math.ceil(0.1); // 1 Math.ceil(0.9); // 1 Math.ceil(21);
// 21 Math.ceil(21.01); // 22
Number.EPSILON
Number.EPSILON returns the smallest interval between two representable numbers.
This is useful for the problem with floating-point approximation.
1 function numberEquals(x, y) {
2 return Math.abs(x - y) < Number.EPSILON;
3 }
4
5 numberEquals(0.1 + 0.2, 0.3); // true
This function works by checking whether the difference between the two numbers
are smaller than Number.EPSILON. Remember that Number.EPSILON is the smallest
difference between two representable numbers. The difference between 0.1+0.2 and 0.3
will be smaller than Number.EPSILON.
Maximums
Number.MAX_SAFE_INTEGER returns the largest integer.
24
Chapter 3 JavaScript Numbers
This returns true because it cannot go any higher. However, it does not work for
floating-point decimals.
1
Number.MAX_SAFE_INTEGER + 1.111 === Number.MAX_SAFE_INTEGER + 2.022;
// false
Minimums
Number.MIN_SAFE_INTEGER returns the smallest integer.
Number.MIN_SAFE_INTEGER is equal to -9007199254740991.
This returns true because it cannot get any smaller. However, it does not work for
floating-point decimals.
25
Chapter 3 JavaScript Numbers
Infinity
The only thing greater than Number.MAX_VALUE is Infinity, and the only thing smaller
than Number.MAX_SAFE_INTEGER is -Infinity.
Size Summary
This inequality summarizes the size of JavaScript numbers from smallest (left) to
largest (right):
Number Algorithms
One of the most discussed algorithms involving numbers is for testing whether a number
is a prime number. Let’s review this now.
Primality Test
A primality test can be done by iterating from 2 to n, checking whether modulus division
(remainder) is equal to zero.
1 function isPrime(n){
2 if (n <= 1) {
3 return false;
4 }
5
6 // check from 2 to n-1
7 for (var i=2; i<n; i++) {
8 if (n%i == 0) {
9 return false;
10 }
26
Chapter 3 JavaScript Numbers
11 }
12
13 return true;
14 }
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97
This is difficult to notice, but all primes are of the form 6k ± 1, with the exception of
2 and 3 where k is some integer. Here’s an example:
Also realize that for testing the prime number n, the loop only has to test until the
square root of n. This is because if the square root of n is not a prime number, n is not a
prime number by mathematical definition.
1 function isPrime(n){
2 if (n <= 1) return false;
3 if (n <= 3) return true;
4
5 // This is checked so that we can skip
6 // middle five numbers in below loop
7 if (n%2 == 0 || n%3 == 0) return false;
8
9 for (var i=5; i*i<=n; i=i+6){
10 if (n%i == 0 || n%(i+2) == 0)
11 return false;
12 }
13
14 return true;
15 }
27
Chapter 3 JavaScript Numbers
P
rime Factorization
Another useful algorithm to understand is for determining prime factorization of a
number. Prime numbers are the basis of encryption (covered in Chapter 4) and hashing
(covered in Chapter 11), and prime factorization is the process of determining which
prime numbers multiply to a given number. Given 10, it would print 5 and 2.
1 function primeFactors(n){
2 // Print the number of 2s that divide n
3 while (n%2 == 0) {
4 console.log(2);
5 n = n/2;
6 }
7
8 // n must be odd at this point. So we can skip one element
(Note i = i +2)
9 for (var i = 3; i*i <= n; i = i+2) {
10 // While i divides n, print i and divide n
11 while (n%i == 0) {
12 console.log(i);
13 n = n/i;
14 }
15 }
16 //This condition is to handle the case when n is a prime number
17 //greater than 2
18 if (n > 2) {
19 console.log(n);
20 }
21 }
22 primeFactors(10); // prints '5' and '2'
28
Discovering Diverse Content Through
Random Scribd Documents
葬於烏鳶,時時邏守之。越日,莊始經此,虎暴出,於馬上撲莊落,
齙其首,咽之。焦桐返馬而射,中虎腹,蹶然遂斃。
杲在錯楚中,恍若夢醒;又經宵,始能行步,厭厭以歸。家人
以其連夕不返,方共駭疑,見之,喜相慰問。杲但臥,蹇澀不能語。
少間,聞莊信,爭即床頭慶告之。杲乃自言:“虎即我也。”遂述其
異,由此傳播。莊子痛父之死甚慘,聞而惡之,因訟果官以其誕而無
據,置不理焉。
異史氏曰:“壯士志酬,必不生返,此千古所悼恨也。借人之殺
以爲生,仙人之術亦神哉!然天下事足發指者多矣。使怨者常爲人,
恨不令暫作虎!”
〈董公子〉
青州董尚書可畏,家庭嚴肅,内外男女,不敢通一語。一日,
有婢僕調笑於中門之外,公子見而怒叱之,各奔去。及夜公子偕僮臥
齋中,時方盛暑,室門洞敞。更深時,僮聞床上有聲甚厲,驚醒;月
影中見前僕提一物出門去,以其家人故,弗深怪,遂複寐。忽聞靴聲
訇然,一偉丈夫赤而修髯,似壽亭侯像,捉一人頭入。僮懼,蛇行入
床下,聞床上支支格格如振衣,如摩腹,移時始罷。靴聲又響,乃
去。僮伸頸漸出,見窗欞上有曉色。以手捫床上,着手沾濕,嗅之血
腥。大呼公子,公子方醒,告而火之,血盈枕席。大駭,不知其故。
忽有官役叩門,公子出見,役愕然,但言怪事。詰之,告
曰:“適衙前一人神色迷罔,大聲曰:‘我殺主人矣!’眾見其衣有血
污,執而白之官,審知爲公子家人。渠言已殺公子,埋首於關廟之
側。往驗之,穴土猶新,而首則並無。”公子駭異,趨赴公庭,見其人
即前狎婢者也。因述其異。官甚惶惑,重責而釋之。公子不欲結怨於
小人,以前婢配之,令去。
積數日,其鄰堵者,夜聞僕房中一聲震響若崩裂,急起呼之,
不應。排闥入視,見夫婦及寢床,皆截然斷而爲兩。木肉上俱有削
痕,似一刀所斷者。關公之靈蹟最多,未有奇於此者也。
〈周三〉
泰安張太華,富吏也。家有狐擾,不可堪,遣制罔效。陳其狀於
州尹,尹亦不能爲力。時州之東亦有狐居村民家,人共見爲一白發
叟,叟與居人通弔問,如世人禮。自雲行二,都呼爲胡二爺。適有諸
生謁尹,間道其異。尹爲吏策,使往問叟,時東村人有作隸者,吏訪
之,果不誣,因與俱往。即隸家設筵招胡,胡至,揖讓酬酢,無異常
人。吏告所求,胡曰:“我固悉之,但不能爲君效力。僕友人周三,僑
居嶽廟,宜可降伏,當代求之。”吏喜,申謝。胡臨别與吏約,明日張
筵於嶽廟之東,吏領教。
胡果導周至。周虯髯鐵面,服褲褶。飲數行,向吏曰:“適胡二
弟致尊意,事已盡悉。但此輩實繁有徒,不可善諭,難免用武。請即
假館君家,微勞所不敢辭。”吏轉念去一狐,得一狐,是以暴易暴也,
游移不敢即應。周已知之,曰:“無畏。我非他比,且與君有喜緣,請
勿疑。”吏諾之。周又囑:“明日偕家人闔戶坐室中,幸勿嘩。”吏歸,
悉遵所教。俄聞庭中攻擊刺鬥之聲,逾時始定。啟關出視,血點點盈
階上;墀中有小狐首數枚,大如碗盞焉;又視所除舍,則周危坐其
中,拱手笑曰:“蒙重托,妖類已盪滅矣。”自是館於其家,相見如主
客焉。
〈鴿異〉
鴿類甚繁:晉有坤星,魯有鶴秀,黔有腋蝶,梁有翻跳,越有
諸尖,皆異種也。又有靴頭、點子、大白、黑石、夫婦雀、花狗眼之
類,名不可屈以指,惟好事者能辨之也。
鄒平張公子幼量癖好之,按經而求,務盡其種。其養之也,如
保嬰兒:冷則療以粉草,熱則投以鹽顆。鴿善睡,睡太甚,有病麻痹
而死者。張在廣陵,以十金購一鴿,體最小,善走,置地上,盤鏇無
已時,不至於死不休也,故常須人把握之;夜置群中使驚諸鴿,可以
免痹股之病,是名“夜游”。齊魯養鴿家,無如公子最;公子亦以鴿自
詡。
一夜坐齋中,忽一白衣少年叩扉入,殊不相識。問之,答
曰:“漂泊之人,姓名何足道。遙聞畜鴿最盛,此亦生平所好,願得寓
目。”張乃盡出所有,五色俱備,燦若雲錦。少年笑曰:“人言果不
虛,公子可謂養鴿之能事矣。僕亦擕有一兩頭,頗願觀之否?”張喜,
從少年去。月色冥漠,曠野蕭條,心竊疑俱。少年指曰:“請勉行,寓
屋不遠矣。”又數武,見一道院僅兩楹,少年握手入,昧無燈火。少年
立庭中,口中作鴿鳴。忽有兩鴿出:狀類常鴿而毛純白,飛與檐齊,
且鳴且鬥,每一撲,必作斤鬥。少年揮之以肱,連翼而去。複撮口作
異聲,又有兩鴿出:大者如鶩,小者裁如拳,集階上,學鶴舞。大者
延頸立,張翼作屏,宛轉鳴跳,若引之;小者上下飛鳴,時集其頂,
翼翩翩如燕子落蒲葉上,聲紙碎類鼗鼓;大者伸頸不敢動。鳴愈急,
聲變如磬,兩兩相和,間雜中節。既而小者飛起,大者又顛倒引呼
之。張嘉歎不已,自覺望洋可愧。遂揖少年,乞求分愛,少年不許。
又固求之,少年乃叱鴿去,仍作前聲,招二白鴿來,以手把之,
曰:“如不嫌憎,以此塞責。”接而玩之,睛映月作琥珀色,兩目通
透,若無隔閡,中黑珠圓於椒粒;啟其翼,脅肉晶瑩,髒腑可數。張
甚奇之,而意猶未足,詭求不已。少年曰:“尚有兩種未獻,今不敢複
請觀矣。”
方競論間,家人燎麻炬入尋主人。回視少年,化白鴿大如雞,
沖霄而去。又目前院宇都渺,蓋一小墓,樹二柏焉。與家人抱鴿,駭
歎而歸。試使飛,馴異如初,雖非其尤,人世亦絕少矣。於是愛惜臻
至。
積二年,育雌雄各三。雖戚好求之,不得也。有父執某公爲貴
官,一日見公子,問:“畜鴿幾許?”公子唯唯以退。疑某意愛好之
也,思所以報而割愛良難。又念長者之求,不可重拂。且不敢以常鴿
應,選二白鴿籠送之,自以千金之贈不啻也。他日見某公,頗有德
色,而其殊無一申謝語。心不能忍,問:“前禽佳否?”答雲:“亦肥
美。”張驚曰:“烹之乎?”曰:“然。”張大驚曰:“此非常鴿,乃俗所
言‘靼韃’者也!”某回思曰:“味亦殊無異處。”
張歎恨而返。至夜夢白衣少年至,責之曰:“我以君能愛之,故
遂托以子孫。何以明珠暗投,致殘鼎鑊!今率兒輩去矣。”言已化爲
鴿,所養白鴿皆從之,飛鳴徑去。天明視之,果俱亡矣。心甚恨之,
遂以所畜,分贈知交,數日而盡。異史氏曰:“物莫不聚於所好,故葉
公好龍,則真龍入室,而況學士之於良友,賢君之於良臣乎?而獨阿
堵之物,好者更多,而聚者特少,亦以見鬼神之怒貪,而不怒癡
也。”向有友人饋朱鯽於孫公子禹年,家無慧僕,以老傭往。及門,傾
水出魚,索柈而進之,及達主所,魚已枯斃。公子笑而不言,以酒犒
傭,即烹魚以饗。既歸,主人問:“公子得魚頗歡慰否?”答曰:“歡
甚。”問:“何以知?”曰:“公子見魚便欣然有笑容,立命賜酒,且烹
數尾以犒小人。”主人駭甚,自念所贈,頗不粗劣,何至烹賜下人。因
責之曰:“必汝蠢頑無禮,故公子遷怒耳。”傭颺手力辯曰:“我固陋
拙,遂以爲非人也!登公子門,小心如許,猶恐筲鬥不文,敬索柈
出,一一勻排而後進之,有何不周詳也?”主人罵而遣之。
靈隱寺僧某以茶得名,鐺臼皆精。然所蓄茶有數等,恒視客之
貴賤以爲烹獻;其最上者,非貴客及知味者,不一奉也。一日有貴官
至,僧伏謁甚恭,出佳茶,手自烹進,冀得稱譽。貴官默然。僧惑
甚,又以最上一等烹而進之。飲已將盡,並無讚語。僧急不能待,鞠
躬曰:“茶何如?”貴官執盞一拱曰:“甚熱。”此兩事,可與張公子之
贈鴿同一笑也。
〈聶政〉
懷慶潞王有昏德,時行民間,窺有好女子輒奪之。有王生妻,
爲王所睹,遣輿馬直入其家。女子號泣不伏,強舁而出。王亡去,隱
身聶政之墓,冀妻經過,得一遙訣。無何妻至,望見夫,大哭投地。
王惻動心懷,不覺失聲。從人知其王生,執之,將加榜掠。忽墓中一
丈夫出,手握白刃,氣象威猛,厲聲曰:“我聶政也!良家子豈可強
占!念汝輩不能自由,姑且宥恕。寄語無道王:若不改行,不日將抉
其首!”眾大駭,棄車而走。丈夫亦入墓中而沒。夫妻叩墓歸,猶懼王
命複臨。過十餘日,竟無消息,心始安。王自是淫威亦少殺雲。
異史氏曰:“餘讀刺客傳,而獨服膺於軹深井里也。其銳身而報
知己也,有豫之義;白晝而屠卿相,有之勇;皮面自刑,不累骨
肉,有曹之智。至於荆軻,力不足以謀無道秦,遂使絕裾而去,自取
滅亡。輕借樊將軍之頭,何日可能還也?此千古之所恨,而聶政之所
嗤者矣。聞之野史:其墳見掘於羊、左之鬼。果爾,則生不成名,死
猶喪義,其視聶之抱義憤而懲荒淫者,爲人之賢不肖何如哉!噫!聶
之賢,於此益信。”
〈冷生〉
平城冷生,少最鈍,年二十餘,未能通一經。忽有狐來與之燕
處,每聞其終夜語,即兄弟詰之,亦不肯泄。如是多日,忽得狂易
病,每得題爲文,則閉門枯坐,少時嘩然大笑。窺之,則手不停草,
而一藝成矣。脱稿又文思精妙。是年入泮,明年食餼。每逢場作笑,
響徹堂壁,由此“笑生”之名大噪。幸學使退休,不聞。後值某學使規
矩嚴肅,終日危坐堂上。忽聞笑聲,怒執之,將以加責,執事官代白
其顛。學使怒稍息,釋之,而黜其名。從此佯狂詩酒。著有《顛草》
四卷,超拔可誦。
異史氏曰:“閉門一笑,與佛家頓悟時何殊間哉!大笑成文,亦
一快事,何至以此褫革?如此主司,寧非悠悠!”學師孫景夏往訪友
人,至其窗外,不聞人語,但聞笑聲嗤然,頃刻數作。意其與人戲
耳。入視,則居之獨也。怪之。始大笑曰:“適無事,默熟笑談耳。”
邑宮生家畜一驢,性蹇劣,每途中逢徒步客,拱手謝曰:“適
忙,不遑下騎,勿罪!”言未已,驢已蹶然伏道上,屢試不爽。宮大慚
恨,因與妻謀,使偽作客。己乃跨驢周於庭,向妻拱手,作遇客語,
驢果伏。便以利錐毒刺之。適有友人相訪,方欲款關,聞宮言於内
曰:“不遑下騎,勿罪!”少頃,又言之。心大怪異,叩扉問其故,以
實告,相與捧腹。
此二則,可附冷生之笑並傳矣。
〈狐懲淫〉
某生購新第,常患狐。一切服物,多爲所毁,且時以塵土置湯
餅中。
一日有友過訪,值生出,至暮不歸。生妻備饌供客,已而借婢
啜食餘餌。生素不羈,好蓄媚藥,不知何時狐以藥置粥中,婦食之,
覺有腦麝氣,問婢,婢雲不知。食訖,覺欲焰上熾,不可暫忍,強自
按抑,燥渴愈急。籌思家中無可奔者,惟有客在,遂往叩齋。客問其
誰,實告之;問何作,不答。客謝曰:“我與若夫道義交,不敢爲此獸
行。”婦尚流連,客叱罵曰:“某兄文章品行,被汝喪盡矣!”隔窗唾
之,婦大慚乃退。因自念我何爲若此?忽憶碗中香,得毋媚藥也?檢
包中藥,果狼藉滿案,盎盞中皆是也。稔知冷水可解,因就飲之。頃
刻,心下清醒,愧恥無以自容。展轉既久,更漏已殘,愈恐天曉難以
見人,乃解帶自經。婢覺救之,氣已漸絕;辰後始有微息。客夜間已
遁。
生晡後方歸,見妻臥,問之不語,但含清涕。婢以狀告,大
驚,苦詰之。妻遣婢去,始以實告。生歎曰:“此我之淫報也,於卿何
尤?幸有良友,不然,何以爲人!”遂從此痛改往行,狐亦遂絕。
異史氏曰:“居家者相戒勿蓄砒鴆,從無有相戒不蓄媚藥者,亦
猶人之畏兵刃而狎床第也。寧知其毒有甚於砒鴆者哉!顧蓄之不過以
媚内耳!乃至見嫉於鬼神;況人之縱淫,有過於蓄藥者乎?”
某生赴試,自郡中歸,日已暮,擕有蓮實菱藕,入室,並置幾
上。又有藤津偽器一事,水浸盎中。諸鄰人以生新歸,擕酒登堂,生
倉卒置床下而出,令内子經營供饌,與客薄飲。飲已入内,急燭床
下,盎水已空。問婦,婦曰:“適與菱藕並出供客,何尚尋也?”生憶
餚中有黑條雜錯,擧座不知何物。乃失笑曰:“癡婆子!此何物事,可
供客耶?”婦亦疑曰:“我尚怨子不言烹法,其狀可醜,又不知何名,
隻得糊塗臠切耳。”生乃告之,相與大笑。今某生貴矣,相狎者猶以爲
戲。
〈山市〉
奐山山市,邑八景之一也,數年恒不一見。孫公子禹年,與同
人飲樓上,忽見山頭有孤塔聳起,高插青冥。相顧驚疑,念近中無此
禪院。無何,見宮殿數十所,碧瓦飛甍,始悟爲山市。未幾高垣睥
睨,連亙六七里,居然城郭矣。中有樓若者、堂若者、坊若者,歷歷
在目,以億萬計。忽大風起,塵氣莽莽然,城市依稀而已。既而風定
天清,一切烏有;惟危樓一座,直接霄漢。樓五架窗扉皆洞開,一行
有五點明處,樓外天也。層層指數:樓愈高則明漸小;數至八層、裁
如星點,又其上則黯然縹緲,不可計其層次矣。而樓上人往來屑屑,
或憑或立,不一狀。逾時樓漸低,可見其頂,又漸如常樓,又漸如高
舍,倏忽如拳如豆,遂不可見。又聞有早行者,見山上人煙市肆,與
世無别,故又名“鬼市”雲。
〈江城〉
臨江高蕃,少慧,儀容秀美,十四歲入邑庠。富室爭女之,生
選擇良苛,屢梗父命。父仲鴻年六十,止此子,寵惜之,不忍少拂。
東村有樊翁者,授童蒙於市肆,擕家僦生屋。翁有女,小字江
城,與生同甲,時皆八九歲,兩小無猜,日共嬉戲。後翁徙去,積四
五年,不複聞問。一日,生於隘巷中,見一女郎,豔美絕俗,從以小
鬟僅六七歲,不敢傾顧但斜睨之。女停睇若欲有言,細視之江城也。
頓大驚喜。各無所言,相視呆立,移時始别,兩情戀戀。生故以紅巾
遺地而去,小鬟拾之,喜以授女。女入袖中,易以己巾,偽謂鬟
曰:“高秀才非他人,勿得諱其遺物,可追還之。”小鬟果追付生,生
得巾大喜。歸見母,請與論婚。母曰:“家無半間屋,南北流寓,何足
疋偶?”生曰:“我自欲之,固當無悔。”母不能決,以商仲鴻,鴻執不
可。生聞之悶悶,嗌不容粒。母憂之,謂高曰:“樊氏雖貧,亦非狙儈
無賴者比。我請過其家,倘其女可偶,當亦無害。”高曰:“諾。”母托
燒香黑帝祠,詣之。見女明眸秀齒,居然娟好,心大愛悦。遂以金帛
厚贈之,實告以意。樊媼謙抑而後受盟。歸述其情,生始解顏爲笑。
逾歲擇吉迎女歸,夫妻相得甚歡。而女善怒,反眼若不相識,
詞舌嘲啁,常聒於耳。生以愛故,悉含忍之。翁媼聞之,心弗善也,
潛責其子。爲女所聞,大恚,詬罵彌加。生稍稍反其惡聲,女益怒,
撻逐出戶,闔其扉。生嚁嚁門外,不敢叩關,抱膝宿檐下。女從此視
若仇。其初,長跪猶可以解,漸至屈膝無靈,而丈夫益苦矣。翁姑薄
讓之,女抵牾不可言狀。翁姑忿怒,逼令大歸。
樊慚懼,浼交好者請於仲鴻,仲鴻不許。年餘,生出遇嶽,嶽
邀歸其家,謝罪不遑。妝女出見,夫婦相看,不覺惻楚。樊乃沽酒款
婿,酬勸甚殷。日暮堅止留宿,掃别榻,使夫婦並寢。既曙辭歸,不
敢以情告父母,掩飾彌縫。自此三五日,暫一寄嶽家宿,而父母不知
也。樊一日自詣仲鴻。初不見,迫而後見之。樊膝行而請,高不承,
諉諸其子。樊曰:“婿昨夜宿僕家,不聞有異言。”高驚問:“何時寄
宿?”樊具以告。高赧謝曰:“我固不知。彼愛之,我獨何仇乎?”樊既
去,高呼子而罵,生但俯首,不少出氣。言間,樊已送女至。高
曰:“我不能爲兒女任過,不如各立門戶,即煩主析爨之盟。”樊勸
之,不聽。遂别院居之,遣一婢給役焉。
月餘,頗相安,翁嫗竊慰。未幾女漸肆,生面上時有指爪痕,
父母明知之,亦忍不置問。一日生不堪撻楚,奔避父所,芒芒然如鳥
雀之被鹯毆者。翁媼方怪問,女已横梃追入,竟即翁側捉而棰之。翁
姑涕噪,略不顧贍,撻至數十,始悻悻以去。高逐子曰:“我惟避囂,
故析爾。爾固樂此,又焉逃乎?”
生被逐,徙倚無所歸。母恐其摺挫行死,今獨居而給之食。又
召樊來,使教其女。樊入室,開諭萬端,女終不聽,反以惡言相苦。
樊拂衣去,誓相絕。無何樊翁憤生病,與嫗相繼死。女恨之,亦不臨
弔,惟日隔壁噪罵,故使翁姑聞。高悉置不知。
生自獨居,若離湯火,但覺淒寂。暗以金啖媒媼李氏,納妓齋
中,往來皆以夜。久之,女微聞之,詣齋嫚罵。生力白其誣,矢以天
日,女始歸。自此日伺生隙。李媼自齋中出,適相遇,急呼之;媼神
色變異,女愈疑,謂媼曰:“明告所作,或可宥免;若有隱祕,撮毛盡
矣!”媼戰而告曰:“半月來,惟勾欄李雲娘過此兩度耳。適公子言,
曾於玉笥山見陶家婦,愛其雙翹,囑奴招致之。渠雖不貞,亦未便作
夜度娘,成否故未必也。”女以其言誠,姑從寬恕。媼欲去,又強止
之。日既昏,呵之曰:“可先往滅其燭,便言陶家至矣。”媼如其言。
女即速入。生喜極,挽臂促坐,具道饑渴。女默不語,生暗中索其
足,曰:“山上一覲仙容,介介獨戀是耳。”女終不語。生曰:“夙昔之
願,今始得遂,何可覿面而不識也?”躬自促火一照,則江城也。大懼
失色,堕燭於地,長跪觳觫,若兵在頸。女摘耳提歸,以針刺兩股殆
遍,乃臥以下床,醒則罵之。生以此畏若虎狼,即偶假以顏色,枕席
之上,亦震懾不能爲人。女批頰而叱去之,益厭棄不以人齒。生日在
蘭麝之鄉,如犴狴中人,仰獄吏之尊也。女有兩姊,俱適諸生。長姊
平善,訥於口,常與女不相洽。二姊適葛氏,爲人狡黠善辯,顧影弄
姿,貌不及江城,而悍妒與埒。姊妹相逢無他語,惟各以閫威自鳴得
意。以故二人最善。生適戚友,女輒嗔怒;惟適葛所,知而不禁。一
日飲葛所,既醉,葛嘲曰:“子何畏之甚?”生笑美曰:“天下事頗多不
解:我之畏,畏其也,乃有美不及内人,而畏甚於僕者,惑不滋甚
哉?”葛大慚,不能對。婢聞,以告二姊。二姊怒,操杖遽出,生見其
凶,跴屣欲走。杖起,已中腰膂,三杖三蹶而不能起。誤中顱,血流
如沈。二姊去,生蹣跚而歸。
妻驚問之,初以迕姨故,不敢遽告;再三研詰,始具陳之。女
以帛束生首,忿然曰:“人家男子,何煩他撻楚耶!”更短袖裳,懷木
杵,擕婢徑去。抵葛家,二姊笑語承迎,女不語,以杵擊之,僕;裂
褲而痛楚焉。齒落唇缺,遺失溲便。女返,二姊羞憤,遣夫赴訴於
高。生趨出,極意溫恤,葛私語曰:“僕此來,不得不爾。悍婦不仁,
幸假手而懲創之,我兩人何嫌焉。”女已聞之,遽出,指罵曰:“齷齪
贼!妻子虧苦,反竊竊與外人交好!此等男子,不宜打煞耶!”疾呼覓
杖。葛大窘,奪門竄去。生由此往來全無一所。
同窗王子雅過之,宛轉留飲。飲間,以閨閣相謔,頻涉狎褻。
女適窺客,伏聽盡悉,暗以巴豆投湯中而進之。未幾吐利不可堪,奄
存氣息。女使婢問之曰:“再敢無禮否?”始悟病之所自來,呻吟而哀
之,則綠豆湯已儲待矣,飲之乃止。從此同人相戒,不敢飲於其家。
王有酤肆,肆中多紅梅,設宴招其曹侶。生托文社,禀白而
往。日暮,既酣,王生曰:“適有南昌名妓,流寓此間,可以呼來共
飲。”眾大悦。惟生離席,興辭,群曳之曰:“閫中耳目雖長,亦聽睹
不至於此。”因相矢緘口,生乃複坐。少間妓果出,年十七八,玉佩丁
冬,雲鬟掠削。問其姓,雲:“謝氏,小字芳蘭。”出詞吐氣,備極風
雅,擧座若狂。而芳蘭猶屬意生,屢以色授。爲眾所覺,故曳兩人連
肩坐。芳蘭陰把生手,以指書掌作“宿”字。生於此時,欲去不忍,欲
留不敢,心如亂絲,不可言喻。而傾頭耳語,醉態益狂,榻上胭脂
虎,亦並忘之。少選,聽更漏已動,肆中酒客愈稀,惟遙座一美少年
對燭獨酌,有小僮捧巾侍焉;眾竊議其高雅。無何,少年罷飲,出門
去。僮返身入,向生曰:“主人相候一語。”眾則茫然,惟生顏色慘
變,不遑告别,匆匆便去。蓋少年乃江城,僮即其家婢也。
生從至家,伏受鞭撲。從此禁錮益嚴,弔慶皆絕。文宗下學,
生以誤講降爲青。一日與婢語,女疑與私,以酒壇囊婢首而撻之。已
而縛生及婢,以繡剪剪腹間肉互補之,釋縛令其自束。月餘,補處竟
合爲一雲。女每以白足踏餅塵土中,叱生摭食之。如是種種。母以憶
子故,偶至其家,見子柴瘠,歸而痛哭欲死。夜夢一叟告之曰:“不須
憂煩,此是前世因。江城原靜業和尚所養長生鼠,公子前生爲士人,
偶游其地,誤斃之。今作惡報,不可以人力回也。每早起,虔心誦觀
音咒一百遍,必當有效。”醒而述於仲鴻,異之,夫妻遵教。虔誦兩月
餘,女横如故,益之狂縱。聞門外鉦鼓,輒握發出,憨然引眺,千人
指視,恬不爲怪。翁姑共恥之,而不能禁,腹誹而已。
忽有老僧在門外宣佛果,觀者如堵。僧吹鼓上革作牛鳴。女奔
出,見人眾無隙,命婢移行床,翹登其上。眾目集視,女如弗覺。逾
時,僧敷衍將畢,索清水一盂,持向女而宣言曰:“莫要嗔,莫要嗔!
前世也非假,今世也非真。咄!鼠子縮頭去,勿使貓兒尋。”宣已,吸
水噀射女面,粉黛淫淫,下沾衿袖。眾大駭,意女暴怒,女殊不語,
拭面自歸。僧亦遂去。女入室癡坐,嗒然若喪,終日不食,掃榻遽
寢。中夜忽喚生醒,生疑其將遺,捧進溺盆。女卻之,暗把生臂,曳
入衾。生承命,四體驚悚,若奉丹詔。女慨然曰:“使君如此,何以爲
人!”乃以手撫捫生體,每至刀杖痕,嚶嚶啜泣,輒以爪甲自掐,恨不
即死。生見其狀,意良不忍,所以慰藉之良厚。女曰:“妾思和尚必是
菩薩化身。清水一灑,若更腑肺。今回憶曩昔所爲,都如隔世。妾向
時得毋非人耶?有夫婦而不能歡,有姑嫜而不能事,是誠何心!明日
可移家去,仍與父母同居,庶便定省。”絮語終夜,如話十年之别。昧
爽即起,摺衣斂器,婢擕簏,躬襆被,促生前往叩扉。母出駭問,告
以意。母尚遲回有難色,女已偕婢入。母從入。女伏地哀泣,但求免
死。母察其意誠,亦泣曰:“吾兒何遽如此?”生爲細述前狀,始悟曩
昔之夢驗也。喜,喚廝僕爲除舊舍。女自是承顏顺志過於孝子,見
人,則觍如新婦;或戲述往事,則紅漲於頰。且勤儉,又善居積,三
年翁媼不問家計,而富稱巨萬矣。生是歲鄉捷。每謂生曰:“當日一見
芳蘭,今猶憶之。”生以不受荼毒,願已至足,妄念所不敢萌,唯唯而
已。會以應擧入都,數月乃返。入室,見芳蘭方與江城對弈。驚而問
之,則女以數百金出其籍矣。此事浙中王子雅言之甚詳。
異史氏曰:“人生業果,飲啄必報,而惟果報之在房中者,如附
骨之疽,其毒尤慘。每見天下賢婦十之一,悍婦十之九,亦以見人世
之能修善業者少也。觀自在願力宏大,何不將孟中水灑大千世界也?”
〈孫生〉
孫生娶故家女辛氏,初入門,爲窮褲,多其帶,渾身糾纏甚
密,拒男子不與共榻,床頭常設錐簪之器以自衛。孫屢被刺剟,因就
别榻眠。月餘,不敢問鼎。即白晝相逢,女未嚐假以言笑。
同窗某知之,私謂孫曰:“夫人能飲否?”答雲:“少飲。”某戲
之曰:“僕有調停之法,善而可行。”問:“何法?”曰:“以迷藥入酒,
給使飲焉,則惟君所爲矣。”孫笑之,而陰服其策良。詢之醫家,敬以
酒煮烏頭置案上。入夜,孫釃别酒,獨酌數觥而寢。如此三夕,妻終
不飲。一夜孫臥移時,視妻猶寂坐,孫故作齁聲,妻乃下榻,取酒煨
鑪上。孫竊喜。既而滿飲一杯;又複的,約盡半杯許,以其餘仍内壺
中,拂榻遂寢。久之無聲,而燈惶煌尚未滅也。疑其尚醒,故大
呼:“錫檠熔化矣!”妻不應,再呼仍不應;白身往視,則醉睡如泥。
啟衾潛入,層層斷其縛結。妻固覺之,不能動,亦不能言,任其輕薄
而去。既醒,惡之,投繯自縊。孫夢中聞喘吼聲,起而奔視,舌已出
兩寸許。大驚,斷索,扶榻上,逾時始蘇。孫自此殊厭恨之,夫妻避
道而行,相逢則俯其首,積四五年不交一語。妻或在室中,與他人嬉
笑,見夫至色則立變,凛如霜雪。孫嚐寄宿齋中,經歲不歸;即強之
歸,亦面壁移時,默然就枕而已。父母甚憂之。
一日有老尼至其家,見婦,亟加讚譽。母不言,但有浩歎,尼
詰其故,具以情告。尼曰:“此易事耳。”母喜曰:“倘能回婦意,當不
靳酬也。”尼窺室無人,耳語曰:“購春宮一幀,三日後爲若厭之。”尼
去,母即購以待之。三日尼果來,囑曰:“此須甚密,勿令夫婦
知。”乃剪下圖中人,又針三枚、艾一撮,並以素紙包固,外繪數畫如
蚓狀,使母賺婦出,竊取其枕,開其縫而投之;已而仍合之,返歸故
處。尼乃去。至晚,母強子歸宿。媼往竊聽。二更將殘,聞婦呼孫小
字,孫不答。少間,婦複語,孫厭氣作惡聲。質明,母入其室,見夫
婦面首相背,知尼之術誣也。呼子於無人處,委諭之。孫聞妻名便
怒,切齒。母怒罵之,不顧而去。
越日尼來,告之罔效,尼大疑。媼因述所聽:尼笑曰:“前言婦
憎夫,故偏厭之。今婦意已轉,所未轉者男耳。請作兩制之法,必有
驗。”母從之,索子枕如前緘置訖,又呼令歸寢。更餘,猶聞兩榻上皆
有轉側聲,時作咳,都若不能寐。久之,聞兩人在一床上唧唧語,但
隱約不可辨。將曙,猶聞嬉笑,吃吃不絕。媼以告母,母喜。尼來,
厚饋之。孫由是琴瑟和好。生一男兩女,十餘年從無角口之事。同人
私問其故,笑曰:“前此顧影生怒,後此聞聲而喜,自亦不解其何心
也。”異史氏曰:“移憎而愛,術亦神矣。然能令人喜者,亦能令人
怒,術人之神,正術人之可畏也。先哲雲:‘六婆不入門。’有見矣
夫!”
〈八大王〉
臨洮馮生,蓋貴介裔而凌夷矣。有漁鱉者負其債,不能償,得
鱉輒獻之。一日獻巨鱉,額有白點,生以其狀異,放之。
後自婿家歸,至恒河之側,日已就昏,見一醉者從二三僮,顛
跋而至,遙見生,便問:“何人?”生漫應:“行道者。”醉人怒曰:“寧
無姓名,胡言行道者?”生馳驅心急,置不答,徑過之。醉人益怒,捉
袂使不得行,酒臭熏人。生更不耐,然力解不能脱。問:“汝何
名?”囈然而對曰:“我南都舊令尹也。將何爲?”生曰:“世間有此等
令尹,辱寞世界矣!幸是舊令尹;假新令尹,將無殺盡途人耶?”醉人
怒甚,勢將用武。生大言曰:“我馮某非受人撾打者!”醉人聞之,變
怒爲歡,踉蹡下拜曰:“是我恩主,唐突勿罪!”起喚從人,先歸治
具。生辭之不得。握手行數里,見一小村。既入,則廊舍華好,似貴
人家。醉人酲稍解,生始詢其姓字。曰:“言之勿驚,我洮水八大王
也。適西山青童招飲,不覺過醉,有犯尊顏,實切愧悚。”生知其妖,
以其情辭殷渥,遂不畏怖。俄而設筵豐盛,促坐歡飲。八大王最豪,
連擧數觥。生恐其複醉,再作縈擾,偽醉求寢。八大王已喻其意,笑
曰:“君得無畏我狂耶?但請勿懼。凡醉人無行,謂隔夜不複記者,欺
人耳。酒徒之不德,故犯者十之九。僕雖不齒於儕偶,顧未敢以無賴
之行施之長者,何遂見拒如此?”生乃複坐,正容而諫曰:“既自知
之,何勿改行?”八大王曰:“老夫爲令尹時,沉湎尤過於今日。自觸
帝怒,謫歸島嶼,力返前轍者十餘年矣。今老將就木,潦倒不能横
飛,故態複作,我自不解耳。茲敬聞命矣。”傾談間遠鍾已動。八大王
起,捉臂曰:“相聚不久。蓄有一物,聊報厚德。此不可以久佩,如願
後,當見還也。”口中吐一小人,僅寸許,因以爪掐生臂,痛若膚裂;
急以小人按捺其上,釋手已入革里,甲痕尚在,而漫漫墳起,類痰核
狀。驚問之,笑而不答。但曰:“君宜行矣。”送生出,八大王自返。
回顧村舍全渺,惟一巨鱉,蠢蠢入水而沒。
錯愕久之,自念所穫,必鱉寶也。由此目最明,凡有珠寶之
處,黄泉下皆可見,即素所不知之物,亦隨口而知其名。於寢室中,
掘得藏鏹數百,用度頗充。後有貨故宅者,生視其中有藏鏹無算,遂
以重金購居之。由此與王公坪富矣,火齊木難之類皆蓄焉。得一鏡,
背有鳳紐,環水雲湘妃之圖,光射里餘,鬚眉皆可數。佳人一照,則
影留其中,磨之不能滅也;若改妝重照,或更一美人,則前影消矣。
時肅府第三公主絕美,雅慕其名。會主游崆峒,乃往伏山中,伺其下
輿,照之而歸,設置案頭。審視之,見美人在中,拈巾微笑,口欲言
而波欲動,喜而藏之。
年餘爲妻所泄,聞之肅府。王怒收之,追鏡去,擬斬。生大賄
中貴人,使言於王曰:“王如見赦,天下之至寶,不難致也。不然,有
死而已,於王誠無所益。”王欲籍其家而徙之。三公主曰:“彼已窺
我,十死亦不足解此玷,不如嫁之。”王不許,公主閉戶不食。妃子大
憂,力言於王。王乃釋生囚,命中貴以意示生。生辭曰:“糟糠之妻不
下堂,寧死不敢承命。王如聽臣自贖,傾家可也。”王怒,複逮之。妃
召生妻入宮,將鴆之。既見,妻以珊瑚鏡台納妃,詞意溫惻。妃悦
之,使參公主。公主亦悦之,訂爲姊妹,轉使諭生。生告妻曰:“王侯
之女,不可以先後論嫡庶也。”妻不聽,歸修聘幣納王邸,齎送者迨千
人。珍石寶玉之屬,王家不能知其名。王大喜,釋生歸,以公主嬪
焉。公主仍懷鏡歸。
生一夕獨寢,夢八大王軒然入曰:“所贈之物,當見還也。佩之
若久,耗人精血,損人壽命。”生諾之,即留宴飲。八大王辭曰:“自
聆藥石,戒杯中物,已三年矣。”乃以口齧生臂,痛極而醒。視之,則
核塊消矣。後此遂如常人。
異史氏曰:“醒則猶人,而醉則猶鱉,此酒人之大都也。顧鱉雖
日習於酒狂乎,而不敢忘恩,不敢無禮於長者,鱉不過人遠哉?若夫
己氏則醒不如人,而醉不如鱉矣。古人有龜鑒,盍以爲鱉鑒乎?乃作
《酒人賦》。賦曰:
‘有一物焉,陶情適口;飲之則醺醺騰騰,厥名爲“酒”。其名最
多,爲功已久:以宴嘉賓,以速父舅,以促膝而爲歡,以合卺而成
偶;或以爲“釣詩鉤”,又以爲“掃愁帚”。故曲生頻來,則騷客之金蘭
友;醉鄉深處,則愁人之逋逃藪。糟丘之台既成,鴟夷之功不朽。齊
臣遂能一石,學士亦稱五鬥。則酒固以人傳,而人或以酒醜。若夫落
帽之孟嘉,荷鍤之伯倫,山公之倒其接,彭澤之漉以葛巾。酣眠乎
美人之側也,或察其無心;濡首於墨汁之中也,自以爲有神。井底臥
乘船之士,槽邊縛珥玉之臣。甚至效鱉囚而玩世,亦猶非害物而不
仁。
‘至如雨宵雪夜,月旦花晨,風定塵短,客舊妓新,履舄交錯,
蘭麝香沉,細批薄抹,低唱淺斟;忽清商兮一奏,則寂若兮無人。雅
謔則飛花粲齒,高吟則戛玉敲金。總陶然而大醉,亦魂清而夢真。果
爾,即一朝一醉,當亦名教之所不嗔。爾乃嘈雜不韻,俚詞並進;坐
起歡嘩,呶呶成陣。涓滴忿爭,勢將投刃;伸頸攢眉,引杯若鴆;傾
沈碎觥,拂燈滅燼。綠醑葡萄,狼藉不靳;病葉狂花,觴政所禁。如
此情懷,不如弗飲。
‘又有酒隔咽喉;間不盈寸;呐呐呢呢,猶譏主吝。坐不言行,
飲複不任:酒客無品,於斯爲甚。甚有狂藥下,客氣粗;努石棱,磔
鬡須;袒兩臂,躍雙趺。塵蒙蒙兮滿面,哇浪浪兮沾裾;口狺狺兮亂
吠,發蓬蓬兮若奴。其籲地而呼天也,似李郎之嘔其肝髒;其颺手而
擲足也,如蘇相之裂於牛車。舌底生蓮者,不能窮其狀;燈前取影
者,不能爲之圖。父母前而受忤,妻子弱而難扶。或以父執之良友,
無端而受罵於灌夫。婉言以警,倍益眩瞑。
‘此名“酒凶”,不可救拯。惟有一術,可以解酩。厥術維何?隻
須一梃。縶其手足,與斬豕等。止困其臀,勿傷其頂;捶至百餘,豁
然頓醒。’”
〈戲縊〉
邑人某年少無賴,偶游村外,見少婦乘馬來,謂同游者曰:“我
能令其一笑。”眾不信,約賭作筵。某遽奔去出馬前,連聲嘩曰:“我
要死!”因於牆頭抽粱黠一本,横尺許,解帶掛其上,引頸作縊狀。婦
果過而哂之,眾亦粲然。婦去既遠,某猶不動,眾益笑之。近視則舌
出目瞑,而氣真絕矣。粱幹自經,不亦奇哉?是可以爲儇薄者戒。
卷七
〈羅祖〉
羅祖,即墨人也,少貧。總族中應出一丁戍北邊,即以羅往。
羅居邊數年,生一子。駐防守備雅厚遇之。會守備遷陝西參將,欲擕
與俱去,羅乃托妻子於其友李某者,遂西。自此三年不得返。
適參將欲致書北塞,羅乃自陳,請以便道省妻子,參將從之。
羅至家,妻子無恙,良慰。然床下有男子遺舄,心疑之;即而至李申
謝。李致酒殷勤,妻又道李恩義,羅感激不勝。明日謂妻曰:“我往致
主命,暮不能歸,勿伺也。”出門跨馬而去。匿身近處,更定卻歸。聞
妻與李臥語,大怒,破扉。二人懼,膝行乞死。羅抽刃出,已,複韜
之曰:“我始以汝爲人也,今如此,殺之污吾刀耳!與汝約:妻子而受
之,籍名亦而充之,馬疋械器具在。我逝矣!”遂去。鄉人共聞於官,
官笞李,李以實告。而事無驗見,莫可質憑,遠近蒐羅,則絕匿名
蹟。官疑其因奸致殺,益械李及妻;逾年並桎梏以死。乃驛送其子歸
即墨。
後石匣營有樵人入山,見一道人坐洞中,未嚐求食。眾以爲
異,齎糧供之。或有識者蓋即羅也。饋遺滿洞。羅終不食,意似厭
囂,以故來者漸寡。積數年,洞外蓬蒿成林。或潛窺之,則坐處不曾
少移。又久之,見其出游山上,就之已杳;往瞰洞中,則衣上塵蒙如
故。益奇之。更數日而往,則玉柱下垂,坐化已久。土人爲之建廟,
每三月間,香楮相屬於道。其子往,人皆呼以小羅祖,香税悉歸之。
今其後人猶歲一往,收税金焉。浙水劉宗玉向予言之甚詳。予笑
曰:“今世諸檀越,不求爲聖賢,但望成佛祖。請遍告之:若要立地成
佛,須放下刀子去。
〈劉姓〉
邑劉姓,虎而冠者也。後去淄居沂,習氣不除,鄉人鹹畏惡
之。有田數畝,與苗某連壟。苗勤,田畔多種桃。桃初實,子往攀
摘,劉怒驅之,指爲己有,子啼而告諸父。父方駭怪,劉已詬罵在
門,且言將訟。苗笑慰之。怒不解,忿而去。時有同邑李翠石作典商
於沂,劉持狀入城,適與之遇。以同鄉故相熟,問:“作何幹?”劉以
告,李笑曰:“子聲望眾所共知;我素識苗甚平善,何敢占騙?將毋反
言之也!”乃碎其詞紙,曳入肆,將與調停。劉恨恨不已,竊肆中筆,
複造狀藏懷中,期以必告。未幾苗至,細陳所以,因哀李爲之解免,
言:“我農人,半世不見官長。但得罷訟,數株桃何敢執爲己有。”李
呼劉出,告以退讓之意。劉又指天畫地,叱罵不休,苗惟和色卑詞,
無敢少辯。
既罷,逾四五日,見其村中人傳劉已死,李爲驚歎。異日他
適,見杖而來者儼然劉也。比至,殷殷問訊,且請顧臨。李逡巡問
曰:“日前忽聞凶訃,一何妄也?”劉不答,但挽入村,至其家,羅漿
酒焉。乃言:“前日之傳,非妄也。曩出門見二人來,捉見官府。問何
事,但言不知。自思出入衙門數十年,非怯見官長者,亦不爲怖。從
去至公廨,見南面者有怒容曰:“汝即某耶?罪惡貫盈,不自悛悔;又
以他人之物,占爲己有。此等横暴,合置鐺鼎!’一人稽簿曰:‘此人有
一善合不死。’南面者閱簿,其色稍霽,便雲:‘暫送他去。’數十人齊
聲呵逐。餘曰:‘因何事勾我來?又因何事遣我去?還祈明示。’吏持簿
下,指一條示之。上記:崇禎十三年,用錢三百,救一人夫婦完聚。
吏曰:‘非此,則今日命當絕,宜堕畜生道。’駭極,乃從二人出。二人
索賄,怒告曰:‘不知劉某出入公門二十年,專勒人財者,何得向老虎
討肉吃耶?’二人乃不複言。送至村,拱手曰:‘此役不曾啖得一掬
水。’二人既去,入門遂蘇,時氣絕已隔日矣。”
李聞而異之,因詰其善行顛末。初,崇禎十三年,歲大凶,人
相食。劉時在淄,爲主捕隸。適見男女哭甚哀,問之,答雲:“夫婦聚
裁年餘,今歲荒,不能兩全,故悲耳。”少時,油肆前複見之,似有所
爭。近詰之,肆主馬姓者便雲:“伊夫婦餓將死,日向我討麻醬以爲
活;今又欲賣婦於我,我家中已買十餘口矣。此何要緊?賤則售之,
否則已耳。如此可笑,生來纏人!”男子因言:“今粟如珠,自度非得
三百數,不足供逃亡之費。本欲兩生,若賣妻而不免於死,何敢焉?
非敢言直,但求作陰騭行之耳。”劉憐之,便問馬出幾何。馬言:“今
日婦口,止直百許耳。”劉請勿短其數,且願助以半價之資,馬執不
可。劉少負氣,便謂男子:“彼鄙瑣不足道,我請如數相贈。若能逃
荒,又全夫婦,不更佳耶?”遂發囊與之。夫妻泣拜而去。劉述此事,
李大加獎歎。
劉自此前行頓改,今七旬猶健。去年李詣周村,遇劉與人爭,
眾圍勸不能解,李笑呼曰:“汝又欲訟桃樹耶?”劉茫然改容,呐呐斂
手而退。
異史氏曰:“李翠石兄弟皆稱素封。然翠石又醇謹,喜爲善,未
嚐以富自豪,抑然誠篤君子也。觀其解紛勸善,其生平可知矣。古
雲:‘爲富不仁。’吾不知翠石先仁而後富者耶?抑先富而後仁者耶?”
〈邵九娘〉
柴廷賓,太平人,妻金氏不育,又奇妒。柴百金買妾,金暴遇
之,經歲而死。柴忿出,獨宿數月,不踐閨闥。
一日柴初度,金卑詞莊禮爲丈夫壽,柴不忍拒,始通言笑。金
設筵内寢招柴,柴辭以醉。金華妝自詣柴所,曰:“妾竭誠終日,君即
醉,請一盞而别。”柴乃入,酌酒話言。妻從容曰:“前日誤殺婢子,
今甚悔之。何便仇忌,遂無結發情耶?後請納金釵十二,妾不汝瑕疵
也。”柴益喜,燭盡見跋,遂止宿焉。由此敬愛如初。
金便呼媒媼來,囑爲物色佳媵,而陰使遷延勿報,己則故督促
之。如是年餘。柴不能待,遍囑戚好爲之購致,得林氏之養女。金一
見,喜形於色,飲食共之,脂澤花釧任其所取。然林固燕產,不習女
紅,繡履之外須人而成。金曰:“我素勤儉,非似王侯家,買作畫圖看
者。”於是授美錦,使學制,若嚴師誨弟子。初猶呵罵,繼而鞭楚。柴
痛切於心,不能爲地。而金之憐愛林尤倍於昔,往往自爲汝束,勻鉛
黄焉。但履跟稍有摺痕,則以鐵杖擊雙彎,發少亂則批兩頰。林不堪
其虐,自經死。柴悲慘心目,頗致怨懟。妻怒曰:“我代汝教娘子,有
何罪過?”柴始悟其奸,因複反目,永絕琴瑟之好。陰於别業修房闥,
思購麗人而别居之。
荏苒半載,未得其人。偶會友人之葬,見二八女郎,光豔溢
目,停睇神馳。女怪其狂顧,秋波斜轉之。詢諸人,知爲邵氏。邵貧
士,止此女,少聰慧,教之讀,過目能了。尤喜讀《内經》及冰鑒
書。父愛溺之,有議婚者,輒令自擇,而貧富皆少所可,故十七歲猶
未字也。柴得其端末,知不可圖,然心低徊之。又翼其家貧,或可利
動。謀之數媼,無敢媒者,遂亦灰心,無所複望。
忽有賈媼者,以貨珠過柴,柴告所願,賂以重金,曰:“止求一
通誠意,其成與否所勿責也。萬一可圖,千金不惜。”媼利其有,諾
之,登門,故與邵妻絮語。睹女,驚讚曰:“好個美姑姑!假到昭陽
院,趙家姊妹何足數得!”又問:“婿家阿誰?”邵妻答:“尚未。”媼
言:“若個娘子,何愁無王候作貴客也!”邵妻歎曰:“王侯家所不敢
望;隻要個讀書種子,便是佳耳。我家小孽冤,翻複遴選,十無一
當,不解是何意向?”媼曰:“夫人勿須煩怨。憑個麗人,不知前身修
何福澤才能消受得!昨一大笑事,柴家郎君雲:於某家瑩邊望見顏
色,願以千金爲聘。此非餓鴟作天鵝想耶?早被老身呵斥去矣!”邵妻
微笑不答。媼曰:“便是秀才家難與較計,若在别個,失尺而得丈,宜
若可爲矣。”邵妻複笑不言。媼撫掌曰:“果爾,則爲老身計亦左矣。
日蒙夫人愛,登堂便促膝賜漿酒;若得千金,出車馬,入樓閣,老身
再到門,則圈者呵叱及之矣。”邵妻沉吟良久,起而去與夫語;移時喚
其女;又移時三人並出。邵妻笑曰:“婢子奇特,多少良疋悉不就,聞
爲賤媵則就之。但恐爲儒林笑也!”媼曰:“倘入門得一小哥子,大夫
人便如何耶!”言已,告以别居之謀。邵益喜,喚女曰:“試同賈姥言
之。此汝自主張,勿後悔,致懟父母。”女腆然曰:“父母安享厚奉,
則養有濟矣。況自顧命薄,若得佳偶,必減壽數,少受摺磨,未必非
福。前見柴郎亦福相,子孫必有興者。”媼大喜,奔告。柴喜出非望,
即置千金,備輿馬,娶女於别業,家人無敢言者。女謂柴曰:“君之
計,所謂燕巢於幕,不謀朝夕者也。塞口防舌以冀不漏,何可得寧?
請不如早歸,猶速發而禍小。”柴慮摧殘,女曰:“天下無不可化之
人。我苟無過,怒何由起?”柴曰:“不然。此非常之悍,不可情理動
者。”女曰:“身爲賤婢,摧摺亦自分耳。不然,買日爲活,何可長
也?”柴以爲是,終躊躇而不敢決。
一日柴他往,女青衣而出,命蒼頭控老牝馬,一嫗擕襆從之,
竟詣嫡所,伏地而陳。妻始而怒,既念其自首可原,又見容飾兼卑,
氣亦稍平。乃命婢子出錦衣衣之,曰:“彼薄幸人播惡於眾,使我横被
口語。其實皆男子不義,諸婢無行,有以激之。汝試念背妻而立家
室,此豈複是人矣?”女曰:“細察渠似稍悔之,但不肯下氣耳。諺
雲:“大者不伏小。’以禮論:妻之於夫,猶子之於父,庶之於嫡也。
夫人若肯假以詞色,則積怨可以盡捐。”妻雲:“彼自不來,我何與
焉?”即命婢媼爲之除舍。心雖不樂,亦暫安之。
柴聞女歸,驚惕不已,竊意羊入虎群,狼藉已不堪矣。疾奔而
至,見家中寂然,心始穩貼。女迎門而勸,令詣嫡所,柴有難色。女
泣下,柴意少納。女往見妻曰:“郎適歸,自慚無以見夫人,乞夫人往
一姍笑之也。”妻不肯行,女曰:“妾已言:夫之於妻,猶嫡之於庶。
孟光擧案,而人不以爲諂,何哉?分在則然耳。”妻乃從之,見柴
曰:“汝狡兔三窟,何歸爲?”柴俯不對。女肘之,柴始強顏笑。妻色
稍霽,將返。女推柴從之,又囑庖人備酌。自是夫妻複和。女早起青
衣往朝,盥已授帨,執婢禮甚恭。柴入其室,苦辭之,十餘夕始肯一
納。妻亦心賢之,然自愧弗如,積慚成忌。但女奉侍謹,無可蹈瑕,
或薄施呵譴,女惟顺受。
一夜夫婦少有反唇,曉妝猶含盛怒。女捧鏡,鏡堕,破之。妻
益恚,握發裂眥。女懼,長跪哀免。怒不解,鞭之至數十。柴不能
忍,盛氣奔入,曳女出,妻呶呶逐擊之。柴怒,奪鞭反撲,面膚綻
裂,始退。由是夫妻若仇。柴禁女無往,女弗聽,早起,膝行伺幕
外。妻捶床怒罵,叱去,不聽前。日夜切齒,將伺柴出而後泄憤於
女。柴知之,謝絕人事,杜門不通弔慶。妻無如何,惟日撻婢媼以寄
其恨,下人皆不可堪。自夫妻絕好,女亦莫敢當夕,柴於是孤眠。妻
聞之,意不稍安,有大婢索狡黠,偶與柴語,妻疑其私,暴之尤苦。
婢輒於無人處,疾首怨罵。一夕輪婢值宿,女囑柴,禁無往,曰:“婢
面有殺機,叵測也。”柴如其言,招之來,詐問:“何作?”婢驚懼,無
所措詞。柴益疑,檢其衣得利刃焉。婢無言,惟伏地乞死。柴欲撻
之,女止之曰:“恐夫人所聞,此婢必無生理。彼罪固不赦,然不如鬻
之,既全其生,我亦得直焉。”柴然之。會有買妾者急貨之。妻以其不
謀故,罪柴,益遷怒女,詬罵益毒。柴忿,顧女曰:“皆汝自取。前此
殺卻,烏有今日?”言已而走。妻怪其言,遍詰左右並無知者,問女,
女亦不言。心益悶怒,捉據浪罵。柴乃返,以實告。妻大驚,向女溫
語,而心轉恨其言之不早。
柴以爲嫌隙盡釋,不複作防。適遠出,妻乃召女而數之曰:“殺
主者罪不赦,汝縱之何心?”女造次不能以詞自達。妻燒赤鐵烙女面欲
毁其容,婢媼皆爲之不平。每號痛一聲,則家人皆哭,願代受死。妻
乃不烙,以針刺脅二十餘下,始揮去之。柴歸,見面創,大怒,欲往
尋之。女捉襟曰:“妾明知火坑而固蹈之。當嫁君時,豈以君家爲天堂
耶?亦自顧薄命,聊以泄造化之怒耳。安心忍受,尚有滿時,若再觸
焉,是坎已填而複掘之也。”遂以藥糝患處,數日尋愈。忽攬鏡喜
曰:“君今日宜爲妾賀,彼烙斷我晦紋矣!”朝夕事嫡。一如往日。金
前見眾哭,自知身同獨夫,略有愧悔之萌,時時呼女共事,詞色平
善。月餘忽病逆,害飲食。柴恨其不死,略不顧問。數日腹脹如鼓,
日夜濅困。女侍伺不遑眠食,金益德之。女以醫理自陳;金自覺疇昔
過慘,疑其怨報,故謝之。金爲人持家嚴整,婢僕悉就約束;自病
後,皆散誕無操作者。柴躬自經理,劬勞甚苦,而家中米鹽,不食自
盡。由是慨然興中饋之思,聘醫藥之。金對人輒自言爲“氣盅”,以故
醫脈之,無不指爲氣鬱者。凡易數醫,卒罔效,亦濱危矣。又將烹
藥,女進曰:“此等藥百裹無益,隻增劇耳。”金不信。女暗撮别劑易
之。藥下,食頃三遺,病若失。遂益笑女言妄,呻而呼之曰:“女華
陀,今如何也?”女及群婢皆笑。金問故,始實告之。泣曰:“妾日受
子之覆載而不知也!今而後,請惟家政,聽子而行。”
無何病痊,柴整設爲賀。女捧壺侍側,金自起奪壺,曳與連
臂,愛異常情。更闌女托故離席,金遣二婢曳還之,強與連榻。自
此,事必商,食必借,即姊妹無其和也。無何,女產一男。產後多
病,金親爲調視,若奉老母。
後金患心痗,痛起則面目皆青,但欲覓死。女急取銀針數枚,
比至,則氣息瀕盡,按穴刺之,畫然痛止。十餘日複發,複刺;過六
七日又發。雖應手奏效,不至大苦,然心常惴惴,恐其複萌。夜夢至
一處,似廟宇,殿中鬼神皆動。神問:“汝金氏耶?汝罪過多端,壽數
合盡:念汝改悔,故僅降災以示微譴。前殺兩姬,此其宿報。至邵氏
何罪,而慘毒如此?鞭打之刑,已有柴生代報,可以相准;所欠一
烙、二十三針,今三次止償零數,便望病根除耶?明日又當作矣!”醒
而大懼,猶冀爲妖夢之誣。食後果病,其痛倍苦。女至刺之,隨手而
瘥。疑曰:“技止此類,病本何以不拔?請再灼之。此非爛燒不可,但
恐夫人不能忍受。”金憶夢中語,以故無難色。然呻吟忍受之際,默思
欠此十九針,不知作何變症,不如一朝受盡,庶免後苦。炷盡,求女
再針,女笑曰:“針豈可以泛常施用耶?’金曰:“不必論穴,但煩十九
刺。”女笑不可。金請益堅,起跪榻上,女終不忍。實以夢告,女乃約
略經絡刺之如數。自此平複,果不複病。彌自懺悔,臨下亦無戾色。
子名曰俊,秀惠絕倫。女每曰:“此子翰苑相也。”八歲有神童之目,
十五歲以進士授翰林。是時柴夫婦年四十,如夫人三十有二三耳。輿
馬歸寧,鄉里榮之。邵翁自鬻女後,家暴富,而士林羞與爲伍,至是
始有通往來者。
異史氏曰:“女子狡妒,其天性然也。而爲妾媵者,又複炫美弄
機以增其怒。嗚呼!禍所由來矣。若以命自安,以分自守,百摺而不
移其志,此豈梃刃所能加乎?乃至於再拯其死,而始有悔悟之萌。嗚
呼!豈人也哉!如數以償,而不增之息,亦造物之恕矣。顧以仁術作
惡報,不亦傎乎!每見愚夫婦抱疴終日,即招無知之巫,任其刺肌灼
膚而不敢呻,心嚐怪之,至此始悟。”
閩人有納妾者,夕入妻房,不敢便去,偽解屨作登榻狀。妻
曰:“去休!勿作態!”夫尚徘徊,妻正色曰:“我非似他家妒忌者,何
必爾爾。”夫乃去。妻獨臥,輾轉不得寐,遂起,往伏門外潛聽之。但
聞妾聲隱約,不甚了了,惟“郎罷”二字略可辨識。郎罷,閩人呼父
也。妻聽逾刻,痰厥而踣,首觸扉作聲。夫驚起啟戶,屍倒入。呼妾
火之,則其妻也。急扶灌之。目略開,即呻曰:“誰家郎罷被汝
呼!”妒情可哂。
〈鞏仙〉
鞏道人,無名字,亦不知何里人。嚐求見魯王,閽人不爲通。
有中貴人出,揖求之,中貴見其鄙陋,逐去之;已而複來。中貴怒,
且逐且撲。至無人處,道人笑出黄金二百兩,煩逐者覆中貴:“爲言我
亦不要見王;但聞後苑花木樓台,極人間佳勝,若能導我一游,生平
足矣。”又以白金賂逐者。其人喜,反命;中貴亦喜,引道人自後宰門
入,諸景俱曆。又從登樓上,中貴方憑窗,道人一推,但覺身堕樓
外,有細葛繃腰,懸於空際;下視則高深暈目,葛隱隱作斷聲。懼
極,大號。無何數監至,駭極。見其去地絕遠,登樓共視,則葛端系
根上,欲解援之,則葛細不堪用力。遍索道人,已杳矣。束手無計,
奏之魯王,王詣視大奇之,命樓下藉茅鋪絮,將因而斷之。甫畢,葛
崩然自絕,去地乃不咫耳。相與失笑。王命訪道士所在。聞館於尚秀
才家,往問之,則出游未複。既,遇於途,遂引見王。王賜宴坐,便
請作劇,道士曰:“臣草野之夫,無他庸能。既承優寵,敢獻女樂爲大
王壽。”遂探袖中出美人置地上,向王稽拜已。道士命扮“瑤池宴”本,
祝王萬年。女子弔場數語。道士又出一人,自白“王母”。少間,董雙
成、許飛瓊,一切仙姬次第俱出。末有織女來謁,獻天衣一襲,金彩
絢爛,光映一室。王意其偽,索觀之,道士急言:“不可!”王不聽,
卒觀之,果無縫之衣,非人工所能制也。道士不樂曰:“臣竭誠以奉大
王,暫而假諸天孫,今則濁氣所染,何以還故主乎?”王又意歌者必仙
姬,思欲留其一二,細視之,則皆宮中樂伎耳。轉疑此曲非所夙諳,
問之,果茫然不自知。道士以衣置火燒之,然後納諸袖中,再蒐之,
則已無矣。
王於是深重道士,留居府内。道士曰:“野人之性,視宮殿如藩
籠,不如秀才家得自由也。”每至中夜,必還其所,時而堅留,亦遂宿
止。輒於筵間,顛倒四時花木爲戲。王問曰:“聞仙人亦不能忘情,果
否?”對曰:“或仙人然耳;臣非仙人,故心如枯木矣。”一夜宿府中,
王遣少妓往試之。入其室,數呼不應,燭之,則瞑坐榻上。搖之,目
一閃即複合;再搖之,齁聲作矣。推之,則遂手而倒,酣臥如雷;彈
其額,逆指作鐵釜聲。返以白王。王使刺一針,針弗入。推之,重不
可搖;加十餘人擧擲床下,若千斤石堕地者。旦而窺之,仍眠地上。
醒而笑曰:“一場惡睡,堕床下不覺耶!”後女子輩每於其坐臥時,按
之爲戲,初按猶軟,再按則鐵石矣。
道士舍秀才家,恒中夜不歸。尚鎖其戶,及旦啟扉,道士已臥
室中。初,尚與曲妓惠哥善,矢志嫁娶。惠雅善歌,弦索傾一時。魯
王聞其名,召入供奉,遂絕情好。每系念之,苦無由通。一夕問道
士:“見惠哥否?”答言:“諸姬皆見,但不知其惠哥爲誰。”尚述其
貌,道其年,道士乃憶之。尚求轉寄一語,道士笑曰:“我世外人,不
能爲君塞鴻。”尚哀之不已。道士展其袖曰:“必欲一見,請人此。”尚
窺之中大如屋。伏身入,則光明洞徹,寬若廳堂;幾案床榻,無物不
有。居其内,殊無悶苦。道士入府,與王對弈。望惠哥至,陽以袍袖
拂塵,惠哥已納袖中,而他人不之睹也。尚方獨坐凝想時,忽有美人
自檐間堕,視之惠哥也。兩相驚喜,綢繆臻至。尚曰:“今日奇緣,不
可不志。請與卿聯之。”書壁上曰:“候門似海久無蹤。”惠續雲:“誰
識蕭郎今又逢。”尚曰:“袖里乾坤真個大。”惠曰:“離人思婦盡包
容。”書甫畢,忽有五人入,八角冠,淡紅衣,認之都與無素。默然不
言,捉惠哥去。尚驚駭,不知所由。道士既歸,呼之出,問其情事,
隱諱不以盡言。道士微笑,解衣反袂示之。尚審視,隱隱有字蹟,細
裁如蟣,蓋即所題句也。後十數日,又求一人。前後凡三入。惠哥謂
尚曰:“腹中震動,妾甚憂之,常以緊帛束腰際。府中耳目較多,倘一
朝臨蓐,何處可容兒啼?煩與鞏仙謀,見妾三叉腰時,便一拯救。”尚
諾之。歸見道士,伏地不起。道士曳之曰:“所言,予已了了。但請勿
憂。君宗祧賴此一線,何敢不竭綿薄。但自此不必複入。我所以報君
者,原不在情私也。”後數月,道士自外入,笑曰:“擕得公子至矣。
可速把繈褓來!”尚妻最賢,年近三十,數胎而存一子;適生女,盈月
而殤。聞尚言,驚喜自出。道士探袖出嬰兒,酣然若寐,臍梗猶未斷
也。尚妻接抱,始呱呱而泣。
道士解衣曰:“產血濺衣,道家最忌。今爲君故,二十年故物,
一旦棄之。”尚爲易衣。道士囑曰:“舊物勿棄卻,燒錢許,可療難
產,堕死胎。”尚從其言。居之又久,忽告尚曰:“所藏舊衲,當留少
許自用,我死後亦勿忘也。”尚謂其言不祥。道士不言而去,入見王
曰:“臣欲死!”王驚問之,曰:“此有定數,亦複何言。”王不信,強
留之;手談一局急起,王又止之。請就外舍,從之。道士趨臥,視之
已死。王具棺木,以禮葬之。尚臨哭盡哀,如悟曩言蓋先告之也。遺
衲用催生,應如響,求者踵接於門。始猶以污袖與之;既而剪領衿,
罔不效。及聞所囑,疑妻必有產厄,斷血布如掌,珍藏之。會魯王有
愛妃臨盆,三日不下,醫窮於術,或有以尚生告者,立召入,一劑而
產。王大喜,贈白金、彩緞良厚,尚悉辭不受。王問所欲,曰:“臣不
敢言。”再請之,頓首曰:“如推天惠,但賜舊妓惠哥足矣。”王召之
來,問其年,曰:“妾十八入府,今十四年矣。”王以其齒加長,命遍
呼群妓,任尚自擇,尚一無所好。王笑曰:“癡哉書生!十年前定婚嫁
耶?”尚以實對。乃盛備輿馬,仍以所辭彩緞爲惠哥作妝,送之出。惠
所生子,名之秀生。秀者,袖也。是時年十一矣。日念仙人之恩,清
明則上其暮。有久客川中者,逢道人於途,出書一卷曰:“此府中物,
來時倉猝,未暇璧返,煩寄去。”客歸,聞道人已死,不敢達王,尚代
奏之。王展視,果道士所借。疑之,發其塚,空棺耳。後尚子少殤,
賴秀生承繼,益服鞏之先知雲。
異史氏曰:“袖里乾坤,古人之寓言耳,豈真有之耶?抑何其奇
也!中有天地、有日月,可以娶妻生子,而又元催科之苦,人事之
煩,則袖中蟣虱,何殊桃源雞犬哉!設容人常住,老於是鄉可耳。”
〈二商〉
莒人商姓者,兄富而弟貧,鄰垣而居。康熙間,歲大凶,弟朝
夕不自給。一日,日向午,尚未擧火、枵腹蹀踱,無以爲計。妻令往
告兄,商曰:“無益。脱兄憐我貧也,當早有以處此矣。”妻固強之,
商便使其子往,少頃空手而返。商曰:“何如哉!”妻詳問阿伯雲何,
子曰:“伯躊躇目視伯母,伯母告我曰:‘兄弟析居,有飯各食,誰複
能相顧也。’”夫妻無言,暫以殘盎敗榻,少易糠秕而生。
里中三四惡少,窺大商饒足,夜逾坦入。夫妻警寤,鳴盥器而
號。鄰人共嫉之,無援者。不得已疾呼二商,商聞嫂鳴欲趨救,妻止
之,大聲對嫂曰:“兄弟析居,有禍各受,誰複能相顧也!”俄,盜破
扉,執大商及婦炮烙之,呼聲綦慘。二商曰:“彼固無情,焉有坐視兄
死而不救者!”率子越垣,大聲疾呼。二商父子故武勇,人所畏懼,又
恐驚致他援,盜乃去。視兄嫂兩股焦灼,扶榻上,招集婢僕,乃歸。
大商雖被創,而金帛無所亡失,謂妻曰:“今所遺留,悉出弟
賜,宜分給之。”妻曰:“汝有好兄弟,不受此苦矣!”商乃不言。二商
家絕食,謂兄必有一報,久之寂不聞。婦不能待,使子捉囊往從貸,
得鬥粟而返。婦怒其少欲反之,二商止之。逾兩月,貧餒愈不可支。
二商曰:“今無術可以謀生,不如鬻宅於兄。兄恐我他去,或不受券而
恤焉,未可知;縱或不然,得十餘金,亦可存活。”妻以爲然,遣子操
券詣大商。大商告之婦,且曰:“弟即不仁,我手足也。彼去則我孤
立,不如反其券而周之。”妻曰:“不然、彼言去,挾我也;果爾,則
適堕其謀。世間無兄弟者,便都死卻耶?我高葺牆垣,亦足自固。不
如受其券,從所適,亦可以廣吾宅。”計定,令二商押署券尾,付直而
去。二商於是徙居鄰村。
鄉中不逞之徒,聞二商去,又攻之。複執大商,榜楚並兼,梏
毒慘至,所有金資,悉以贖命。盜臨去,開廪呼村中貧者,恣所取,
頃刻都盡。次日二商始聞,及奔視,則兄已昏憒不能語,開目見弟,
但以手抓床席而已。少頃遂死。二商忿訴邑宰。盜首逃竄,莫可緝
穫。盜粟者百餘人,皆里中貧民,州守亦莫如何。
大商遺幼子,才五歲,家既貧,往往自投叔所,數日不歸;送
之歸,則啼不止。二商婦頗不加青眼。二商曰:“渠父不義,其子何
罪?”因市蒸餅數枚,自送之。過數日,又避妻子,陰負鬥粟於嫂,使
養兒。如此以爲常。又數年,大商賣其田宅,母得直足自給,二商乃
不複至。後歲大饑,道殣相望,二商食指益繁,不能他顧。侄年十
五,荏弱不能操業,使擕籃從兄貨胡餅。一夜夢兄至,顏色慘戚
曰:“餘惑於婦言,遂失手足之義。弟不念前嫌,增我汗羞。所賣故
宅,今尚空閑,宜僦居之。屋後篷顆下,藏有窖金,發之可以小阜。
使醜兒相從,長舌婦餘甚恨之,勿顧也。”既醒,異之。以重直啗第
主,始得就,果發得五百金。從此棄賤業,使兄弟設肆廛間。侄頗
慧,記算無訛,又誠愨,凡出入一錙銖必告。二商益愛之。一日泣爲
母請粟,商妻欲勿與,二商念其孝,按月廪給之。數年家益富。大商
婦病死,二商亦老,乃析侄,家資割半與之。
異史氏曰:“聞大商一介不輕取與,亦猖潔自好者也。然婦言是
聽,憒憒不置一詞,恝情骨肉,卒以吝死。嗚呼!亦何怪哉!二商以
貧始,以素封終。爲人何所長?但不甚遵閫教耳。嗚呼!一行不同,
而人品遂異。”
〈沂水秀才〉
沂水某秀才,課業山中。夜有二美人入,含笑不言,各以長袖
拂榻,相將坐,衣軟無聲。少間一美人起,以白綾巾展幾上,上有草
書三四行,亦未嚐審其何詞。一美人置白金一鋌,可三四兩許,秀才
掇内袖中。美人取巾,握手笑出,曰:“俗不可耐!”秀才捫金則烏有
矣。麗人在坐,投以芳澤,置不顧,而金是取,是乞兒相也,尚可耐
哉!狐子可兒,雅態可想。
友人言此,並思不可耐事,附志之:對酸俗客。市井人作文
語。富貴態狀。秀才裝名士。旁觀諂態。信口謊言不倦。揖坐苦讓上
下。歪詩文強人觀聽。財奴哭窮。醉人歪纏。作滿洲調。體氣若逼人
語。市井惡謔。任憨兒登筵抓餚果。假人餘威裝模樣。歪科甲談詩
文。語次頻稱貴戚。
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
ebooknice.com