<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Thema "Re: Code Kata: verflixte Quersumme" in CoDe SAS German</title>
    <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235959#M1818</link>
    <description>&lt;P&gt;hallo Michael,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;das ist aber schade, dass Du den Code nicht ausführen kannst.&lt;/P&gt;
&lt;P&gt;Dann kannst Du leider auch nicht sehen, wie unglaublich schnell er ist &lt;img id="smileywink" class="emoticon emoticon-smileywink" src="https://communities.sas.com/i/smilies/16x16_smiley-wink.png" alt="Smiley (zwinkernd)" title="Smiley (zwinkernd)" /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Du hast Recht, die Bedingung ist im Moment immer true. Aber ich hoffe doch, dass sich am Ende einer findet, der die Codes (von der Zahl 1 beginnend) gegeneinander laufen lässt? Wir wollen schließlich wissen, wer gewonnen hat &lt;img id="smileywink" class="emoticon emoticon-smileywink" src="https://communities.sas.com/i/smilies/16x16_smiley-wink.png" alt="Smiley (zwinkernd)" title="Smiley (zwinkernd)" /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;viele Grüße. Heide&lt;/P&gt;</description>
    <pubDate>Mon, 23 Nov 2015 10:34:11 GMT</pubDate>
    <dc:creator>HeideTribius</dc:creator>
    <dc:date>2015-11-23T10:34:11Z</dc:date>
    <item>
      <title>Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235647#M1807</link>
      <description>&lt;P&gt;Hallo zusammen,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ich habe mal wieder eine kleine Übungsaufgabe für professionelle SAS Entwickler und solche die es werden wollen. Gefunden habe ich die Aufgabe mal wieder als aktuelles Rätsel bei Spiegel Online unter:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.spiegel.de/wissenschaft/mensch/raetsel-der-woche-verflixte-quersumme-a-1061371.html" target="_self"&gt;http://www.spiegel.de/wissenschaft/mensch/raetsel-der-woche-verflixte-quersumme-a-1061371.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Es wird ein Zahlenpaar gesucht,das die folgenden Bedingungen erfüllt:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Die Quersumme beider Zahlen ist durch 10 teilbar&lt;/LI&gt;
&lt;LI&gt;Die Differenz beider Zahlen soll lediglich 1 betragen&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Da es mehrere Zahlenpaare gibt, die diese Bedingungen erfüllen, wird im Rätsel explizit nach der kleinsten Zahl und ihrem Nachfolger gefragt.&lt;/P&gt;
&lt;P&gt;Die Lösung lässt sich zwar auch theoretisch herleiten (siehe &lt;A href="http://www.spiegel.de/wissenschaft/mensch/raetsel-der-woche-verflixte-quersumme-a-1061371-2.html" target="_self"&gt;Lösung&lt;/A&gt;), aber als Entwickler lasse ich natürlich lieber SAS für mich denken. Das die Aufgabe vollständig durch einen Algorithmus beschrieben und gelöst werden kann, wähle ich also den Brute Force Ansatz.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ich lade alle CoDe SAS Mitglieder ein hier ihre Lösung zu präsentieren. Ich selbst werde wieder verstärkt Wert auf eine möglichst einfache und leicht nachvollziehbare Lösung legen und nächste Woche meine Lösung vorstellen.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Bis dahin wünsche ich allen viel Spass beim tüfteln.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;PS: in der Vorbereitung auf diese Aufgabe habe ich schon mal ein paar Performancetests durchgeführt und festgestellt, dass die Laufzeit für eine vollständige Suche im Zahlenraum zwischen 1 und 2*10^10 mehrere Stunden dauert. Ich schlage daher vor den Suchraum für den Algorithmus durch zwei Makrovariablen &lt;EM&gt;start_number&lt;/EM&gt; und &lt;EM&gt;end_number &lt;/EM&gt;zu definieren, damit man leichter entwickeln und testen kann.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Viele Grüße,&lt;/P&gt;
&lt;P&gt;Andreas Menrath&lt;/P&gt;</description>
      <pubDate>Fri, 20 Nov 2015 12:39:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235647#M1807</guid>
      <dc:creator>AndreasMenrath</dc:creator>
      <dc:date>2015-11-20T12:39:14Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235683#M1808</link>
      <description>&lt;P&gt;Hallo zusammen,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;bei der Bearbeitung bin ich auf ein Thema mit der LAG-Funktion gestoßen, das ich mir nicht erklären kann, vielleicht weiß hier jemand mehr.&lt;/P&gt;
&lt;P&gt;Mein Code (zugegeben, eher auf rasch programmiert) sieht wie folgt aus. Nein, es erfolgt keine Prüfung, ob die Start-Variable kleiner als die End-Variable ist &lt;span class="lia-unicode-emoji" title=":zwinkerndes_Gesicht:"&gt;😉&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;DATA _null_;
  length findme $20.;
  start_number = 18999999900;
  end_number = 99999999999;

  DO n = start_number TO end_number;
    findme = INPUT(n,$20.);
    quersumme = 0;
    
         DO i = 1 TO length(findme);
           quersumme = quersumme + (substr(findme,i,1)); /* scheint ohne explizite Typkonvertierung mit "INT()" um den substr minimal performanter zu laufen */
         END;

         /* Test: Quersumme durch 10 teilbar? */
         IF MOD(quersumme,10) EQ 0 THEN DO;
         /*  put "zahl gefunden: " n " mit quersumme " quersumme; */
		   findlag = lag(findme); put findlag=;&lt;BR /&gt;
&lt;BR /&gt;		   /* Quersumme der vorherigen Zahl auch durch 10 teilbar? */
		   IF (PUT(lag(findme),20.) + 1) EQ PUT(findme,20.) THEN DO;
		       lagnumber = lag(findme);
		       lagnumber2 = PUT(lag(findme),20.);
                       PUT "Ergebnis: " lagnumber " | " lagnumber2 " | " findlag " und " findme; /* hier hätte ich erwartet, dass sowohl lagnumber und lagnumber2 angezeigt werden sollten */
                       STOP;&lt;BR /&gt;                   END;
         END;
  END;
RUN;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Folgende Frage stellt sich mir:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Wieso funktioniert das lag innerhalb der Prüfung des zweiten IF-Statements einwandfrei, aber nicht im nachfolgenden Code? Man sieht, dass ich hier ein bisschen probiert habe. Auch ein lag(n) funktioniert dort leider nicht.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Zur performanten Ausführung des Programms würde ich natürlich die Ausgaben im Log aus dem Code nehmen. Mir geht es hier lediglich um die Funktionsweise des lag. (natürlich könnte ich mir die vorherige Zahl mit durch 10 teilbarer Quersumme auch für die Ausgabe merken, es sollte meiner Ansicht nach jedoch auch mit dem Lag funktionieren)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Herzlichen Dank für Hinweise dazu,&lt;/P&gt;
&lt;P&gt;Michael&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;p.s.: der Editor hier stellt meinen Code leider nicht mit den gewünschten Einrückungen dar - pardon dafür.&lt;/P&gt;
&lt;P&gt;p.s.2: habe mir eine Frage schon selbst beantworten können &lt;span class="lia-unicode-emoji" title=":zwinkerndes_Gesicht:"&gt;😉&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 20 Nov 2015 15:02:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235683#M1808</guid>
      <dc:creator>mfab</dc:creator>
      <dc:date>2015-11-20T15:02:23Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235689#M1809</link>
      <description>Hallo Michael,&lt;BR /&gt;ich selbst benutze LAG nur höchst ungern, da es in Verbindung mit konditionalen Abfragen zu unerwarteten Effekten führt.&lt;BR /&gt;Vielleicht hilft dir dieses Whitepaper unter &lt;A href="http://support.sas.com/resources/papers/proceedings09/055-2009.pdf" target="_blank"&gt;http://support.sas.com/resources/papers/proceedings09/055-2009.pdf&lt;/A&gt; weiter.&lt;BR /&gt;&lt;BR /&gt;Grüße,&lt;BR /&gt;Andreas</description>
      <pubDate>Fri, 20 Nov 2015 15:06:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235689#M1809</guid>
      <dc:creator>AndreasMenrath</dc:creator>
      <dc:date>2015-11-20T15:06:45Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235693#M1810</link>
      <description>&lt;P&gt;Hallo Andreas,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;toller Hinweis, vielen Dank.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Dann macht das lag ja genau das, was es in diesem Fall soll und sollte hier auch performanter arbeiten, als wenn jede verarbeitete Nummer zwischengespeichert wird. &lt;img id="smileyvery-happy" class="emoticon emoticon-smileyvery-happy" src="https://communities.sas.com/i/smilies/16x16_smiley-very-happy.png" alt="Smiley (überglücklich)" title="Smiley (überglücklich)" /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So sieht der Code doch gar nicht so schlecht aus (lasse mich gerne von anderen Lösungen überraschen)&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;DATA _null_;
  length findme $20.;
  start_number = 18999999900;
  end_number = 99999999999;

  DO n = start_number TO end_number;
    findme = INPUT(n,$20.);
	quersumme = 0;
    
         DO i = 1 TO length(findme);
           quersumme = quersumme + (substr(findme,i,1)); /* scheint ohne explizite Typkonvertierung mit "INT()" um den substr minimal performanter zu laufen */
         END;

		 /* Test: durch 10 teilbar? */
         IF MOD(quersumme,10) EQ 0 THEN DO;
		     findlag = lag(findme);

		   /* Quersumme der vorherigen Zahl auch durch 10 teilbar? */
		   IF (PUT(findlag,20.) + 1) EQ PUT(findme,20.) THEN DO;
               PUT "Ergebnis: " findlag " und " findme;
               STOP;
           END;
		 END;
  END;
RUN;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Beste Grüße&lt;/P&gt;
&lt;P&gt;Michael&lt;/P&gt;</description>
      <pubDate>Fri, 20 Nov 2015 15:12:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235693#M1810</guid>
      <dc:creator>mfab</dc:creator>
      <dc:date>2015-11-20T15:12:04Z</dc:date>
    </item>
    <item>
      <title>Betreff: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235713#M1811</link>
      <description>&lt;PRE&gt;data _null_;
   do i=18990000000 to 20000000000;
      testvalue=i;
      link cross_sum;
      if mod(cs,10) ne 0 then continue; 
      testvalue=i+1;
      link cross_sum;
      if mod(cs,10) = 0 then do; 
         i2 = i+1;
         put i= i2=;
         stop; 
      end; 
   end; 
stop; 

cross_sum:
   cvalue = compress(put(testvalue,12.));
   cs=0;
   do j=1 to length(cvalue);
      cs = cs + substr (cvalue, j, 1);
   end;
return;
 
run; &lt;/PRE&gt;</description>
      <pubDate>Fri, 20 Nov 2015 16:07:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235713#M1811</guid>
      <dc:creator>Andreas</dc:creator>
      <dc:date>2015-11-20T16:07:08Z</dc:date>
    </item>
    <item>
      <title>Betreff: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235726#M1812</link>
      <description>&lt;P&gt;hallo zusammen,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ich habe jede einzelne Stelle der Zahl in eine Arrayvariable gelesen und die Summe per lag() mit dem Vorgänger verglichen:&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt; 
data _null_;
   array a{0:10} a0 - a10;
 
   do i=18999999900 to 99999999999;
      do j=0 to 10;
         a(j) = mod(int(i / 10**j),10);
      end;
      if mod(sum(of a0-a10),10)=0 and lag(mod(sum(of a0-a10),10))=0 then do;
         i=i-1;
         put i= commax15.0; 
         stop;
      end;
   end;
run;
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;viele Grüße. Heide Tribius&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 20 Nov 2015 17:04:31 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235726#M1812</guid>
      <dc:creator>Heide</dc:creator>
      <dc:date>2015-11-20T17:04:31Z</dc:date>
    </item>
    <item>
      <title>Betreff: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235742#M1813</link>
      <description>&lt;P&gt;hallo zusammen,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;es hat sich gerade gezeigt, dass die String-Funktionen zum separieren der Zahlen deutlich schneller sind und das will ich Euch natürlich nicht vorenthalten &lt;span class="lia-unicode-emoji" title=":zwinkerndes_Gesicht:"&gt;😉&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; 
data _null_;
   array a{11} a1 - a11;
 
   do i=18990000000 to 99999999999;
      c = put(i,best.);
      do j=1 to 11;
         a(j) = ifn(length(c)&amp;gt;=j, input(substr(c,j,1),best.), .);
      end;
      if mod(sum(of a0-a10),10)=0 and lag(mod(sum(of a0-a10),10))=0 then do;
         i=i-1;
         put i= commax15.0; 
         stop;
      end;
   end;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ein schönes Wochenende! Heide&lt;/P&gt;</description>
      <pubDate>Fri, 20 Nov 2015 17:56:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235742#M1813</guid>
      <dc:creator>Heide</dc:creator>
      <dc:date>2015-11-20T17:56:16Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235772#M1814</link>
      <description>&lt;P&gt;Andreas das stimmt met unerwartete resultate. Die richtigen name für die LAG function (Oracle is using it with SQL) sollte abe queue sein &lt;A href="https://en.wikipedia.org/wiki/Queue_(abstract_data_type)&amp;nbsp;.&amp;nbsp;&amp;nbsp;" target="_blank"&gt;https://en.wikipedia.org/wiki/Queue_(abstract_data_type)&amp;nbsp;.&amp;nbsp;&amp;nbsp;&lt;/A&gt; Wenn es eine falschen name hat ist die falschen benutzen zu erwarten.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 20 Nov 2015 20:09:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235772#M1814</guid>
      <dc:creator>jakarman</dc:creator>
      <dc:date>2015-11-20T20:09:59Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235853#M1815</link>
      <description>&lt;P&gt;Hallo zusammen,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;nachdem schon so&amp;nbsp;starke Datastep-Lösungen ins Rennen geschickt worden waren, wollte ich eigentlich etwas ganz anderes versuchen. Jedoch war die Performance einer reinen Makro-Lösung noch viel schlechter als befürchtet und auch ein Ansatz mit PROC FCMP (zur Berechnung der Quersumme und Prüfung ihrer&amp;nbsp;Teilbarkeit durch 10) enttäuschte mit seiner Laufzeit. Daher bin ich doch beim reinen Datastep geblieben und habe versucht, ihn durch eine windschnittige Pfeilform schneller zu machen.&amp;nbsp;&lt;img id="smileyhappy" class="emoticon emoticon-smileyhappy" src="https://communities.sas.com/i/smilies/16x16_smiley-happy.png" alt="Smiley (fröhlich)" title="Smiley (fröhlich)" /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data _null_;
array z[0:10];
do z1 = 0 to 9;
  do z2 = 0 to 9;
    do z3 = 0 to 9;
      do z4 = 0 to 9;
        do z5 = 0 to 9;
          do z6 = 0 to 9;
            do z7 = 0 to 9;
              do z8 = 0 to 9;
                do z9 = 0 to 9;
                  do z10= 0 to 9;
                    do z11= 0 to 9;
                      if ~init then do; z1=1; z2=8; z3=9; z4=9; init=1; end; /* nur zum Testen */
                      qsm=mod(sum(of z[*]), 10);
                      if qsm=lag(qsm) then do;
                        if ~qsm then do;
                          n=input(cats(of z[*]), 11.);
                          v=n-1;
                          put 'Lösung: ' v +(-1) ', ' n;
                          stop;
                        end;
                      end;
                    end;
                  end;
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Die Zeile "&lt;FONT face="courier new,courier"&gt;if ~init ...&lt;/FONT&gt;" würde für einen kompletten Lauf ab 0 natürlich entfernt.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Viele Grüße und schönes WE&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Reinhard&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 21 Nov 2015 13:33:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235853#M1815</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2015-11-21T13:33:46Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235948#M1816</link>
      <description>&lt;P&gt;Vielen Dank schon einmal für alle eingereichten Lösungen. Ich bin immer wieder faziniert auf wie viele unterschiedlichen Wegen sich das gleiche Problem lösen lässt und wie stark die einzelnen Lösungen untereinander abweichen.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Bei der ein oder anderen Lösung wäre ich auch froh, wenn ich nicht die Wartung für das Programm übernehmen müsste &lt;img id="smileywink" class="emoticon emoticon-smileywink" src="https://communities.sas.com/i/smilies/16x16_smiley-wink.png" alt="Smiley (zwinkernd)" title="Smiley (zwinkernd)" /&gt;&lt;/P&gt;
&lt;P&gt;Auch zieren die meisten Lösungen das SAS Log mit Typkonvertierungsnotes, da wohl an der ein oder anderen Stelle ein PUT/INPUT vergessen wurde.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ich versuche mich daher einmal an einer "sauberen" Implementierung. Hier also mein Programm:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* Parameters for program */
%let start_number = 1.89999e10; /* %let start_number = 1; */
%let end_number = 1.91e10; /* %let end_number = 2e10; */
%let divisor = 10;

/* define view with sum of digits */
data sum_of_digits_view/ view=sum_of_digits_view;

  attrib number        length=8 format=commax15. 
         sum_of_digits length=8;
  keep number 
       sum_of_digits;

  do number=&amp;amp;start_number. to &amp;amp;end_number.;
    sum_of_digits = 0;
    tmp_number = number;

    do while(tmp_number ne 0);
      sum_of_digits = sum_of_digits + mod(tmp_number, 10);
      tmp_number = floor(tmp_number / 10);
    end;

    output;
  end;
run;

/* data processing logic */
data _null_;
  set sum_of_digits_view;

  /* filter */
  if (mod(sum_of_digits,&amp;amp;divisor.) eq 0);

  length previous_number current_number 8;
  retain previous_number 0;

  /* check condition */
  current_number = number;
  if ( (current_number - previous_number) eq 1) then do;
    put "NOTE: Zahlenpaar gefunden:";
    put "NOTE- Zahl:" previous_number;
    put "NOTE- Nachfolger:" current_number;
    stop;
  end;
  previous_number = number;

  /* report progress */
  if (mod(_n_, 1000000) eq 0) then do;
    progress = (current_number - &amp;amp;start_number.) / ( &amp;amp;end_number. - &amp;amp;start_number. );
    rc = dosubl(cats('SYSECHO "progress:', put(progress, percent10.2), '";'));
  end;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Ich habe mein Programm logisch in zwei Teile geteilt. Im ersten Teil erzeuge ich eine Data View, die mir alle Zahlen im Suchraum sowie ihre Quersumme berechnet. Dieses Zwischenergebnis lässt sich auch schnell und einfach visuell "debuggen".&lt;/P&gt;
&lt;P&gt;Im zweiten Teil wird im DATA _NULL_ Schritt die View verarbeitet und die Regeln der "Business Logik" geprüft.&lt;/P&gt;
&lt;P&gt;Da bei einer vollständigen Suche ab der Zahl 1 die Verarbeitung relativ lange dauert, habe ich mir &lt;A href="https://communities.sas.com/t5/SAS-Enterprise-Guide/Trick-for-showing-program-progress-in-SAS-Enterprise-Guide/m-p/234375#M16943" target="_self"&gt;hier &lt;/A&gt;noch einenTrick abgeschaut: innerhalb des Datasteps melde ich noch an Enterprise Guide zurück, wie weit der aktuelle Verarbeitungsstand ist.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Viele Grüße,&lt;/P&gt;
&lt;P&gt;Andreas&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Nov 2015 09:10:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235948#M1816</guid>
      <dc:creator>AndreasMenrath</dc:creator>
      <dc:date>2015-11-23T09:10:07Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235958#M1817</link>
      <description>&lt;P&gt;Hallo zusammen,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;klasse, wieviel man hierbei lernen kann!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Falls jemand die Typkonvertierungs-Notes aus meinem Code entfernen kann - ich bin für Hinweise dankbar. Gerade sehe ich nicht, wo das Problem ist.&lt;/LI&gt;
&lt;LI&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/60374"&gt;@Heide&lt;/a&gt;: den zweiten Code kann ich leider nicht ausführen. Mich würde interessieren, welche Funktion das "length(c)&amp;gt;=j" erfüllt. Ist das nicht immer "true"?&lt;/LI&gt;
&lt;LI&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/8497"&gt;@Reinhard&lt;/a&gt;: Die Pfeiform hat schon was ;). Was bewirkt denn das "~init". Das kenne ich nicht und kann auch online nichts dazu finden.&lt;/LI&gt;
&lt;LI&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13593"&gt;@Andreas&lt;/a&gt;: Wieso ist denn Deine Lösung so dermaßen performant? Liegt das an der Berechnung der Quersumme? Hier hätte ich vermutet, dass die Verarbeitung per Substring in etwa genauso lange dauert, wie das Errechnen über Mod. Gibt es denn generell einen Weg bei SAS die Performanz zu prüfen? Fullstimer habe ich schon aktiviert, aber das scheint mir nicht ausreichend präzise zu sein. Ich würde in meinem Code vermuten, dass das Weglassen der Variablen start_number und end_number den Code performanter macht, weil die beiden Variablen im PDV aufgebaut werden. Das kann ich im Log aber nicht sinnvoll nachvollziehen.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Gibt es diese Code Katas regelmäßig? Ich finde das sehr spannend und freue mich über den Austausch und das Lernpotential!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Herzliche Grüße&lt;/P&gt;
&lt;P&gt;Michael&lt;/P&gt;</description>
      <pubDate>Mon, 23 Nov 2015 10:09:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235958#M1817</guid>
      <dc:creator>mfab</dc:creator>
      <dc:date>2015-11-23T10:09:05Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235959#M1818</link>
      <description>&lt;P&gt;hallo Michael,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;das ist aber schade, dass Du den Code nicht ausführen kannst.&lt;/P&gt;
&lt;P&gt;Dann kannst Du leider auch nicht sehen, wie unglaublich schnell er ist &lt;img id="smileywink" class="emoticon emoticon-smileywink" src="https://communities.sas.com/i/smilies/16x16_smiley-wink.png" alt="Smiley (zwinkernd)" title="Smiley (zwinkernd)" /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Du hast Recht, die Bedingung ist im Moment immer true. Aber ich hoffe doch, dass sich am Ende einer findet, der die Codes (von der Zahl 1 beginnend) gegeneinander laufen lässt? Wir wollen schließlich wissen, wer gewonnen hat &lt;img id="smileywink" class="emoticon emoticon-smileywink" src="https://communities.sas.com/i/smilies/16x16_smiley-wink.png" alt="Smiley (zwinkernd)" title="Smiley (zwinkernd)" /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;viele Grüße. Heide&lt;/P&gt;</description>
      <pubDate>Mon, 23 Nov 2015 10:34:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235959#M1818</guid>
      <dc:creator>HeideTribius</dc:creator>
      <dc:date>2015-11-23T10:34:11Z</dc:date>
    </item>
    <item>
      <title>Betreff: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235960#M1819</link>
      <description>&lt;P&gt;hallo zusammen,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Michael hat Recht - der zweite Code funktioniert so nicht. Was hab ich da nur kopiert?! Sorry!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; 
data _null_;
   array a{1:11} a1 - a11;
 
   do i=18999000000 to 99999999999;
      c = put(i,11.);
      do j=1 to 11;
         a(j) = ifn(length(c)&amp;gt;=j, input(substr(c,j,1),best.), .);
      end;
      if mod(sum(of a1-a11),10)=0 and lag(mod(sum(of a1-a11),10))=0 then do;
         i=i-1;
         put i= commax15.0; 
         stop;
      end;
   end;
run;
 
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 23 Nov 2015 11:00:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235960#M1819</guid>
      <dc:creator>HeideTribius</dc:creator>
      <dc:date>2015-11-23T11:00:43Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235969#M1820</link>
      <description>&lt;P&gt;Hallo, Michael,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Dein Code verursacht zwei Typkonvertierungs-Notes:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;1. Numeric to character&lt;/U&gt;&lt;BR /&gt;Das passiert in der Definition von FINDME. Hier wird das Character-Informat $20. auf die numerische Variable N angewandt. Passender wäre hier ein PUT-Statement mit einem numerischen Format.&lt;BR /&gt;Vorschlag: &lt;FONT face="courier new,courier"&gt;findme = PUT(n, 11.-l);&lt;/FONT&gt;&lt;BR /&gt;(Das &lt;FONT face="courier new,courier"&gt;-l&lt;/FONT&gt; sorgt für Linksbündigkeit, was im weiteren Verlauf wichtig wird, falls START_NUMBER nicht schon 11-stellig ist.)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;2. Character to numeric&lt;/U&gt;&lt;BR /&gt;Das passiert an drei Stellen:&lt;BR /&gt;a) Die SUBSTR-Funktion liefert ein Character-Ergebnis, das in einer numerischen Addition verwendet wird.&lt;/P&gt;
&lt;P&gt;Abhilfe: &lt;FONT face="courier new,courier"&gt;quersumme = quersumme + input(substr(findme,i,1), 1.);&lt;/FONT&gt;&lt;BR /&gt;b) SAS ist schon kulant, dass es die Anwendung des numerischen Formats 20. auf die Character-Variable FINDLAG kommentarlos akzeptiert.&amp;nbsp;Die PUT-Funktion liefert aber ein Character-Ergebnis, zu dem dann die Zahl 1 addiert wird. Vorschlag: s. u.&lt;BR /&gt;c) Bei PUT(findme,20.) greift wieder die Kulanz, aber der Vergleich des resultierenden Strings mit dem zuvor in eine Zahl umgewandelten Wert (PUT(findlag,20.) + 1) erfordert&amp;nbsp;dann doch die Konvertierung des Strings in eine Zahl.&lt;/P&gt;
&lt;P&gt;Vorschlag für Punkte b und c: &lt;FONT face="courier new,courier"&gt;IF INPUT(findlag,11.) + 1 EQ INPUT(findme,11.) THEN DO;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Im Sinne eines ganz "sauberen" Logs wäre es noch schön, die Note "Missing values were generated ..." zu eliminieren. Die kommt zustande, weil der erste Wert, den FINDLAG von der LAG-Funktion erhält, ein Leerzeichen ist, zu dem nach Umwandlung in ein numerisches Missing die Zahl 1 addiert wird.&lt;/P&gt;
&lt;P&gt;Daher modifizierter Vorschlag für 2.b und c: &lt;FONT face="courier new,courier"&gt;IF SUM(INPUT(findlag,11.),1) EQ INPUT(findme,11.) THEN DO;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Die Laufzeit verlängert sich allerdings durch die Verschönerungen ein wenig (insg. um ca. 1 - 3 %?).&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;Zur Frage nach meinem Code: Das INIT ist nur eine numerische Variable, die ich so genannt habe, weil sie als "Flag" dafür dient, ob die betreffende Codezeile schon einmal ausgeführt wurde. Ist dies noch nicht geschehen, ist die Variable noch nicht initialisiert, also missing. Die Bedingung &lt;FONT face="courier new,courier"&gt;~init&lt;/FONT&gt; (also &lt;FONT face="courier new,courier"&gt;NOT init&lt;/FONT&gt;) ist dann erfüllt und die Schleifenvariablen werden von 0 auf die zu Testzwecken gewünschten Startwerte hochgesetzt. Da INIT sodann auf 1 initialisiert wird, ist &lt;FONT face="courier new,courier"&gt;~init&lt;/FONT&gt; im weiteren Verlauf nie wieder erfüllt.&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;Was Laufzeitmessungen angeht, hätte ich eigentlich auf die (FULL)STIMER-Angaben vertraut. Hast Du schon unglaubwürdige Zeitangaben beobachtet? Alternativ (insb. wenn die Gesamtlaufzeit mehrerer Steps interessiert) kann man freilich auch vor und nach dem betreffenden Programmteil mit &lt;FONT face="courier new,courier"&gt;%put %sysfunc(datetime(), datetime.);&lt;/FONT&gt; Timestamps ins Log schreiben oder mit wenig mehr Aufwand sogar die Zeitdifferenz zwischen den beiden Timestamps ausrechnen lassen.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/63054"&gt;@HeideTribius﻿&lt;/a&gt;: Den Performance-Test kann ich gern auf meinem Rechner laufen lassen, aber überzeugender fände ich es, wenn die Laufzeiten nicht von einem der teilnehmenden "Läufer" selbst gemessen würden.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Viele Grüße&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Reinhard&lt;/P&gt;</description>
      <pubDate>Mon, 23 Nov 2015 12:57:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235969#M1820</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2015-11-23T12:57:53Z</dc:date>
    </item>
    <item>
      <title>Re: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235971#M1821</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/6453"&gt;@mfab&lt;/a&gt;: Berechnungen mit Fließkommazahlen sind aus meiner Erfahrung immer schneller als Stringoperationen. Außerdem hast du danach dann auch wieder die Typkonvertierung von z.B. Text "1" in die Ziffer 1. Das kostet auch noch einmal etwas Performance.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Bei dir sehe ich auch noch diese Zeile als potenziell problematisch an:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;DO i = 1 TO length(findme);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Für jede berechnete Quersumme gehst du bei einer 10stelligen Zahl zehn Mal durch diesen Abschnitt und rufst damit 10 mal die LENGTH Funktion auf. Bei 1.000 berechneten Quersummen rufst du also 10.000 mal LENGTH auf.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Etwas besseres als FULLSTIMER kenne ich für DATA _NULL_ Steps auch nicht. Leider kann man nicht sehen an welchen Stellen innerhalb eines Datasteps die typischen Performancekiller (wie IO, CPU Zeit, usw.) auftreten.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Die Code Katas finden übrigens mehr oder weniger regelmäßig statt. Immer wenn ich ein passendes Problem finde stelle ich es ein und markiere es mit dem entsprechenden Tag. Über die Seite &lt;A href="https://communities.sas.com/t5/tag/code%20kata/tg-p/board-id/code_sas" target="_self"&gt;Code Kata Tag &lt;/A&gt;findest du leicht die älteren Beiträge.&lt;/P&gt;
&lt;P&gt;Weitere Anregungen zu Code Katas sind immer willkommen.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Grüße,&lt;/P&gt;
&lt;P&gt;Andreas&lt;/P&gt;</description>
      <pubDate>Mon, 23 Nov 2015 13:03:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/235971#M1821</guid>
      <dc:creator>AndreasMenrath</dc:creator>
      <dc:date>2015-11-23T13:03:23Z</dc:date>
    </item>
    <item>
      <title>Betreff: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236003#M1822</link>
      <description>&lt;P&gt;Hallo zusammen,&lt;BR /&gt;&lt;BR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/32733"&gt;@FreelanceReinh﻿&lt;/a&gt;: Vielen Dank für Deine Hinweise. Ojhe, ist das peinlich ... da habe ich wohl den Wald vor lauter Bäumen nicht gesehen und war mehr auf den Algorhythmus konzentriert, als auf SAS. Eine Typkonvertierung hatte ich ja auch im Kommentar und wollte von String mit INT() auf numerisch konvertieren statt mit INPUT ... eieiei.&lt;BR /&gt;&lt;BR /&gt;Anbei (der Vollständigkeit halber) mein korrigierter Code. Ich habe nur die Notes im Log bereinigt, wobei ich wirklich erstaunt bin wie viel schneller eine alternative Verarbeitung ohne Strings laufen kann.&lt;BR /&gt;Zusätzlich habe ich mir erlaubt die gesuchte Nummer maximal 15 Stellen lang werden zu lassen statt 20. Wenn man die Lösung kennt, kann man natürlich auf 11 einschränken und mehr Performance gewinnen.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;DATA _null_;
  length findme $15.;
  start_number = 18990000000;
  end_number = 99999999999;

  DO n = start_number TO end_number;
    findme = PUT(n,15.-l);
	digits = length(findme);
	quersumme = 0;
	/*rc=dosubl(cats('SYSECHO "n=',n,'"'));*/
    
	     /* Quersumme berechnen */
         DO i = 1 TO digits;
           quersumme = quersumme + INPUT(substr(findme,i,1),1.);
         END;

		 /* Test: durch 10 teilbar? */
         IF MOD(quersumme,10) EQ 0 THEN DO;
		     findlag = lag(findme);

		   /* Quersumme der vorherigen Zahl auch durch 10 teilbar? */
		   IF SUM(INPUT(findlag,15.),1) EQ INPUT(findme,15.) THEN DO;
               PUT "Ergebnis: " findlag " und " findme;
               STOP;
           END;
		 END;
  END;
RUN;&lt;/PRE&gt;
&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;Was mich ja wundert ist die Tatsache, dass die automatische Konvertierung von SAS tatsächlich performanter läuft, als wenn man das selbst angibt. Ich komme auf Laufzeiten, die sich um 10-25% unterscheiden.&lt;BR /&gt;&lt;BR /&gt;Den Hinweis mit "dosubl" für die Ausgabe im eGuide finde ich klasse, das sorgt in meinem Data-Step jedoch für mehr als doppelt so lange Laufzeiten.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;(FULL)STIMER liefert meist gute Werte. Mir fehlt jedoch eine Option, unterschiedliche Lösungen im Detail zu testen.&lt;BR /&gt;Beispiel: Deklaration der zu durchlaufenden Zahlen einmal im DATA-Step vor der DO-Schleife und einmal die direkte Angabe in der DO-Schleife.&lt;/P&gt;
&lt;PRE&gt;[...]
  start_number = 18990000000;
  end_number = 99999999999;

  DO n = start_number TO end_number;
[...]

vs

[...]
  DO n = 18990000000 TO 99999999999;
[...]&lt;/PRE&gt;
&lt;P&gt;Oder per Macro-Variable, wie man es natürlich auch machen kann.&lt;BR /&gt;Hier liegen die Zeitunterschiede vermutlich in einem sehr kleinen Bereich, wodurch das schlecht im Log nachvollziehbar ist. Da können wahrscheinlich parallel laufende Zugriffe im System mehr Einfluss auf das Log haben. Dennoch würde mich interessieren, ob es Unterschiede gibt oder nicht.&lt;BR /&gt;Reine Neugier &lt;span class="lia-unicode-emoji" title=":leicht_lächelndes_Gesicht:"&gt;🙂&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/16887"&gt;@AndreasMenrath﻿&lt;/a&gt;: Führt SAS das Length-Statement wirklich 10 mal aus, wenn es im Schleifen-Kopf steht? Damit hätte ich nicht gerechnet. Ich habe es jetzt im Code voran gestellt, konnte jedoch keine wesentlichen Unterschiede in der Laufzeit feststellen. (Auch wieder so ein Thema, das ich gerne genauer prüfen würde)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Beste Grüße in die Runde&lt;/P&gt;
&lt;P&gt;Michael&lt;/P&gt;</description>
      <pubDate>Mon, 23 Nov 2015 15:36:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236003#M1822</guid>
      <dc:creator>mfab</dc:creator>
      <dc:date>2015-11-23T15:36:16Z</dc:date>
    </item>
    <item>
      <title>Betreff: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236017#M1823</link>
      <description>&lt;P&gt;Gern würde ich einmal "hinter die Kulissen" eines Datasteps schauen können ... &amp;nbsp;-- In dem Beispiel der Start- und Endwerte einer DO-Schleife gehe ich davon aus, dass es so gut wie keinen Unterschied macht, ob man sie explizit oder in (Datastep-)Variablen übergibt, denn die Übergabe erfolgt ja nur ein einziges Mal. Für diese Vermutung spricht jedenfalls, dass die Schleife nicht häufiger durchlaufen wird, wenn man den Endwert nachträglich erhöht:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data test;
a=10;
do i=1 to a;
  a=20;
  output;
end;
run; /* 10 obs. */
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Insofern dürften auch Funktionsauswertungen in der Schleifendeklaration keinen nennenswerten Performance-Verlust für die betreffende Schleife bewirken.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Makrovariablen würden ohnehin aufgelöst, noch bevor der Datastep-Compiler überhaupt seine Arbeit aufnimmt.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Die (END_NUMBER - START_NUMBER + 1)-malige Auswertung der LENGTH-Funktion in der äußeren DO-Schleife wird dagegen selbstverständlich ihren Anteil zur Laufzeit beitragen. In der Tat wäre es nützlich, diesen Anteil einschätzen zu können.&lt;/P&gt;</description>
      <pubDate>Mon, 23 Nov 2015 16:41:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236017#M1823</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2015-11-23T16:41:45Z</dc:date>
    </item>
    <item>
      <title>Betreff: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236206#M1824</link>
      <description>&lt;P&gt;Also das Thema Performanceoptimierung von SAS Programmen ist erfahrungsgemäß eine Geheimwissenschaft für sich.&lt;/P&gt;
&lt;P&gt;Aus Neugier habe ich das ganze auch einmal mit "richtigen" Datentypen in einem DS2 Programm ausprobiert. Ich hätte erwartet, dass es dadurch etwas schneller wird, aber genau das Gegenteil war der Fall.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Zur Vollständigkeit hier noch der DS2 Code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* Parameters for program */
%let start_number = 18900000000; /* %let start_number = 1; */
%let end_number   = 19100000000; /* %let end_number = 2e10; */
%let divisor = 10;

proc ds2;

	data matches(overwrite=yes);
		dcl bigint number;
		dcl bigint current_number;
		dcl bigint previous_number;
		dcl int sum_of_digits;
		dcl int quersumme;

		method getQuerSumme(bigint zahl) returns int;
			sum_of_digits = 0;

			do while(zahl ne 0);
				sum_of_digits = sum_of_digits + mod(zahl, 10);
				zahl = zahl / 10;
			end;

			return(sum_of_digits);
		end;

		method init();

			do number = &amp;amp;start_number. to &amp;amp;end_number.;
				quersumme = getQuerSumme(number);

				if (mod(quersumme,&amp;amp;divisor.) eq 0) then
					do;
						current_number = number;

						if ( (current_number - previous_number) eq 1) then
							do;
								put 'NOTE: Zahlenpaar gefunden:';
								put 'NOTE- Zahl:' previous_number;
								put 'NOTE- Nachfolger:' current_number;
								output;
								stop;
							end;

						previous_number = number;
					end;
			end;
		end;

	enddata;
run;

quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;PS: SAS als Skriptsprache ist selbst im Vergleich zu Managed Code wie Java oder .Net ziemlich langsam. Der gleiche Algorithmus in C# ist ungefähr um den Faktor 100 schneller.&lt;/P&gt;
&lt;P&gt;Es sollte also noch etwas Potenzial zur Performanceverbesserung da sein &lt;img id="smileyhappy" class="emoticon emoticon-smileyhappy" src="https://communities.sas.com/i/smilies/16x16_smiley-happy.png" alt="Smiley (fröhlich)" title="Smiley (fröhlich)" /&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 24 Nov 2015 15:14:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236206#M1824</guid>
      <dc:creator>AndreasMenrath</dc:creator>
      <dc:date>2015-11-24T15:14:37Z</dc:date>
    </item>
    <item>
      <title>Betreff: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236208#M1825</link>
      <description>&lt;P&gt;Hallo Andreas,&lt;/P&gt;
&lt;P&gt;gibt es denn irgendwann einmal vergleichende Messungen für die verschiedenen Lösungen?&lt;/P&gt;
&lt;P&gt;Viele Grüße&lt;/P&gt;
&lt;P&gt;Andreas&lt;/P&gt;</description>
      <pubDate>Tue, 24 Nov 2015 15:18:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236208#M1825</guid>
      <dc:creator>Andreas</dc:creator>
      <dc:date>2015-11-24T15:18:21Z</dc:date>
    </item>
    <item>
      <title>Betreff: Code Kata: verflixte Quersumme</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236396#M1826</link>
      <description>&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13593"&gt;@Andreas&lt;/a&gt;: die Ergebnisse würden mich auch interessieren. Wenn sich ein neutraler Schiedsrichter finden lässt, sollte das auch kein Problem sein.&lt;BR /&gt;Ich nehme mich mal aus, da ich selbst zwei Implementierungen gepostet habe.&lt;BR /&gt;&lt;BR /&gt;Hat jemand Lust die Beispiele zu vergleichen?</description>
      <pubDate>Wed, 25 Nov 2015 13:29:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Code-Kata-verflixte-Quersumme/m-p/236396#M1826</guid>
      <dc:creator>AndreasMenrath</dc:creator>
      <dc:date>2015-11-25T13:29:51Z</dc:date>
    </item>
  </channel>
</rss>

