Difference between revisions of "Esercizi a caso del Prof."

From Sistemi Operativi
Jump to navigation Jump to search
 
(44 intermediate revisions by 7 users not shown)
Line 2: Line 2:
  
 
=== Il programma che stampa se stesso ===
 
=== Il programma che stampa se stesso ===
scrivere un programma che produca in output se stesso: i.e. non prevede input e l'output deve essere identico al sorgente.
+
scrivere un programma che produca in output se stesso: i.e. '''non prevede input''' e l'output deve essere identico al sorgente.
  
 
Vince chi produce il programma piu' compatto (in ogni linguaggio).
 
Vince chi produce il programma piu' compatto (in ogni linguaggio).
  
 
Però non dovete fare come in questo [[tentativo]]. il programma deve stampare se stesso '''senza''' leggere il proprio sorgente! (è proprio quella la sfida divertente!, rd 20131027). Per il Pyhton il programma vuoto non vale, è una soluzione banale.
 
Però non dovete fare come in questo [[tentativo]]. il programma deve stampare se stesso '''senza''' leggere il proprio sorgente! (è proprio quella la sfida divertente!, rd 20131027). Per il Pyhton il programma vuoto non vale, è una soluzione banale.
 +
Ecco un altro [[tentativo]] errato.
 +
  print(__file__)
 +
non e' non Quine in Python 3.x perché stampa il proprio parametro, non il proprio sorgente.
 +
In caso contrario anche il comando echo sarebbe un Quine!
 +
 +
* [Python] beccatevi questo (da Federico A. e Alessio G.):
 +
*; La prima versione con due variabili : <syntaxhighlight lang="python"> a='a=%r;b=%r;print a%%(a,b)';b='b=%r;print a%%(a,b)';print a%(a,b) </syntaxhighlight>
 +
*; Per capire meglio la logica del format ci siamo sbizzarriti: <syntaxhighlight lang="python"> a = 'a = %r ; b = %r ; c = %r ; print a%%(a,b,c) ' ; b = 'b = %r ; c = %r ; print a%%(a,b,c) ' ; c = 'c = %r ; print a%%(a,b,c) ' ; print a%(a,b,c) </syntaxhighlight>
 +
# %% fuori stringa corrisponde ad un solo %.
 +
# print a%(a,b,c) corrisponderebbe in C a printf(a,a,b,c).
 +
 +
* [C] beccatevi anche questo (da Alessio G. e Federico A.):
 +
Usando la stessa logica del programma in "pitone" lo abbiamo rielaborato in C:
 +
<syntaxhighlight lang="C">
 +
/*Printf stampa la stringa s e sostituisce ad ogni occorrenza di %c i caratteri ascii corrispondenti ai numeri: 9 = \t , 10 = \n , 34 = \"  .
 +
Il %s corrisponde alla stringa.*/
 +
#include <stdio.h>
 +
char s[] = "#include <stdio.h>%c%cchar s[]=%c%s%c;%cvoid main(void){%c%cprintf(s,10,9,34,s,34,10,9,10,9,10);%c%c}%c";
 +
void main(void){
 +
      printf(s,10,9,34,s,34,10,10,9,10,9,10); 
 +
}
 +
</syntaxhighlight>
 +
 +
(bravi Alessio e Federico, questi sono proprio Quine!, rd 20131101)
 +
 +
* [Python3] (io ho fatto un Quine in python3 con il metodo ''format''... perch&eacute; non ci provate ache voi? rd20131101)
 +
 +
 +
 +
 +
 +
*Grazie a questa pagina [http://www.python.org/dev/peps/pep-3101/  Advanced String Formatting ] ho scoperto che con !r è possibile usare la funzione repr() solo su certi fields della stringa il che era l'ultimo bit che mi mancava per riuscirci.
 +
<syntaxhighlight lang="python">
 +
a='a={0!r}{1}print(a.format(a,{1!r}))'
 +
print(a.format(a,'\n'))
 +
</syntaxhighlight>
 +
-Fede
 +
 +
*Come non detto facendo qualche esperimento sono riuscito a compattarla ancora di più
 +
<syntaxhighlight lang="python">
 +
a='a={0};print(a.format(repr(a)))';print(a.format(repr(a)))
 +
</syntaxhighlight>
 +
oppure 10 caratteri in meno:
 +
<syntaxhighlight lang="python">
 +
a='a={0!r};print(a.format(a))';print(a.format(a))
 +
</syntaxhighlight>
 +
Questo codice funziona sia in python 3 che 2.
 +
 +
*questo invece è il mio primo tentativo sbagliato ma che ha messo in evidenza la differenza tra % e .format.
 +
<syntaxhighlight lang="python">
 +
a='a={0}\nprint(a.format(a))'
 +
print(a.format(a))
 +
</syntaxhighlight>
 +
-Fede
 +
 +
Ottimo Fede, il tuo Quine e' anche piu' corto del mio. Io usavo la funzione chr, ma il formato !r toglie ancora qualche carattere (rd 20131101):
 +
<syntaxhighlight lang="python">
 +
f="f={0}{1}{0};print(f.format(chr(34),f))";print(f.format(chr(34),f))
 +
</syntaxhighlight>
 +
 +
 +
*Ho provato a rendere ancora più corto il codice cercando di rimuovere l'assegnamento ma in realtà lo allunga.
 +
<syntaxhighlight lang="python">
 +
print('print({0!r}.format({0!r}))'.format('print({0!r}).format({0!r}))'))
 +
</syntaxhighlight>
 +
*purtroppo % non assegna a più fields la stessa stringa ma richiede tanti argomenti quanti fields sono presenti nella stringa... se non fosse così la soluzione migliore sarebbe...
 +
<syntaxhighlight lang="python">
 +
print('print(%r%%%r)'%'print(%r%%%r)')
 +
</syntaxhighlight>
 +
*che non funziona (e di cui non sono neanche certissimo prof. lei che dice, funzionerebbe se % "capisse" che il suo argomento va messo in tutte i%r?).
 +
 +
-Fede
  
 
=== Programmi semplici ===
 
=== Programmi semplici ===
Line 12: Line 84:
 
riscrivere le funzioni strcpy, strcmp, strncmp etc... (quelle elencate da "man 3 string") in C e in Python.
 
riscrivere le funzioni strcpy, strcmp, strncmp etc... (quelle elencate da "man 3 string") in C e in Python.
  
scrivere una funzione che controlli se una stringa e' palindroma (C python)
+
Implementazione in Python di strcpy, strcmp, strncmp.
 +
<syntaxhighlight lang="python">
 +
def strcpy(s):
 +
    return s
 +
 
 +
def strcmp(s1, s2):
 +
    if s1 == s2: return 0
 +
    elif s1 < s2: return -1
 +
    else: return 1
 +
 
 +
def strncmp(s1, s2, n):
 +
    i = 0;
 +
    res = 0;
 +
    if(len(s1) < n):
 +
        n = len(s1)
 +
    if(len(s2) < n):
 +
        n = len(s2)
 +
    while n > 0  and res == 0:
 +
        if s1[i] == s2[i]: res = 0
 +
        elif s1[i] < s2[i]: res = -1
 +
        else: res = 1
 +
        n += 1
 +
        i += 1
 +
    return res
 +
</syntaxhighlight>
 +
- Alberto
 +
 
 +
 
 +
 
 +
Implementazione in C di strcoll.
 +
<syntaxhighlight lang="c">
 +
int strcoll(char *string1, char *string2){
 +
while(*string1!='\0' || *string2!='\0'){
 +
if(*string1==*string2){
 +
string1++;
 +
string2++;
 +
}
 +
else if(*string1<*string2)
 +
return -1;
 +
else
 +
return 1;
 +
}
 +
return 0;
 +
}
 +
</syntaxhighlight>
 +
- Tony
 +
 
 +
scrivere una funzione che controlli se una stringa e' [[palindroma]] (C python)
  
 
=== Una miniera di esercizi ===
 
=== Una miniera di esercizi ===
  
 
[http://rosettacode.org/wiki/Category:Programming_Tasks Rosetta Stone]. Tantissimi problemi risolti con tantissimi linguaggi.
 
[http://rosettacode.org/wiki/Category:Programming_Tasks Rosetta Stone]. Tantissimi problemi risolti con tantissimi linguaggi.

Latest revision as of 19:48, 14 November 2013

Cominciamo da una sfida:

Il programma che stampa se stesso

scrivere un programma che produca in output se stesso: i.e. non prevede input e l'output deve essere identico al sorgente.

Vince chi produce il programma piu' compatto (in ogni linguaggio).

Però non dovete fare come in questo tentativo. il programma deve stampare se stesso senza leggere il proprio sorgente! (è proprio quella la sfida divertente!, rd 20131027). Per il Pyhton il programma vuoto non vale, è una soluzione banale. Ecco un altro tentativo errato.

  print(__file__) 

non e' non Quine in Python 3.x perché stampa il proprio parametro, non il proprio sorgente. In caso contrario anche il comando echo sarebbe un Quine!

  • [Python] beccatevi questo (da Federico A. e Alessio G.):
    La prima versione con due variabili
     a='a=%r;b=%r;print a%%(a,b)';b='b=%r;print a%%(a,b)';print a%(a,b)
    
    Per capire meglio la logica del format ci siamo sbizzarriti
     a = 'a = %r ; b = %r ; c = %r ; print a%%(a,b,c) ' ; b = 'b = %r ; c = %r ; print a%%(a,b,c) ' ; c = 'c = %r ; print a%%(a,b,c) ' ; print a%(a,b,c)
    
  1. %% fuori stringa corrisponde ad un solo %.
  2. print a%(a,b,c) corrisponderebbe in C a printf(a,a,b,c).
  • [C] beccatevi anche questo (da Alessio G. e Federico A.):

Usando la stessa logica del programma in "pitone" lo abbiamo rielaborato in C:

/*Printf stampa la stringa s e sostituisce ad ogni occorrenza di %c i caratteri ascii corrispondenti ai numeri: 9 = \t , 10 = \n , 34 = \"  .
Il %s corrisponde alla stringa.*/
#include <stdio.h>
	char s[] = "#include <stdio.h>%c%cchar s[]=%c%s%c;%cvoid main(void){%c%cprintf(s,10,9,34,s,34,10,9,10,9,10);%c%c}%c";
void main(void){
       printf(s,10,9,34,s,34,10,10,9,10,9,10);  
	}

(bravi Alessio e Federico, questi sono proprio Quine!, rd 20131101)

  • [Python3] (io ho fatto un Quine in python3 con il metodo format... perché non ci provate ache voi? rd20131101)



  • Grazie a questa pagina Advanced String Formatting ho scoperto che con !r è possibile usare la funzione repr() solo su certi fields della stringa il che era l'ultimo bit che mi mancava per riuscirci.
a='a={0!r}{1}print(a.format(a,{1!r}))'
print(a.format(a,'\n'))

-Fede

  • Come non detto facendo qualche esperimento sono riuscito a compattarla ancora di più
a='a={0};print(a.format(repr(a)))';print(a.format(repr(a)))

oppure 10 caratteri in meno:

a='a={0!r};print(a.format(a))';print(a.format(a))

Questo codice funziona sia in python 3 che 2.

  • questo invece è il mio primo tentativo sbagliato ma che ha messo in evidenza la differenza tra % e .format.
a='a={0}\nprint(a.format(a))'
print(a.format(a))

-Fede

Ottimo Fede, il tuo Quine e' anche piu' corto del mio. Io usavo la funzione chr, ma il formato !r toglie ancora qualche carattere (rd 20131101):

f="f={0}{1}{0};print(f.format(chr(34),f))";print(f.format(chr(34),f))


  • Ho provato a rendere ancora più corto il codice cercando di rimuovere l'assegnamento ma in realtà lo allunga.
print('print({0!r}.format({0!r}))'.format('print({0!r}).format({0!r}))'))
  • purtroppo % non assegna a più fields la stessa stringa ma richiede tanti argomenti quanti fields sono presenti nella stringa... se non fosse così la soluzione migliore sarebbe...
print('print(%r%%%r)'%'print(%r%%%r)')
  • che non funziona (e di cui non sono neanche certissimo prof. lei che dice, funzionerebbe se % "capisse" che il suo argomento va messo in tutte i%r?).

-Fede

Programmi semplici

riscrivere le funzioni strcpy, strcmp, strncmp etc... (quelle elencate da "man 3 string") in C e in Python.

Implementazione in Python di strcpy, strcmp, strncmp.

def strcpy(s):
    return s

def strcmp(s1, s2):
    if s1 == s2: return 0
    elif s1 < s2: return -1
    else: return 1

def strncmp(s1, s2, n):
    i = 0;
    res = 0;
    if(len(s1) < n):
        n = len(s1)
    if(len(s2) < n):
        n = len(s2)
    while n > 0  and res == 0:
        if s1[i] == s2[i]: res = 0
        elif s1[i] < s2[i]: res = -1
        else: res = 1
        n += 1
        i += 1
    return res

- Alberto


Implementazione in C di strcoll.

int strcoll(char *string1, char *string2){
	while(*string1!='\0' || *string2!='\0'){
		if(*string1==*string2){
			string1++;
			string2++;					
		}
		else if(*string1<*string2)
			return -1;
		else
			return 1;
	}
return 0;
}

- Tony

scrivere una funzione che controlli se una stringa e' palindroma (C python)

Una miniera di esercizi

Rosetta Stone. Tantissimi problemi risolti con tantissimi linguaggi.