idk, I learned that just a few days ago - when we all golfed-down that sample script in the post where Jen's announced this tournament. My guess is the "IN" variable only gets evaluated once ? I suppose once the enum starts - its not valid to change it on the fly - maybe its a oversight on Ruuds part.
Shawn, very nice with that 185 code. That $m = $m * 20 + ascan($c,$) would have never crossed my mind. And i like the way you built out the mayan numbers - i knew there was room for improvement in the way i did it.
By the way, i was trying to get a half recursive solution going last night, but was too sick of staring at the code
I think there is still room for improvment in that mayan table - somehow getting rid of that 3rd $var - but I can't wrap my mind around it. Or shrinking that mayan string somehow and adding some math-magic - idk . Or something totally new and radical more like.
In terms of the recursive - I did try it "both ways" (to and from at same time) ... and it does work - but I found the overhead on the string side to be too big - but then, that was a few days ago ... one might revisit a double-recurse.
Registered: 2003-01-28
Posts: 4396
Loc: New Jersey
Because of the wicked thunderstorms in the northeast US, I was alternately without power or cable/internet for several hours and was unable to post my lowest score of 326. I've included those enhancements as comments in the code, marked by "LATE! -# strokes". Damn weather made us postpone my daughter's 12th birthday party today!
Somebody asked for commented code so they could learn about the logic, so, here's my commented 337-stroke version: Code:
; begin Mayan Number Converter ; ;! Function m($) ; - 57 stroke overhead
Dim $_,$C,$D
If VarType($)=8 ; is it a mayan string?
; Mayan to Decimal - 96 strokes $D=1 ; initial multiplier value
; work from LSD to MSD For $_=Len($) to 1 Step -1
; get Mayan char value based on string position ; InString will report 1, 2, 5, or 6 (delimiter) $C=InStr('.:xx| ',SubStr($,$_,1))
If $C=6 ; Delimiter? move to next multiplier power of 20 $D=$D*20 Else ; is a vaid digit value - multipliy by current multiplier value ; and add to running total $m=$m+$C*$D ; process value EndIf
Next ; next string character
Else ; or a Decimal Value?
; Decimal to Mayan - 184 strokes $D=64000000 ; highest divisor value for 7 digits
While $D>=1 ; loop while divisor is greater than 0 ;While $D ; LATE! -3 strokes ; divide by max value, result will be between 0 and 19 - a Mayan "Digit" $C=$/$D $=$ Mod $D
; If not zero, output the Mayan chars that make up this "digit" If $C $m=$m+$_+SubStr('.',1,$C Mod 5 Mod 2)+SubStr('::',1,$C Mod 5/2)+SubStr('|||',1,$C/5) $_=' ' ; inter-digit space after the first one Else ; if zero, output a zero only if other digits exist, eliminates leading "shells" If $m $m=$m+' -' EndIf EndIf
$D=$D/20 ; reduce the divisor by power of 20
Loop
; If no digits were generated, return only a null shell "digit" $m=IIf($m='','-',$m) ;$m=IIf($m,$m,'-') ; LATE! -3 strokes
EndIf ; LATE! -5 strokes if removed
EndFunction ;! ;! ; end Mayan Number Converter
_________________________ Actually I am a Rocket Scientist!
Just using the table generator and the -ubound trick dropped my original function by 21 strokes...
Code:
;225 Function m($) dim $y,$r,$c for $c = 1 to 15 $y = split("- . : .: :: | " + $r) $r = $r + $y[$c] + "| " next if $+0=$ do $r=$ mod 20 $m=" "+$y[$r]+$m $=$/20 until $=0 $m=trim($m) else $c=split($) $r=1 for $=-ubound($c) to 0 $m=$m+ascan($y,$c[-$])*$r $r=$r*20 ; next ; endif EndFunction
Shawn... I've been staring at your 182... how are you trimming the Mayan number?
gives a hint that there are more characters to come ... and since the " " is only added if there are more chars. There is never that "trailing space" that needs to be trimmed.
Registered: 2003-10-29
Posts: 1036
Loc: Lincoln, Ne
Rogier, I liked your code so I just had to play with it, doing away with $a = $ mod 20 saved you 1 stroke, you now have 216.
Code:
Function m($) Dim $a If $+0=$ Do $m = IIf($ mod 20,Left('.',$ mod 5 mod 2)+Left('::',$ mod 5/2)+Left('|||',$ mod 20/5),'-')+' '+$m $ = $ / 20 Until $ = 0 Else $a = InStr('-.:__|', Left($,1)) $m = m(IIf($a, $m+$a-1, $m*20)) $ = Right($,~) EndFunction
Code:
Mayan Number Converter passed all 60 tests (100% correct)
KiXtart KiXtart Version = 4.52 KiXGolf Script = kixgolf_mnc.kix
Computer OS = Windows XP Professional CPU = Intel(R) Pentium(R) D CPU 2.80GHz Speed = 2793 MHz Memory = 2048 MB
Registered: 2001-04-25
Posts: 11164
Loc: Boston, MA, USA
After running all submitted codes through my own tester, here's the current results: Code:
Jooel --------- 182 1. Shawn --------- 185 (confirmed) 2. Shawn --------- 213 (confirmed) 3. DrillSergeant - 217 (confirmed) Jooel --------- 219 4. Maciep -------- 225 (confirmed) 5. Richard H ----- 252 (confirmed) 6. Allen --------- 256 (confirmed) 7. Howard bullock 285 (confirmed) 8. Glenn Barnas -- 337 (confirmed) It_took_my_meds 343 (does not pass validation due to not DIMming variables inside the UDF) 9. Jochen -------- 352 (confirmed) 10. Benny69-------- 448 (confirmed) 11. Krabourn ------ 651 (confirmed)
Please note that Jooel has not submitted either of his two solutions, therefore the KiXgolf scores are unconfirmed and thus not reflected in the ranking. As of right now, Shawn would actually be the winner of the private phase.
_________________________
There are two types of vessels, submarines and targets.