Ready/Run

Takie sobie archiwum listingów ze starych magazynów komputerowych


Szukamy Liczb Czyli Sukcesywna Aproksymacja
  • Język programu: Basic
  • Platforma: ZX Spectrum
  • Kod zamieszczono w Bajtek 3/1988
  • Autor listingu: Marcin Przasnyski
  • Listing nadesłał: Faust

Stan listingu:

4
Listing gotowy - uruchamia się na emulatorze lub realnej maszynie zgodny z listingiem zamieszczonym w periodyku

 W instrukcji do Spectrum znalazłem następujący program:

 
10 LET a=INT (RND*100)
20 LET a$ = ~~
30 INPUT (a$); ~Zgadnij liczbe~;b
40 IF a=b THEN PRINT „ Gratuluje! ”:STOP
50 IF a>b THEN LET a$=” Za malo ”
60 IF a<b THEN LET a$=” Za duzo! ”
70 GO TO 30
 
Istnieje niejedna metoda aproksymacji. Rozważmy program:
Jest to doskonała zabawa na prawie cały dzień. Zgadujemy tu liczbę pomyślaną przez komputer. Najefektywniejszą taktyką odgadywania jest dzielenie rozpatrywanego przedziału na pół. Na przykład jeżeli zgadujemy liczbę z przedziału (0,100), podajemy 50. Jeśli jest ona za mała, bierzemy przedział (50,100), podajemy 75 i tak dalej. W zasadzie ósmy strzał powinien być trafiony.
Metoda kolejnych przybliżeń to właśnie aproksymacja. Powinna on być sukcesywna — dawać rezultat jak najszybciej.
Spróbujmy odwrócić sytuację — my pomyślimy liczbę, a komputer będzie ją odgadywał.
 
10 LET x=0:LET y=102
20 LET c=INT((x+y)/2)
30 INPUT „Czy „;(c);” ? „;a$
40 if a$=”>” THEN LET x=c:GO TO 20
50 IF a$=”<” THEN LET y=c:GO TO 20
60 IF a$=”=” THEN STOP
70 GO TO 20
 
W odpowiedzi na pytanie „Czy xx” należy podać jeden ze znaków — „>”, „<” lub „ = „. Rozpatrujemy przedział (0,100).
Istnieje niejedna metoda aproksymacji. Rozważmy program:
 
10 DIM a(8)
15 LET a(1)=1
20 FOR f=2 TO 8:LET a(f)=2^(f-2):NEXT F
30 LET c=a(8)
40 FOR f=7 to 1 STEP -1
50 INPUT ~Czy ~;(c);~ ? ~;a$
60 IF a$<>”<” AND a$<>”>” AND a$<>”=” THEN GOTO 50
70 IF a$=”>” THEN LET c=c+a(f)
80 IF a$=”<” THEN LET c=c-a(f)
90 IF a$=”=” THEN GOTO 110
100 NEXT f
110 PRINT „Liczba=”;c
 
W tablicy a zapisaliśmy sześć kolejnych potęg dwójki. Najwyższa liczba to 64, więc kompuer odgadnie tu liczbę z przedziału (0,127). Jako pierwsza podawana jest liczba 64. Jeżeli pomyślana jest większa, do 64 dodawana jest 32, jeśli mniejsza, to 32 jest odejmowane i tak dalej. Tu maksymalna ilość pytań jest także 8 ze względu na włączenie zera do rozpatrywanego przedziału.
Możemy rozszerzyć tablicę na przykład do 16 pozycji; trzeba wtedy odpowiednio pozmieniać początki i końce pętli, lecz uzyskamy zakres do 131069, a maksymalną ilością pytań będzie najwyższa potęga dwójki, czyli 16.
W zasadzie nie można powiedzieć, która z metod jest najlepsza. W pamięci lepiej używać metody dzielenia przedziałów na pół, maszyna szybciej aproksymuje dwójkowo.