Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/08/2012, à 19:58

thurston

[RESOLU] Compacter une phrase complète pour low char display

Bonjour,

faisant suite à ce post 1007381 (resolu merci à tous), je peux donc déterminer les mots significatif d'une phrase, à savoir les plus longs. (c'est pour reconnaitre un artiste, un album ou un titre).
Ok mais le résultat de ces mots importants est toujours de longueur inadapté à un display (de type car player) de 16 char seulement.
L'idée est donc d'inventer une moulinette qui permette de compacter les mots importants pour faire tenir le tout dans 16 char.
Je suis parti de ceci comme postulat de départ

final_sequence_max_word_nb=`bc <<<"(sqrt($final_sequence_char_nb))"`

Ceci donne le nombre de mots max à compacter (on les trouve parmi les plus longs avec le post cité) en fonction du nb total de caractères visibles.
Display
3 char > 1 mot
4 char > 2 mots
9 char > 3 mots
etc...
Cette règle permet de loger l'artiste + le titre dans 16 char au total et de reconnaitre au premier coup d'oeil de quel titre il s'agit.
Egalement: Je conserve toujours le 1er mot comme important quelque soit sa taille pour conserver le tri alphabetique.

J'ai bricolé quelque chose d'horrible en bash qui m'a permis de déduire que le principe fonctionnait (je veux dire je reconnais même sur 16 char l'artiste + le titre).
Ce qu'ai fait, c'est également d'égaliser initialement les 3 mots, sans appliquer de ratio versus la taille initiale. Ce que je peux dire c'est qu'il faut bien sûr bien réserver pour l'éventuel 3eme mot par ex le reste du display dispo dans le cas où les 2 premiers mots seraient très courts initialement. (on doit avoir char1 + char2 + char3 = char total et non pas diviser le char total par 3...)
Exemple:
Ainsi cet artiste "Thurston Moore" donnerait (char)
Th.Mo (5)
Thur.Moor (9)

Par contre, cet artiste "My Bloody Valentine" donnerait (char) (le My consomme moins que 1/3 de 14)
My.Va (5)
My.Bl.Val (9)
My.Blood.Valent (14)

On reconnait bien l'artiste ;-), et les "." indique la troncature.

Quelqu'un que ca intéresse et qui pourrait me proposer quelque chose d'optimisé? Si oui je prends
Cette manipulation me permet de naviguer relativement facilement dans 2000 titres en voiture!!! ou sur un mp3 player en navigation de type folder. J'ai traité presque 10 000 mp3s de façon très drastique, puisque 16 char seulement avec un char perdu entre titre et artiste...Et ca marche au niveau reconnaissance visuelle rapide.
Merci d'avance
A+
T

Dernière modification par thurston (Le 16/08/2012, à 13:04)

Hors ligne

#2 Le 16/08/2012, à 00:15

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

Salut thurston,

Ce n'est pas très propre, ça manque de commentaires, et ça ne fait pas exactement ce que tu veux, mais c'est un point de départ.

$ cat ./compact.sh

#!/bin/bash

traitement() {
   phrase="$1"           # Phrase à traiter
   nmax="$2"             # Nombre de mots à conserver
   n=0; resul=""
# On trie les longueurs des mots par valeurs décroissantes, et on ne garde que les "nmax" premières
   longueurs=( $(
         for mot in ${phrase[@]}
         do
            echo ${#mot}
         done | sort -rn | head -$nmax
   ) )
   
 # Boucle sur les mots de la phrase
 # On ne prend que ceux dont la longueur correspond à une de celles conservées dans le tableau "longueurs"
   for mot in ${phrase[@]}
   do
      ind=0
      for lon in "${longueurs[@]}"
      do
         if [[ ${#mot} == $lon ]]; then
            resul=$resul"$mot "
          # On enlève du tableau la longueur qui a été utilisée
            longueurs[$ind]=""
            ((++n))
            break
         fi
         ((++ind))
      done
    # On s'arrête si on a le compte de mots
      ((n >= nmax)) && break
   done
      
   echo "$resul"
}

compact() {
   phrase="$1"
   nb_mot_phrase=$(wc -w <<<"$phrase")
   nb_car_tot="$2"
   nb_mot=$(bc <<<"sqrt($nb_car_tot)")
   ((nb_mot>nb_mot_phrase)) && nb_mot=$nb_mot_phrase
   nb_car_mot=$((nb_car_tot/nb_mot))
   mot_1=$(cut -d\  -f1 <<<$phrase)
   mot_2_fin=$(cut -d\  -f2- <<<$phrase)
   phrase_courte="$mot_1 "$(traitement "$mot_2_fin" $((nb_mot-1)))
   nb_mot_phrase_courte=$(wc -w <<<"$phrase_courte")
   n=0
   for mot in ${phrase_courte}
   do
      ((n++))
      nb_car_mot=$((nb_car_tot/nb_mot))
      if ((${#mot} <= $((nb_car_mot-1)) )); then
         resul=$resul"$mot "; lon=$((${#mot}+1))
      else
         if ((n==nb_mot_phrase_courte)); then
            resul=$resul"${mot:0:$((nb_car_mot))}"
         else
            resul=$resul"${mot:0:$((nb_car_mot-1))}."
         fi
         lon=$nb_car_mot
      fi
      ((nb_car_tot-=lon))
      ((nb_mot--))
   done
#  echo "$phrase_courte"
   echo "$resul"
}

compact "$1" "$2"

Utilisation :

$ ./compact.sh "Thurston Moore" 5
T.Moo

$ ./compact.sh "Thurston Moore" 9
Thu.Moore

$ ./compact.sh "My Bloody Valentine" 5
M.Val

$ ./compact.sh "My Bloody Valentine" 9
My.Bl.Val

$ ./compact.sh "My Bloody Valentine" 14
My Bloo.Valent

Édité : Petite correction

Dernière modification par pingouinux (Le 16/08/2012, à 00:57)

Hors ligne

#3 Le 16/08/2012, à 00:36

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

Salut pingouinux

Ah la vache, c'est vraiment la grande classe...quand je pense au temps que j'ai mis à bricoler un truc immonde (plusieurs jours...). Y a pas à faire, quand on sait faire, ca le fait...moi mon truc c'est le design de cartes électroniques, je suis à la rue, et j'apprécie vraiment ton aide.
je continue à tester avec d'autres cas.
1. traitement "My Bloody Valentine" 12 > My Blo.Valen soit 2char.3char.5char Je m'attendais à  2char.4char.4char
2. bizarrement: traitement "Killing Joke" 8 donne le meme résultat que traitement "Killing Joke" 9 > Kil.Joke (8) (idem avec thurston moore pour 10 et 11 qui produise le meme resultat
3. la gestion du point qui apparait et disparait en fonction du nb de char. Dans mon esprit il ne doit pas signifier si troncature il y a mais simplement représenter la séparation entre 2 mots (un espace qui prend la forme d'un point, quoi, mais qui est plus indicatif du compactage fort du nom original. My.Bloo.Valen est mieux visuellement que My Bloo Valen. (au cas où tu te sois posé la question...)

Merci vraiment pour ton temps, je suis toujours émerveillé de l'entraide dans ce forum.
A+
T

Dernière modification par thurston (Le 16/08/2012, à 00:56)

Hors ligne

#4 Le 16/08/2012, à 01:04

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

Je viens de faire une petite correction du script en #2, pour que la gestion du point soit cohérente (absence de point si le mot est complet). Mais que veux-tu exactement ?

thurston #1 a écrit :

les "." indique la troncature.

thurston #3 a écrit :

la gestion du point qui apparait et disparait en fonction du nb de char. Dans mon esprit il ne doit pas signifier si troncature il y a mais simplement représenter la séparation entre 2 mots

Hors ligne

#5 Le 16/08/2012, à 02:01

Maisondouf

Re : [RESOLU] Compacter une phrase complète pour low char display

@pingouinux: j'arrive un peu en vrac sur le sujet et première chose bravo (m'a fallu 30 minutes pour comprendre le principe du scripte sad )...

Une suggestion quand même, si le but est de récupérer une phrase en vue d'être utilisée comme nom de fichier, il vaudrait mieux éviter le espaces.
Maintenant pour différencier la notion de mot abrégé de mot complet, le signe '_' peut remplacer l'espace et être plus secure pour les systèmes d'exploitation ou les applications qui seraient amenées à utiliser ces noms de fichiers.

Amusez vous bien ! wink


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#6 Le 16/08/2012, à 02:24

Maisondouf

Re : [RESOLU] Compacter une phrase complète pour low char display

papounet@amd8papou:~/Modèles$ bash title-compactor2.sh "My tailor is rich" 10
My_ta.rich
papounet@amd8papou:~/Modèles$ bash title-compactor2.sh "My tailor is rich" 15
My_tailo.rich_
papounet@amd8papou:~/Modèles$ bash title-compactor2.sh "My tailor is rich" 20
My_tail.is_rich_
papounet@amd8papou:~/Modèles$ bash title-compactor2.sh "the house of the rising sun" 20
the_hous.the_rising_

Vilain en fait.... avec le '_' à la fin...


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#7 Le 16/08/2012, à 08:01

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

Bonjour à tous,

désolé je suis parti dormir ;-)
En fait ce que j'ai trouvé le plus lisible c'est le point utilisé pour séparer 2 mots que ceux ci soient tronqués ou pas.
Le point utilisé en tant qu'espace donc indique la forte troncature opérée sur la phrase initiale...enfin c'est visuel et un peu perso.
Pour etre clair
Ceci est ok
My.Bloo.Valen

Pas ceci
My Bloo.Valen
ni ceci
My.Bloo.Valen.

Maintenant, je propose que l'on ne retouche pas au script qui marche super bien, et que l'on fasse à la demande un remplacement des espaces par un point si on le souhaite en fin de process, du style
echo "$resul" | sed -e "s# #.#g" qui ne coute pas trop cher à mon sens et permet les 2 options.*

Sinon ,j'ai retesté la nouvelle version, qui est mieux. Par contre j'ai toujours (pas encore retouché sur ce point?):
traitement "Killing Joke" 11 = traitement  "Killing Joke" 10. et le résultat est Kill.Joke (4)(1)(4) soit 9 char et non 10 ni 11
traitement "Killing Joke" 8 est lui ok, sans espace en bout d'ailleurs
On voit bien les espaces si on opte pour la ligne de code ci dessus rajouté en dernier

Egalement
traitement "Killing Joke" 10> "Kill.Joke" > (4)(1)(4) = (9)
Merci en tous les cas, le script est fantastique déjà dans l'état!!!
A+
Thurston

Dernière modification par thurston (Le 16/08/2012, à 08:08)

Hors ligne

#8 Le 16/08/2012, à 09:55

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

@ thurston #7 :
Voici une version corrigée de mon script bash du #2 (il n'y a plus d'espaces en sortie).
La chaîne finale est parfois moins longue que ce qui est demandé. Je traite les mots dans l'ordre, et fais une estimation au fur et à mesure de la longueur à conserver des mots suivants ( place_restante / nb_de_mots_restants ). Si on termine par des mots courts, on peut ne pas occuper toute la place.

$ cat ./compact.sh

#!/bin/bash

traitement() {
   phrase="$1"           # Phrase à traiter
   nmax="$2"             # Nombre de mots à conserver
   n=0; resul=""
# On trie les longueurs des mots par valeurs décroissantes, et on ne garde que les "nmax" premières
   longueurs=( $(
         for mot in ${phrase[@]}
         do
            echo ${#mot}
         done | sort -rn | head -$nmax
   ) )
   
 # Boucle sur les mots de la phrase
 # On ne prend que ceux dont la longueur correspond à une de celles conservées dans le tableau "longueurs"
   for mot in ${phrase[@]}
   do
      ind=0
      for lon in "${longueurs[@]}"
      do
         if [[ ${#mot} == $lon ]]; then
            resul=$resul"$mot "
          # On enlève du tableau la longueur qui a été utilisée
            longueurs[$ind]=""
            ((++n))
            break
         fi
         ((++ind))
      done
    # On s'arrête si on a le compte de mots
      ((n >= nmax)) && break
   done
      
   echo "$resul"
}

compact() {
   phrase="$1"
   nb_mot_phrase=$(wc -w <<<"$phrase")
   nb_car_tot="$2"
   nb_mot=$(bc <<<"sqrt($nb_car_tot)")
   ((nb_mot>nb_mot_phrase)) && nb_mot=$nb_mot_phrase
   mot_1=$(cut -d\  -f1 <<<$phrase)
   mot_2_fin=$(cut -d\  -f2- <<<$phrase)
   phrase_courte="$mot_1 "$(traitement "$mot_2_fin" $((nb_mot-1)))
   nb_mot_phrase_courte=$(wc -w <<<"$phrase_courte")
   n=0
   for mot in ${phrase_courte}
   do
      ((n++))
      nb_car_mot=$((nb_car_tot/nb_mot))
      if ((n==nb_mot_phrase_courte)); then # Dernier mot
         if ((${#mot} <= $((nb_car_mot)) )); then
            resul=$resul"$mot"
         else
            resul=$resul"${mot:0:$((nb_car_mot))}"
         fi
      else                                 # Pas dernier mot
         if ((${#mot} <= $((nb_car_mot-1)) )); then
            resul=$resul"$mot."
            lon=$((${#mot}+1))
         else
            resul=$resul"${mot:0:$((nb_car_mot-1))}."
            lon=$nb_car_mot
         fi
      fi
      ((nb_car_tot-=lon))
      ((nb_mot--))
   done
#  echo "$phrase_courte"
   echo "$resul"
}

compact "$1" "$2"

Hors ligne

#9 Le 16/08/2012, à 11:14

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

Voici une version "améliorée", qui ne devrait pas avoir les inconvénients que je signalais en #8 :
$ cat compact2.sh

#!/bin/bash

traitement() {
   phrase="$1"           # Phrase à traiter
   nmax="$2"             # Nombre de mots à conserver
   n=0; resul=""
# On trie les longueurs des mots par valeurs décroissantes, et on ne garde que les "nmax" premières
   longueurs=( $(
         for mot in ${phrase[@]}
         do
            echo ${#mot}
         done | sort -rn | head -$nmax
   ) )
   
 # Boucle sur les mots de la phrase
 # On ne prend que ceux dont la longueur correspond à une de celles conservées dans le tableau "longueurs"
   for mot in ${phrase[@]}
   do
      ind=0
      for lon in "${longueurs[@]}"
      do
         if [[ ${#mot} == $lon ]]; then
            resul=$resul"$mot "
          # On enlève du tableau la longueur qui a été utilisée
            longueurs[$ind]=""
            ((++n))
            break
         fi
         ((++ind))
      done
    # On s'arrête si on a le compte de mots
      ((n >= nmax)) && break
   done
      
   echo "$resul"
}

compact() {
   phrase="$1"
   nb_mot_phrase=$(wc -w <<<"$phrase")
   nb_car_tot="$2"
   nb_mot=$(bc <<<"sqrt($nb_car_tot)")
   ((nb_mot>nb_mot_phrase)) && nb_mot=$nb_mot_phrase
   mot_1=$(cut -d\  -f1 <<<$phrase)
   mot_2_fin=$(cut -d\  -f2- <<<$phrase)
   phrase_courte="$mot_1 "$(traitement "$mot_2_fin" $((nb_mot-1)))
   nb_mot_phrase_courte=$(wc -w <<<"$phrase_courte")
################################################################################
 # Chaque ligne de "liste" va contenir :
   # la longueur du mot
   # sa place dans la phrase
   # le mot
   # 0 (ou 1 si dernier mot de la phrase)
 # Cette "liste" est triée par longueurs croissantes des mots
   n=0
   liste=$(
   for mot in ${phrase_courte}
   do
      ((n++))
      printf "%s %s %s %s\n" ${#mot} $n $mot $((n==nb_mot_phrase_courte))
   done | sort -n
   )
################################################################################
   n=0
   resul=$( printf "%s" $(
   while read l_mot place mot der
   do
      ((n++))
      nb_car_mot=$((nb_car_tot/nb_mot))
      if ((der==1)); then                  # Dernier mot
         if ((l_mot <= nb_car_mot)); then
            printf "%s %s\n" $place "$mot"
            lon=$l_mot
         else
            printf "%s %s\n" $place "${mot:0:$nb_car_mot}"
            lon=$nb_car_mot
         fi
      else                                 # Pas dernier mot
         if ((l_mot <= $((nb_car_mot-1)) )); then
            printf "%s %s\n" $place "$mot."
            lon=$((l_mot+1))
         else
            printf "%s %s\n" $place "${mot:0:$((nb_car_mot-1))}."
            lon=$nb_car_mot
         fi
      fi
      ((nb_car_tot-=lon))
      ((nb_mot--))
   done <<<"${liste}" | sort -n | cut -d\  -f2
   ) )
################################################################################
   echo "$resul"
}

compact "$1" "$2"

Hors ligne

#10 Le 16/08/2012, à 11:42

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

Bon ben again, chapeau.
J'ai testé sur plusieurs titres, tout est nickel.
Juste pour que je comprenne le résultat (j'arrive pas à m'y retrouver dans les boucles, script trop complexe pour moi)
traitement "And So I Watch You From Afar" 7 > An.Watc (2)(1)(4)
On n'a pas l'égalité qui était théoriquement possible entre 1er et 2eme mot, puisque l'on a pas (3)(1)(3).
Comment cela s'explique t il?
Attention je n'ai pas dit que cela ne convenait pas !!!!! c'est juste pour comprendre les conséquences sur le compactage.
Merci vraiment à toi pingouinux. Je me tellement redevable car j'imagine qu'il y a pas mal d'heures de boulot derrière.
A+
T

Dernière modification par thurston (Le 16/08/2012, à 11:46)

Hors ligne

#11 Le 16/08/2012, à 12:16

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

Voici une version donnant (en principe) les mêmes résultats que la précédente, mais le script est simplifié. Je me suis inspiré d'une idée de Tycho Brahe dans le post #3 de cette discussion.

$ cat ./compact3.sh

#!/bin/bash

compact() {
   phrase="$1"
   nb_mot_phrase=$(wc -w <<<"$phrase")
   nb_car_tot="$2"
   nb_mot=$(bc <<<"sqrt($nb_car_tot)")
   ((nb_mot>nb_mot_phrase)) && nb_mot=$nb_mot_phrase
   #############################################################################
   n=0
   phrase_courte=$( echo $(
   for mot in ${phrase}
   do
      ((n++))
      ((n==1)) && lon=1000 || lon=${#mot}
      printf "%s %s %s %s\n" $lon ${#mot} $n $mot
   done | sort -rn | head -$nb_mot | cut -d\  -f3,4 | sort -n | cut -d\  -f2
   ) )
   nb_mot_phrase_courte=$(wc -w <<<"$phrase_courte")
   #############################################################################
 # Chaque ligne de "liste" va contenir :
   # la longueur du mot
   # sa place dans la phrase
   # le mot
   # 0 (ou 1 si dernier mot de la phrase)
 # Cette "liste" est triée par longueurs croissantes des mots
   n=0
   liste=$(
   for mot in ${phrase_courte}
   do
      ((n++))
      printf "%s %s %s %s\n" ${#mot} $n $mot $((n==nb_mot_phrase_courte))
   done | sort -n
   )
   #############################################################################
   n=0
   resul=$( printf "%s" $(
   while read l_mot place mot der
   do
      ((n++))
      nb_car_mot=$((nb_car_tot/nb_mot))
      if ((der==1)); then                  # Dernier mot
         if ((l_mot <= nb_car_mot)); then
            printf "%s %s\n" $place "$mot"
            lon=$l_mot
         else
            printf "%s %s\n" $place "${mot:0:$nb_car_mot}"
            lon=$nb_car_mot
         fi
      else                                 # Pas dernier mot
         if ((l_mot <= $((nb_car_mot-1)) )); then
            printf "%s %s\n" $place "$mot."
            lon=$((l_mot+1))
         else
            printf "%s %s\n" $place "${mot:0:$((nb_car_mot-1))}."
            lon=$nb_car_mot
         fi
      fi
      ((nb_car_tot-=lon))
      ((nb_mot--))
   done <<<"${liste}" | sort -n | cut -d\  -f2
   ) )
################################################################################
   echo "$resul"
}

compact "$1" "$2"
thurston #10 a écrit :

traitement "And So I Watch You From Afar" 7 > An.Watc (2)(1)(4)
On n'a pas l'égalité qui était théoriquement possible entre 1er et 2eme mot, puisque l'on a pas (3)(1)(3).

Je procède comme ceci :

  • nb de mots : 2=sqrt(7)

  • longueur des mots : 3=7/2

  • Je prends 3 caractères du 1er mot (2 + le point), et il en reste 4.

Le challenge était intéressant.

Hors ligne

#12 Le 16/08/2012, à 12:59

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

@pingouinux

Merci pour le boulot l'explication, le tout quoi.
Oui j'avais conscience que le challenge était prenant, car même avec mes petits moyens cela m'a occupé plusieurs jours pendant mes congés!! Par contre je n'avais pas le niveau requis, et j'avais traité jusqu'à 4 mots seulement, avec des caseif nul quoi, mais fonctionnel pour voir si ca le faisait (ca le fait).
Pour finir, je vais utiliser ton boulot extrêmement souvent, car 4 gamins équipés de player mp3 et moi meme très gros consommateur (3 mp3 players rien que pour moi + voiture équipé également poste mp3, avec + de 30 000 mp3 90% legaux quand même!!!).
En gros, c'était un challenge utile crois moi.
Encore merci, le forum est vraiment un lieu magique avec une entraide qui est franchement incroyable, et qui me pousse à proner linux (la machine et la mentalité) autour de moi.
A+
Merci vraiment
Thurston

PS: je me souviens que dans mon script, j'étais obligé d'ajouter un peu moins que le nombre de mots à la longueur de caractère avant de diviser par ce nombre de mots pour atteindre le bon nombre de char, en calculant au final le reliquat pour le dernier mot. Ca permettait des fois d'obtenir (3)(1)(3). Par contre, c'était facile car je le traitais avec des caseif et non des boucles en while.

Dernière modification par thurston (Le 16/08/2012, à 13:13)

Hors ligne

#13 Le 16/08/2012, à 16:41

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

Je crois que c'est mon dernier mot :

$ cat compact4.sh

#!/bin/bash

compact() {
   phrase="$1"
   nb_mot_phrase=$(wc -w <<<"$phrase")
   nb_car_tot="$2"
   nb_mot=$(bc <<<"sqrt($nb_car_tot)")
   ((nb_mot>nb_mot_phrase)) && nb_mot=$nb_mot_phrase
   #############################################################################
   n=0
   phrase_courte=$( echo $(
   for mot in ${phrase}
   do
      ((n++))
      ((n==1)) && lon=1000 || lon=${#mot}
      printf "%s %s %s %s\n" $lon ${#mot} $n $mot
   done | sort -rn | head -$nb_mot | cut -d\  -f3,4 | sort -n | cut -d\  -f2
   ) )
   nb_mot_phrase_courte=$(wc -w <<<"$phrase_courte")
   #############################################################################
 # Chaque ligne de "liste" va contenir :
   # la longueur du mot
   # sa place dans la phrase
   # le mot
   # 0 (ou 1 si dernier mot de la phrase)
 # Cette "liste" est triée par longueurs croissantes des mots
   n=0
   liste=$(
   for mot in ${phrase_courte}
   do
      ((n++))
      printf "%s %s %s %s\n" ${#mot} $n $mot $((n==nb_mot_phrase_courte))
   done | sort -n
   )
   #############################################################################
   n=0; deja_der=0
   resul=$( printf "%s" $(
   while read l_mot place mot der
   do
      ((n++))
      nb_car_mot=$(( (nb_car_tot-nb_mot+1-deja_der)/nb_mot ))
      if ((der==1)); then                  # Dernier mot
         if ((l_mot <= nb_car_mot)); then
            printf "%s %s\n" $place "$mot"
            lon=$l_mot
         else
            printf "%s %s\n" $place "${mot:0:$nb_car_mot}"
            lon=$nb_car_mot
         fi
      else                                 # Pas dernier mot
         if ((l_mot <= $nb_car_mot )); then
            printf "%s %s\n" $place "$mot."
            lon=$((l_mot+1))
         else
            printf "%s %s\n" $place "${mot:0:$nb_car_mot}."
            lon=$((nb_car_mot+1))
         fi
      fi
      ((nb_car_tot-=lon))
      ((nb_mot--))
      ((deja_der+=der))
   done <<<"${liste}" | sort -n | cut -d\  -f2
   ) )
################################################################################
   echo "$resul"
}

compact "$1" "$2"
$ ./compact4.sh "And So I Watch You From Afar" 7
And.Wat

Hors ligne

#14 Le 16/08/2012, à 17:02

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

Ben moi j'en aurais plein de mots pour décrire ton script.
Je vais me borner à Splendide, et à merci pour ce que je te dois.
A+
T

Hors ligne

#15 Le 18/08/2012, à 11:27

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

@pingouinux,

Tiens, en utilisant la fonction intensivement, je me rends compte que je dois souvent faire ceci:
short2 "artiste-titre" 16
Sachant que j'affecte 8 à l'artiste et 7 au titre initialement (ca pourrait etre 8 puis 7, il faut simplement gérer ici que 16 - (1=-) = impair , et que, si l'artiste est initialement plus court je reserve le reste dispo au titre.
En résumé
short2 "Beck - No Title In Mind" 16 > Beck-No.Tit.Mi soit (5-1-9=16)
short2 "Sonic Youth - Confusion Is Sex" 16 > Son.Yout-Con.Sex (8-1-7)

j'y suis arrivé très laborieusement je pense, en traitant avec ton script, je fais un check de la longueur et j'affecte si il le faut le reste au 2eme mot. Ca donne ca, mais je suis sur qu'il il y a beaucoup plus efficace, oui ou non? Attention tu vas pleurer...

function short2()
{
#$1: first word
#$2: second word
#$3: total length 

nb_char=$3
word1_init_nb_char=`bc <<<"(($nb_char+0.99)/2)"`
word2_init_nb_char=`bc <<<"($3 -1 - $word1_init_nb_char)"`

word1="`compact "$1" $word1_init_nb_char`"
word2="`compact "$2" $word2_init_nb_char`"

word1_nb_char=`echo -n "$word1" | wc -c`
word2_nb_char=`echo -n "$word2" | wc -c`

if [ $word1_nb_char -lt $word1_init_nb_char ]
then
   word2_updated_nb_char=`bc <<<"($nb_char -1 - $word1_nb_char)"`
   word2="`compact "$2" $word2_updated_nb_char`"
fi
if [ $word2_nb_char -lt $word2_init_nb_char ]
then
   word1_updated_nb_char=`bc <<<"($nb_char -1 - $word2_nb_char)"`
   word1="`compact "$1" $word1_updated_nb_char`"
fi

echo "$word1-$word2"

}

Si tu as le temps juste pour me donner ton avis sur ce que je fais, sans redire de faire de gros développement.

Dernière modification par thurston (Le 18/08/2012, à 11:35)

Hors ligne

#16 Le 18/08/2012, à 12:48

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

Bonjour,
Je pense que tu te compliques la vie, et que ceci fait la même chose que ton script du #15 :

function short2()
{
#$1: first word
#$2: second word
#$3: total length 

nb_char=$3

word1_init_nb_char=`bc <<<"(($nb_char)/2)"`
word1="`compact "$1" $word1_init_nb_char`"
word1_nb_char=`echo -n "$word1" | wc -c`

word2_nb_char=`bc <<<"($nb_char -1 - $word1_nb_char)"`
word2="`compact "$2" $word2_nb_char`"

echo "$word1-$word2"

}

J'en profite pour corriger mon script du #13 (compact4.sh) : lorsqu'il avait le choix entre plusieurs mots de même longueur, il prenait les premiers par ordre alphabétique, et non les premiers de la phrase.
$ cat compact4.sh.corrige

#!/bin/bash
export LC_ALL=C

compact() {
   phrase="$1"
   nb_mot_phrase=$(wc -w <<<"$phrase")
   nb_car_tot="$2"
   nb_mot=$(bc <<<"sqrt($nb_car_tot)")
   ((nb_mot>nb_mot_phrase)) && nb_mot=$nb_mot_phrase
   #############################################################################
   n=0
   phrase_courte=$( echo $(
   for mot in ${phrase}
   do
      ((n++))
      ((n==1)) && lon=1000 || lon=${#mot}
      printf "%s %02d %s %s\n" -$lon $n ${#mot} $mot
   done | sort -n | head -$nb_mot | cut -d\  -f2,4 | sort -n | cut -d\  -f2
   ) )
   nb_mot_phrase_courte=$(wc -w <<<"$phrase_courte")
   #############################################################################
 # Chaque ligne de "liste" va contenir :
   # la longueur du mot
   # sa place dans la phrase
   # le mot
   # 0 (ou 1 si dernier mot de la phrase)
 # Cette "liste" est triée par longueurs croissantes des mots
   n=0
   liste=$(
   for mot in ${phrase_courte}
   do
      ((n++))
      printf "%s %s %s %s\n" ${#mot} $n $mot $((n==nb_mot_phrase_courte))
   done | sort -n
   )
   #############################################################################
   deja_der=0
   resul=$( printf "%s" $(
   while read l_mot place mot der
   do
      nb_car_mot=$(( (nb_car_tot-nb_mot+1-deja_der)/nb_mot ))
      if ((der==1)); then                  # Dernier mot
         if ((l_mot <= nb_car_mot)); then
            printf "%s %s\n" $place "$mot"
            lon=$l_mot
         else
            printf "%s %s\n" $place "${mot:0:$nb_car_mot}"
            lon=$nb_car_mot
         fi
      else                                 # Pas dernier mot
         if ((l_mot <= $nb_car_mot )); then
            printf "%s %s\n" $place "$mot."
            lon=$((l_mot+1))
         else
            printf "%s %s\n" $place "${mot:0:$nb_car_mot}."
            lon=$((nb_car_mot+1))
         fi
      fi
      ((nb_car_tot-=lon))
      ((nb_mot--))
      ((deja_der+=der))
   done <<<"${liste}" | sort -n | cut -d\  -f2
   ) )
################################################################################
   echo "$resul"
}

compact "$1" "$2"

Corrigé : Ajout de export LC_ALL=C dans le script

Dernière modification par pingouinux (Le 22/08/2012, à 22:48)

Hors ligne

#17 Le 18/08/2012, à 13:05

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

Salut et merci pour la réponse rapide.
En fait je me suis mal exprimé, et j'aurais du rajouter que si le titre est court, alors l'artiste utilise plus de char. J'utilise donc tjrs les 16 char. Donc j'en déduis que ce que j'ai fait est pas débile complet.
Exemple
short2 "Beck - No Title In Mind" 16 > Beck-No.Tit.Mi soit (5-1-9=16)
short2 "Sonic Youth - Confusion Is Sex" 16 > Son.Yout-Con.Sex (8-1-7=16)
short2 "Sonic Youth - Goof" 16 > Sonic.Youth-Goof (11-1-4=16)

Merci pour la modif du script, j'avais pas vu.
Le script tourne à plein régime.
J'ai compté, je l'utilise + que 16 fois pour chaque titre traité!!! donc l'efficacité de traitement est vraiment un plus
A+
T

PS: Au fait il faut faire très attention que dans les titres, il n'y ait pas de char spéciaux. Souvent j'ai des " ou des ' pour les 7" ou 12", et il m'arrive d'avoir des * au milieu de 2 mots et là ca bug. Je fais donc une première étape ou je nettoie la phrase à traiter. (sed....)

Dernière modification par thurston (Le 18/08/2012, à 13:10)

Hors ligne

#18 Le 18/08/2012, à 13:44

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

Alors, ceci ?

function short2()
{
#$1: first word
#$2: second word
#$3: total length 

word1="$1"
word2="$2"
nb_char=$3

word1_init_nb_char=`bc <<<"(($nb_char)/2)"`
word2_init_nb_char=`bc <<<"($nb_char -1 - $word1_init_nb_char)"`
word2_nb_char=`echo -n "$word2" | wc -c`

delta=$(( word2_init_nb_char - word2_nb_char ))
((delta>0)) && ((word1_init_nb_char+=delta))

word1="`compact "$word1" $word1_init_nb_char`"
word1_nb_char=`echo -n "$word1" | wc -c`

word2_nb_char=`bc <<<"($nb_char -1 - $word1_nb_char)"`
word2="`compact "$word2" $word2_nb_char`"

echo "$word1-$word2"

}

Modifié : Petite simplification

Dernière modification par pingouinux (Le 18/08/2012, à 14:31)

Hors ligne

#19 Le 18/08/2012, à 14:21

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

salut et merci

ton script est effectivement plus rapide.
merci, adopté.
mon script global est maintenant très opimisé,merci vraiment
A+
T

Hors ligne

#20 Le 22/08/2012, à 00:29

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

@ pingouinux
Au cas où toujours à l'écoute, et preuve que le script mouline sec, j'ai trouvé un cas qui me pose souci, à savoir si le titre commence par un chiffre (j'avais déjà oté tous les caractères un peu farfelu du style ponctuation ou autres: le * est mortel si espacé (My fuck * Guitar) )
exemple
./compact "4 Tunna Brix" 16
qui renvoie:
Tunna.Brix.4
Le chiffre est interprété semble t il, et ne reste donc pas à la bonne place, la première.
D'avance merci si solution simple, sinon, pas grave, j'ai pas tant de titre qui commence par des chiffres...ou alors je prétraiterais les titres en remplacant 1 par un, 2 par deux  etc... euh je plaisante, meme si l'idée m'a traversé l'esprit. ;-)
A+
T

Dernière modification par thurston (Le 22/08/2012, à 00:30)

Hors ligne

#21 Le 22/08/2012, à 06:57

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

Bonjour thurston,

./compact "4 Tunna Brix" 16
qui renvoie:
Tunna.Brix.4

C'est bizarre, car voici ce que j'obtiens, avec mon script compact4.sh du #16 :

$ ./compact4.sh  "4 Tunna Brix" 16
4.Tunna.Brix

le * est mortel si espacé

C'est exact. Je vais voir s'il y a quelque chose de simple à faire pour y remédier.
On peut déjà y mettre un autre caractère, mais ce n'est pas très satisfaisant.

$ ./compact4.sh  "My fuck ⊛ Guitar" 16
My.fuck.⊛.Guitar

Ajouté :
On peut aussi faire ceci, mais on perd un caractère :

$ ./compact4.sh  "My fuck \* Guitar" 16
My.fuck.*.Guita

Dernière modification par pingouinux (Le 22/08/2012, à 07:12)

Hors ligne

#22 Le 22/08/2012, à 07:41

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

Bonjour pingouinux

Je confirme que sur 2 pcs différents mais tous deux en 12.04
j'ai bien

./compact.sh "4 Tunna Brix" 16
Tunna.Brix.4

Bizarre d'où cela peut il venir? Frustrant...
Pour les * je les ote, c'était plus un avertissement à un utilisateur du script. Il faut bien nettoyer la phrase à traiter
A+
T

Sur un serveur en10.04, meme resultat. (J'ai du installer le soft bc seulement manquant).

Dernière modification par thurston (Le 22/08/2012, à 07:45)

Hors ligne

#23 Le 22/08/2012, à 08:36

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

Je suis sous Ubuntu 11.04, 64 bits.
Ton script est-il bien identique au compact4.sh que j'ai fourni en #16 ?

Peux-tu tester ce script ? C'est le même, avec des impressions en plus.
$ cat compact4.sh.avec_impressions

#!/bin/bash

compact() {
   phrase="$1"
   nb_mot_phrase=$(wc -w <<<"$phrase")
   nb_car_tot="$2"
   nb_mot=$(bc <<<"sqrt($nb_car_tot)")
   ((nb_mot>nb_mot_phrase)) && nb_mot=$nb_mot_phrase
   #############################################################################
   n=0
   phrase_courte=$( echo $(
   for mot in ${phrase}
   do
      ((n++))
      ((n==1)) && lon=1000 || lon=${#mot}
      printf "%s %02d %s %s\n" -$lon $n ${#mot} $mot
   done | sort -n | head -$nb_mot | cut -d\  -f2,4 | sort -n | cut -d\  -f2
   ) )
   nb_mot_phrase_courte=$(wc -w <<<"$phrase_courte")
echo phrase_courte="$phrase_courte"= nb_mot_phrase_courte="$nb_mot_phrase_courte"=
   #############################################################################
 # Chaque ligne de "liste" va contenir :
   # la longueur du mot
   # sa place dans la phrase
   # le mot
   # 0 (ou 1 si dernier mot de la phrase)
 # Cette "liste" est triée par longueurs croissantes des mots
   n=0
   liste=$(
   for mot in ${phrase_courte}
   do
      ((n++))
      printf "%s %s %s %s\n" ${#mot} $n $mot $((n==nb_mot_phrase_courte))
   done | sort -n
   )
echo liste="$liste"=
   #############################################################################
   deja_der=0
   resul=$( printf "%s" $(
   while read l_mot place mot der
   do
      nb_car_mot=$(( (nb_car_tot-nb_mot+1-deja_der)/nb_mot ))
      if ((der==1)); then                  # Dernier mot
         if ((l_mot <= nb_car_mot)); then
            printf "%s %s\n" $place "$mot"
            lon=$l_mot
         else
            printf "%s %s\n" $place "${mot:0:$nb_car_mot}"
            lon=$nb_car_mot
         fi
      else                                 # Pas dernier mot
         if ((l_mot <= $nb_car_mot )); then
            printf "%s %s\n" $place "$mot."
            lon=$((l_mot+1))
         else
            printf "%s %s\n" $place "${mot:0:$nb_car_mot}."
            lon=$((nb_car_mot+1))
         fi
      fi
      ((nb_car_tot-=lon))
      ((nb_mot--))
      ((deja_der+=der))
   done <<<"${liste}" | sort -n | cut -d\  -f2
   ) )
################################################################################
   echo "$resul"
}

compact "$1" "$2"

Voici ce qu'il donne chez moi :

$ ./compact4.sh.avec_impressions  "4 Tunna Brix" 16
phrase_courte=4 Tunna Brix= nb_mot_phrase_courte=3=
liste=1 1 4 0
4 3 Brix 1
5 2 Tunna 0=
4.Tunna.Brix

Hors ligne

#24 Le 22/08/2012, à 09:17

thurston

Re : [RESOLU] Compacter une phrase complète pour low char display

et ben!!! (encore essayé sur un autre pc, et tous sont en 32 bits)
Au fait le script avec les echo dedans est vraiment bien pour la compréhension de la mécanique interne
Merci
A+
Y

./compact "4 Tunna Brix" 16
phrase_courte=Tunna Brix 4= nb_mot_phrase_courte=3=
liste=4 2 Brix 0
5 1 Tunna 0
1 3 4 1=
Tunna.Brix.4

Egalement, pour un texte qui semble fonctionner et pour avoir peut etre d'autre repères.

./compact "thurston moore" 12
phrase_courte=thurston moore= nb_mot_phrase_courte=2=
liste=5 2 moore 1
8 1 thurston 0=
thurst.moore

Dernière modification par thurston (Le 22/08/2012, à 09:19)

Hors ligne

#25 Le 22/08/2012, à 10:00

pingouinux

Re : [RESOLU] Compacter une phrase complète pour low char display

J'ai peut-être une piste (tri de nombres négatifs). Voici un test à faire :

$ echo -e "-5\n-1\n-10" | sort -n
-10
-5
-1

Si le résultat est différent du mien, essaye ceci :

$ echo -e "-5\n-1\n-10" | sort -h
-10
-5
-1

Il n'est utile de faire le test suivant que si le premier a donné des résultats corrects.

$ cat compact4.sh.phrase_courte

#!/bin/bash

TMP=/tmp/compact.out.$$
compact() {
   phrase="$1"
   nb_mot_phrase=$(wc -w <<<"$phrase")
   nb_car_tot="$2"
   nb_mot=$(bc <<<"sqrt($nb_car_tot)")
   ((nb_mot>nb_mot_phrase)) && nb_mot=$nb_mot_phrase
   #############################################################################
   n=0
   phrase_courte=$( echo $(
   for mot in ${phrase}
   do
      ((n++))
      ((n==1)) && lon=1000 || lon=${#mot}
      printf "%s %02d %s %s\n" -$lon $n ${#mot} $mot
   done |tee $TMP| sort -n |tee -a $TMP| head -$nb_mot |tee -a $TMP| cut -d\  -f2,4 |tee -a $TMP| sort -n |tee -a $TMP| cut -d\  -f2
   ) )
   nb_mot_phrase_courte=$(wc -w <<<"$phrase_courte")
echo phrase_courte="$phrase_courte"= nb_mot_phrase_courte="$nb_mot_phrase_courte"=
################################################################################
}

compact "$1" "$2"
cat $TMP; rm $TMP
$ ./compact4.sh.phrase_courte  "4 Tunna Brix" 16
phrase_courte=4 Tunna Brix= nb_mot_phrase_courte=3=
-1000 01 1 4
-5 02 5 Tunna
-4 03 4 Brix
-1000 01 1 4
-5 02 5 Tunna
-4 03 4 Brix
-1000 01 1 4
-5 02 5 Tunna
-4 03 4 Brix
01 4
02 Tunna
03 Brix
01 4
02 Tunna
03 Brix

Hors ligne