chore: add existing programs
This commit is contained in:
commit
a90eb2b48b
7 changed files with 296 additions and 0 deletions
28
queue-golang/go.mod
Normal file
28
queue-golang/go.mod
Normal file
|
@ -0,0 +1,28 @@
|
|||
module devraza/queue
|
||||
|
||||
go 1.23.3
|
||||
|
||||
require (
|
||||
github.com/charmbracelet/bubbles v0.20.0
|
||||
github.com/charmbracelet/bubbletea v1.2.4
|
||||
github.com/charmbracelet/lipgloss v1.0.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/atotto/clipboard v0.1.4 // indirect
|
||||
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
||||
github.com/charmbracelet/x/ansi v0.4.5 // indirect
|
||||
github.com/charmbracelet/x/term v0.2.1 // indirect
|
||||
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
|
||||
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-localereader v0.0.1 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
|
||||
github.com/muesli/cancelreader v0.2.2 // indirect
|
||||
github.com/muesli/termenv v0.15.2 // indirect
|
||||
github.com/rivo/uniseg v0.4.7 // indirect
|
||||
golang.org/x/sync v0.9.0 // indirect
|
||||
golang.org/x/sys v0.27.0 // indirect
|
||||
golang.org/x/text v0.3.8 // indirect
|
||||
)
|
41
queue-golang/go.sum
Normal file
41
queue-golang/go.sum
Normal file
|
@ -0,0 +1,41 @@
|
|||
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
|
||||
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
|
||||
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
|
||||
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
|
||||
github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE=
|
||||
github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
|
||||
github.com/charmbracelet/bubbletea v1.2.4 h1:KN8aCViA0eps9SCOThb2/XPIlea3ANJLUkv3KnQRNCE=
|
||||
github.com/charmbracelet/bubbletea v1.2.4/go.mod h1:Qr6fVQw+wX7JkWWkVyXYk/ZUQ92a6XNekLXa3rR18MM=
|
||||
github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg=
|
||||
github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo=
|
||||
github.com/charmbracelet/x/ansi v0.4.5 h1:LqK4vwBNaXw2AyGIICa5/29Sbdq58GbGdFngSexTdRM=
|
||||
github.com/charmbracelet/x/ansi v0.4.5/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
|
||||
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
|
||||
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
|
||||
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
|
||||
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
|
||||
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
|
||||
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
|
||||
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
|
||||
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
|
||||
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
|
||||
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
|
||||
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
|
||||
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
|
||||
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
|
||||
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
||||
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
|
||||
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
146
queue-golang/main.go
Normal file
146
queue-golang/main.go
Normal file
|
@ -0,0 +1,146 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/charmbracelet/bubbles/textinput"
|
||||
"github.com/charmbracelet/lipgloss"
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
)
|
||||
|
||||
var (
|
||||
command = lipgloss.NewStyle().Foreground(lipgloss.Color("12")).Background(lipgloss.Color("235"))
|
||||
list = lipgloss.NewStyle().Bold(true)
|
||||
padding = lipgloss.NewStyle().PaddingTop(1).PaddingLeft(2)
|
||||
red = lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("9"))
|
||||
green = lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("10"))
|
||||
)
|
||||
|
||||
func enqueue(queue []int64, number string) []int64 {
|
||||
integer, err := strconv.ParseInt(number, 10, 64)
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
}
|
||||
|
||||
if len(queue) < 5 {
|
||||
queue = append([]int64{integer}, queue...)
|
||||
}
|
||||
|
||||
return queue
|
||||
}
|
||||
|
||||
func dequeue(queue []int64) []int64 {
|
||||
if len(queue) > 0 {
|
||||
queue = queue[:len(queue)-1]
|
||||
}
|
||||
return queue
|
||||
}
|
||||
|
||||
func check(queue []int64) string {
|
||||
if len(queue) == 0 {
|
||||
return fmt.Sprintf("The queue is currently %v", green.Render("empty"))
|
||||
} else if len(queue) == 5 {
|
||||
return fmt.Sprintf("The queue is currently %v", red.Render("full"))
|
||||
} else {
|
||||
return fmt.Sprintf("The queue is currently neither %v nor %v", green.Render("empty"), red.Render("full"))
|
||||
}
|
||||
}
|
||||
|
||||
type (
|
||||
errMsg error
|
||||
)
|
||||
|
||||
type model struct {
|
||||
textInput textinput.Model
|
||||
queue []int64
|
||||
status string
|
||||
show bool
|
||||
err error
|
||||
}
|
||||
|
||||
func initialModel() model {
|
||||
ti := textinput.New()
|
||||
ti.Placeholder = "enqueue 9"
|
||||
ti.Focus()
|
||||
ti.CharLimit = 156
|
||||
ti.Width = 20
|
||||
|
||||
return model{
|
||||
textInput: ti,
|
||||
err: nil,
|
||||
}
|
||||
}
|
||||
|
||||
func (m model) Init() tea.Cmd {
|
||||
return textinput.Blink
|
||||
}
|
||||
|
||||
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
var cmd tea.Cmd
|
||||
|
||||
switch msg := msg.(type) {
|
||||
case tea.KeyMsg:
|
||||
switch msg.Type {
|
||||
case tea.KeyCtrlC:
|
||||
return m, tea.Quit
|
||||
case tea.KeyEnter:
|
||||
arguments := strings.Split(m.textInput.Value(), " ")
|
||||
switch arguments[0] {
|
||||
case "enqueue":
|
||||
m.show = false
|
||||
m.queue = enqueue(m.queue, arguments[1])
|
||||
case "dequeue":
|
||||
m.show = false
|
||||
m.queue = dequeue(m.queue)
|
||||
case "check":
|
||||
m.show = true
|
||||
m.status = check(m.queue)
|
||||
default:
|
||||
m.show = true
|
||||
m.status = red.Render("This action is unsupported")
|
||||
}
|
||||
}
|
||||
|
||||
case errMsg:
|
||||
m.err = msg
|
||||
return m, nil
|
||||
}
|
||||
|
||||
m.textInput, cmd = m.textInput.Update(msg)
|
||||
return m, cmd
|
||||
}
|
||||
|
||||
func (m model) View() string {
|
||||
command_list := fmt.Sprintf(
|
||||
"Valid commands: %s, %s, %s",
|
||||
command.Render(" enqueue "),
|
||||
command.Render(" dequeue "),
|
||||
command.Render(" check "),
|
||||
)
|
||||
|
||||
if m.show {
|
||||
return padding.Render(fmt.Sprintf(
|
||||
"%v\n\n%v\n\n%s",
|
||||
command_list,
|
||||
m.status,
|
||||
m.textInput.View(),
|
||||
)) + "\n"
|
||||
} else {
|
||||
return padding.Render(fmt.Sprintf(
|
||||
"%v\n\n%v\n\n%s",
|
||||
command_list,
|
||||
list.Render(fmt.Sprintf("%v", m.queue)),
|
||||
m.textInput.View(),
|
||||
)) + "\n"
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
p := tea.NewProgram(initialModel())
|
||||
if _, err := p.Run(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
BIN
queue-golang/queue
Executable file
BIN
queue-golang/queue
Executable file
Binary file not shown.
BIN
queue-golang/queue.exe
Executable file
BIN
queue-golang/queue.exe
Executable file
Binary file not shown.
BIN
stack-rs/stack
Executable file
BIN
stack-rs/stack
Executable file
Binary file not shown.
81
stack-rs/stack.rs
Normal file
81
stack-rs/stack.rs
Normal file
|
@ -0,0 +1,81 @@
|
|||
use std::io::{self, Write};
|
||||
|
||||
fn tail(stack: [i64; 5]) -> usize {
|
||||
let mut index = 0;
|
||||
for i in 0..=4 {
|
||||
let subtract = -1*i as isize;
|
||||
let wanted_index = (4+subtract) as usize;
|
||||
|
||||
if subtract <= 0 && stack[wanted_index] != 0 {
|
||||
index = wanted_index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
index
|
||||
}
|
||||
|
||||
fn push(stack: &mut [i64; 5], number: &mut String) {
|
||||
let mut index = 0;
|
||||
let mut used = 0;
|
||||
|
||||
for (idx, i) in stack.clone().iter().enumerate() {
|
||||
if *i == 0 {
|
||||
index = idx;
|
||||
break;
|
||||
} else {
|
||||
used += 1;
|
||||
}
|
||||
}
|
||||
if used < 5 {
|
||||
stack[index] = number.parse().unwrap();
|
||||
} else {
|
||||
eprintln!("\x1b[31m\x1b[1m\nThe stack is full!\x1b[0m");
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut stack: [i64; 5] = [0; 5];
|
||||
|
||||
println!("\x1b[32m\x1b[1m\n Push, peek, pop or quit\x1b[0m");
|
||||
println!(" When pushing, append the value to push to the command: `push x`\n");
|
||||
let mut arguments: Vec<&str> = vec!["0"];
|
||||
let mut action = String::new();
|
||||
let mut argument: String;
|
||||
|
||||
while arguments[0] != "quit" {
|
||||
print!("\x1b[36m$\x1b[0m ");
|
||||
io::stdout().flush().unwrap();
|
||||
|
||||
io::stdin().read_line(&mut action).expect("Failed to read input");
|
||||
|
||||
argument = action.clone().replace("\n", "");
|
||||
arguments = argument.split(' ').collect::<Vec<&str>>();
|
||||
|
||||
action = String::new();
|
||||
|
||||
match arguments[0] {
|
||||
"push" => {
|
||||
push(&mut stack, &mut arguments[1].to_string());
|
||||
println!("\n\x1b[1m{:?}\x1b[0m\n", stack);
|
||||
}
|
||||
"peek" => {
|
||||
println!("\n\x1b[1m{}\x1b[0m\n", stack[tail(stack)]);
|
||||
}
|
||||
"pop" => {
|
||||
let used: Vec<i64> = stack.iter().filter(|&&x| x != 0).cloned().collect();
|
||||
if used.len() > 0 {
|
||||
stack[tail(stack)] = 0;
|
||||
eprintln!("\n\x1b[1m{:?}\x1b[0m\n", stack);
|
||||
} else {
|
||||
eprintln!("\x1b[31m\x1b[1m\nThe stack is empty!\x1b[0m\n");
|
||||
}
|
||||
}
|
||||
"quit" => {
|
||||
std::process::exit(0);
|
||||
}
|
||||
_ => {
|
||||
eprintln!("\x1b[31m\x1b[1m\nThis action is not supported!\x1b[0m\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue