ciklus és megjelenítés

Szeretném megoldani ezt a feladványt. A hét napjait szeretném kiíratni megfelelő formában. Tehát számokat adok meg. Teszem azt 3, akkor szerda. Ha 2-5 akkor kedd-péntek. Ha 1,3,7, akkor hétfő, szerda, vasárnap.

Végül is majdnem jó amit csináltam, csak annyi a baj, hogy az utolsó nap után is kiírja vesszőt, vagy a kötőjelet. Persze ciklusban van. mi mást csinálna. A sed meg mindenhonnan leszedi az utolsó két karaktert, így lőttek az elválasztóknak.

#!/bin/bash

HN="$1"
# HN lehet: 1,2,7    # HN lehet: 2-5   # HN lehet: 3
dayS () {
	case "${HNnum}" in
       "1") HNw="Monday";;
       "2") HNw="Tuesday";;  
       "3") HNw="Wednesday";; 
       "4") HNw="Thursday";; 
       "5") HNw="Friday";; 
       "6") HNw="Saturday";; 
       "7") HNw="Sunday";;
	esac
}

separate=$(echo "${HN}" | cut -c2-2)
    
case "${separate}" in
    "") 
        (( HNnum = HN ))
            dayS
            echo "${HNw}"
    ;;
    "-" | ",")
        mapfile numberArray <<< "$(echo "${HN}" | tr "${separate}" "\n")"  # szétbontva tömbbe rakjuk az adatokat.
        len=${#numberArray[@]} # itt megtudjuk hány számot is raktunk be.
        for (( i=0; i<=$((len-1)); i++ )); do 
            (( HNnum = "${numberArray[$i]}" ))
            dayS
            printf '%s' "${HNw}${separate}" #| sed 's/..$//'
        done
    ;;
esac

Persze ragoznám még, mert ha 6,7 akkor írja ki hogy hétvége. Ha 1-5, akkor hétköznap, meg lehetne páratlan napok, páros napok. Vagy teljesen más úton kéne elindulni?  Hm. A beszúró ablakban a case-t még jól mutatta, de itt most nem.

Hozzászólások

Akkor tanulsz legtöbbet, ha magad találod ki, gondolkodsz rajta. Az ilyen problémára nagyon sokféle megoldás létezik, csak a fantázia szab határt annak, milyen adatstruktúrát, ábrázolási formát használsz, illetve milyen algoritmusokat. Én az egészet awk-ban írnám, de én ilyen vagyok. :)

Egyébként meg holnap ZH? :D

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Érdemben is mondok valamit. Lényegében egy teljes szintaxis elemzőt kell írnod. Kezdetben vesszőnél szeparálnék, erre az awk split() függvénye remek. Így megmaradnak egy elemként a kötőjeles dolgok, s ha ilyet találnék, azt külön kiértékelném.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

#!/bin/bash

HN="$1"

days=("" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday")

IFS=$(echo "${HN}" | cut -c2-2)

read -a numberArray <<< $HN
j=${#numberArray[@]}
i=0

for val in "${numberArray[@]}";
do
  ((i++))
  printf "${days[$val]}";
  if [ "$i" -lt "$j" ]; then
    printf "$IFS";
  fi
done
printf "\n";

Áá. Igaz is két tömb. És az IFS mezőhatároló. A napok tömbbe rakásán én is gondolkoztam, de az IFS eszembe nem jutott volna. Mindenesetre köszi. Amúgy sosem tanultam iskolában programozni. Mindenre autodidakta módon és sok próbálkozással jöttem rá. Illetve voltak ilyen emberek akik kisegítettek. Nem ZH. Van egy szerelem projektem és most van időm kicsit kozmetikázni, finomítani. 

A paraméterből először a ","-ket cserélném " "-re, és egy ciklusban mennék végig rajtuk. Egy switch/case "keretén belül" ha az adott elem illeszkedik a "-" mintára, akkor az egy plusz ciklussal (for x in $(seq $(echo $a | tr "-" " "))) "váltanám át" számokká, illetve ez alapján írnám ki a megfelelő napot. Ha meg nem illeszkedik a "-" mintára, akkor a számnak megfelelő napot kell kiírni.

Hibakezelés, paraméter validálást és hasonlókat rád bízom :-P

Csak nem hagyott nyugodni a dolog - lehet yool megköpködni :) 

#!/bin/bash

nap=("vasárnap" "hétfő" "kedd" "szerda" "csütörtök" "péntek" "szombat" "vasárnap")
for i in $(echo $1 | tr "," " ")
do
  case $i in
    *-* ) for x in $(seq $(echo $i | tr "-" " "))
          do
            echo ${nap[$x]}
          done ;;
    * )   echo ${nap[$i]};;
  esac;
done

A tömb 0. eleme azért a vasárnap, mert így a crontab "day of week" mezőjét pici kiegészítéssel (ott lehet névvel is hivatkozni a napokra) megeszi.

$ echo 1,2-3/4=5%6#7 | sed -e 's/1/hétfő/g' -e 's/2/kedd/g' -e 's/3/szerda/g' -e 's/4/csütörtök/g' -e 's/5/péntek/g' -e 's/6/szombat/g' -e 's/7/vasárnap/g'
hétfő,kedd-szerda/csütörtök=péntek%szombat#vasárnap
 

Igazából nem gondoltam arra, hogy a szerdát is kiírja. Hiszen a hétfő-szombat rövidebb, mintha felsorolnám majdnem az egész hetet. A ragozáson már nem is gondolkoztam, mert az ugye... :)

fromDays=('Hétfőtől' 'Keddtől' 'Szerdától' 'Csütörtöktől' 'Péntektől' 'Szombattól' 'Vasárnaptól' )
toDays=('Hétfőn' 'Kedden' 'Szerdán' 'Csütörtökön' 'Pénteken' 'Szombaton' 'Vasárnap')
untilDays=('Hétfőig' 'Keddig' 'Szerdáig' 'Csütörtökig' 'Péntekig' 'Szombatig' 'Vasárnapig')

Ez sziszifuszi. De nyelvtanilag tuti hogy helyes lenne. :)

"4-6") echo ${fromDays[3]}-${untilDays[5]} ;;

A hétvége: 

"6-7") echo "Hétvégén" ;;   
"2,4,6") echo "Minden páros napon" ;;
"1,3,5") echo "Minden páratlan napon" ;;
 "0") echo "Minden nap" ;;

*************************************
De most belém hasított a dilemma. Hétfőtől szerdáig az valójában 2 nap. De biztos hogy mindenki rávágja hogy 3. Ezért is hanyagolom a ragozást ebben az esetben. 

Érdemes kettéválasztani a kérdést. Az első, a paraméterek egységesítése, tehát a felsorolások és az intervallumok egybegyúrása, azaz egy "1,2-3,5,6-7"-ból "1,2,3,5,6,7" sorozat megalkotása. Ezen végigmenve már tudsz olyat csinálni, ami egybegyúrja az intervallumokat (a a következő egyel nagyobb, mint az aktuális, akkor az intervallum végét növeled, ha egynél nagyobb a különbség, akkor az aktuális intervallumot kiírod, és a következőt megkezded, azaz a példában 1-3, majd 5-7 kerül kiírásra. De előtte vizsgálhatod azt is, hogy több napot jelölt-e meg, mint 3? Mer ha igen, akkor lehet, hogy célszerűbb a "melyik napon nem"-et kiírni :-)
Sokáig ragozható a dolog - kifejezetten ötletes feladatok alapja lehet shell script írása témakörben :-)