Explain it!
Posted: Tue Oct 21, 2008 2:15 pm
Επειδη πολλοι ρωτησατε τι και πως~~Wind~~ wrote:
- Spoiler: εμφάνιση/απόκρυψη
Code: Select all
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"++++\ +++++++++\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
Τελικα ειναι πιο απλο απ οτι φαινεται
Το προγραμμα αυτο σταλθηκε στο 1ο διαγωνισμο Obfuscated C Contest απο καποιον πολυ σχετικο με την C, κ προφανως ειναι γραμμενο σε C.
O συγγραφεας δεν ειπε ονομα καθως επιθυμει να μεινει ανώνυμος μεχρι κ σημερα.
Η αρχικη του μορφη ειναι η εξης:
Code: Select all
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
Code: Select all
int i;
main(){
for( ; i["]<i;++i){--i;}"]; read('-'-'-',i+++"hell\
o, world!\n",'/'/'/') );
}
read(j,i,p){
write(j/p+p, i---j, i/i);
}
Η for: @Para μια for εχει τρια μερη
for ( 'ορισζουμε εναν μετρητη συνηθως' ;
'συγκρινουμε τον μετρητη με καποια μεταβλητη αλλη' ;
'κανουμε μια ενεργεια' )
Κανεις ομως δε μας επιβαλλει να εχουμε οπωσδηποτε αυτον τον μετρητη.. μπορουμε να εχουμε οτι θελουμε εκει.
Η for κανονικα μεταφραζεται --> ( οσες φορες γινεται κατι εκει μεσα ) { κανε κατι; }
Παρε τωρα την απειρη επαναληψη --> for (;;) τι σημαινει αυτο ?
Η δικα μας for :
Code: Select all
for( ; i["]<i;++i){--i;}"]; read('-'-'-',i+++"hell\
o, world!\n",'/'/'/') );
Tι λεει μεσα στη read ?
Code: Select all
read( '-' - '-', i++ + "hell\
o, world!\n", '/' / '/' ) );
Διαιρει το '/' με το '/'. Διεραιση μεταξυ char. Αυτο μας κανει 1.
Δλδ:
Code: Select all
read( 0 , i+++"hell\
o, world!\n" , 1 ) );
Code: Select all
read(j,i,p){
write(j/p+p, i---j, i/i);
}
Code: Select all
read(0, i, 1){
write (j/p+p, i---j, i/i);
}
Code: Select all
write (j/p+p, i---j, i/i);
Code: Select all
write (0/1+1, i---0, i/i);
«»
write (0+1, i--, 1);
«»
write (1, i--, 1);
Επισης μπορουμε να ξεφορτωθουμε την '\' που αλλαζει σειρα στο "Hell[\]o, world!"
Παρατηρήστε ακομα οτι το i στην read(0, i, 1) μεσα στην write μειωνεται (i--). Αυτο δεν εχει κανενα απολυτως νοημα αφου ειναι τοπικη μεταβολη και δε χρησιμοποιειται πουθενα αρα
Μεχρι τωρα εχουμε:
Code: Select all
int i; //global
main(){
for( ; i["]<i;++i){--i;}"]; read( i++ + "hello, world!\n" ) );
}
read( i ){
write( 1, i, 1);
}
Οποτε:
Code: Select all
int i;
main()
{
for (; i["]i;++i){--i;}"]; write( 1, i++ + "hello, world!\n", 1 ));
}
i["]i;++i){--i;}"]; <--- Θα μπορουσε να εχει οτιδηποτε εκει μεσα, πχ i["ειμαι πολυ ομορφος"], δε πρεπει να σας μπερδευουν τα ]i;++...κλπ
καθως αποτελουν απλα ενα string.
To μονο που πρεπει να προσεξουμε ειναι το μηκος του πινακα να ειναι οσο η εκφραση που εμφανιζουμε (το string στην write δλδ)
Αυτο που γινεται τελικα δλδ ειναι οτι εμφανιζουμε ενα ενα τα γραμματα του "Hello, world!" - ενα γραμμα για καθε επαναληψη της for
μεχρι η for να φτασει στο τελος του πινακα i["]i;++i){--i;}"]
Ελπιζω να καταλαβατε
Μπορουμε τωρα να κανουμε το αρχικο κομματι κωδικα καπως ετσι
Code: Select all
int i;main(){for(;i["]["];read('-'-'-',i+++"++\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
Αυτα, 14.15, το φαι με περιμενει ..
πρεπει να στησω κ iptables σημερα.. πφφ,..