From e507aa80acff646efd16364923f1c6d3191184db Mon Sep 17 00:00:00 2001 From: Spectre Date: Mon, 20 Apr 2026 16:12:15 +0200 Subject: [PATCH] complete cow school scripts Move bash scripts under src/bash_scripts, add college/university/smart cow implementations, and mark the completed TODO items. --- TODO.md | 22 ++++---- bash_scripts/cow_college.sh | 18 ------- src/bash_scripts/cow_college.sh | 52 +++++++++++++++++++ .../bash_scripts}/cow_highschool.sh | 0 .../bash_scripts}/cow_kindergarten.sh | 0 .../bash_scripts}/cow_primaryschool.sh | 0 src/bash_scripts/cow_university.sh | 44 ++++++++++++++++ src/bash_scripts/smart_cow.sh | 12 +++++ 8 files changed, 119 insertions(+), 29 deletions(-) delete mode 100755 bash_scripts/cow_college.sh create mode 100755 src/bash_scripts/cow_college.sh rename {bash_scripts => src/bash_scripts}/cow_highschool.sh (100%) rename {bash_scripts => src/bash_scripts}/cow_kindergarten.sh (100%) rename {bash_scripts => src/bash_scripts}/cow_primaryschool.sh (100%) create mode 100755 src/bash_scripts/cow_university.sh create mode 100755 src/bash_scripts/smart_cow.sh diff --git a/TODO.md b/TODO.md index 5fcf097..96306fd 100644 --- a/TODO.md +++ b/TODO.md @@ -17,17 +17,17 @@ ## 3. Bash Scripts -- [ ] **`cow_kindergarten`** - - [ ] Cow says numbers 1 to 10, 1-second pause between each, sticks out tongue at the end. -- [ ] **`cow_primaryschool`** - - [ ] Cow says numbers 1 to `n` (argument). -- [ ] **`cow_highschool`** - - [ ] Cow says squares (1, 4, 9, ..., `n^2`) (argument). -- [ ] **`cow_college`** - - [ ] Cow says Fibonacci sequence up to `n`. -- [ ] **`cow_university`** - - [ ] Cow says prime numbers up to `n`. -- [ ] **`smart_cow`** +- [x] **`cow_kindergarten`** + - [x] Cow says numbers 1 to 10, 1-second pause between each, sticks out tongue at the end. +- [x] **`cow_primaryschool`** + - [x] Cow says numbers 1 to `n` (argument). +- [x] **`cow_highschool`** + - [x] Cow says squares (1, 4, 9, ..., `n^2`) (argument). +- [x] **`cow_college`** + - [x] Cow says Fibonacci sequence up to `n`. +- [x] **`cow_university`** + - [x] Cow says prime numbers up to `n`. +- [x] **`smart_cow`** - [ ] Cow says a simple arithmetic expression (e.g., "3+11"), eyes show the result. - [ ] **`crazy_cow`** - [ ] Create a "crazy arithmetic cow" script with something unusual or complex. diff --git a/bash_scripts/cow_college.sh b/bash_scripts/cow_college.sh deleted file mode 100755 index 7242c8c..0000000 --- a/bash_scripts/cow_college.sh +++ /dev/null @@ -1,18 +0,0 @@ -if [[ $# -ne 1 ]]; then - echo "usage: $0 " - echo "please provide exactly one numeric argument" - exit 1 -fi - -if ! [[ "$1" =~ ^[0-9]+$ ]] || (("$1" < 1)); then - echo "error: argument must be a positive integer" - exit 1 -fi - -reset -for ((i = 2; i < "$(($1 + 1))"; i++)); do - cowsay "$((($i - 1) * ($i - 1)))" - sleep 1 - clear -done -cowsay -e oo -T U "$(($1 * $1))" diff --git a/src/bash_scripts/cow_college.sh b/src/bash_scripts/cow_college.sh new file mode 100755 index 0000000..1c32a9c --- /dev/null +++ b/src/bash_scripts/cow_college.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +if [[ $# -ne 1 ]]; then + echo "usage: $0 " + exit 1 +fi + +if ! [[ "$1" =~ ^[0-9]+$ ]] || (($1 < 1)); then + echo "error: argument must be a positive integer" + exit 1 +fi + +n=$1 + +declare -A memo +memo[1]=0 +memo[2]=1 + +result=0 + +fib() { + local k=$1 + local a + local b + + if [[ -n "${memo[$k]:-}" ]]; then + result=${memo[$k]} + return + fi + + fib $((k - 1)) + a=$result + + fib $((k - 2)) + b=$result + + memo[$k]=$((a + b)) + result=${memo[$k]} +} + +for ((i = 1; i <= n; i++)); do + fib "$i" + value=$result + + if ((i < n)); then + printf '%s\n' "$value" | cowsay # il y a eu un peu de problèmes pour afficher correctement le nombre avec cowsay il attendait une sorte d'input ?? + sleep 1 + clear + else + printf '%s\n' "$value" | cowsay -e oo -T U + fi +done diff --git a/bash_scripts/cow_highschool.sh b/src/bash_scripts/cow_highschool.sh similarity index 100% rename from bash_scripts/cow_highschool.sh rename to src/bash_scripts/cow_highschool.sh diff --git a/bash_scripts/cow_kindergarten.sh b/src/bash_scripts/cow_kindergarten.sh similarity index 100% rename from bash_scripts/cow_kindergarten.sh rename to src/bash_scripts/cow_kindergarten.sh diff --git a/bash_scripts/cow_primaryschool.sh b/src/bash_scripts/cow_primaryschool.sh similarity index 100% rename from bash_scripts/cow_primaryschool.sh rename to src/bash_scripts/cow_primaryschool.sh diff --git a/src/bash_scripts/cow_university.sh b/src/bash_scripts/cow_university.sh new file mode 100755 index 0000000..2c8beb9 --- /dev/null +++ b/src/bash_scripts/cow_university.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +if [[ $# -ne 1 ]]; then + echo "usage: $0 " + exit 1 +fi + +if ! [[ "$1" =~ ^[0-9]+$ ]] || (($1 < 2)); then + echo "error: argument must be an integer >= 2" + exit 1 +fi + +n=$1 +# On utilise le crible de Eratosthenes +declare -a is_prime + +for ((i = 0; i <= n; i++)); do + is_prime[$i]=1 +done + +is_prime[0]=0 +is_prime[1]=0 + +for ((p = 2; p * p <= n; p++)); do + if ((is_prime[p] == 1)); then + for ((multiple = p * p; multiple <= n; multiple += p)); do + is_prime[$multiple]=0 + done + fi +done + +last_prime=0 + +for ((i = 2; i <= (n - 1); i++)); do + if ((is_prime[i] == 1)); then + + sleep 1 + clear + last_prime=$i + printf '%s\n' "$i" | cowsay + fi +done +reset # un peu sus comme façon de faire on verra pr le changer +printf '%s\n' "$last_prime" | cowsay -e oo -T U diff --git a/src/bash_scripts/smart_cow.sh b/src/bash_scripts/smart_cow.sh new file mode 100755 index 0000000..4d8f5ce --- /dev/null +++ b/src/bash_scripts/smart_cow.sh @@ -0,0 +1,12 @@ +while :; do # on utilise ce code pour etre sur qu'il n'y a pas de biais sur la génération de nombres aléatoire car il y a plus de chance sinon de tomber + # sur un nombre entre 0-17 que sur un nombre entre 0-49 + ra=$RANDOM + ((ra < 32750)) && r1=$((ra % 50)) && break # On peut avoir aussi une chance infiniment petite que la boucle ne finisse jamais donc a voir.... +done + +while :; do # Pareil mais les valeures favorisée aurait été entre 0-25 + rb=$RANDOM + ((rb < 32742)) && r2=$((rb % 51)) && break +done +# on génère entre 0 et 50/49 pour ne pas dépasser les 2 characters limites pour les yeux +cowsay -e "$(($r1 + $r2))" "$r1 + $r2"