JavaScript Data Structures and Algorithms An Introduction to Understanding and Implementing Core Data Structure and Algorithm Fundamentals 1st Editon by Sammie Bae ISBN 1484239873 9781484239872 - The ebook in PDF and DOCX formats is ready for download
JavaScript Data Structures and Algorithms An Introduction to Understanding and Implementing Core Data Structure and Algorithm Fundamentals 1st Editon by Sammie Bae ISBN 1484239873 9781484239872 - The ebook in PDF and DOCX formats is ready for download
com
OR CLICK BUTTON
DOWLOAD EBOOK
https://ebookball.com/product/a-practical-introduction-to-data-
structures-and-algorithm-analysis-3rd-edition-by-clifford-
shaffer-15310/
ebookball.com
https://ebookball.com/product/data-structures-and-algorithms-made-
easy-data-structure-and-algorithmic-puzzles-5th-edition-by-careermonk-
publications-narasimha-karumanchi-isbn-9788193245279-15800/
ebookball.com
https://ebookball.com/product/data-structures-and-algorithms-1st-
edition-by-alfred-aho-isbn-0201000237-9780201000238-25072/
ebookball.com
https://ebookball.com/product/data-structures-and-algorithm-analysis-
in-javatm-3rd-edition-by-mark-weiss-9780133465013-0133465012-18710/
ebookball.com
Data Structures And Algorithm Analysis in C 4th Edition by
Mark Weiss 013284737X 9780132847377
https://ebookball.com/product/data-structures-and-algorithm-analysis-
in-c-4th-edition-by-mark-weiss-013284737x-9780132847377-15292/
ebookball.com
https://ebookball.com/product/data-structures-and-algorithms-in-
java-1st-edition-by-peter-drake-isbn-0131469142-9780131469143-12422/
ebookball.com
https://ebookball.com/product/data-structures-and-algorithms-in-c-1st-
edition-by-adam-drozdek-asin-b002wlxmby-25076/
ebookball.com
https://ebookball.com/product/data-structures-and-algorithm-analysis-
in-c-3rd-edition-by-clifford-shaffer-
isbn-048648582x-978-0486485829-16486/
ebookball.com
https://ebookball.com/product/data-structures-algorithms-and-
applications-in-c-1st-edition-by-adam-drozdek-
isbn-1133608426-9781133608424-17250/
ebookball.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
Acknowledgments ��������������������������������������������������������������������������������������������������xix
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
Chapter 3 JavaScript Numbers
You may wonder how you get random integers or numbers greater than 1.
To get floating points higher than 1, simply multiply Math.random() by the range.
Add or subtract from it to set the base.
Exercises
1. Given three numbers x, y, and p, compute (xˆy) % p. (This is
modular exponentiation.)
Here, x is the base, y is exponent, and p is the modulus.
Modular exponentiation is a type of exponentiation performed
over a modulus, which is useful in computer science and used in
the field of public-key encryption algorithms.
At first, this problem seems simple. Calculating this is a one-line
solution, as shown here:
29
Chapter 3 JavaScript Numbers
c % m = (a b) % m
c % m = [(a % m) (b % m)] % m
4ˆ3 % 5 = 64 % 5 = 4
30
Chapter 3 JavaScript Numbers
value = (4 x 4) % 5 = 16 % 5 = 1
value = (1 x 4) % 5 = 4 % 5 = 4
1 function allPrimesLessThanN(n){
2 for (var i=0; i<n; i++) {
3 if (isPrime(i)){
4 console.log(i);
5 }
6 }
7 }
8
9 function isPrime(n){
10 if (n <= 1) return false;
11 if (n <= 3) return true;
12
31
Chapter 3 JavaScript Numbers
Let’s define ugly numbers as those whose only prime factors are
2, 3, or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, … shows the
first 11 ugly numbers. By convention, 1 is included.
To do this, divide the number by the divisors (2, 3, 5) until it
cannot be divided without a remainder. If the number can be
divided by all the divisors, it should be 1 after dividing everything.
Iterate this over n, and now the list of ugly numbers can be
returned.
33
Another Random Document on
Scribd Without Any Related Topics
The Project Gutenberg eBook of A szentlélek
lovagja
This ebook is for the use of anyone anywhere in the United States
and most other parts of the world at no cost and with almost no
restrictions whatsoever. You may copy it, give it away or re-use it
under the terms of the Project Gutenberg License included with this
ebook or online at www.gutenberg.org. If you are not located in the
United States, you will have to check the laws of the country where
you are located before using this eBook.
Language: Hungarian
BIRÓ LAJOS
KÖNYVEI:
1. Regények
A diadalmas asszony 3.–
Nyári zivatar 3.50
2. Elbeszélések
Ciklámen 3.–
Kunszállási emberek 3.50
A fekete ostor 3.50
Marie és más asszonyok 4.–
Huszonegy novella. 2. kiadás 4.–
3. Szindarabok
1913. Történelmi színmű 3 felv.
Az utolsó csók. (Egy szegény ifju története) 3 felv. 2.50
Tavaszi ünnep. Dráma 3 felv. 3.–
A rablólovag. Színjáték 3 felv. 3.–
Sárga liliom. Színmű 3 felv. 3.–
A cárnő. Irták Biró Lajos és Lengyel Menyhért. Színjáték 3
felv. 3.–
A szentlélek lovagja
Budapest 1914
Singer és Wolfner kiadása
VI., Andrássy-út 16.
Minden jogot fenntartunk
BUDAPESTI HIRLAP NYOMDÁJA
I.
Monostory rákönyökölt a márványasztalra, amely meg volt rakva
pezsgősüveggel; egy pisszenéssel elhallgattatta a cigányt a háta
mögött; elborult szemének egy másodpercnyi ingadozása után
kikereste mulató társai közül a legkülönbet és csendesen
megszólította:
– Mondd, János fiam, buta vagy?
Az aposztrofált Buzát János meghökkenve emelte föl a fejét.
Monostory nyugodtan ismételte:
– Mondd: buta vagy? – Mondd! Mondd, hogy buta vagy; mondd,
hogy tök vagy…
A hangja ingerült lett, fenyegető, mint egy oroszlán dörmögése:
– Ne kapkodd a fejedet, édes fiam, mert én belelátok ám. Én
tudom, édes jó fiam, hogy mi van benne… Nekem hiába nyalod
magadat kivülről angol lordra, belül egy szegény kupecivadék ijedt
lelke reszket benned. Nekem hiába adod a tudóst, én tudom, hogy
csak szorgalmas ujságolvasó vagy, azzal szédíted ezeket a
szamarakat, akik szorgalmasan még ujságot sem tudnak olvasni.
Nekem hiába adod a nagy szónokot, én látom, hogy elsápadsz és
reszketsz, amikor beszélni kezdesz; és én tudom, hogy két hétig
tanulod a rögtönzött beszédeidet. És én nekem hiába adod a
született vezért, én tudom, hogy született közkatona vagy, született
csatlós, született szolga, sima és ügyes lakáj. És én belátok a fejedbe
és tudom, hogy ezt te is tudod; tudom: remegsz tőle, hogy egyszer
csak kisül; tudom: nincs egy győzelmes félórád; tudom: nincs egy
mámoros perced. Ezért tehát, édes fiam, ha én azt kérdezem tőled,
buta vagy-e, akkor ne kapkodd a fejedet, hanem hajtsd meg, és
felelj rendesen és engedelmesen, amint illik: igenis, István bátyám,
buta vagyok.
Monostory befejezte a beszédét. A beszéd azonban még a
pezsgősüvegek között és éjfél után is nagyon kíméletlen volt. A
társaság nem nevetett, hanem csendben lázadozott és boldog
zúgással fogadta azt a választ, amelyre egyikük rátalált:
– Pista bácsi, részeg vagy.
Helyeseltek, nevettek, ütötték az asztalt, tusst parancsoltak a
cigánynak és tíz hang variálta a választ:
– Pista bátyánk berugott! Monostory István részeg, mint a tök.
Dicsőséges atyánk leszopta magát:
Monostory azonban fölugrott; kirugta maga alól a széket,
meghajlott teste úgy egyenesedett ki, mintha acélból lett volna és
fáradt száján harsány kiáltás csattant ki:
– Csend!
Csend lett. A cigány is rögtön elhallgatott. Monostory
félresimította a homlokából fehér szálakkal átszőtt fekete haját,
elborult szeme szikrákat szórt; körülnézett a társaságon, amely
kényelmetlenül és rosszat sejtve lapult meg a tekintete alatt, és
tiszta, meleg és csengő hangon mondta:
– Ti nyálasok és nyálkáslelküek, ti szomjas nyakalók és tisztátlan
berugók, mit tudjátok ti azt, milyen viszonyban vagyok én a
részegséggel. Mit tudjátok ti azt, hogy én meg tudok részegedni egy
korty ital nélkül, ha úgy jön, és hiába öntöm le magamba a világ
minden italát, ha idebent józanság, szomorúság és bánat lakik. Mi
tudjátok ti, hogy én már öt napja akarok hiába lerészegedni, és mit
tudjátok ti, miféle italokat iszom én hajnaltájban, amikor ti piszkosan
horkoltok piszkos ágyaitokban.
Egy másodpercnyi szünetet tartott.
– De mert ezt nem tudjátok, – folytatta azután csendesebben és
szigorúbban, – nem tudhatjátok azt sem, mit tesz az, hogy én most
veletek vagyok és sokszor hajnalig tűröm a hitvány közelléteteket. –
Minthogy pedig szemetek van, de nem láttok, minthogy…
Megakadt. Egy másodpercre megtörten, lehunyt szemmel
hanyatlott le a feje a mellére. De azután fölkapta a fejét és magából
kikelten, kigyulladt arccal és mámorosan ordította:
– Minthogy nem látjátok a géniusz ragyogását a homlokomon;
minthogy továbbá nem ismeritek az áhítatot; mithogy tiszteletlen,
arcátlan plebejus röhögők vagytok, – én titeket, gyáva had, a
szentlélek nevében, amelynek lovagja vagyok, meg foglak fenyíteni…
Az arca lángolt, a szeme mintha szikrázva akart volna kipattanni
üregéből, két keze ökölbe szorulva emelkedett föl, és az asztal körül
ijedt ugrálás támadt.
– Részeg! – Meg van őrülve. – Kitelik tőle. – Le kell fogni. –
Ilyenkor ölni is tud. – Kényszerzubbonyt rá.
Monostory elvakultan nyúlt a pezsgőspalackok után, amelyeket el
akartak kapkodni a keze ügyéből; fölemelte a kezét, hogy azt a
mulató társát, aki hozzá legközelebb volt, megüsse, amikor az öreg
cigányprímás, aki a háta mögött állott, hirtelen előre lépett és halkan
mondta:
– Nagyságos úr, lovas legény jött Erdőmonostorról.
Monostory fölemelt keze megakadt; a cigányprímás pedig már
elébe is tolta az ijedt képü legényt, akit a pincérek nem mertek
bejelenteni. A legény rémülten pislogott; Monostory leeresztette a
kezét:
– Mi kell? – kérdezte halkan.
– A nagyságos asszony kéreti a nagyságos urat, – hadarta a
legény, – tessen azonnal hazajönni. Mert igen rosszul van az öreg
nagyságos úr.
Monostory úgy nézett rá a legényre, mintha álomban látná.
– Micsoda nagyságos asszony? – kérdezte lehunyt szemmel és
nagyon halkan.
– A nagyságos úr felesége, – válaszolta a legény ijedten, de
engedelmesen.
– Ki van rosszul? – kérdezte újra Monostory lomhán és álmosan.
– Az öreg nagyságos úr: a nagyságos úr édesapja.
Monostory behunyta a szemét és mozdulatlanul állt egy darabig.
Azután vállon fogta a legényt, a szemébe nézett, hozzá hajolt és
csendesen így szólt:
– Mondd meg a nagyságos asszonynak, hogy ha az apám
véletlenül csakugyan nagybeteg, – attól, ha engem meglát,
egyszerre halálos lesz a baja. – Eredj.
Meglódította a bámuló legényt, villámgyorsan a kezébe nyomott
egy teli pezsgős palackot és rákiáltott:
– Idd le magad hazáig. Takarodj.
A meghökkent legény elment; a társaság időközben szétsurrant
és Monostory szédülő fejjel egyedült ült le a pezsgőpocsolyás
asztalhoz. A két tenyerébe támasztotta az arcát és hallgatott. Sokáig
hallgatott, azután a két tenyere közül halkan megszólalt:
– Marci.
A cigánybanda csendben várakozott volt a parancsára és az öreg
cigányprímás, akinek a megszólítás szólt, most ijedten kereste
láthatatlan arcát, mert a hangja józan, megtört és kongó hang volt.
– Tessék, nagyságos úr.
A Monostory hangja nyugodtan, egyenletesen, de megtörten jött
a két tenyere mögül:
– Marci, tudsz-e valamit, amitől megrészegszik az ember?
– A borital nagyságos úr…
– Menj a pokolba a tudományoddal.
Monostory fölállott. Az arca sápadt volt és a szeme beesett.
– No várj, – mondta, – majd keresek én magamnak olyan italt.
Odaintette a kalapját és a felöltőjét.
– Ti engem itt megvártok, – mondta a cigányoknak.
Föltette a kalapját és fölvette a felöltőjét; és csöndes, biztos,
egyenes lépésekkel kiment a kávéházból. Kint hüvös tavaszi éjszaka
volt. Fázott; zsebredugta a kezét és gyors lépésekkel indult a Piac-
térre. A Piac-téren kikeresett egy nagy emeletes házat, megállott
előtte és sorra vette a boltajtókat, amelyek éjjel be voltak csukva.
Végre megtalálta, amit keresett: a patika ajtaját. Megnyomta a
csengőt, előbb röviden és udvariasan, azután hosszan, dühbe jötten
és fenyegetően.
A csengő mellett kinyilott egy kis ablak és egy álmos fej jelent
meg benne.
– Mi tetszik?
Monostory most megint nyugodt volt:
– Adjon nekem, – mondta csöndesen, – egy üveg étert.
– Minek az?… Minek most éjszaka? Hozott-e orvosi
rendelvényt?… Nem adok.
Az álmos fej, miután szemügyre vette Monostoryt és miután
három kérdésen át felelet nélkül is eljutott a megtagadásig, vissza
akart vonulni. Visszavonulás közben azonban meg kellett állnia.
Monostoryban ugyanis mérhetetlen düh gyulladt föl és olyat vágott
az öklével az ablak keresztfájára, hogy a kis ablak üvege
csörömpölve hullott be.
– Hallod-e kölyök, – recsegte be az ablakon, – azt akarod, hogy
beküldjek hozzád egypár acélburkolatu golyót?
A dühnek még ebben az indulatában kirántotta a pisztolyát és
rásütötte a nagy házra, mintha gyűlölt, nagy sárga ellenség állna
előtte. A golyó lepattant a kőfalról és süvöltve zúgott el az
éjszakába; a dördülést csöndes mozgolódás követte a nagy téren; de
még mielőtt valaki jöhetett volna, egy remegő kéz már kinyujtott az
ablakon egy nagy üveget; Monostory átvette, egy marék ezüstpénzt
és bankót behajított érte az ablakon; elindult és az üveggel a
kezében befordult egy mellékutcába.
Komolyan és feszülten figyelt lépéseinek a kemény kopogására,
mintha ennek a hangnak a csöndes éjszakában különös fontossága
lett volna számára. Elválasztotta a hangot a visszhangtól és zenei
elemeket keresett bennük, hogy minden figyelme le legyen kötve és
hogy ne kelljen semmi másra gondolnia. Siető, lépései alól azonban
elfogyott az aszfaltozott gyalogjáró, puha földön járt, rosszul
világított, szűk sikátorokba tévedt bele, rozoga fakerítés mellett
rozoga fapadot talált, reszkető lábbal ereszkedett le reá, és ekkor föl
kellett emelnie és meg kellett néznie az üveget, amelyet a kezében
tartott.
Két kézzel körülfogta, fölemelte és magasra tartotta. A folyadék
megcsillant a gyér világításban és Monostory, hogy riadtan dobogó
szívét elhallgattassa, gúnyosan mondta:
– Áldozati kehely… áldozás a gonosznak: különös összetételü kén
és szénvegyületekkel…
Mosolygott. De amint ült a rozoga fapadon, nagy fáradtsága
kezdett elmulni és egyszerre ismét fölsirt a szívében részegség után
való forró vágyakozása. Részegnek lenni! Részegség! Részegség!…
Villámgyors mozdulattal kirántotta az üveg dugóját, két kezébe
keményen belemarkolta az üveget, magához húzta és ráhajolt.
Az éter édeskés szaga rögtön kicsapott az üvegből és elárasztotta
az orrát. Undorítónak találta ezt a szagot és szinte visszahőkölt tőle,
de gyors elhatározással még mélyebben hajolt az üvegre, a száját is
kinyitotta és szomjas, nagy lélekzettel szítta be az éter láthatatlan és
csodálatos gőzeit. Három, négy, öt lélegzet… ah, ez csak undorító,
de soha ettől részeggé nem lesz az ember. – Elszántan kapta föl az
üveget, a szájában érezte az üveg nyakát. Mindjárt, – most!…
A nyelvén, a szájpadlásán, az egész szájában türhetetlen égetést
érzett és a szája, a torka, a gyomra, a feje egyszerre tele lett a
gyülöletes édeskés szaggal. Fuldokolni kezdett és szörnyü utálattal
köpte ki a folyadékot a szájából; az üveget a földhöz vágta; az üveg
összetörött és a folyadék szétcsurgott; a földről is az éter gőzei
szállottak föl; olyan volt, mintha az egész éjszaka, a föld, a
mindenség föl a csillagokig tele volna ezzel a rémületes szaggal;
mintha a tejút odafönt étergőzökből sűrüsödött volna össze…
Ijedten, undorodva és szégyenkezve menekült a rozoga pad
közeléből és köpködve, fuldokolva próbálta eltávolítani a szájából és
az orrából az éter emlékét. Lángoló szégyenkezés és eszeveszett düh
kínozta; józanabb volt, mint amikor este inni kezdett és sírni tudott
volna a teljes, nagy részegség után való vágyában.
Bőszülten rohant bele a sötét sikátortömegbe, amely előtte volt,
és szinte fölordított örömében, amikor egy piszkos lebuj homályosan
megvilágított ajtaja akadt elébe. Ah, ez a Vitriol-kocsma… Itt más
folyadék szokott hajnaltájban megcsordulni, itt hajnaltájban kés
villog és vér folyik. Itt belevetette magát már egyszer egy hajnali
késelésbe… ha most is olyan kimondhatatlan szerencséje volna! Ez
lesz a megváltás, ez lesz az öröm, ez lesz a részegség: vércsordító
ütéseket adni és villogó kések ellen védekezni. Lihegett a
fölindulástól és az az érzése volt, hogy ha egy kést döfnének a
mellébe, ujjongva fogadná a döfést.
Lihegett a fölindulástól és lábbal rúgta be a piszkos ajtót.
Berobbant az ajtón és ökölbeszorított kézzel, villámló szemmel állott
meg a kocsma közepén. Bent azonban csöndes és ijedt mozgolódás
felelt csak a kihívásra; nem volt ünnepnap és a lebuj hajnali élete
csöndes volt és álmos volt; egyetlen toprongyos vendég riadt föl a
sarokból, és az álmos kocsmáros jött hajlongva Monostory elé.
Monostory megszégyenülve nézett le rá és ételt és italt rendelt nála.
Ha most már csak az éter emlékét tudná elűzni a torkából és az
orrából. Fáradtan ült le, éhesen evett és szomjasan itta a pálinkát,
amelyet vizespohárba töltetett magának.
A fölriasztott toprongyos vendég állt egy ideig, azután visszaült a
sarokba. Monostory ekkor ismert rá.
– Hohó, báró úr, – kiáltott föl örömmel.
A báró úr megháborodott szegény zsidó volt, ártatlan bolond, aki
csak akkor jött dühbe és akkor lett veszedelmessé, ha nem akarták
neki elhinni, hogy báró. A Monostory kiáltására gyanakodva emelte
föl a fejét, mert még nem tudta, hivéssel vagy csúfolódással kerül-e
szembe; de Monostory megnyugtatta:
– Báró úr, – mondta, – legyen szerencsém. Tiszteljen meg,
kérem…
A báró úr kijött a sarokból és megállt a Monostory asztala
mellett. Cserzett arcából, elvadult fekete szőrzete közül nedvesen
lángolt ki nagy szeme.
– No mi ujság, báró úr? – kérdezte Monostory.
A báró úr fölemelte kérges hüvelykujját.
– A császár – mondta halkan és figyelmeztetően – nemsokára
eljön…
– És?
– És mindenkit kivégeztet.
– És?
– Engem elismer. És akkor…
Gyönyörűség ragyogása ömlött el sötét arcán.
– És akkor? – kérdezte Monostory.
– És akkor azután, – súgta reszketve és áhítatosan a báró, – a
Morgenrot boltja az enyém lesz.
Monostory rábámult. Ezért kell a császárnak eljönnie és
mindenkit kivégeztetnie? Ebbe lehet beleőrülni? Elnevette magát.
– No jó, báró úr, üljön le.
A báró úr készült leülni, amikor Monostorynak eszébe jutott
valami.
– Nézze, báró úr, – mondta, – ha már ilyen szépen együtt
vagyunk, nem lehetne előkeríteni az ön kitünő barátját: a főurat is?
A báró úr félénken ránézett a kocsmárosra; a kocsmáros, aki
szolgálattételre készen állott a közelben, sietve válaszolt:
– Itt van.
– Hol?
– Az udvaron. Alszik. Nem volt szabad bejönnie, mert nem volt
pénze.
– Jőjjön be, – kiáltotta Monostory, – és ha van még egypár ebből
a nemből a közelben, csak hadd jőjjön. Én fizetek mindent.
A kocsmáros kiment az udvarra és fél perc mulva bejött az álmos,
de jókedvű főúrral. A főúr is csendes bolond volt; a román
papnevelőintézetbe járt valamikor és kétségbeesve ragaszkodott a
papi ruhához, amely mindig szétmállott a testén, mire megint kapott
valahol egy régi reverendát. Az elméjének úgyszólván semmi baja
sem volt; mindig lobogott a jókedve: ez volt az egész; mindig
nevetett és öt percenkint a fejéhez kellett kapnia a kezét és össze
kellett vernie a bokáját, mintha táncolni akarna és mintha egy lelkes
csuhajt akarna elkiáltani.
Á
Bejött. Álmosan mosolygott. Megállott. Monostory ránézett. A
főúr kényesen a fejéhez kapta a kezét és villámgyorsan, hetykén,
mintha táncolni akarna, összecsapta bokáját.
– Ez az! – mondta Monostory. – Üljön le, főúr. Maga az én
emberem. Magam is így mulatok: fölkapom a kezem, összeverem a
bokám, a jó Isten tudja, miért.
A főúr leült az asztalhoz. A báró már ott ült. Monostory ételt és
italt adatott nekik. Az ajtó lassan föl-fölnyilott és egy-egy új rongyos
alak lopódzkodott be. A Monostory intésére azok is odaültek az
asztalhoz és boldogan ettek és ittak. Monostory ott ült közöttük,
csendesen beszélgetett velük, vizes poharából még mindig
szomjasan itta a pálinkát és most végre úgy érezte, hogy a
részegség köde lassan elborítja az agyát. Kellemes fáradtságot
érzett, amely mégis élénkség volt; úgy érezte, hogy lebeg és
elmerül; mosolygott és semmi másra nem gondolt többé, csak arra,
amit kimond.
Végignézett az őrülteken és rongyosokon, akik között ült és
halkan, derűsen mondta:
– Symposion.
Plátóra gondolt; és körültekintett, nem ront-e be a mulató
társaságba Alkibiadesz mámorosan és ibolyakoszorús fejjel, hogy
Szokrateszről beszéljen. Úgy érezte, görög bölcsek között ül és az
őrülteknek és rongyosoknak görög bölcsek álmairól beszélt:
– A léleknek – mondta – valamikor szárnya volt és fent repült az
istenek útján. Van lélek, amely a hitvány testben is emlékszik rá,
hogy valaha szárnya volt. Ez az emlékező lélek csapkod és
vergődik…
Rongyos társasága szájtátva hallgatta és Monostory részegen
magyarázta nekik Eroszt, a Symposiont és Phaidroszt. Kint azonban
hajnalodott és a hajnal kék sugarai befénylettek a kocsma füstös
lámpája köré. Monostory egymásután ürítette ki a pálinkával telt
nagy poharakat és most magasra csapott benne a boldog mámor.
Fölugrott.
– Itt az édes hajnal, – mondta, – mi most megyünk és áldozunk
a Napistennek.
Összegyűjtötte rongyos seregét és otthagyta velük a kocsmát. A
báróra és a főúrra támaszkodott, a többi rongyost maga mögé
rendelte. Lassan haladtak előre és a mögötte lévő rongyos had egyre
nőtt. A kis városnak szinte minden megtépettje, elesettje és koldusa
rátalált a menetre és hozzája csatlakozott. A tömeg zúgva haladt
előre; az ujonnan jöttek kérdezősködtek, majd türelmetlenül
követelőztek. Akik már a kocsmában is ott voltak, azok a Monostory
szavait ismételték:
– A léleknek szárnya volt valamikor, – kiáltozta egy félszemü
kucséber.
– Megyünk áldozni a Napistennek, – mondták mások.
Monostory boldogan haladt elől a báró és a főúr között. Élvezte a
zúgást, amelyet maga mögött hallott; úgy érezte, ez a zúgás, mint
valami nagyszerü folyam, ringatva viszi előre; nevető örömet érzett
azon, hogy hajnalodik és tudta, hogy mámoros hadával valami
nagyszerü dolgot kell csinálnia. Valamit, ami robban és dördül.
Valamit, ami a föld széléig és az ég tetejéig harsog. Valami óriási
tűzvészt fölgyújtani…
A piacon, amely már elevenedett, egy hordó bort üttetett csapra.
Az igyék, aki akar. Egy ezüstpénzt megforgatott a kezében és
odadobta egy szomjasan nyakaló sántának:
– Eredj a Bárányba: a Marci bandája jőjjön ide. És ahány
cigánybanda van, mind jőjjön ide.
Most dadogott már egy kissé, bizonytalanul állt a lábán és
bizonytalanok voltak a tervei.
– A végén, – mondta dadogva, – máglyát raktok, sóval és borral
hintitek meg és engem rajta elégettek…
– Éljen a nagyságos úr, – zúgta a folyton szaporodó tömeg.
Monostory körülnézett és a Piac-tér tulsó oldalán meglátta a
Nagytemplomot. A Nagytemplom hatalmas román ívei ragyogni
kezdtek a feljövő nap fényében; a hatalmas terraszon, amelyre a
templom épült, virágzó akácfák és szentek fehér márványszobrai
állottak. Az egész kép egyre lángolóbb és egyre fényesebb lett;
Monostory kitárt karral indult feléje.
A terrasz alján megállott és bizonytalanul nézett a hatalmas fehér
kőlépcsőre, amely három menetben a templom főbejáratáig vitt.
Most mi legyen? Bemegy-e most a templomba részegen lármázó
hadával? Mámoros pillantása végigsiklott a tömegen és megpihent
egy szines bábún, egy cifraruhás kövesdi parasztlányon, aki bámulva
nézte a részeg, rongyos hadat és a rongyos had úri vezérét.
Ránézett a bámuló parasztleányra és mosolyogni kezdett örömében.
– Parasztpillangó, – mondta magában, – el ne repülj.
Odalépett a leányhoz. A leány ijedten hátrált apjához, anyjához.
Az apja védekezésre készült. Monostory belenyúlt a zsebébe és egy
nagy bankót hajított oda neki.
– Fogd meg, – mondta, – nem szúrom érte gombostűre.
A leány és az apja még mindig nyugtalankodott. Monostory a
pisztolyát mutatta nekik.
– Parasztpillangó, – mondta, – el ne repülj. – Hogy hínak?
– Orosz Zsuzsánna, – mondta a leány remegve.
Monostory megfogta kicsi, durva kezét.
– Orosz Zsuzsánna, – szólt dadogva, – mi most téged imádni
fogunk.
Rongyos hadához fordult:
– Imádni fogjuk most, – mondta, – mi asszonyunkat, Orosz
Zsuzsánnát.
A terrasz a lépcső két szélén erkélybe ugrott ki. Monostory
odavezette Orosz Zsuzsánnát. De itt megállott.
– Nem léphetsz a kőre, – mondta. – Szőnyeget ide.
Szőnyeg nem volt kapható. Monostory bosszúsan ordította:
– Szőnyeget ide, oltártakarót, lágyat…
A tömeg nevetni kezdett és Monostory a pisztolya után nyúlt. Egy
másodpercre úgy volt, hogy belelő a tömegbe, de ekkor a tömeg
fölött elsikló szeme virággal rakott szekeret vett észre. A kocsi lassan
döcögött a Piac-tér felé.
– A virágokat ide, – kiáltotta ekkor Monostory. – Minden virágot
ide.
Tíz ember rohant egyszerre a szekér felé és ordítva magyarázta a
parasztkertésznek, aki rajta ült, hogy a nagyságos úr minden virágját
megveszi. A lovait megfogták, a szekeret megfordították, az óriási
virághalom ott volt a Monostory lábánál. A rémült kertész ordítva
követelte a pénzét. Monostory pénzt dobott neki; a kertész
elhallgatott.
– Minden virágot föl az erkélyre.
A tömeg nekiesett a virágoknak. Sötétpiros pünkösdi rózsák
röpködtek mint a láng és mint a vér és végigcsordultak az erkélyen.
Föléjük lila iriszek borultak bágyadt, hosszu száron. Közbe röppent
még néhány szál késői orgona is, néhány szál szegfü és korai rózsa
és az egészre mint egy-egy ezüst pehely rálibbent néhány fürt
akácvirág. Az erkélyen ki volt terítve a dús szőnyeg.
– Állj rá, Orosz Zsuzsánna, – mondta Monostory.
Orosz Zsuzsánna térdig virágban, szégyenkezve állott a
Nagytemplom terraszának legszélső erkélyén. Monostory ekkor a
cigányokat kereste. A cigányok ott voltak már és gyanakvó arccal
várták a parancsát.
– Marci, – mondta Monostory dadogva a primásnak, – most
valami olyat kell húznotok… Valami hallatlant… Valami csodaszépet…
Valami lángoló himnuszt…
Az öreg cigányprimás kelletlenül vonogatta a vállát, mert lenézte
a csőcseléket, amely körülötte tolongott.
– Hanem kevesen vagytok, – mondta reszketve Monostory. –
Minden cigánybanda jőjjön ide; és szólaljon meg odabent az orgona
is és rendüljön meg a föld a szépség himnuszától.
Keleten, a templom mögött fölbukkant a nap.
– A Napisten, – ordította Monostory. – A Napisten himnuszát! A
föld reszkessen tőle…
Mámorosan és türelmetlenül nyult a hegedü után, de a részeg és
ordító tömegen ekkor egy lovas verte át türelmetlenül a lovát.
Monostoryt ismerős hang riasztotta föl. Visszanézett. A tömeg
közepén ismerős ló állott és a lovas dühösen kiabált:
– Nagyságos úr, itt a levél. Lehúznak ezek a gazemberek.
Monostory bágyadtan intett. A tömeg hozzáeresztette a lovast, az
erdőmonostori legényt, akit az éjjel egyszer már hazakergetett. A
legény most elszánt volt, hangos és határozott. Levelet nyujtott
feléje.
– Tessen rögtön elolvasni, – mondta határozottan.
Monostory kábultan, engedelmesen nyult a levél után és
megborzongott, mielőtt kinyitotta. A felesége levélpapirja, a felesége
írása. Elolvassa-e? Ne rakasson-e óriási máglyát csak azért, hogy ezt
a levelet rátegye és elégesse? Habozott. A cigányokhoz akart
fordulni; meg akarta parancsolni, hogy zúgjon a csodálatos himnusz,
amelyre vágyódott, de azután egy rántással mégis föltépte a
borítékot.
Részeg volt. A betűk táncoltak előtte. A tenyerét rászorította a
szemére, hogy szeme égését hűtse egy kicsit, azután újra megnézte,
mi áll a levélben. A levél a felesége írása volt és ez állott benne:
ebookball.com