infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: upthewall din Martie 16, 2006, 14:04:08



Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: upthewall din Martie 16, 2006, 14:04:08
Hey, uite nu am avut si eu ce face o juma de ora si m-am gandit ca asa ceva ar fi folositor.
Scriptul asta pentru bash (adica merge doar pe linux) converteste testele din orice format (exemplu nume_problema.in15   si .ou15 ) in ceva de genul 0-Nume_Problema.in/.ok

Cod:

#!/bin/bash
#RENAME TESTS, VERSION 1.3
#SCREW COPYRIGHT :P

base=`basename "$0"`

i_format=$1
files="*.*"
if [ "$2" != "" ];then
  files="$2"
fi
if [ "$#" -lt 1 ]
then
  echo "Usage: $base <Initial Test Format> [Directory]"
  echo "Format:      %N - file name  ( A-Z, a-z )"
  echo "             %n - numerical file name  ( A-Z, a-z, <<0-9>> )"
  echo "             %E - extension  ( a-z, A-Z ) -> won't be parsed"
  echo "             %T - test number ( 0-9 )"
  echo "             -  - junk character ( anything but dot ); -* => more junk"
  echo "Example:     $base %N.%E%T ... will transform to %T-%N.new extension"
  echo 'Dir. can be :dir1/dir2 ( can use trailing / ) ( DO NOT USE WILDCARDS )'
  echo 'Extension is extracted from file name, and is: '
  echo '.in        for    .in found'
  echo '.ok        for    .ou, .ok found'
  echo 'Otherwise, file is not processed'
  exit
fi

# format parsing... %N, %n, %T, -, ., and %E ....................
replace_str='\2-\1'
# name after test number? we'll see now ( %N/%n after %T )
n_after=`echo "$i_format" | sed 's/.*\(%T\).*\(%[Nn]\).*/\1\2/'`
if [ "`echo $n_after|tr [a-z] [A-Z]`" == "%T%N" ]; then
  replace_str='\1-\2'
fi
 
sedcmd=`echo "$i_format" | sed 's/\\./\\\./' | sed 's/-/[^\\\.]/' | sed 's/%N/\\\([a-z]*\\\)/' | sed 's/%n/\\\([a-z0-9]*\\\)/' | sed 's/%E/[a-z]*/' | sed 's/%T/\\\([0-9]*\\\)/'`
# finished parsing ..............................................

for file in `ls -1 $files`
do
  if [ -f "$files/$file" ]; then
    #mv "$file" "$file2.$cumscheama$punctc"
    file_name=`basename $file`
    file_lower=`echo $file_name | tr [A-Z] [a-z]` # just the name, not the path
    exten=`echo $file_lower | sed 's/.*\.\([^\.]*\)$/\1/'`
    extension=""
    tt=`echo $exten | grep 'in'`
    if [ "$?" == "0" ]; then
      extension="in"
    else
      tt=`echo $exten | grep 'o[uk]'`
      if [ "$?" == "0" ]; then
        extension="ok"
      fi
    fi
    if [ "$extension" != "" ]; then
      command="s/$sedcmd/$replace_str\\.$extension/"
      new_file=`echo "$file_lower" | sed $command`
      if [ "$file" != "$new_file" ]; then
        echo "$file_name > $new_file"
        #file_path=`expr "$file" : '\(.*\/\)[^\/]*'`
        mv "$files/$file" "$files/$new_file"
      fi
    fi
  fi  
done

# END OF SCRIPT


btw, am pus versiunea 1.4 care stie si sa ii puna un nume ales de tine (prin -nume ... ), din teste de genul T10.in/.out :)

Cod:

#!/bin/bash
#RENAME TESTS, VERSION 1.4

base=`basename "$0"`

if [ "$#" -lt 1 ]
then
  echo "Usage: $base <Initial Test Format> [-nume ...] [Directory]"
  echo "Format:      %N - file name  ( A-Z, a-z )"
  echo "             %n - numerical file name  ( A-Z, a-z, <<0-9>> )"
  echo "             %E - extension  ( a-z, A-Z ) -> won't be parsed"
  echo "             %T - test number ( 0-9 )"
  echo "             -  - junk character ( anything but dot ); -* => more junk"
  echo "Example:     $base %N.%E%T ... will transform to %T-%N.new extension"
  echo 'Dir. can be :dir1/dir2 ( can use trailing / ) ( DO NOT USE WILDCARDS )'
  echo 'Extension is extracted from file name, and is: '
  echo '.in        for    .in found'
  echo '.ok        for    .ou, .ok found'
  echo 'Otherwise, file is not processed'
  exit
fi

i_format=$1
files="*.*"
fnume='\2'
shift
while [ "$1" != "" ]; do
  if [ "$1" != "-nume" ];then
    files="$2"
  else
    shift
    fnume="$1"
  fi
  shift
done

# format parsing... %N, %n, %T, -, ., and %E ....................
replace_str="$fnume-\\1"
# name after test number? we'll see now ( %N/%n after %T )
n_after=`echo "$i_format" | sed 's/.*\(%T\).*\(%[Nn]\).*/\1\2/'`
if [ "`echo $n_after|tr [a-z] [A-Z]`" == "%T%N" ]; then
  replace_str="\\1-$fnume"
fi
 
sedcmd=`echo "$i_format" | sed 's/\\./\\\./' | sed 's/-/[^\\\.]/' | sed 's/%N/\\\([a-z]*\\\)/' | sed 's/%n/\\\([a-z0-9]*\\\)/' | sed 's/%E/[a-z]*/' | sed 's/%T/\\\([0-9]*\\\)/'`
# finished parsing ..............................................

for file in `ls -1 $files`
do
  if [ -f "$files/$file" ]; then
    #mv "$file" "$file2.$cumscheama$punctc"
    file_name=`basename $file`
    file_lower=`echo $file_name | tr [A-Z] [a-z]` # just the name, not the path
    exten=`echo $file_lower | sed 's/.*\.\([^\.]*\)$/\1/'`
    extension=""
    tt=`echo $exten | grep 'in'`
    if [ "$?" == "0" ]; then
      extension="in"
    else
      tt=`echo $exten | grep 'o[uk]'`
      if [ "$?" == "0" ]; then
        extension="ok"
      fi
    fi
    if [ "$extension" != "" ]; then
      command="s/$sedcmd/$replace_str\\.$extension/"
      new_file=`echo "$file_lower" | sed $command`
      if [ "$file" != "$new_file" ]; then
        echo "$file_name > $new_file"
        #file_path=`expr "$file" : '\(.*\/\)[^\/]*'`
        mv "$files/$file" "$files/$new_file"
      fi
    fi
  fi  
done


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: Tiberiu-Lucian Florea din Martie 16, 2006, 20:35:25
Marfa... cred ca ar fi util sa dai si niste linkuri de tutoriale / crash course-uri into bash. :)


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: Sima Mihai Cotizo -vechi din Martie 17, 2006, 18:15:31
:D l-a facut singurel din cate il stiu eu...
bravo man, super-nice ideea... dar ademeneste-i si cu chestiile pe care mi le-ai zis mie, ca poate transforma din orice format in orice format (asa mi-ai zis, inca nu l-am testat :P)
btw, daca mai ai o jumatate de ora, calca-ti peste obicei si scrie-l si pentru windows, sa faci fericita si cealalta jumatate!


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: Tiberiu-Lucian Florea din Martie 17, 2006, 18:57:52
In primul rand, nu exista bash in Windows. Sau... cine stie, s-o fi portat si asta in ultima vreme. In orice caz, scripting-ul nu face parte din filosofia Windows, capacitatile sale in acest domeniu sunt infinit mai slabe (iar din punctul de vedere al Microsoft, acest lucru nu este un dezavantaj, este un lucru care contribuie la user-friendliness).


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: Tudor A din Martie 17, 2006, 19:26:31
mah greco...exista ceva asemanator bashului in windows. pacat ca e emulat bathchurile..cu greu pot fi comparate cu bash , ce e drept!


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: Valentin Stanciu din Martie 17, 2006, 20:30:02
Intradevar, in Windows nu ai bash, dar ai visual basic scripting si java scripting.

Incearca sa faci un fisier test.vbs si scrie in el
MsgBox "Hello windows user!"
apoi pur si simplu da-i dublu click pe el..

Desigur asta este un exemplu mic.. dar cred ca iti dai seama ca se pot face lucruri avansate..
Microsoft vroia ca aceste fisiere de scripting sa inlocuiasa vechiul .bat


Titlul: da...
Scris de: Tudor A din Martie 17, 2006, 20:34:02
Cod:

msgbox "Iesim si noi in oras la un suc??"
msgbox "Zi tu unde ne intalnim!"
msgbox "HAI CA ITI INCHID EU CALCULATORUL CA SA VII SIGUR! :D"
Dim wshshell
set wshshell = wscript.CreateObject("WScript.Shell")
wshshell.run "shutdown -s -t 10"
:fish:
Asta e doar un mic exemplu din ce as putea face! Sa NU ne aducem aminte de seria de virusi vbs :). vbs ,care de altfel , e foarte "stabil" si "reliable" , care nu permite exploituri ,nu :)


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: Valentin Stanciu din Martie 17, 2006, 20:39:46
mai, stabil si reliable nu pot sa zic ca este 100%, dar ce zici tu tine mai mult de puterea pe care i-o da utilizatorului.. daca eu vreau sa imi fac un script, care sa imi stearga toate fisierele temporare si apoi sa imi inchida calculatorul? (script care sa il rulez cand vreau sa ma culc de exemplu) Trebuie sa imi dea puterea sa fac asta...
Eu nu am avut nevoie inca, dar apreciez programele care dupa ce termina de facut ceva (de exemplu utorrent pt luat torrenti) poti sa rulezi un program cu ei.. astfel fac un mic script care sa mute ceva de colo colo sau sa faca hash-check sau mai stiu eu ce.. :)

Pentru stabil/reliable incearca si java script (eu cam urasc tot ce contine visual basic)

(exemplele sunt teoretice, nu prea am folosit scripturile, decat .bat pt olimpiade sa testez un program de 100+ ori)

Apropo, poti la fel de usor sa iti inchizi calculatorul ruland direct din run "shutdown -s -t 10".. asta pentru cine nu a inteles ce face scriptul sus mentionat.

Extensii recunoscute de Windows
Visual Basic Script: .vbs
Java Script: .js


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: Tudor A din Martie 17, 2006, 20:48:26
pai eu folosesc baturile pt a flooda cu net send . un mic executabil care genereaza 2 baturi care se apeleaza recursiv si trimit mesaje la broadcast , gasesti aici : http://ts.b0x.ro/share/exe/net-send-flooder.exe
presupun ca stii de net send , nu? Am mai folosit ca sa imi inchid calcu "shutdown -s -t 3600*nr de ore :)" . In windows , sunt emulate chestiile astea. In linux , sunt integrate. de aici o mai mare putere. in vista , suportul pentru baturi / scripturi de consola  ... :-({|= . in ultimul lor build [5380] , nu mai mergea rhide.
Is curios , de altfel, cum folosesti javascript ca sa iti inchizi calculatorul. daca o sa imi zici ca faci un program in java ...naspa. masina virtuala de java mananca memorie intutil.devine offtopic , apropo!

//edit
scriptul puteai sa il dai la un papagal care nu stie cu ce sa mananca windows ca sa il pacalesti. worked for me :)) :guns:


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: average din Martie 19, 2006, 22:34:47
Bash in Windows? Maybe Cygwin (http://www.cygwin.com). Dar ultima oara cand am incercat mergea ca naiba in Windows XP (si pe alte losedowsuri nu am incercat :P). Oricum, nu se compara cu experienta originala... Asa cum wine nu o sa fie niciodata un emulator perfect de lose32. Sad, but true.


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: upthewall din Martie 24, 2006, 22:34:03
Cygwin e bun.  bunicel.
Oricum, eu recomand - screw windoze :)
Apropo, stiti teorema mea, unica, speciala si super originala la care nu s-au gandit deja decat vreo cateva miliarde de oameni? Ca microsux scoate produse destul de bune cand le fur..uh cumpara :D Pe masura ce le "dezvolta" (capacitatea de blocare aleatorie, sau ce dezvolta ei la ele) incep sa fie mai - dap, proaste.
De ex de ce au renuntat complet la emularea 16-bit pe Vista? nu era chiar asa de urgent sa "avansam" (ca de-aia nu mai merge rhide pe vista).

Windows e bun totusi :) ca sa dai shutdown prin netbios la unu,  cand esti la oji (a facut-o unu cica, desigur ca profele nu s-au prins ce-i aia :D)


Titlul: Script de bash pentru convertire a testelor pentru probleme
Scris de: Sima Mihai Cotizo -vechi din Martie 26, 2006, 16:58:59
@greco: nu am vrut sa il supar in vreun fel... stiu doar ca nu suporta windows (vezi replica de genul "screw windoze"). nu ma refeream sa faca pentru windows un script BASH ci unul BAT... nu un script, poti sa ii zici cum vrei tu... un lucru care nu functioneaza (ca e windows)

@dan: cygwin bunicel? l-am folosit la finala si e bun pentru ca are VIM inclus... altfel nu se compara cu originalul

@cine a zis faza cu shutdown: era o chestie misto (amintita si de dan) de genul "shutdown -s -t 00 -m \\computername"... daca ai acces(a se citi noroc) va merge sa inchizi un comp din retea... folositor la OJI, cum s-a mai zis