#! /usr/bin/bash - # This file ought to be sourced, above line for syntax highlighting purposes. ######################## BASH RESET ############################# IFS=" " POSIXLY_CORRECT='1' COMMANDS_="builtin unalias unset read printf command exit type . tr fc compgen" COMMANDS_="${COMMANDS_-} wc sed grep xargs sudo shopt kill ps head awk clear" COMMANDS_="${COMMANDS_-} curl wget source check mv mkdir rm rmdir while do done" COMMANDS_="${COMMANDS_-} cc gcc g++ clang basename clone42 git alias export pwd" COMMANDS_="${COMMANDS_-} docker shift until for in bash sh dash ash ksh zsh top" COMMANDS_="${COMMANDS_-} shellcheck watch cmatrix alacritty tmux zellij ssh" COMMANDS_="${COMMANDS_-} which date df du case esac crontab ping base64 apt" COMMANDS_="${COMMANDS_-} paru pacman yum dnf aptitude apt-get yay rpm dpkg env" COMMANDS_="${COMMANDS_-} awk apropos help info dirname bc dc break continue" COMMANDS_="${COMMANDS_-} unzip zip tar untar gzip gunzip xz unxz base32 cal" COMMANDS_="${COMMANDS_-} chattr cfdisk fdisk passwd chroot cmp cron split dd" COMMANDS_="${COMMANDS_-} df dir declare diff dircolors dmesg eval exec egrep" COMMANDS_="${COMMANDS_-} false true : fg bg free fold find file gawk groupadd" COMMANDS_="${COMMANDS_-} less more cat head tail chmod chown history sleep yes" COMMANDS_="${COMMANDS_-} useradd adduser addgroup usermod groupdel userdel xxd" COMMANDS_="${COMMANDS_-} groups users who w last hash hostname htop ip ifconfig" COMMANDS_="${COMMANDS_-} install ifdown ifup jobs killall pkill pgrep klist" COMMANDS_="${COMMANDS_-} link ln unlink let local logout logname lsblk lsof" COMMANDS_="${COMMANDS_-} pidof lspci lsusb lscpu make mktemp mount umount nc" COMMANDS_="${COMMANDS_-} ncat nmap nft iptables ufw firewall-cmd nl nslookup" COMMANDS_="${COMMANDS_-} open xdg-open whereis whatis write wall agetty amixer" COMMANDS_="${COMMANDS_-} pulsemixer ar cmake bzip2 ccrypt chvt column chsh ex" COMMANDS_="${COMMANDS_-} od pushd popd pv pvs lvs vgs rsync screen sed seq wait" COMMANDS_="${COMMANDS_-} ftp sftp shift shuf sort uniq su strace sync tee test" COMMANDS_="${COMMANDS_-} time trap tr tty ulimit umask unix2dos dos2unix uptime" COMMANDS_="${COMMANDS_-} paco francinette cd ls disown whoami reboot systemctl" COMMANDS_="${COMMANDS_-} shutdown poweroff set x touch stat cp scp man locate" COMMANDS_="${COMMANDS_-} xset kbdrate return cut batcat id ed vi vim nvim nano" COMMANDS_="${COMMANDS_-} skill norminette bat echo if then fi else function" COMMANDS_="${COMMANDS_-} PROMPT_COMMAND PS0 PS1 PS2 PS3 PS4" # shellcheck disable=SC2086 2>/dev/null \unset -f -- ${COMMANDS_-} || true # shellcheck disable=SC2086 2>/dev/null \unalias -- ${COMMANDS_-} || true \builtin -- hash -r 2>/dev/null \unset -- POSIXLY_CORRECT COMMANDS_ ######################## BASH RESET END ############################# [ -z "${PS1-}" ] && return set -o emacs tabs -4 shopt -s histappend shopt -s checkwinsize shopt -s extglob shopt -u histverify shopt -s autocd HISTSIZE='-1' HISTFILESIZE='-1' HISTFILE="${HOME}"/.bash_history HISTTIMEFORMAT=$'\033[m%F %T: ' HISTCONTROL='ignoreboth:erasedups' # PROMPT_COMMAND="history -n; history -w; history -c; history -r" [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" if 2>/dev/null 1>&2 command -v nvim; then alias v='nvim' alias vi='nvim' alias vim='nvim' elif 2>/dev/null 1>&2 command -v vim; then alias v='vim' alias vi='vim' elif 2>/dev/null 1>&2 command -v nvi; then alias v='nvi' alias vi='nvi' elif 2>/dev/null 1>&2 command -v vi; then alias v='vi' fi alias tapo_bright='ssh -t pt bash -ic tapo_bright' alias tapo_color_ambience='ssh -t pt bash -ic tapo_color_ambience' alias tapo_color_ambience2='ssh -t pt bash -ic tapo_color_ambience2' alias gdb='gdb -q' alias objdump='objdump --disassembler-color=extended-color -Mintel' alias v='nvim' alias vim='nvim' alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias sudo='sudo ' alias s='echo sudo $(fc -nl -2 | head -1 | cut -c3-); eval sudo $(fc -nl -2 | head -1 | cut -c3-)' # cut -c2- for bash posix mode alias watch='watch ' alias tmux='tmux -2' alias open='xdg-open' alias xcopy='xsel --clipboard --input' alias xpaste='xsel --clipboard --output' alias aptclean='sudo apt -y update && sudo apt -y full-upgrade && sudo apt -y dist-upgrade && sudo apt -y autoremove && sudo apt -y clean' # shellcheck disable=SC2032 alias pacman='pacman --color=auto' alias pcker='nvim "${HOME-}"/.config/nvim/lua/*' alias after='nvim "${HOME-}"/.config/nvim/after/plugin' alias l='\ls --width="${COLUMNS:-80}" --sort=time --time=mtime --color=auto --time-style=long-iso -bharZ1l' # alias l='lsd --timesort --color=auto -harZ1l' alias ll='\ls --width="${COLUMNS:-80}" --sort=time --time=mtime --color=auto --fu -bharZ1l' alias ls='\ls --width="${COLUMNS:-80}" --color=auto -bC' alias ip='ip -color=auto' alias ipa='ip -br -color=auto a' alias grep='grep --color=auto' alias diff='diff --width="${COLUMNS:-80}" --color=auto' alias less='less -SR' alias dmesg='dmesg --color=auto --reltime --human --nopager --decode' alias free='free -mht' alias tree='tree --dirsfirst -C' alias francinette='"${HOME-}"/francinette/tester.sh' alias paco='"${HOME-}"/francinette/tester.sh' alias wttr='curl wttr.in' alias colors='bash -c "$(curl --silent --location \ "https://gist.githubusercontent.com/HaleTom/\ 89ffe32783f89f403bba96bd7bcd1263/raw" )"' alias sl='sl -GwFdcal' alias cmatrix='cmatrix -u3 -Cred' alias gca='git add -u && git commit -m "Automatic add"' alias watch='watch -tcn.1' alias pacop='clear && 2>/dev/null paco && 2>/dev/null paco --strict' alias xterm='xterm -bg black -fg white' alias norm='alacritty -e sh -c '\''watch -cn.5 \ norminette -R CheckForbiddenSourceHeader'\'' & disown' alias norm2='alacritty -e sh -c '\''watch -cn.5 \ norminette -R CheckForbiddenSourceHeader \| \ xargs -I{} printf \"{} \#\#\# \"'\'' & disown' alias dotconf='git --git-dir="${HOME-}"/.dotfiles/ --work-tree="${HOME-}"' alias r='ranger' 2>/dev/null dotconf config status.showUntrackedFiles no # auto_pushd function cd () { command cd "${@}" || return 1 pwd="${PWD}" 1>/dev/null command cd - || return 1 1>/dev/null pushd "${pwd}" || return 1 } CDPATH="${CDPATH}:${HOME}" CDPATH="${CDPATH}:${HOME}/projects" CDPATH="${CDPATH}:${HOME}/projects/aoc" CDPATH="${CDPATH}:${HOME}/projects/aoc/2023" CDPATH="${CDPATH}:${HOME}/42ecole" CDPATH="${CDPATH}:${HOME}/42ecole/42cursus" CDPATH="${CDPATH}:${HOME}/onnea" function paruuu () { read -p 'Do system upgrade (Y) or exit (n)' choice if [ ! "${choice}" = "y" -a ! "${choice}" = "Y" -a -n "${choice}" ]; then exit fi ssid="$(iw dev wlan0 link | grep SSID | sed -e 's/[[:blank:]]*SSID: //' \ -e 's/[[:blank:]]*$//' )" if : \ && [ ! "${ssid-}" = "Free Wifi" ] \ && [ ! "${ssid-}" = "FreeWifi" ] \ && [ ! "${ssid-}" = "DS_JD-Tree" ] \ && [ ! "${ssid-}" = "Haihin" ] \ && [ ! "${ssid-}" = "∞" ] \ && [ ! "${ssid-}" = "\xe2\x88\x9e" ] \ && [ ! "${ssid-}" = $'\xe2\x88\x9e' ] \ && [ ! "${ssid-}" = "Nichts 5" ] \ && [ ! "${ssid-}" = "Nichts 2,4" ] \ && [ ! "${ssid-}" = "Pink Flamingo" ] \ && [ ! "${ssid-}" = "Pink Flamingo_5G" ] \ && [ ! "${ssid-}" = "42Berlin_Student" ] \ && [ ! "${ssid-}" = "42Berlin_Guest" ] \ && [ ! "${ssid-}" = "ZorgatiHome Guest" ] \ && [ ! "${ssid-}" = "Rudolph" ] \ && [ ! "${ssid-}" = "Hackme" ] \ && [ ! "${ssid-}" = "hackme3" ] \ && [ ! "${ssid-}" = "Silmaril 4 (5)" ] \ && [ ! "${ssid-}" = "Silmaril 4 (2.4)" ] \ && [ -n "${ssid-}" ] \ && : ; then read -p "[31mYou're connected to '${ssid-}', update anyway (Y|n)?[m" choice if [ ! "${choice}" = "y" -a ! "${choice}" = "Y" -a -n "${choice}" ]; then exit fi fi # shellcheck disable=SC2033 time ( printf '\033[30;41m%s\033[m\n' 'Cache credentials for sudo:' \ && sudo -v \ && printf '\033[30;41m%s\033[m\n' 'Updating mirrorlist' \ && curl -sSL "https://archlinux.org/mirrorlist/?country=DE&protocol=https&use_mirror_status=on" \ | sed -e 's/^#Server/Server/' -e '/^#/d' \ | rankmirrors -n 8 - \ | sudo tee /etc/pacman.d/mirrorlist \ && clear \ && printf '\033[30;41m%s\033[m\n' 'pacman -Sy archlinux-keyring' \ && yes | sudo pacman -Sy archlinux-keyring \ && printf '\033[30;41m%s\033[m\n' 'pacman -Syyuu --noconfirm' \ && yes | sudo pacman -Syyuu --noconfirm \ && printf '\033[30;41m%s\033[m\n' 'paru -Syyu --devel --noconfirm' \ && yes | paru -Syyu --devel --noconfirm \ && printf '\033[30;41m%s\033[m\n' 'pacman -Qtdq | pacman -Rns -' \ && { pacman -Qtdq | 2>/dev/null sudo pacman --noconfirm -Rns - \ || printf '\033[30;42m%s\033[m\n' 'No pacman orphan packages :)!'; } \ && yes | paru -Scc -d \ && printf '\n\033[30;42m%s\033[m\n' '###### Done without error ######' \ || printf '\n\033[30;41m%s\033[m\n' '###### Some error occured! ######' ) } function skill () { if [ -n "${1-}" ] ; then # shellcheck disable=SC2046,SC2009 2>/dev/null kill -9 \ -- $(ps auxww | grep "${1-}" | grep -v grep | awk '{print $2}') \ && return 0 2>/dev/null sudo kill -9 \ -- $(ps auxww | grep "${1-}" | grep -v grep | awk '{print $2}') else echo 'Please provide one argument' fi } function wpa_restart () { skill wpa_supplicant sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf } function bat () { 2>/dev/null command -v batcat && { batcat "${@}"; return 0; } 2>/dev/null command -v bat && { $(type -P bat) "${@}"; return 0; } { printf '%s\n' "bat not found"; return 1; } } function take () { mkdir -p -- "$1" && cd -P -- "$1" || return 1; } function norminette () { local vers local newst vers="$($(type -P norminette) -v | cut -d" " -f2)" newst='3.3.55' if [ ! "${vers-}" = "${newst-}" ] ; then printf "%s\n%b\n" "Norminette v${vers-} instead of v${newst-} detected."\ '\033[31mPlease up-/downgrade\033[m' fi $(type -P norminette) -R CheckForbiddenSourceHeader "${@}" } function __norm () { local _pwd return 0 _pwd="$(pwd -P)" [ -n "${_pwd-}" ] && [ -z "${_pwd##${HOME-}/42/42cursus/*}" ] || { return 1; } 1>/dev/null 2>&1 git status || { return 2; } 1>/dev/null 2>&1 norminette && printf ' \033[92m%s\033[m' "[Norm: OK]" || printf ' \033[101;37m%s\033[m' "[䝝誒 ‼ NORM ‼ 屌誒]" return 0 } function ft_check () { # Set params URL="${1}" DIR="/tmp/tmp_repo_$(date +%s)" # If no URL, get it from current repo if [ -z "${URL-}" ] ; then URL="$(git remote get-url origin)" fi # Clone in temp folder git clone --quiet "${URL}" "${DIR}" # Only proceed if clone success if [ -d "${DIR}" ] ; then # Check the norm and print beautiful message norminette -R CheckForbiddenSourceHeader "${DIR}" && printf '\033[30;102m%s\033[m\n' "Norminette success" || printf '\033[30;101m%s\033[m\n' "Norminette fail!!!" # Remove temp folder rm -rf -- "${DIR}" else printf '\033[30;101m%s\033[m\n' "Could not clone the repo" fi } function clone42 () { folder="${1}" repo_url="${2}" # shellcheck disable=SC2015 git clone --quiet "${repo_url}" "${folder}" && { cd "${folder}"; norminette -R CheckForbiddenSourceHeader "."; } || { printf '%s\n' "Could not clone repo!"; } } # shellcheck disable=SC2016 export GIT_SSH_COMMAND='ssh -oIdentitiesOnly=yes -F"${HOME-}"/.ssh/config' if [ ! "${TERM-}" = "linux" ] ; then if [ -f '/usr/share/terminfo/x/xterm-256color' ] ; then export TERM='xterm-256color' elif [ -f '/usr/share/terminfo/x/xterm-color' ] ; then export TERM='xterm-color' elif [ -f '/usr/share/terminfo/x/xterm' ] ; then export TERM='xterm' elif [ -f '/usr/share/terminfo/s/screen-256color' ] ; then export TERM='screen-256color' elif [ -f '/usr/share/terminfo/s/screen' ] ; then export TERM='screen' fi fi # # shellcheck disable=SC2155 # export VISUAL="$(2>/dev/null $(type -P nvim))" export VISUAL="vi" # # shellcheck disable=SC2155 export EDITOR="vi" # export EDITOR="$(2>/dev/null $(type -P vim) || # 2>/dev/null $(type -P vi) || # 2>/dev/null $(type -P nano) || # 2>/dev/null $(type -P ed))" export SUDO_EDITOR="${EDITOR-}" export GIT_PS1_SHOWDIRTYSTATE='1' export MANPAGER='nvim +Man!' [ -z "${DISPLAY-}" ] && echo 'Warning: DISPLAY is not set' ###################### PROMPT STUFF ####################### # If bash runs in posix mode, if should be `cut -c2-' instead # shellcheck disable=SC2016 # PS0='$(clear -x ; printf "${PS1@P}" ; fc -nl -1 | cut -c3- ; printf "\n")' if [ ! -f "${HOME}"/.bash-preexec.sh ] ; then curl --silent --location \ "https://raw.githubusercontent.com/rcaloras\ /bash-preexec/master/bash-preexec.sh" \ -o "${HOME}"/.bash-preexec.sh fi # shellcheck disable=SC1091 . "${HOME}"/.bash-preexec.sh preexec() { TIMESTAMP_BEFORE="$(date +%s)" } precmd() { local sec_diff local TIMESTAMP_NOW TIMESTAMP_NOW="$(date +%s)" sec_diff="$(( TIMESTAMP_NOW - TIMESTAMP_BEFORE ))" if [ -n "${TIMESTAMP_BEFORE-}" ] && [ "${sec_diff-}" -ge "5" ] ; then TOOK_STRING=' took ' mins="$((sec_diff / 60))" secs="$((sec_diff % 60))" if [ "${mins-}" = "0" ] ; then TOOK_STRING="${TOOK_STRING-}${secs-}s" else TOOK_STRING="${TOOK_STRING-}${mins-}m${secs-}s" fi else unset -v -- TOOK_STRING fi } GIT_PROMPT="1" if [ ! -f "${HOME}"/git-prompt.sh ] && [ "${GIT_PROMPT-}" = "1" ] ; then curl --silent --location \ "https://raw.githubusercontent.com/git\ /git/master/contrib/completion/git-prompt.sh" \ -o "${HOME}"/git-prompt.sh fi _PS1_CWD_CLR='\[\033[33m\]' _PS1_USER='\[\033[31m\]\u\[\033[m\]' _PS1_SSH="$( set | grep -sq ^SSH_CONNECTION && printf "@\[\033[36m\]%s\[\033[m\]" "ssh" )" _PS1_TMUX="$( set | grep -sq ^TMUX_PANE && printf "@\[\033[35m\]%s\[\033[m\]" "tmux" )" [ -n "${_PS1_SSH-}" ] && _PS1_HOST_CLR='\[\033[30;42m\]' || \ _PS1_HOST_CLR='\[\033[32m\]' _PS1_1="${_PS1_USER-}" _PS1_1="${_PS1_1-}@${_PS1_HOST_CLR-}" _PS1_1="${_PS1_1-}\h\[\033[m\]" _PS1_1="${_PS1_1-}${_PS1_SSH-}${_PS1_TMUX-} " _PS1_1="${_PS1_1-}${_PS1_CWD_CLR-}" _PS1_1="${_PS1_1-}[\w]\${TOOK_STRING-}" # shellcheck disable=SC2016 _PS1_GIT='\[\033[m\]\[\033[36m\]$(__git_ps1 " (%s)")' # shellcheck disable=SC2016 _PS1_2='\[\033[m\]\[\033[36m\]$(__norm)\[\033[m\]\n\[\033[35m\]~\$\[\033[m\] ' if [ -f "${HOME}"/git-prompt.sh ] && [ -r "${HOME}"/git-prompt.sh ] && \ [ "${GIT_PROMPT-}" = "1" ] ; then # shellcheck disable=SC1091 . "${HOME}"/git-prompt.sh PS1="${_PS1_1-}${_PS1_GIT-}${_PS1_2-}" else PS1="${_PS1_1-}${_PS1_2-}" fi ######################### PROMPT STUFF END ####################### # Key Repeat/Delay Rate 2>/dev/null xset r rate 200 60 # Disable bell 2>/dev/null xset -b # sudo kbdrate --rate=30.0 --delay=250 complete -C pomo pomo eval "$(keyring --print-completion bash)" # shellcheck disable=SC1091 if [ -f "${HOME}"/.userbashrc ]; then . "${HOME}"/.userbashrc; fi # Simplified *Bash* Prompt, e.g. for tty/system/linux console # unset PS0; PS1='\033[94m\u\033[37m@\033[32m\h\033[37m@\033[33m$(basename -- "$(tty)") \033[36m\w \033[35m\$\033[m ' push_swap_perf () { url="${1}" perf_dir="${2}" [ -z "${url}" ] && { echo "Expected two parameters (url && perf_dir)" ; return ; } [ -z "${perf_dir}" ] && { echo "Expected two parameters (url && perf_dir)" ; return ; } rm -rf -- "${perf_dir}" || { echo "Couldn't return" ; return ; } git clone --quiet --depth 1 "${url}" "${perf_dir}" || { echo "Couldn't clone" ; return ; } [ -f "./stack_a.txt" ] || { echo "File ./stack_a.txt does not exist!" ; return ; } stack_a_file="$(readlink -f -- "./stack_a.txt")" 2>/dev/null 1>/dev/null pushd -- "${perf_dir}" || { echo "Couldn't cd into '${perf_dir}'" ; return ; } makefile_dir="$(find . -name Makefile | awk '{printf "%s|%s\n", $0, length($0)}' | sort -t'|' -k2,2g | head -1 | awk -F'|' '{print $1}' | xargs -r dirname)" [ -z "${makefile_dir}" ] && { echo "No Makefile found" ; return ; } 2>/dev/null 1>/dev/null pushd -- "${makefile_dir}" || { echo "Couldn't cd into '${makefile_dir}'" ; return ; } find . -type f -exec sed -i -e 's/-Werror//g' {} \; find . -type f -exec sed -i -e 's/rewind/rewindx/g' {} \; 2>/dev/null 1>/dev/null make -j$(nproc) -i -k -s || { echo "Couldn't run make" ; return ; } ops="$(2>/dev/null ./push_swap $(cat -- "${stack_a_file}") | wc -l)" echo "ops;${ops}" 2>/dev/null 1>/dev/null popd 2>/dev/null 1>/dev/null popd } # Add these to your ~/.bash_aliases AOC_DIR="${HOME}/projects/aoc" # remember to change this to whatever your AOC directory is alias aos="python3 solution.py < in.txt" alias aot="printf '\033[34m'; python3 solution.py < test.txt; printf '\033[m'" alias aoc="aot; echo; aos" aocload () { local dir local year local day this_year="$(date "+%Y")" this_day="$(date "+%d" | sed -e 's/^0//')" if [ -n "${1}" ]; then if [ -z "${2}" ]; then printf '\033[31m%s\033[m\n' 'Expected one more parameter (day)' return 1 fi if [ -n "${3}" ]; then printf '\033[31m%s\033[m\n' 'Expected exactly 2 parameters (year day)' return 2 fi year="${1}" day="${2}" if [ "${day}" -lt "1" -o "${day}" -gt "25" ]; then printf '\033[31m%s\033[m\n' 'Day not in range 1..25' return 3 fi if [ "${year}" -lt "2015" -o "${year}" -gt "${this_year}" ]; then printf '\033[31m%s\033[m\n' "Year not in range 2015..${this_year}" return 4 fi else year="${this_year}" day="${this_day}" fi dir="${AOC_DIR}/${year}/${day}" command mkdir -p -- "${dir}" || return 5 command cd -P -- "${dir}" || return 6 2>/dev/null 1>/dev/null git init "${AOC_DIR}" || true . "${AOC_DIR}/.env" curl -sSL \ -o './in.txt' \ -b "session=${AOC_COOKIE}" \ "https://adventofcode.com/${year}/day/${day}/input" \ || printf '\033[31m%s\033[m' "$(echo 'Error downloading input' | tee './in.txt')" command unset -v -- AOC_COOKIE if [ ! -f './solution.py' ]; then command cat <<- TEMPLATE >> './solution.py' #!/usr/bin/env python3 print() import os import re import sys import math import multiprocessing as mp from copy import copy, deepcopy from typing import Any import numpy as np import more_itertools as miter from functools import cache, lru_cache, reduce from collections import deque, defaultdict, Counter from itertools import ( repeat, cycle, combinations, combinations_with_replacement, permutations, tee, pairwise, zip_longest, islice, takewhile, filterfalse, starmap ) e=enumerate data = open(0).read().strip().splitlines() R = len(data) C = len(data[0]) def parse_grid(data: list[str]) -> Any: for r in range(R): for c in range(C): pass def parse_lines(data: list[str]) -> Any: for line in data: line = line.split() def parse_line(data: list[str]) -> Any: return data[0].split() # data = parse_line(data) # data = parse_lines(data) data = parse_grid(data) t = 0 for line in data: n = 0 t += n print(t) TEMPLATE fi command chmod +x './solution.py' tmux splitw -v -c "${dir}" tmux send-keys "nvim '+normal gg0' './in.txt'" ENTER tmux select-pane -l tmux send-keys "nvim './solution.py'" ENTER } xmodmap ~/.Xmodmap alias q='docker run --rm -it ghcr.io/natesales/q'