Results 1 to 12 of 12

Thread: een reeks getallen

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,325

    een reeks getallen

    In de opleiding van mijn zoon zit ook een stukje JAVA programmeren. Nu heeft hij de eindtoets wel gehaald met zelfstudie en heel veel google en natuurlijk zijn oude vaar om tot een resultaat te komen. Toch heeft hij besloten om dit jaar klassikaal mee te lopen. Dit, omdat de lesstof veel beter is dan vorig jaar en dat je een beetje bijblijft omtrent de programmeertaal.
    Zo heeft hij besloten om een extra opdracht vanuit het boek te maken. Deze opdracht heeft de volgende kenmerken:
    • vul via een loop getal(len) in
    • kijk naar de langste reeks en geef daar de lengte van op het scherm weer alsmede om welk getal het gaat.

    Heeft hij aardig in zijn eentje op de rit gezet, al is het op een omslachtige manier.
    Nu werd ik zelf wel nieuwsgierig naar die opdracht en heb deze gemaakt. Maar ik wilde het niet alleen in JAVA, maar ook in pascal.
    Dit is het resultaat:
    Delphi Code:
    1. program reeksvangetallen;
    2.  
    3. {$APPTYPE CONSOLE}
    4.  
    5. {$R *.res}
    6.  
    7. uses
    8.   System.SysUtils, system.types;
    9.  
    10. var invoer  : string;
    11.     totaal  : string;
    12.     getal   : integer;
    13.     index   : integer;
    14.     subindex: integer;
    15.     ttlreeks: integer;
    16. begin
    17.   try
    18.     { TODO -oUser -cConsole Main : Insert code here }
    19.     totaal := '';
    20.     ttlreeks := 0;
    21.    repeat
    22.      write('Geef een nummer op  : ');
    23.      readln(invoer);
    24.      if invoer > ''  then
    25.        totaal := totaal + invoer;
    26.    until invoer = '';
    27.    index := 1;
    28.    subindex := 1;
    29.    while index <= length(totaal) do
    30.    begin
    31.       if totaal[index] = totaal[index + subindex] then
    32.       begin
    33.         //een reeks te pakken met twee gelijken
    34.         subindex := subindex + 1;
    35.         //zoek nu naar een reeks van he volgende nummer
    36.         while (totaal[index] = totaal[index + subindex]) and ((index + subindex) <= length(totaal)) do
    37.           subindex := subindex + 1;
    38.         if ttlreeks < subindex then
    39.         begin
    40.            ttlreeks := subindex;
    41.            getal := StrToInt(totaal[index]);
    42.         end;
    43.         index := index + subindex;
    44.       end else
    45.       begin
    46.         index := index + 1;
    47.         subindex := 1;
    48.       end;
    49.    end;
    50.    writeln(totaal);
    51.    writeln('lengte van de reeks : ',ttlreeks, ', getal :  ', getal );
    52.    readln;
    53.   except
    54.     on E: Exception do
    55.       Writeln(E.ClassName, ': ', E.Message);
    56.   end;
    57. end.
    Ik vind het wel geslaagd en best wel klein qua code.

    Nu ben ik benieuwd of er andere zijn, die dit qua code nog kleiner kan krijgen dan het hier bovenstaande. Je mag geen gebruik maken van externe libraries of third parties.

    Wie durft het aan?
    Last edited by jkuiper; 03-Oct-18 at 18:09.
    Delphi is great. Lazarus is more powerfull

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,292
    Je moet even de opdracht duidelijker schrijven want dit is mij niet helemaal duidelijk:
    kijk naar de langste reeks geen
    TMemoryLeak.Create(Nil);

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,325
    Typfout. Aangepast.
    Delphi is great. Lazarus is more powerfull

  4. #4
    Het werkt alleen met losse cijfers, niet met getallen van meer dan 1 cijfer? Zo ja, waarom moet er dan een enter tussen elk cijfer?
    1+1=b

  5. #5
    Een iets flexibelere variant die alles toestaat qua invoer, niet alleen losse cijfers. Maakt bovendien geen gebruik van externe of meegeleverde libraries. De uses-lijst is leeg, alleen de standaard taalfeatures worden gebruikt.

    De code is korter, met name omdat ik niet een lijst (of string) van invoer opsla en er nog een keer doorheen loop. In plaats daarvan hou ik tijdens het invoeren al bij hoeveel keer achter elkaar je dezelfde string invoert. Verder niet geprobeerd om codegolf-trucjes toe te passen om de code zo compact mogelijk te krijgen.

    De operator in de vergelijking HighCounter < CurrentCounter is nog bepalend als er meerdere reeksen van dezelfde lengte zijn. Met HighCounter < CurrentCounter wordt de eerste reeks getoond, met HighCounter <= CurrentCounter wordt de laatste reeks getoond.

    Delphi Code:
    1. program reeksvangetallen;
    2.  
    3. {$APPTYPE CONSOLE}
    4.  
    5. var
    6.   HighValue: String;
    7.   HighCounter: Integer;
    8.   CurrentValue: String;
    9.   CurrentCounter: Integer;
    10.   Input: String;
    11. begin
    12.   CurrentCounter := 0;
    13.   HighCounter := 0;
    14.   repeat
    15.     ReadLn(Input);
    16.  
    17.     if CurrentValue <> Input then
    18.     begin
    19.       if HighCounter < CurrentCounter then
    20.       begin
    21.         HighCounter := CurrentCounter;
    22.         HighValue := CurrentValue;
    23.       end;
    24.       CurrentValue := Input;
    25.       CurrentCounter := 0;
    26.     end;
    27.  
    28.     Inc(CurrentCounter)
    29.  
    30.   until Input = '';
    31.  
    32.   Writeln(HighCounter, ' x ' , HighValue, #13#10'Press enter to exit');
    33.   ReadLn;
    34. end.
    Last edited by GolezTrol; 03-Oct-18 at 22:34.
    1+1=b

  6. #6
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,325
    Quote Originally Posted by GolezTrol View Post
    Het werkt alleen met losse cijfers, niet met getallen van meer dan 1 cijfer? Zo ja, waarom moet er dan een enter tussen elk cijfer?
    1212 is geen reeks.
    Bij invoer mag ook 324923494242945555552231 worden gebruikt.
    Uiteindelijk zal dan het getal 5 met lengte van 6 worden getoond.
    De enter geeft alleen aan dat er nog meer ivoer plaats kan vinden.
    1
    22
    333
    4444
    55555
    5
    6
    7
    99
    Delphi is great. Lazarus is more powerfull

  7. #7
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,292
    Ah, nou begin ik te begrijpen wat je bedoelt (hoop ik).

    Even wat definities:
    • Een cijfer is een karakter van 0 tot 9
    • Een getal is een waarde van geen tot een oneindig aantal cijfers
    • Een reeks is een aantal gelijke cijfers achter elkaar binnen een getal
    • Een lijst is een verzameling van reeksen

    De opdracht is:
    Wat is de langste reeks binnen een lijst en hoe lang is deze reeks?
    Verwoord ik het zo goed?
    TMemoryLeak.Create(Nil);

  8. #8
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,325
    Helemaal
    Delphi is great. Lazarus is more powerfull

  9. #9
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,292
    Quote Originally Posted by jkuiper View Post
    Helemaal
    Blijkbaar niet, want dat is niet wat jouw code doet (ik heb het niet getest, alleen maar gelezen).

    In jouw oplossing zet je alle invoer achter elkaar (totaal := totaal + invoer), dus in één keer 1234
    intikken is hetzelfde als 1 <ENTER> 2 <ENTER> 3 <ENTER> 4 <ENTER> gebruiken; die laatste
    "Definitie" ("Een lijst is een verzameling van reeksen") valt dan dus af.

    De opdracht is dus eigenlijk:
    "Gegeven een string met getallen, welke reeks van getallen is het langst en wat is de lengte hiervan?"
    TMemoryLeak.Create(Nil);

  10. #10
    Ja, getal en lijst zijn hetzelfde (of getal bestaat niet). De invoer is een lijst cijfers (van 0 tot 9), en een reeks is een opvolging van hetzelfde cijfer binnen die lijst.
    1+1=b

  11. #11
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,325
    Of het 1 getal per invoer is of een reeks getallen. Het maakt allemaal niet uit. De doelstelling is: zoek naar een reeks met DEZELFDE getallen, controleer daar de lengte van en onthoud dat getal. Kijk verder of er geen andere reeks die langer is. Zo ja, presenteer die reeks met het getal waar in staat.
    Het resultaat blijft hetzelfde.

    Dit is de uitkomst van mijn programma:
    Geef een nummer op : 3
    Geef een nummer op : 4
    Geef een nummer op : 55556
    Geef een nummer op : 5
    Geef een nummer op : 7
    Geef een nummer op : 7
    Geef een nummer op : 7
    Geef een nummer op : 7
    Geef een nummer op : 7
    Geef een nummer op : 7
    Geef een nummer op : 7
    Geef een nummer op : 89
    Geef een nummer op : 6456
    Geef een nummer op : 222
    Geef een nummer op :
    345555657777777896456222
    lengte van de reeks : 7, getal : 7
    Je kan ook zeggen: hoe vaak is een getal achter / naast elkaar van het zelfde soort ingevoerd.
    Last edited by jkuiper; 05-Oct-18 at 08:42.
    Delphi is great. Lazarus is more powerfull

  12. #12
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    9,747
    Wat meer implementatie technisch, in Lazarus kan je indexbyte gebruiken ipv de inner while lus:

    https://www.freepascal.org/docs-html...indexbyte.html

    Al is dat meer een snelheids optimalizatie, die origineel vooral als doel had dat mensen POS() niet gingen misbruiken.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •