Permalänk
Medlem

String byte

Hej!

Undrar om det går att räkna fram vad frågetecknen är nedan. Antal frågeteckan kan vara fler eller färre.

isTheString("????????", 0xe8b0279L); public static boolean isTheString(String s, long l) { Adler32 adler32 = new Adler32(); try { adler32.update(s.getBytes("US-ASCII")); } catch(Exception exception) { System.exit(1); } return adler32.getValue() == l; }

Permalänk
Medlem

adler32 är en kontrollsumma man kan använda till ex. text.
se: http://en.wikipedia.org/wiki/Adler-32
kort svarat, nej du kan inte få fram vad strängen ???????? var. Men du kan via t.ex. bruteforce ta reda på alla möjliga strängar av den längden som får kontrollsumman: 0xe8b0279L
Eftersom strängen är så pass kort så bör det dock endast finnas en möjlighet. Du bör även kunna finna denna genom att nyttja det som står under disadvantages på wiki-sidan.

Lycka till

Edit...
kort analys ...
kontrollsumman i binärt format: 111010001011 0000001001111001
de 16 lägsta bitarna:
0000001001111001_2 = 633 (bas 10)
och de högsta bitarna:
0000111010001011_2 = 3723 (bas 10)

strängen s var 8 tecken låt s[i] beteckna det i:te tecknet där s[1] motsvarar det första tecknet.

då har vi att:
1 + sum( (char)s[i], i=1..8 ) = 633
eller att summan av asciivärdet för alla tecken ska bli 633-1 = 632
Med hjälp av detta kan du väldigt enkelt utesluta många strängar ... förutsatt att det endast är alfabetiska tecken och inga siffror med i strängen så kan du börja med strängen:
AAAAAAxz
sedan minskar du succesivt en bokstav och ökar en annan t.ex.
AAAAAAyy
AAAAABwz
osv.

för varje sträng till kandidat så räknar du ut den övre summan:
8 + sum( (8+1 - i)*(char)s[i] , i=1..8 ) = 3723
eller:
sum( (9- i)*(char)s[i] , i=1..8 ) = 3715
eller
8*s[1] + 7*s[2] + 6*s[3] + 5*s[4] + 4*s[5] + 3*s[6] + 2*s[7] + s[8] = 3715

allt detta förutsätter att det inte blir overflow någonstans så att du måste ha med modulo-operatorn. Med modulooperatorn och overflow så blir det inte lika enkelt

jo så under dessa förutsättningar så bör du kunna lösa det hela relativt enkelt.

Lycka till igen!

Visa signatur

weeeee