Ami 0-65535 között helyezkedik el. A feladat az az, hogy tizenhat kérdésből kitalálja az ember ezt a számot.
Elöljáróban közölném, hogy ez a játék nem pont egy játék, mindössze csak egy algoritmus, ami egy DAC (digitális-analóg konverter) kimenetét hasonlítja össze egy referencia feszültséggel, és bumm - így lesz az ADC (analóg-digitális konverter). De attól még lehet, hogy érdekel valakit.
Tehát vissza a feladathoz, ami egy fokozatos közelítéses mérési izé. A feladat megoldásához nem árt némi kis affinitás a bináris számok irányába. Amúgy rohadt egyszerű. A méréshez szükséges mintavevő-tartó áramkör olyan bonyolult is lehet, mint egy százasszög, a DAC-ot meg össze lehet hányni két-háromszáz forintból (olyan is - nem lehet versenyezni a lézer-trimmelt ellenállássokkal készített áramkörökkel, vagy éppen egy flash-ADC-vel), a komparátor meg... No, de a lényeg lényege lényegében lényegtelenné lényegül.
No, osonjunk csak sorjában végig mindenen... Legyen a gondolt szám, mondjuk... 34225. Legyen a felhasznált programnyelv a... Egy papír...
Elméletben tizenhat biten 65536 szám fejezhető ki, de mivel a nulla is beletartozik ebbe a fogalomkörbe... Így nullától 65535-ig terjedhet a kitalálandó szám értéke. Kettes számrendszerben ábrázolva: 0000000000000000-1111111111111111. Ez utóbbi a számítástechnika miatt lehet fontos, hiszen az java részt a kettes számrendszeren alapszik. Nos, akkor találjuk ki a már eleve ismert számunkat. Ha programból kívánjuk megoldani, akkor nem árt definiálni pár számot, illetve egy regisztert.
No, de eredetileg csak papírt használunk. Bátran felfirkálhatjuk rá a következőeket:
1000000000000000 = 32768
0100000000000000 = 16384
0010000000000000 = 8192
0001000000000000 = 4096
0000100000000000 = 2048
0000010000000000 = 1024
0000001000000000 = 512
0000000100000000 = 256
0000000010000000 = 128
0000000001000000 = 64
0000000000100000 = 32
0000000000010000 = 16
0000000000001000 = 8
0000000000000100 = 4
0000000000000010 = 2
0000000000000001 = hihetetlen módon ez pont egy...
1.) No, akkor kezdjük meg a kérdezősködést. A 'gondolt' szám kisebb-e, mint 32768? Hát nem. Tehát akkor fel lehet vésni a papírra, hogy
1.
2.) A gondolt szám kisebb-e, mint 32768+16384? Hát ránézésre az... Tehát folytassuk a számsort:
10.
3.) A szám kisebb-e, mint 32768+8192? Elképzelhetőnek tartom... Tehát ezidáig:
100
4.) A szám kisebb-e, mint 32768+4096? Az.
1000
5.) Kisebb-e,mint 32768+2048?
10000
6.) Kisebb-e, mint 32768+1024? Kivételesen nem. Már írhatunk egy egyest is.
100001
7.) Kisebb-e a szám, mint (32768+1024) 33792+512 ? Jaja.
1000010
8.) He? 33792 + 256, kisebb-e ennél? Nem.
10000101
9.) Kisebb-e, mint 34048+128? No.
100001011
10.) 34176+64 = .34240. Ennél kisebb-e? Az.
1000010110
11.) 34176+32 = 34208. A kérdés ismert. Nem.
10000101101
12.) 34208+16 = 34224. Még mindig nem kisebb.
100001011011
13.) 34224+8 = 34232. Kisebb.
1000010110110
14.) 34224+4 = 34228. Ennél is kisebb.
10000101101100
15.) 34224+2 = 34226. Kisebb.
100001011011000
16.) 34224+1. Kisebb-e? Nem.
1000010110110001
Ez utóbbi a végeredmény. Már csak át kell váltani tízes számrendszerbe és készen is vagyunk... Emlékezzünk csak az előzőleg lefirkantott számokra... Váltsuk át, balról jobb felé haladva (de lehet fordítva is). Az első számjegy az egyes. Tizenhat számjegy esetében az 32768, tehát firkantsuk fel a 'puskáról' a számot.
32768
00000
00000
00000
00000
01024
00000
00256
00128
00000
00032
00016
00000
00000
00000
00001
Ez összeadva,annyi mint... A gondolt szám. Most átmegyek Gecimici Ajatollahba, ugyanez kockában és nem papíron.
def
const
s = array[1..16] of dword = (%1000000000000000, %0100000000000000, ...(kitöltendő rész) %0000000000000001); //Az egyszerűség kedvéért. Lehetne [0..15] is.
Ne szarozzunk, XOR-ozzunk... De nem ártana egy olyan izé sem, amiben az átmeneti eredményt... Egy darabka tetőléccel... Vagy...
var SAR :dword = $00; //nem, nem az. Fokozatos megközelítésű regiszter... Nullával indítunk és ez lesz a végeredmény
tmp : dword; //ebbe a változóba csak átmenetileg tárolunk számokat
Mivel ahány bit annyi lépés, jelen esetben tizenhat lépés lesz. Véleményem szerint egy sima for ciklus elég lesz rá, legalább nem keveredik az emberfia végtelen ciklusba - maximum csak nem lesz jó valami... Tehát kell még egy változó, ami legyen mondjuk egy... Öööö. I.
var i : byte; //tizenhatig csak bírja...
for i:=1 to 16 do
begin
tmp:=SAR; //biztos, ami biztos. Nem kéne elbaszni a regiszter értékét
tmp:=tmp xor s[i]; //xor-ozzuk a tömbben tárolt konstanssal
if tmp > gondolt_szám then SAR:=tmp; //és ha a kitalálandó érték kisebb, mint a tmp, akkor a SAR regiszternek átadjuk az értékét, ellenkező esetben nem buzerálunk semmit...
end;
writeln(SAR); //ezt lehet cifrázni a strtoint függvénnyel, meg ilyekkel is.
Azért írtam regisztert a SAR neve mellé, mert ha netán hardveres alapon akarjuk megvalósítani a dolgokat, esetleg mikrokontrollerrel, akkor... Ez a pár Pascal nyelven leír izé elég segítség a kezdéshez, innentől már kedvünk szerint túlbonyolíthatjuk a problémát.
Utolsó kommentek