commit
f2f3c1aff1
@ -0,0 +1,2 @@ |
|||||||
|
english_words.db |
||||||
|
*.txt |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
# xorWords |
||||||
|
|
||||||
|
## Install |
||||||
|
``` |
||||||
|
$ go get github.com/mattn/go-sqlite3 |
||||||
|
$ go run create_db.go |
||||||
|
``` |
||||||
|
## Create xored data |
||||||
|
$ go run writeData.go |
||||||
|
## Fetch data |
||||||
|
$ go run readData.go |
||||||
@ -0,0 +1,95 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"database/sql" |
||||||
|
"fmt" |
||||||
|
"io/ioutil" |
||||||
|
"log" |
||||||
|
"strings" |
||||||
|
|
||||||
|
_ "github.com/mattn/go-sqlite3" |
||||||
|
) |
||||||
|
|
||||||
|
var topEnglishWords = []string{ |
||||||
|
".", ",", "!", ";", "?", "(", ")", "'", "\"", |
||||||
|
"the", "and", "of", "to", "a", "in", "is", "it", "you", "that", |
||||||
|
"he", "was", "for", "on", "are", "with", "as", "I", "his", "they", |
||||||
|
"be", "at", "one", "have", "this", "from", "or", "had", "by", "hot", |
||||||
|
"word", "but", "what", "some", "we", "can", "out", "other", "were", |
||||||
|
"all", "there", "when", "up", "use", "your", "how", "said", "an", |
||||||
|
"each", "she", "which", "do", "their", "time", "if", "will", "way", |
||||||
|
"about", "many", "then", "them", "write", "would", "like", "so", "these", |
||||||
|
} |
||||||
|
|
||||||
|
func main() { |
||||||
|
// Open SQLite database file
|
||||||
|
db, err := sql.Open("sqlite3", "./english_words.db") |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer db.Close() |
||||||
|
|
||||||
|
// Create table
|
||||||
|
_, err = db.Exec(`CREATE TABLE IF NOT EXISTS words (id INTEGER PRIMARY KEY, word TEXT);`) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
// Insert top English words into the database
|
||||||
|
tx, err := db.Begin() |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
stmt, err := tx.Prepare("INSERT INTO words(word) VALUES(?)") |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer stmt.Close() |
||||||
|
|
||||||
|
for _, word := range topEnglishWords { |
||||||
|
_, err = stmt.Exec(word) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Commit the transaction
|
||||||
|
tx.Commit() |
||||||
|
|
||||||
|
fmt.Println("Top English words inserted into the database.") |
||||||
|
|
||||||
|
// Read the contents of the american-english file
|
||||||
|
filePath := "/usr/share/dict/american-english" |
||||||
|
content, err := ioutil.ReadFile(filePath) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
// Split content into words
|
||||||
|
words := strings.Fields(string(content)) |
||||||
|
|
||||||
|
// Insert american-english words into the database
|
||||||
|
tx, err = db.Begin() |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
stmt, err = tx.Prepare("INSERT INTO words(word) VALUES(?)") |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer stmt.Close() |
||||||
|
|
||||||
|
for _, word := range words { |
||||||
|
_, err = stmt.Exec(word) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Commit the transaction
|
||||||
|
tx.Commit() |
||||||
|
|
||||||
|
fmt.Println("American-English words inserted into the database.") |
||||||
|
} |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
module xorWords |
||||||
|
|
||||||
|
go 1.20 |
||||||
|
|
||||||
|
require github.com/mattn/go-sqlite3 v1.14.19 // indirect |
||||||
@ -0,0 +1,2 @@ |
|||||||
|
github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI= |
||||||
|
github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= |
||||||
@ -0,0 +1,130 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"database/sql" |
||||||
|
"flag" |
||||||
|
"bufio" |
||||||
|
"fmt" |
||||||
|
"log" |
||||||
|
"strings" |
||||||
|
"strconv" |
||||||
|
"os" |
||||||
|
|
||||||
|
_ "github.com/mattn/go-sqlite3" |
||||||
|
) |
||||||
|
|
||||||
|
func containsSymbol(input string, symbols []string) bool { |
||||||
|
for _, symbol := range symbols { |
||||||
|
if strings.Contains(input, symbol) { |
||||||
|
return true |
||||||
|
} |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
func main() { |
||||||
|
// Define a command-line flag for the filename
|
||||||
|
filenamePtr := flag.String("file", "results.txt", "Name of the file to write results to") |
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
// Open the SQLite3 database file
|
||||||
|
db, err := sql.Open("sqlite3", "./english_words.db") |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer db.Close() |
||||||
|
|
||||||
|
// Open the file
|
||||||
|
file, err := os.Open(*filenamePtr) |
||||||
|
if err != nil { |
||||||
|
fmt.Println("Error opening file:", err) |
||||||
|
return |
||||||
|
} |
||||||
|
defer file.Close() |
||||||
|
|
||||||
|
symbols := []string{ |
||||||
|
".", ",", "!", ";", "?", "(", ")", "'", "\"", |
||||||
|
} |
||||||
|
|
||||||
|
// Create a scanner to read the file line by line
|
||||||
|
scanner := bufio.NewScanner(file) |
||||||
|
|
||||||
|
// Loop through each line in the file
|
||||||
|
for scanner.Scan() { |
||||||
|
line := scanner.Text() |
||||||
|
|
||||||
|
// Split the line by spaces
|
||||||
|
parts := strings.Fields(line) |
||||||
|
last := "" |
||||||
|
// Process the parsed values (assuming each line has a specific structure)
|
||||||
|
for _, part := range parts { |
||||||
|
if strings.Contains(part, "_") { |
||||||
|
result := strings.Replace(part, "_", "", -1) |
||||||
|
input := decompressRLE(xorBy13(result)) |
||||||
|
if containsSymbol(input, symbols) { |
||||||
|
last = strings.TrimRight(last, " ") + fmt.Sprintf("%s ", input) |
||||||
|
} else { |
||||||
|
last = last + fmt.Sprintf("%s ", input) |
||||||
|
} |
||||||
|
} else { |
||||||
|
query := "SELECT word FROM words WHERE id = ?" |
||||||
|
rows, err := db.Query(query, part) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer rows.Close() |
||||||
|
if rows.Next() {
|
||||||
|
var word string |
||||||
|
err = rows.Scan(&word) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
if containsSymbol(word, symbols) { |
||||||
|
last = strings.TrimRight(last, " ") + fmt.Sprintf("%s ", word) |
||||||
|
} else { |
||||||
|
last = last + fmt.Sprintf("%s ", word) |
||||||
|
} |
||||||
|
}
|
||||||
|
} |
||||||
|
} |
||||||
|
fmt.Println(last) |
||||||
|
} |
||||||
|
|
||||||
|
// Check for errors during scanning
|
||||||
|
if err := scanner.Err(); err != nil { |
||||||
|
fmt.Println("Error reading file:", err) |
||||||
|
}
|
||||||
|
} |
||||||
|
|
||||||
|
// decompressRLE decompresses a string that has been Run-Length Encoded
|
||||||
|
func decompressRLE(compressed string) string { |
||||||
|
result := "" |
||||||
|
|
||||||
|
for i := 0; i < len(compressed); i += 2 { |
||||||
|
char := compressed[i] |
||||||
|
count, err := strconv.Atoi(string(compressed[i+1])) |
||||||
|
if err != nil { |
||||||
|
// Handle error if conversion fails
|
||||||
|
fmt.Println("Error converting count to integer:", err) |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
// Repeat the character count times in the result
|
||||||
|
for j := 0; j < count; j++ { |
||||||
|
result += string(char) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return result |
||||||
|
} |
||||||
|
|
||||||
|
func xorBy13(input string) string { |
||||||
|
var result strings.Builder |
||||||
|
|
||||||
|
for _, char := range input { |
||||||
|
xored := char ^ 13 |
||||||
|
result.WriteRune(xored) |
||||||
|
} |
||||||
|
|
||||||
|
return result.String() |
||||||
|
} |
||||||
@ -0,0 +1,155 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"database/sql" |
||||||
|
"flag" |
||||||
|
"fmt" |
||||||
|
"log" |
||||||
|
"strings" |
||||||
|
"os" |
||||||
|
"strconv" |
||||||
|
|
||||||
|
_ "github.com/mattn/go-sqlite3" |
||||||
|
) |
||||||
|
|
||||||
|
var symbols = []string{ |
||||||
|
".", ",", "!", ";", "?", "(", ")", "'", "\"", |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
func main() { |
||||||
|
// Define a command-line flag for the filename
|
||||||
|
filenamePtr := flag.String("file", "results.txt", "Name of the file to write results to") |
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
// Open the SQLite3 database file
|
||||||
|
db, err := sql.Open("sqlite3", "./english_words.db") |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer db.Close() |
||||||
|
|
||||||
|
for { |
||||||
|
|
||||||
|
// Get user input for the test query
|
||||||
|
fmt.Print("Enter keyword: ") |
||||||
|
var searchTerm string |
||||||
|
fmt.Scanln(&searchTerm) |
||||||
|
|
||||||
|
// Exit the loop if Enter key is pressed without entering a search term
|
||||||
|
if searchTerm == "" { |
||||||
|
break |
||||||
|
} |
||||||
|
|
||||||
|
// Execute the first query with case-sensitive like
|
||||||
|
query := "SELECT id FROM words WHERE word COLLATE BINARY = ?" |
||||||
|
rows, err := db.Query(query, searchTerm) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer rows.Close() |
||||||
|
|
||||||
|
// If no results, try case-insensitive like
|
||||||
|
if !rows.Next() { |
||||||
|
rows.Close() // Close the previous result set before executing a new query
|
||||||
|
|
||||||
|
// Execute the second query with case-insensitive like
|
||||||
|
query = "SELECT id FROM words WHERE LOWER(word) LIKE ?" |
||||||
|
rows, err = db.Query(query, strings.ToLower(searchTerm)) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer rows.Close() |
||||||
|
if rows.Next() {
|
||||||
|
// Process the results
|
||||||
|
fmt.Println("Results for case-insensitive LIKE:") |
||||||
|
writeResultsToFile(*filenamePtr, rows) |
||||||
|
} else {
|
||||||
|
if strings.Contains(searchTerm, "*") { |
||||||
|
result := strings.Replace(searchTerm, "*", "", -1) |
||||||
|
writeDataToFile(*filenamePtr, xorBy13(compressRLE(result))) |
||||||
|
} else { |
||||||
|
fmt.Println("Not found! Please retype and add an * at the end to save") |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} else { |
||||||
|
// Process the results
|
||||||
|
fmt.Println("Results for case-sensitive LIKE:") |
||||||
|
writeResultsToFile(*filenamePtr, rows) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func writeDataToFile(filename string, data string) { |
||||||
|
file, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer file.Close() |
||||||
|
|
||||||
|
result := fmt.Sprintf("_%s ", data) |
||||||
|
_, err = file.WriteString(result) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
fmt.Printf("Added to %s\n", filename) |
||||||
|
} |
||||||
|
|
||||||
|
func writeResultsToFile(filename string, rows *sql.Rows) { |
||||||
|
file, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
defer file.Close() |
||||||
|
|
||||||
|
var id int |
||||||
|
err = rows.Scan(&id) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
fmt.Printf("ID=%d\n", id) |
||||||
|
|
||||||
|
result := fmt.Sprintf("%d ", id) |
||||||
|
_, err = file.WriteString(result) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
if err := rows.Err(); err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
fmt.Printf("Results written to %s\n", filename) |
||||||
|
} |
||||||
|
|
||||||
|
func xorBy13(input string) string { |
||||||
|
var result strings.Builder |
||||||
|
|
||||||
|
for _, char := range input { |
||||||
|
xored := char ^ 13 |
||||||
|
result.WriteRune(xored) |
||||||
|
} |
||||||
|
|
||||||
|
return result.String() |
||||||
|
} |
||||||
|
|
||||||
|
// compressRLE compresses a string using Run-Length Encoding
|
||||||
|
func compressRLE(input string) string { |
||||||
|
result := "" |
||||||
|
count := 1 |
||||||
|
|
||||||
|
for i := 1; i < len(input); i++ { |
||||||
|
if input[i-1] == input[i] { |
||||||
|
count++ |
||||||
|
} else { |
||||||
|
result += string(input[i-1]) + strconv.Itoa(count) |
||||||
|
count = 1 |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Add the last character and its count
|
||||||
|
result += string(input[len(input)-1]) + strconv.Itoa(count) |
||||||
|
|
||||||
|
return result |
||||||
|
} |
||||||
Loading…
Reference in new issue