Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C (alle ISO-Standards) ::  Verständnis: Map of India     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
__ich_du_er_sie_es__
Unregistrierter




Beitrag __ich_du_er_sie_es__ Unregistrierter 13:48:05 11.08.2017   Titel:   Verständnis: Map of India            Zitieren

Ich verstehe irgendwie nicht diesen Source Code:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main()
{
    int a,b,c;
    int count = 1;
    for (b=c=10;a="- FIGURE?, UMKC,XYZHello Folks,\
   TFy!QJu ROo TNn(ROo)SLq SLq ULo+\
   UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\
   NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\
   HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\
   T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\
   Hq!WFs XDt!"
[b+++21]; )
    for(; a-- > 64 ; )
    putchar ( ++c=='Z' ? c = c/ 9:33^b&1);
    return 0;
}


Output:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
                    !!!!!!                                                    
                    !!!!!!!!!!                                                
                     !!!!!!!!!!!!!!!                                          
                       !!!!!!!!!!!!!!                                          
                     !!!!!!!!!!!!!!!                                          
                      !!!!!!!!!!!!                                            
                      !!!!!!!!!!!!                                            
                        !!!!!!!!!!!!                                          
                        !!!!!!!!                                              
                        !!!!!!!!!!                                            
                       !!!!!!!!!!!!!!                                          
                     !!!!!!!!!!!!!!!!                                          
                    !!!!!!!!!!!!!!!!                                  !!!!!    
                  !!!!!!!!!!!!!!!!!!!                               !!!!!!!!!!
                 !!!!!!!!!!!!!!!!!!!!!!!                 !         !!!!!!!!!!  
            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!              !!     !!!!!!!!!!!!    
           !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!        !!      !!!!!!!!      
            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!      
             !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!      
              !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  !!!!!!!!!!!!      
       !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!        !!!!!!        
      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!      !!!!!        
          !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!        !!!          
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!        !          
          !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                      
           !!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                        
                  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                          
                 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                          
                  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                              
                  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                              
                  !!!!!!!!!!!!!!!!!!!!!!!!!!!!                                
                  !!!!!!!!!!!!!!!!!!!!!!!!!!                                  
                  !!!!!!!!!!!!!!!!!!!!!!!!!                                    
                   !!!!!!!!!!!!!!!!!!!!!!!!                                    
                    !!!!!!!!!!!!!!!!!!!!                                      
                    !!!!!!!!!!!!!!!!!!!                                        
                     !!!!!!!!!!!!!!!!                                          
                      !!!!!!!!!!!!!!!!                                        
                      !!!!!!!!!!!!!!!                                          
                       !!!!!!!!!!!!!!                                          
                        !!!!!!!!!!!!                                          
                        !!!!!!!!!!!!                                          
                        !!!!!!!!!!!!                                          
                          !!!!!!!!                                            
                          !!!!!!                                              
                           !!!!


Quelle: https://github.com/TonyJosi97/MyWorkspace/blob/master/Cool/MapOfIndia.c

Kann mir jemand das Vorgehen näher erklären?
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 28074
Beitrag SeppJ Global Moderator 15:17:37 11.08.2017   Titel:              Zitieren

In der innersten Schleife sind die Werte wie folgt:
  • c wird in jedem Durchgang erhöht und zählt jeweils von 10 bis 90 (=='Z').
  • a zählt in jedem Durchgang um 1 rückwärts, ausgehend vom aktuellen Zeichen bis 64 (das Zeichen vor 'A'). Das aktuelle Zeichen hängt vom Wert von b ab.
  • b geht bei 10 los und wird jeweils genau dann um 1 erhöht, wenn die a-Schleife fertig ist. Das kann manchmal so aussehen als würde b um 2 oder mehr erhöht, falls das aktuelle Zeichen kleiner als 'A' ist, die a-Schleife also gar nicht erst betreten wird.


In jedem Durchgang der innersten Schleife wird ein Zeichen ausgegeben:

  • Wenn c gleich 90 ist, wird ein Linefeed ausgegeben (Wert 10, berechnet sich nach c/9)
  • Wenn c ungleich 90 ist:
    • Wenn b gerade ist (b&1 ist 0), wird ein '!' ausgegeben (Wert 33, das ist 33^0)
    • Wenn b ungerade ist (b&1 ist 1), wird ein Leerzeichen ausgegeben (Wert 32, das ist 33^1)



In der Zeichenkette ist also codiert, wie lange eine Sequenz von Leerzeichen bzw. Ausrufezeichen jeweils dauert. Die Länge ist dabei wie weit das Zeichen nach 'A' kommt. Wird eine sehr lange Sequenz von Leerzeichen benötigt, kommen von Zeit zu Zeit auch mal Zeichen vor 'A' vor. In dem Fall wird die Ausrufezeichensequenz übersprungen und direkt zur nächsten Leerzeichensequenz übergegangen.

Die ersten 31 Zeichen des Codes werden komplett übersprungen.

Die scheinbar der Einrückung dienenden Leerzeichen in den Zeilen 7-12 sind Teil der Zeichenkette und somit kritisch, die Einrückung darf also nicht verändert werden.

Und Windows dürfte das Programm nicht funktionieren, da dort ein Zeilenumbruch nicht durch ein Linefeed ersetzt werden kann. Da müsste man schreiben (ungetestet):
C:
putchar ( ++c=='Z' ? (c = c/ 9), '\n':33^b&1);


PS: Es kann sein, dass ich bei obiger Beschreibung stellenweise ungenau war, was die genauen Schleifengrenzen angeht. Die Idee sollte aber hoffentlich klar geworden sein.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.


Zuletzt bearbeitet von SeppJ am 15:22:57 11.08.2017, insgesamt 2-mal bearbeitet
__ich_du_er_sie_es__
Unregistrierter




Beitrag __ich_du_er_sie_es__ Unregistrierter 15:26:26 11.08.2017   Titel:              Zitieren

Puh, wie kommt man nur auf so eine Idee. Auch wenn ich schon seit einiger Zeit in C++ programmiere und einige Kenntnisse in C habe, das hat mich dann doch ein wenig überfordert. Ist es in irgendeiner Weise üblich, dass man so etwas in einer Zeichenkette codiert? Selbsterklärend ist der Code meiner Meinung nach nämlich überhaupt nicht.

Vielen Dank also für das Erklären.
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 28074
Beitrag SeppJ Global Moderator 16:31:13 11.08.2017   Titel:              Zitieren

An sich ist es durchaus üblich, dass man Information über "flächige" Bilder codiert, indem man angibt, wie lang ein Stück der Fläche jeweils ist. Das ist Basis vieler Komprimierungsverfahren, nicht nur für Bilder.

Was absolut nicht normal ist, ist, wie hier die Information dekodiert wird. Das könnte man auch viel verständlicher programmieren. Der Code ist eindeutig mit Absicht unverständlich gehalten. Es gibt sogar einen berühmten Wettbewerb für unverständliches C. Dieses Programm hätte dort aber keine Chance, das ist noch viel zu harmlos. Es aber gewiss eine gute Übung für den Autor gewesen, wie man solche Programme schreibt, und es stellt auch eine gute Übung für interessierte Leser dar, wie man solche Programme wieder entziffert. Ich fand es sehr interessant, mich da durch zu hangeln. Es war einerseits nicht sofort offensichtlich, wie es funktioniert (mein erster Verdacht war eine Bitmapcodierung), aber andererseits ist es nicht so überwältigend komplex, dass man gar nicht weiß, wo man anfangen soll.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 15301
Beitrag Erhard Henkes Mitglied 23:23:03 19.08.2017   Titel:              Zitieren

Das "Hello Folks" im Code ist schon gelungen. :D

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
C++ Forum :: C (alle ISO-Standards) ::  Verständnis: Map of India   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.