09-18-2017, 06:00 AM
09-18-2017, 07:51 AM
I've been able to get it down to 68 bytes, Dave's idea
Cheers, Werner
Code:
>LBL"HAPPY"
CLA
CF 29
FIX 0
0
STO Z
>LBL 02
CLX
4
X=Y?
GTO 04
SIGN
X=Y?
GTO 01
ARCL Y
MOD
ISG Y
>LBL 03
ATOX
X=0?
GTO 02
48
-
X^2
+
GTO 03
>LBL 04
"UN"
>LBL 01
+"HAPPY "
ARCL Z
SF 29
FIX 4
AVIEW
END
Cheers, Werner
09-18-2017, 08:23 AM
Just wondering if a CLSTK at the end is shorter than the '0' at step 5?
Default state at the start means zeros on the stack but to be rerunnable these have to be restored.
Pauli
Default state at the start means zeros on the stack but to be rerunnable these have to be restored.
Pauli
09-18-2017, 09:03 AM
No, 0 and CLST are both 1 byte on a 41.
Werner
Werner
09-18-2017, 11:02 AM
(09-18-2017 07:51 AM)Werner Wrote: [ -> ]I've been able to get it down to 68 bytes, Dave's idea
Excellent! but there are too much labels. We can save one byte by removing LBL 01 , going down to 67 bytes:
Code:
Step Bytes Instruction
1 9 >LBL"HAPPY"
2 2 CLA
3 2 CF 29
4 1 FIX 0
5 1 0
6 2 STO Z
7 1 >LBL 02
8 1 CLX
9 1 4
10 1 X#Y?
11 1 SIGN
12 1 X=Y?
13 2 GTO 04
14 2 ARCL Y
15 1 MOD
16 2 ISG Y
17 1 >LBL 03
18 2 ATOX
19 1 X=0?
20 2 GTO 02
21 2 48
22 1 -
23 1 X^2
24 1 +
25 2 GTO 03
26 1 >LBL 04
27 2 DSE X
28 3 "UN"
29 8 "|-HAPPY "
30 2 ARCL Z
31 2 SF 29
32 2 FIX 4
33 1 AVIEW
34 3 END
67
09-18-2017, 11:26 AM
You Shall Not Pass!
66 bytes
Werner
66 bytes
Code:
>LBL"HAPPY"
CLA
CF 29
FIX 0
0
STO Z
>LBL 02
CLX
4
X!=Y?
SIGN
X=Y?
GTO IND X
ARCL Y
MOD
ISG Y
>LBL 03
ATOX
X=0?
GTO 02
48
-
X^2
+
GTO 03
>LBL 04
"UN"
>LBL 01
+"HAPPY "
ARCL Z
SF 29
FIX 4
AVIEW
END
Werner
09-18-2017, 11:39 AM
Ah, I KNEW there had to be a way to improve the 4/1 tests somehow. Didn't think to use SIGN and indirect GTO. Very nice.
09-18-2017, 08:04 PM
Some of the below is repeated in the post for the RPL programming contest...
--------------------------------------------------------------------------------------------
The way the contests work at a real HHC gathering goes something like this.
1) We announce that program submissions (a physical machine with the program in it already AND a printed/hand written listing of the program AND the author's name on the machine and listing) are due to the judge at say Noon.
2) Noon happens to be when we break for lunch.
3) So as we break for lunch, those entering the contest are fighting their way to the judge who has to be careful to keep the machines safe (I dropped a 41C two years ago and broke it - ugh - didn't enjoy getting that fixed).
4) The judge tries to go get some lunch and then runs the inputs to the RPL and RPN contests on the machines and tries to record results / score them.
5) This is often a slow process since people want to be friendly and are curious. Personally, I don't like to hide, but I probably should.
6) The contest results are usually determined in an hour or so and then announced around 3pm. The results are kept secret until then.
7) Winner of each contest gets to pick a prize from the prize table AFTER the Best Speaker picks one but before all the other attendees will pick one.
8) The judge then starts trying to think of a contest for next year!
--------------------------------------------------------------------------------------------
Here are the numbers I used as test inputs.
Number 1: 123,456,789
Result: UNHAPPY 13
Number 2: 987,654,321
Result: UNHAPPY 13
Number 3: 555,555,555
Result: UNHAPPY 12
Number 4: 20
Result: UNHAPPY 1
Number 5: 989
Result: HAPPY 6
Number 6: 13
Result: HAPPY 2
Number 7: 15999
Result: UNHAPPY 16 (Note: 16 is the highest number of cycles required for a 10 digit or less number to process. Thanks, Eric Smith for finding this!)
Number 8: 100
Result: HAPPY 1
Number 9: 8002
Result: HAPPY 3
Number 10: 1
Result: HAPPY 1
--------------------------------------------------------------------------------------------
The way the contests work at a real HHC gathering goes something like this.
1) We announce that program submissions (a physical machine with the program in it already AND a printed/hand written listing of the program AND the author's name on the machine and listing) are due to the judge at say Noon.
2) Noon happens to be when we break for lunch.
3) So as we break for lunch, those entering the contest are fighting their way to the judge who has to be careful to keep the machines safe (I dropped a 41C two years ago and broke it - ugh - didn't enjoy getting that fixed).
4) The judge tries to go get some lunch and then runs the inputs to the RPL and RPN contests on the machines and tries to record results / score them.
5) This is often a slow process since people want to be friendly and are curious. Personally, I don't like to hide, but I probably should.
6) The contest results are usually determined in an hour or so and then announced around 3pm. The results are kept secret until then.
7) Winner of each contest gets to pick a prize from the prize table AFTER the Best Speaker picks one but before all the other attendees will pick one.
8) The judge then starts trying to think of a contest for next year!
--------------------------------------------------------------------------------------------
Here are the numbers I used as test inputs.
Number 1: 123,456,789
Result: UNHAPPY 13
Number 2: 987,654,321
Result: UNHAPPY 13
Number 3: 555,555,555
Result: UNHAPPY 12
Number 4: 20
Result: UNHAPPY 1
Number 5: 989
Result: HAPPY 6
Number 6: 13
Result: HAPPY 2
Number 7: 15999
Result: UNHAPPY 16 (Note: 16 is the highest number of cycles required for a 10 digit or less number to process. Thanks, Eric Smith for finding this!)
Number 8: 100
Result: HAPPY 1
Number 9: 8002
Result: HAPPY 3
Number 10: 1
Result: HAPPY 1
09-18-2017, 09:23 PM
Never having used a 41, I wanted to implement the problem using the 17bii solver. Here is the equation:
This is not a normal solver equation, it takes advantage of the fact you can exit a loop by inducing an error in the calculation (divide by 0 works well) after saving whatever values you want in variables that you can then RCL. So, to run this, enter your desired number to test and press NUM. Then press ANS (solve for ANS). After a few seconds it will beep and display SOLUTION NOT FOUND. Just RCL HAP (4=unhappy, 1=happy) and RCL CYC for the number of cycles.
Code:
HAPPY:HAP+CYC+
ANS=SIGMA(I:1:100:1:
L(N:SIGMA(J:0:LOG(NUM):1:
SQ(MOD(IDIV(NUM:10^J):10))))
+L(NUM:G(N))+
IF(NUM=1 OR NUM=4:L(HAP:NUM)+L(CYC:I)/0:0))
This is not a normal solver equation, it takes advantage of the fact you can exit a loop by inducing an error in the calculation (divide by 0 works well) after saving whatever values you want in variables that you can then RCL. So, to run this, enter your desired number to test and press NUM. Then press ANS (solve for ANS). After a few seconds it will beep and display SOLUTION NOT FOUND. Just RCL HAP (4=unhappy, 1=happy) and RCL CYC for the number of cycles.
09-18-2017, 10:26 PM
OK then, here's my (irrelevant) RPL version using DavidM's ListExt library:
Code:
\<< 0 SWAP DO I\->NL SQ LSUM SWAP 1 + SWAP
UNTIL { 1 4 } OVER POS
END "HAPPY"
IF SWAP 4 SAME
THEN "UN" SWAP +
END \->TAG
\>>
09-18-2017, 10:36 PM
(09-18-2017 11:02 AM)Didier Lachieze Wrote: [ -> ]Code:
Step Bytes Instruction
1 9 >LBL"HAPPY"
2 2 CLA
Why should "CLA" require 2 bytes?
Dieter
09-19-2017, 04:01 AM
Good catch, of course CLA requires only 1 byte instead of 2 and on step 4 FIX 0 requires 2 bytes and not 1. It seems I swapped the byte count for these two instructions, but the total count is right.
I can't find any further optimization of Werner's last code. The GTO IND is brilliant !
I can't find any further optimization of Werner's last code. The GTO IND is brilliant !
09-19-2017, 05:57 AM
Well, I missed all big improvements (ATOX, the 1/4 combined test), all I did was find two tricks ;-)
Now, what should 1 HAPPY return? "HAPPY 1" or "HAPPY 0"? I vote for the latter.
It's logical that 1 HAPPY is "HAPPY 0" and 10 HAPPY is "HAPPY 1".
Cheers, Werner
Now, what should 1 HAPPY return? "HAPPY 1" or "HAPPY 0"? I vote for the latter.
It's logical that 1 HAPPY is "HAPPY 0" and 10 HAPPY is "HAPPY 1".
Cheers, Werner
09-19-2017, 09:53 AM
Here is my version. It uses synthetic programming. It restores the flags and settings to its previous state and uses register 'a' as counter for the (un-)happy steps.
71 Bytes, no regs.
Regards Bernd
71 Bytes, no regs.
Regards Bernd
Code:
BYTES Command
9 LBL "HAPPY"
1 LBL 11
1 ENTER^
2 ST- Y ( prepare Y as summation register)
1 LBL 12
2 RCL X
2 10
2 ST/ Z
1 MOD
1 X^2
2 ST+ Z ( calculate sqr sum in Z)
1 RDN
1 INT
1 X#0?
2 GTO 12
2 ISG a
1 "" ( byte 0xF0 )
1 RDN
1 4
1 X=Y?
2 GTO 13
1 SIGN
1 X<>Y
1 X#Y?
2 GTO 11
1 CLX
1 LBL 13
1 CLA
1 X#0?
3 "UN"
8 +"HAPPY "
2 RCL d
2 FIX 0
2 CF 29
2 ARCL a
2 STO d
1 AVIEW
3 END
--
71 bytes total
09-19-2017, 12:14 PM
(09-19-2017 05:57 AM)Werner Wrote: [ -> ]Well, I missed all big improvements (ATOX, the 1/4 combined test), all I did was find two tricks ;-)
Now, what should 1 HAPPY return? "HAPPY 1" or "HAPPY 0"? I vote for the latter.
It's logical that 1 HAPPY is "HAPPY 0" and 10 HAPPY is "HAPPY 1".
Cheers, Werner
Hello all! The powers of the on-site judge are nearly all-inclusive.
Per the rules I wrote :-) which say this:
"Start with a number and replace it with the sum of the squares of each of its digits. Compare the computed sum of these squares to the rules below. Repeat the process with the previous result as the next input."
1 should return HAPPY 1.
Start with a number - in this case 1 is entered.
Then replace it with the sum of the squares of each of its digits. Ok, still 1.
THEN compare the computed sum to the rules below.
At this point, one cycle has occurred so when 1 is evaluated, the cycle count should be 1. Same score as 10 or 100 etc. of course.
:-)
09-19-2017, 01:05 PM
I bow to the judge..
[Edited] Still 66 bytes
[Edited] Still 66 bytes
Code:
>LBL"HAPPY"
CLA
CF 29
FIX 0
0
X<>Y
ENTER
>LBL 02
ARCL Y
MOD
ISG Y
>LBL 03
ATOX
X=0?
GTO 00
48
-
X^2
+
GTO 03
>LBL 00
CLX
4
X=Y?
"UN"
X!=Y?
SIGN
X!=Y?
GTO 02
+"HAPPY "
ARCL Z
SF 29
FIX 4
AVIEW
END
09-19-2017, 03:05 PM
(09-19-2017 01:05 PM)Werner Wrote: [ -> ]I bow to the judge..
Wow, that is slick and impressive. Everything that my program isn't. :-)
For the conference, my notes indicate that Gene said 10 entries for the RPN contest and only 5 for the RPL. I find that ratio interesting.
09-19-2017, 03:18 PM
(09-19-2017 01:05 PM)Werner Wrote: [ -> ]I bow to the judge..
[Edited] Still 66 bytes
Gene: :-) Don't bow to me! I try not to let those Judging powers go to my head. Honest! lol.
09-19-2017, 09:02 PM
Here is another 66 byte version that uses Werner's clever trick of 4/1 check. It works on a HP 41C, but uses synthetic commands.
Regards
Bernd
Regards
Bernd
Code:
LBL "HAPPY"
ENTER^
CLA
LBL 11
CLX
X<>Y
LBL 12
RCL X
10
ST/ Z
MOD
X^2
ST+ Z ( calculate sqr sum in Z)
RDN
INT
X#0?
GTO 12
ISG a
"" ( byte 0xF0 )
RDN
4
X=Y?
"UN"
X!=Y?
SIGN
X!=Y?
GTO 11
+"HAPPY "
RCL d
FIX 0
CF 29
ARCL a
STO d
AVIEW
END
09-19-2017, 09:05 PM
(09-19-2017 03:05 PM)DanM Wrote: [ -> ]For the conference, my notes indicate that Gene said 10 entries for the RPN contest and only 5 for the RPL. I find that ratio interesting.Those are high numbers for both contests if my memory serves. There are usually more entries for the RPN contest than the RPL one. IN 2016 there were only 4 RPL entries.