2024(e)ko otsailaren 28(a), asteazkena

6. astea | letra bat asmatzen

Ordenadoreak letra bat pentsatuko du eta guk asmatu beharko dugu

A eta Z bitartean dagoen letra bat aukeratuko du ordenadoreak eta ezezaguna den letra hori guk asmatuko dugu. Egiten dugun saiakera bakoitzeko, programak informazioa emango digu esanez letra ezezaguna zein tartetan dagoen.

  1. Ordenadoreak letra bat aukeratuko du, A eta Z bitartean dagoen letra bat aukeratuko du. Horretarako, random() funtzio estandarra erabiliko du (randomize prozedurarekin batera). programak aukeratzen duen letra cAsmatzeko aldagaian gordeko da
  2. Ezezaguna den letraren heina [A, Z] da hasieran, behemuga A eta goimuga Z. Beraz, cProposatutakoTxikiena:='A' eta cProposatutakoHandiena:='Z'
  3. Errepikatu letra asmatu arte edo 5 saiakera egin arte:
    • Teklatuaren bitartez irakurriz, soluzio bat proposatuko diogu programari. Nahi dugun soluzioa proposatuko diogu programari, modurik eraginkorrena da tartearen erdiko letra proposatzea programari: M lehen saiakeran, G edo T bigarren saiakeran...
    • Gure proposamenaren arabera, programak bi aukera izango ditu eta honela jokatuko du:
      • Proposatutako letra eta programak asmatutakoa bat datoz, letra asmatu dugunez begiztatik irten
      • Proposatutako letra eta programak asmatutakoa ez datoz bat, ez dugunez letra asmatu beste saiakera bat emango digu programak (5 saiakeraren muga ez badugu oraindik gainditu). Hurrengo saiakeraran erakutsiko digun tartea egokituko du programak, honelaxe:
        • Proposatu diogun letra programarena baino handiagoa bada (tartearen cProposatutakoHandiena aldatu eta 3. urratsaren hasierara itzuli saiakera berri bat egiteko)
        • Proposatu diogun letra programarena baino txikiagoa bada (tartearen cProposatutakoTxikiena aldatu eta 3. urratsaren hasierara itzuli saiakera berri bat egiteko)
  4. Emaitza erakutsi, begiztatik irteteko aukerak:
    • Letra asmatu diogu programari, zorionak eta iSaiakera erakutsi
    • Saiakerak 5 baino gehiago izan dira, cAsmatzeko aldagaiaren edukia erakutsi
  Zergatik 5 saiakera?
  A-ren eta Z-ren artean 26 karaktere. Urrats bakoitzean,
  karaktere guztietatik erdiak baztertzen dira. Beraz:
log2(26)=4,70044
  logaritmo (2 oinarrian) 26 zenbakiarena 4,70044 da
  2x = 26   >>>   ln(2x) = ln(26)   >>>
  x·ln(2) = ln(26)   >>>   x = ln(26)/ln(2)
  x = 3.25810/0.69315 = 4.70044   >>>   x=5   


Ikusi LetraAsmatu.exe programaren balizko exekuzio bat:

Eskatzen den ariketaren hurbilpen hau LetraAsmatu_hasiera.pas abiapuntutzat har daiteke. Hau da eskatzen den LetraAsmatu.pas iturburu-programa bat. Zein da zurea?

Hona hemen programaren kodifikazioa non, mesedez, pantaila-irteeran agertzen diren koloreei jaramonik ez diezuen egin behar. Aldiz, oso interesgarria da boAsmatua aldagai boolear laguntzilearen erabilera. Ikusi ere random(), chr(), ord(), pred() eta succ() funtzioek programari egiten dioten ekarpena:

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
   'A' eta 'Z' arteko letra bat programak aukeratuko du,
   letra hori guk asmatuko dugu erantzun hauek emanez:
 
   00000000011111111112222222
   12345678901234567890123456
   ABCDEFGHIJKLMNOPQRSTUVWXYZ
               M                1. saikera
         G            T         2. saikera
      D     J     P      W      3. saikera
    B   F           R      Y    4. saikera
                                5. saikera
                                 
   ---------------------------------------
     
   Zergatik 5 saiakera?
 
   log2(26)=4.7
   logaritmo 2 oinarrian 26 zenbakiarena 4.7 da
   A eta Z artean 26 karaktere
}
 
program LetraAsmatu;
uses
   crt;
const
   iSAIAKERAKOPURUMAXIMOA = 5;
var
   cLetra, cAsmatzeko, cProposatutakoTxikiena, cProposatutakoHandiena, cItxaron: char;
   iEsparrua, iAleatorioa, iSaiakera: integer;
   boAsmatua: boolean;
    
begin
   clrscr;
   writeln;
   writeln('''A'' eta ''Z'' arteko letra bat aukeratuko du konputagailuak eta');
   writeln('ea letra hori asmatzeko gai zaren. Zure proposamenak egitean');
   writeln('"Bilaketa Bitarra" deitzen den estrategia erabil ezazu');
   writeln;
   writeln;
   writeln('Aurrera egiteko tekla bat sakatu!');
   writeln;
   writeln;
   cItxaron := readkey;
   writeln(cItxaron);
    
   clrscr;
   writeln('//////////////////////////////////////');
   writeln;
    
   randomize;
 
   iEsparrua := ord('Z') - ord('A') + 1;
    
   iAleatorioa := random(iEsparrua);
   (* *) writeln('iAleatorioa=', iAleatorioa);
   cAsmatzeko := chr(iAleatorioa + ord('A'));   (* 0-A, 1-B, 2-C, ... 24-Y, 25-Z *)
   (* *) writeln('cAsmatzeko=', cAsmatzeko);
   writeln;
 
   boAsmatua := FALSE;
   iSaiakera := 1;
   cProposatutakoTxikiena := 'A';
   cProposatutakoHandiena := 'Z';
   repeat
      repeat
         writeln('Saiakera=', iSaiakera, '     Zein da ezkutatu dugun letra maiuskula? ');
         // kolorerik gabe
         write('               ', cProposatutakoTxikiena, '..', cProposatutakoHandiena,' alfabetoko letra bat eman, eta ea asmatzen duzun: ');
          
         // koloreekin
         {
         write('               ');
         textcolor(Cyan);
         write(cProposatutakoTxikiena);
         textcolor(LightGray);
         write('..');
         textcolor(Cyan);
         write(cProposatutakoHandiena);
         textcolor(LightGray);
         write(' alfabetoko letra bat eman, eta ea asmatzen duzun: ');
         }
         readln(cLetra);
         cLetra := upcase(cLetra);
         if (cLetra < cProposatutakoTxikiena) or (cLetra > cProposatutakoHandiena) then
         begin
            // kolorerik gabe
            writeln('Datua ''', cProposatutakoTxikiena, ''' eta ''', cProposatutakoHandiena, ''' artekoa, mesedez!');
             
            // koloreekin
            {
            write('Datua ');
            textcolor(Red);
            write('''', cProposatutakoTxikiena, '''');
            textcolor(LightGray);
            write(' eta ');
            textcolor(Red);
            write('''', cProposatutakoHandiena, '''');
            textcolor(LightGray);
            writeln(' artekoa, mesedez!');
            }
         end;
      until (cLetra >= cProposatutakoTxikiena) and (cLetra <= cProposatutakoHandiena);
       
      if cLetra=cAsmatzeko then
      begin
         boAsmatua := TRUE;
         writeln;
         // kolorerik gabe
         writeln('OSO ONDO!');
          
         // koloreekin
         {
         textcolor(Green);
         writeln('OSO ONDO!');
         textcolor(LightGray);
         }
      end
      else
      begin
         iSaiakera := iSaiakera + 1;
         // kolorerik gabe
         write('EZ, EZ DUZU ASMATU!   ');
          
         // koloreekin
         {
         textcolor(Red);
         write('EZ, EZ DUZU ASMATU!   ');
         textcolor(LightGray);
         }
         if cAsmatzeko < cLetra then
         begin
            cProposatutakoTxikiena := cProposatutakoTxikiena;   {esleipen hau soberan egon daiteke}
            cProposatutakoHandiena := pred(cLetra);
 
            // kolorerik gabe
            writeln('Saiatu bilatzen ''', cProposatutakoTxikiena, ''' eta ''', cProposatutakoHandiena, ''' bitartean');
             
            // koloreekin
            {
            write('Saiatu bilatzen ');
            textcolor(Cyan);
            write('''', cProposatutakoTxikiena, '''');
            textcolor(LightGray);
            write(' eta ');
            textcolor(Cyan);
            write('''', cProposatutakoHandiena, '''');
            textcolor(LightGray);
            writeln(' bitartean');
            }
         end;
         if cAsmatzeko > cLetra then
         begin
            cProposatutakoHandiena := cProposatutakoHandiena;   {esleipen hau soberan egon daiteke}
            cProposatutakoTxikiena := succ(cLetra);
             
            // kolorerik gabe
            writeln('Saiatu bilatzen ''', cProposatutakoTxikiena, ''' eta ''', cProposatutakoHandiena, ''' bitartean');
             
            // koloreekin
            {
            write('Saiatu bilatzen ');
            textcolor(Cyan);
            write('''', cProposatutakoTxikiena, '''');
            textcolor(LightGray);
            write(' eta ');
            textcolor(Cyan);
            write('''', cProposatutakoHandiena, '''');
            textcolor(LightGray);
            writeln(' bitartean');
            }
         end;
         writeln;
      end;
   until (iSaiakera > iSAIAKERAKOPURUMAXIMOA) or boAsmatua;
    
   if boAsmatua then
   begin
      writeln(iSaiakera, ' saiakera egin ondoren asmatu duzu');
   end
   else
   begin
      writeln('Saiakerak agortu dituzu eta ez duzu asmatu');
      write('Asmatu beharreko letra hau izan da: ');
      // kolorerik gabe
      writeln(cAsmatzeko);
       
      // koloreekin
      {
      textcolor(Red);
      writeln(cAsmatzeko);
      textcolor(LightGray);
      }
   end;
    
   writeln;
   writeln('//////////////////////////////////////');
   readln;
end.
 
 
00000000011111111112222222
12345678901234567890123456
ABCDEFGHIJKLMNOPQRSTUVWXYZ
            M                 1. saikera
      G            T          2. saikera
   D     J     P      W       3. saikera
 B   F           R      Y     4. saikera
                              5. saikera

 

iruzkinik ez:

Argitaratu iruzkina

Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.