Explain it!

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
~~Wind~~
Gbyte level
Gbyte level
Posts: 1747
Joined: Thu Nov 30, 2006 1:07 am
Academic status: N>4
Gender:
Location: *void

Explain it!

Post by ~~Wind~~ » Tue Oct 21, 2008 2:15 pm

~~Wind~~ wrote:
Spoiler: εμφάνιση/απόκρυψη
για τους τολμηρους :-D

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);}
Επειδη πολλοι ρωτησατε τι και πως :-p
Τελικα ειναι πιο απλο απ οτι φαινεται ;)

Το προγραμμα αυτο σταλθηκε στο 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",'/'/'/') );
αποτελειται επισης απο 3 μερη. Δεν αρχικοποιει τπτ, αφου κατι τετοιο δε χρειαζεται. Οριζει εναν πινακα --> i["]<i;++i){--i;}"] και καλει την μεθοδο read();

Tι λεει μεσα στη read ?

Code: Select all

read( '-' - '-', i++ + "hell\
        o, world!\n", '/' / '/' ) );
αφαιρει το '-' απο το '-'. Αφαιρεση μεταξυ char. Αυτο μας κανει 0. :smt001
Διαιρει το '/' με το '/'. Διεραιση μεταξυ char. Αυτο μας κανει 1. :smt001 :smt002
Δλδ:

Code: Select all

read( 0 , i+++"hell\
        o, world!\n" , 1 ) );
Παμε στην πραγματικη read()

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);
}
Η read καλει την write. Ας απλοποιησουμε την write

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);
Τωρα μπορουμε να βγαλουμε τα 0 κ 1 απο την read
Επισης μπορουμε να ξεφορτωθουμε την '\' που αλλαζει σειρα στο "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);
}
Μπορουμε πλεον να αντικαταστησουμε την read με την ιδια την write
Οποτε:

Code: Select all

int i;
main()
{
        for (; i["]i;++i){--i;}"]; write( 1, i++ + "hello, world!\n", 1 ));
}
To μονο που εχει μεινει παραξενο ειναι αυτος ο πινακας. Στη πραγματικοτητα ειναι ενας πολυ απλος πινακας.
i["]i;++i){--i;}"]; <--- Θα μπορουσε να εχει οτιδηποτε εκει μεσα, πχ i["ειμαι πολυ ομορφος"], δε πρεπει να σας μπερδευουν τα ]i;++...κλπ
καθως αποτελουν απλα ενα string.
To μονο που πρεπει να προσεξουμε ειναι το μηκος του πινακα να ειναι οσο η εκφραση που εμφανιζουμε (το string στην write δλδ)

Αυτο που γινεται τελικα δλδ ειναι οτι εμφανιζουμε ενα ενα τα γραμματα του "Hello, world!" - ενα γραμμα για καθε επαναληψη της for
μεχρι η for να φτασει στο τελος του πινακα i["]i;++i){--i;}"]

Ελπιζω να καταλαβατε :smt016

Μπορουμε τωρα να κανουμε το αρχικο κομματι κωδικα καπως ετσι

Code: Select all

int i;main(){for(;i["]["];read('-'-'-',i+++"++\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
ωστε να ειμαστε σωστοι με τα ++ , ο πινακας επισης δεν εγινε διδιαστατος, .. :smt024

Αυτα, 14.15, το φαι με περιμενει .. :-D :smt016
πρεπει να στησω κ iptables σημερα.. :smt017 πφφ,..
ImageImage
Come to foss-aueb ...we have cookies.. yamyam~nomnomnomnomnomnomnomnom
a cookie ~ I will do science to it
User avatar
proskopos
Wow! Terabyte level
Wow! Terabyte level
Posts: 2808
Joined: Tue Dec 18, 2007 4:01 pm
Academic status: Alumnus/a
Gender:
Location: Στα φεγγάρια του Πλάνταρ...
Contact:

Re: Explain it!

Post by proskopos » Tue Oct 21, 2008 2:26 pm

Και εγένετο φως... :)
~~Βαρδάρη~~ ρίξε λίγο νερό στο σβέρκο σου, γιατί έπιασες φωτίστα.... :smt005 :shaking2: :bom:
Extreme Makeover... Mind edition...
3,6 μαθήματα/εξεταστική....
Image
User avatar
~~Wind~~
Gbyte level
Gbyte level
Posts: 1747
Joined: Thu Nov 30, 2006 1:07 am
Academic status: N>4
Gender:
Location: *void

Re: Explain it!

Post by ~~Wind~~ » Tue Oct 21, 2008 2:51 pm

proskopos wrote:Και εγένετο φως... :)
~~Βαρδάρη~~ ρίξε λίγο νερό στο σβέρκο σου, γιατί έπιασες φωτίστα.... :smt005 :shaking2: :bom:

Link
ImageImage
Come to foss-aueb ...we have cookies.. yamyam~nomnomnomnomnomnomnomnom
a cookie ~ I will do science to it
User avatar
para
Wow! Terabyte level
Wow! Terabyte level
Posts: 3648
Joined: Sat Nov 04, 2006 2:59 am
Academic status: Alumnus/a
Gender:

Re: Explain it!

Post by para » Wed Oct 22, 2008 1:08 pm

Η write τι ορίσματα παίρνει και τι κάνει;
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
User avatar
~~Wind~~
Gbyte level
Gbyte level
Posts: 1747
Joined: Thu Nov 30, 2006 1:07 am
Academic status: N>4
Gender:
Location: *void

Re: Explain it!

Post by ~~Wind~~ » Wed Oct 22, 2008 1:55 pm

para wrote:Η write τι ορίσματα παίρνει και τι κάνει;
Λειτουργικα δεν εκανες ? :smt018 :-p

Code: Select all

ssize_t write(int fildes, const void *buf, size_t nbyte);
Γραφει nbyte bytes απο τον buffer που δειχνει ο δεικτης buf σε ενα προκαθορισμενο ρευμα.

Code: Select all

 write( 1,  i, 1);
Γραφει 1 byte απο το i στο ρευμα εξοδου (stdout)

Σε Unix/Linux τα ρευματα εχουν ως εξης
0 - ρευμα εισοδου (stdin)
1 - ρευμα εξοδου (stdout)
2 - ρευμα διαγνωστικων μηνυματων (stderr)
3,4,.... περιγραφιτες αρχειων (fildes = file descriptors)
ImageImage
Come to foss-aueb ...we have cookies.. yamyam~nomnomnomnomnomnomnomnom
a cookie ~ I will do science to it
User avatar
Joanna
Mbyte level
Mbyte level
Posts: 563
Joined: Fri Oct 27, 2006 11:02 pm
Academic status: N>4
Gender:

Re: Explain it!

Post by Joanna » Wed Oct 22, 2008 4:42 pm

Amazing! :) ~~Άνεμε~~ όρισες!
Spoiler: εμφάνιση/απόκρυψη
~~Wind~~ you rule! :-D
Le vent nous portera...
User avatar
rose
Gbyte level
Gbyte level
Posts: 1921
Joined: Sun May 20, 2007 8:59 pm
Academic status: 4th year
Gender:

Re: Explain it!

Post by rose » Wed Oct 22, 2008 5:17 pm

Ο Wind έχει πορωθεί τελείως, ειναι σε καλό δρόμο. :smt016
που θα πάει θα το δουμε...
User avatar
para
Wow! Terabyte level
Wow! Terabyte level
Posts: 3648
Joined: Sat Nov 04, 2006 2:59 am
Academic status: Alumnus/a
Gender:

Re: Explain it!

Post by para » Wed Oct 22, 2008 7:49 pm

Joanna wrote:~~Άνεμε~~ όρισες!
Κατά το "έγραψες";; :smt042 :smt042 :smt042

~~Wind~~ wrote:Λειτουργικα δεν εκανες ? :smt018
Ωχ.. τέτοια θα κάνουμε; Ευτυχώς τα κάνει η Βάνα :smt109

Καλή δουλειά ~~Wind~~ :smt023
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
User avatar
Joanna
Mbyte level
Mbyte level
Posts: 563
Joined: Fri Oct 27, 2006 11:02 pm
Academic status: N>4
Gender:

Re: Explain it!

Post by Joanna » Wed Oct 22, 2008 9:14 pm

para wrote:Κατά το "έγραψες";; :smt042 :smt042 :smt042
Όχι, κατά το "you rule" ανόητε!!! :-D :-D
Le vent nous portera...
Post Reply

Return to “Προγραμματισμός”