Newsgroup: it.comp.lang.c++
Titolo: Il codice + illegibile

Ciao a tutti
oggi durante un esercitazione in facoltà il mio docente, ci ha parlato di
gare in cui i programmori si sfidano nel creare codice +
"compresso"/illegibile. Volevo sapere dove potevo trovare + informazioni.
Grazie
Vi riporto il codice che abbiamo ideato io ed un mio amico x convertire una
lettera minuscola in maiuscola e viceversa(Era un esercizio assegnato in
laboratorio).
#include <stdio.h>
void main(){
char l=getchar();
printf("%c", (l>=97)?l-32:(l>=65)?l+32:255);}
Si può ridurre di +?
Thx x l'attenzione.

printf("%c", (l>=97)?l-32:(l>=65)?l+32:255);}
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Non è protabile ed è chiarissimo (quasi) e a dire la verità non è
neanche molto c++ ma più che altro c.
Su it.comp.programmare Andrea Ferro aveva postato un esempio di codice
volutamente incomprensibile.
-- 
Marco Barisione (ICQ 84277092)

"compresso"/illegibile. Volevo sapere dove potevo trovare + informazioni.
http://www.ioccc.org/
-- 
Andrea Laforgia - walkietalkie(at)
libero.it
"Meglio cieco che negro" (Stevie Wonder)

printf("%c", (l>=97)?l-32:(l>=65)?l+32:255);}
Personalmente non lo trovo affatto illeggibile, mi sembra più che
altro sbagliato e non portabile.
1)si assume che l'insieme di caratteri sia quello ASCII, cosa che su
alcune piattaforme non é affatto vera.
2)La funzione isalpha della libreria standard del c (<ctype.h> oppure
<cctype> in c++)permette di fare la stessa cosa, con la differenza che
é portabile e molto più manutenibile di questa, ed inoltre per
convertire un carattere char da maiuscolo a minuscolo e viceversa
esistono già le funzioni toupper e tolower.
3)Il tipo del valore di ritorno di main deve essere int.
Il Ghenio
---------
// TODO: Place your ass here

 3)Il tipo del valore di ritorno di main deve essere int.
Perché ????

Si puņ ridurre di +?
#include <stdio.h>
#include <ctype.h>
int main(){putchar(toupper(getchar()));return 0;}
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

 Perché ????
Perche` cosi` dice lo standard ISO del linguaggio C++ (e di
quello qui si parla).  Non ci sarebbero vantaggi a permettere
troppe diverse signature di main, quindi, una tantum, il
comitato di standardizzazione ha preferito semplificare.
Nota che a norma di standard per la sola funzione main,
pur dovendo tornare int, e` *perfettamente corretto* non
avere nella funzione un esplicito return (equivale ad un
'return 0;' prima della } finale).  In teoria un compilatore
NON dovrebbe dire neppure beo sul 'return mancante',
ma SOLO per la funzione main (non so quali compilatori
normalmente avvertano per i return mancanti ma trattino
main come caso speciale, a norma di standard; ahime`,
lo standard e` ben lungi dall'essere implementato da tutti
i compilatori -- anzi, ancora nessun compilatore lo 
implementa al 100%, a quanto ne so).
Alex

 Grazie
Forse questo non e' molto compresso anzi il contrario, pero' qualcuno......
potrebbe avere difficolta' nel leggerlo e capire prima dell' esecuzione cosa ne
uscira':):)
#include <stdio.h>
#define __OBSCURED_WORDS_   "CHILAVANANI%.3s\n"
int main (int argc,char *argv[])
{
 printf(&(__OBSCURED_WORDS_-__OBSCURED_WORDS_+("A"-"A"+1)[__OBSCURED_WORDS_]-("B"-"B"+4)[__OBSCURED_WORDS_]+3)[__OBSCURED_WORDS_],&(__OBSCURED_WORDS_-__OBSCURED_WORDS_+5)[__OBSCURED_WORDS_]);
 return 0;
}
--
Ivan Molella
__LINUX__ the choice of the  __GNU__ generation

#define __OBSCURED_WORDS_   "CHILAVANANI%.3s\n"
         ^
Il prefisso underscore negli identificatori e' riservato.
p.s.: il tuo codice, compilato con C++ Builder, non stampa
nulla...



Il codice non e' portabile, io lo scritto con il gcc 2.96 anzi che non
ti e' andato in core  :):)
Comunque avevo detto di capire......senza compilare :):)
Dovresti sapere perche' non stampa nulla,magari qualche
ottimizzazione....:):)


 esempio di codice volutamente incomprensibile.
Mi dai il message ID?
Ricordo che tempo fa Andrea Griffini aveva
postato questa risposta a una richiesta assurda :-))))
#include <stdio.h>
int main(){for(int
i=0;putchar(i++[""
"J(wf!cffo!tp!mbn"
"f!up!btl!uif!tpm"
"vujpo!up!nz!ipnf"
"xpsl!po!VTFOFU"]-
1)!='T';);}///////
--
Gerolamo

"raistlin" ha scritto
: Ciao a tutti
: oggi durante un esercitazione in facoltà il mio docente, ci ha parlato di
: gare in cui i programmori si sfidano nel creare codice +
: "compresso"/illegibile. Volevo sapere dove potevo trovare + informazioni.
: Grazie
:
: Vi riporto il codice che abbiamo ideato io ed un mio amico x convertire
una
: lettera minuscola in maiuscola e viceversa(Era un esercizio assegnato in
: laboratorio).
Nota che non converte solo le maiuscole in minuscole e viceversa...
prova con la tilde ~(126) per esempio, ti stampa ^(126-32)
:
: #include <stdio.h>
: void main(){
: char l=getchar();
: printf("%c", (l>=97)?l-32:(l>=65)?l+32:255);}
:
:
: Si può ridurre di +?
:
: Thx x l'attenzione.
#include <stdio.h>
int main(){char l=getchar();printf("%c",l>96?l-32:l>64?l+32:255);}
ciao
Massimo

 ha scritto nel messaggio
news:Ay248.3151$761.1...@twister1.libero.it...


 dell' esecuzione cosa ne uscira':):)
[cut]
Non credo sia portabile. Nel codice fai vasto uso di espressioni di 
questo tipo:
        "A" - "A"
bene, in questo caso stai effettuando la sottrazione di due espressioni 
di tipo const char[], che decadono a const char*. Lo standard dice che 
e` possibile sottrarre due puntatori se e solo se appartengono allo 
stesso array oppure all'elemento immediatamente dopo l'ultimo dello 
stesso array.
Ora, non so se lo standard assicura che due string literal uguali 
abbiano lo stesso indirizzo, ma non ci giurerei: se non hanno lo stesso 
indirizzo, oltre ad avere risultati sbagliati ("A" - "A" sarebbe diverso 
da 0) saresti anche in una situazione di undefined behaviour.
Ma, ripeto, bisognerebbe vedere se lo standard obbliga i compilatori a 
mettere due string literal uguali nella stessa locazione di memoria o 
meno.
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 abbiano lo stesso indirizzo, ma non ci giurerei
La questione  e' implementation dependent.


 Si può ridurre di +?
Sì. Ecco come (ma vale solo per il codice ASCII, e se il carattere digitato
è una lettere non accentata):
#include <stdio.h>
int main(){return putchar(getchar()^32);}
      Carlo Milanesi
http://digilander.iol.it/carlmila

 1)!='T';);}///////
Potreste spiegarmelo per favore?
Sono troppo curioso...
In particolare non riesco a capire quello che succede nella putchar: cosa è
quell i++[...
vi prego, vi prego, vi prego........

> Potreste spiegarmelo per favore?
Leggilo così:
#include <stdio.h>
int main()
{
   for(int i=0; //inizializza i
   putchar(i++["stringa"]-1)!='T'; //condizione
   ); // non c'e' la terza espressione del for
}//////
Ad ogni giro del for la condizione viene valutata
e quindi i viene incrementato.
A questo punto l'unica cosa oscura dovrebbe essere
l' espressione i++["stringa"]
Tieni presente che in C le espressioni
a[b] e b[a] sono equivalenti, ovvero:
a[b] = *(a+b) = *(b+a) = b[a]
Quindi...
#include <stdio.h>
int main()
{
  for(int i=0;
  putchar(i++["Uj!f(!dijbsp!dptb!gb!rvftup!dpejdf@"]-1)!='?';)
  ;
}
--
Gerolamo


Era questo che mi mancava...
comunque grazie, sei stato chiarissimo in tutto.
Giovanni ^_^