\<< 0, ROT CLLCD
DO DUP DUP 0, OVER
DO 10, / IP SWAP OVER + SWAP DUP
UNTIL 10, <
END DROP 9, * - MOD
IF NOT
THEN SWAP 1, + DUP
IF 4, \>=
THEN OVER 2, DISP 1, WAIT
END SWAP
ELSE NIP 0, SWAP
END 1, + 3, PICK OVER
UNTIL <
END 3, DROPN
\>>
A fenti program Pascalban:
Program Niven;
var n1, n2, n: real;
c, i, m: byte;
k: char;
function Sod(x: Real): byte;
var s, t: real;
begin
s:=0;
t:=x;
repeat
t:=Int(t/10);
s:=s+t
until t<10;
Sod:=Trunc(x-9*s)
end;
begin
ClrScr;
Write('n1, n2, m: ');
ReadLn(n1, n2, m);
WriteLn;
n:=n1;
c:=0;
repeat
if Frac(n/Sod(n)) = 0
then
begin
c:=c+1;
if c>=m then WriteLn (n-i+1:18:0)
end
else
c:=0;
n:=n+1;
until n=n2
end.
Gerson talált egy programot a HP48 fórumon is, ami hasonlít az én első megoldásomhoz. Futásidő 55 sec.
\<< 0, ROT CLLCD
DO DUP DUP MANT 0,
DO OVER IP + SWAP FP MANT SWAP
UNTIL OVER NOT
END + MOD
IF NOT
THEN SWAP 1, + DUP
IF 4, \>=
THEN OVER 2, DISP 1, WAIT
END SWAP
ELSE NIP 0, SWAP
END 1, + 3, PICK OVER
UNTIL <
END 3, DROPN
\>>
Ronald Williams listákat használt. Futásidő Exact módban egész számokkal 43 perc 34 másodperc.
Mikor átváltott lebegőpontosra, ez 12 perc 42 másodpercre csökkent.
<<
8996 { 1000 1001 1002 1003} {} {} {}
-> n a d1 d2 b
<< TIME NEG 1 SF
1 n FOR k
a 'd1' STO
1 4 FOR j
d1 j GET 1000 / DUP @ CHANGE
IP SWAP FP
10 * DUP
IP SWAP FP
10 * DUP
IP SWAP FP
10 *
+ + + d1 j ROT PUT 'd1' STO @ CHANGE
NEXT
a d1 / FP 'd2' STO
CASE
d2 4 GET 0 > THEN k 2 + 'k' STO 2 SF END @ CHANGE
d2 3 GET 0 > THEN k 1 + 'k' STO 2 SF END @ CHANGE
d2 2 GET 0 > THEN 2 SF END @ CHANGE
d2 1 GET 0 > THEN 2 SF END @ CHANGE
END
IF 2 FC?C THEN
IF 1 FS?C THEN a 'b' STO
ELSE a b + 'b' STO END
END
{ 1000 1001 1002 1003} k ADD 'a' STO
NEXT
TIME HMS+ 4 FIX "TIME H.MMSS" + 2 FIX
b SORT
>>
>>
\<< {} 0 \-> results len \<<
27
1000 9999 FOR x
IF x 10 MOD THEN
1 +
ELSE
IF x 100 MOD THEN 8 -
ELSE IF x 1000 MOD THEN 17 -
ELSE 26 -
END
END
END
DUP x SWAP
IF MOD THEN
0 'len' STO
ELSE
IF len 3 == THEN
'results' x len - STO+
ELSE
'len' 1 STO+
END
END
NEXT
results
\>> \>>Itt van JavaScript-ben is: ;-)
function () {
var results = [], len = 0;
var digitSum = 27;
for (var x=1000; x<9999; x++) {
if (x % 10)
digitSum += 1;
else {
if (x % 100) digitSum -= 8;
else if (x % 1000) digitSum -= 17;
else if (x % 10000) digitSum -= 26;
}
if (x % digitSum)
len = 0;
else {
if (len == 3)
results.push(x-len);
else
len += 1;
}
}
return results;
}
HP-50g:
%%HP: T(3)A(D)F(,);
\<< { } 0, 1000,
DO DUP DUPDUP 10, / IP DUP 10, / IP DUP 10, / IP + + 9, * - MOD
IF NOT
THEN SWAP 1, + DUP
IF 4, \>=
THEN UNROT + LASTARG NIP ROT
END SWAP
ELSE NIP 0, SWAP
END 1, + DUP 10000,
UNTIL >
END DROP2
\>>
<< DC >> TEVAL -> {1017. 2025. 3033.}
s: 171.2803
( 38.3768 seconds when up to 3033)
HP-28S:
\<< { } 0 1000
DO DUP DUP DUP 10
/ IP DUP 10 / IP DUP
10 / IP + + 9 * -
MOD
IF NOT
THEN SWAP 1 +
DUP
IF 4 \>=
THEN OVER 4
ROLL + ROT ROT
END SWAP
ELSE SWAP DROP 0
SWAP
END 1 + DUP 3033
UNTIL >
END DROP2
\>>
DC -> { 3033 2025 1017 } (after 3.00 minutes)
"<< {} results sto 0 len sto <<"és a "->"-jel valószínűleg a "STO►" megfelelője lehet.
\<< eddig: \>>. Elmentettem txt formában és úgy töltöttem a HP-be.
\<< {} 0 \-> results len \"
Beírás, ábrázolás:
<< << 1000. 3035. DC >> TEVAL >> -> s: 60.1381
Próbáld meg így beírni, ahogy látod a képen. Feltöltöttem a futtatható programot is. (titkos.zip) Ha még nincs kábeled, az emulátorral akkor is kipróbálhatod.
Ez meg a kódvisszafejtő program. Ezt is egy (más) néven mentsd el. (Mondjuk 'FEJT' )
Ez a kódolt szöveg. Az eredeti szövegből kódolta a KODOL prg.
Ez meg a visszafejtett szöveg. Ékezetet még sajnos nem tud átalakítani. (Fejt prg)
Az nem baj ha az = jel előtt nem C van.