Page 5 of 11

Re: Rosetta Code

Posted: 02 Feb 2014, 18:29
by MasterFocus
"Twelve Statements" done. Will upload it to Rosetta Code later.

Code: Select all

; Note: the original puzzle provides 12 statements and starts with
; "Given the following twelve statements...", so the first statement
; should ignore the F[1] flag and always be true (see "( N == 1 )").

S := 12 ; number of statements
Output := ""
Loop, % 2**S {
    ;;If !Mod(A_Index,100) ;; optional 'if' to show the loop progress
    ;;    ToolTip, Index: %A_Index%
    SetFlags(A_Index-1), Current := "", Count := 0
    Loop, %S%
        R := TestStatement(A_Index), Current .= R, Count += (R == F[%A_Index%])
    If ( Count >= S-1 )
        Output .= "`n[" Count "] -> " Current
}
ToolTip
MsgBox, % SubStr(Output,2)
Return

;-------------------------------------------------------------------------------------

SetFlags(D) {
    Global
    Local I
    Loop, %S%
        I := S-A_Index+1 , F[%I%] := (D >> (S-A_Index)) & 1
}

;-------------------------------------------------------------------------------------

TestStatement(N) {
    Global
    Local I, C := 0
    If ( N == 1 ) ; This is a numbered list of twelve statements.
        Return ( S == 12 ) ; should always be true
    If ( N == 2 ) { ; Exactly 3 of the last 6 statements are true.
        Loop, 6
            I := S-A_Index+1 , C += F[%I%]
        Return ( C == 3 )
    }
    If ( N == 3 ) { ; Exactly 2 of the even-numbered statements are true.
        Loop, %S%
            C += ( !Mod(A_Index,2) & F[%A_Index%] )
        Return ( C == 2 )
    }
    If ( N == 4 ) ; If statement 5 is true, then statements 6 and 7 are both true.
        Return ( F[5] ? F[6] & F[7] : 1 )
    If ( N == 5 ) { ; The 3 preceding statements are all false.
        Loop, 3
            I := N-A_Index , C += F[%I%]
        Return ( C == 0 )
    }
    If ( N == 6 ) { ; Exactly 4 of the odd-numbered statements are true.
        Loop, %S%
            C += ( !!Mod(A_Index,2) & F[%A_Index%] )
        Return ( C == 4 )
    }
    If ( N == 7 ) ; Either statement 2 or 3 is true, but not both.
        Return ( F[2] ^ F[3] )
    If ( N == 8 ) ; If statement 7 is true, then 5 and 6 are both true.
        Return ( F[7] ? F[5] & F[6] : 1 )
    If ( N == 9 ) { ; Exactly 3 of the first 6 statements are true.
        Loop, 6
            C += F[%A_Index%]
        Return ( C == 3 )
    }
    If ( N == 10 ) ; The next two statements are both true.
        Return ( F[11] & F[12] )
    If ( N == 11 ) ; Exactly 1 of statements 7, 8 and 9 are true
        Return ( F[7]+F[8]+F[9] == 1 )
    If ( N == 12 ) { ; Exactly 4 of the preceding statements are true
        Loop, % N-1
            C += F[%A_Index%]
        Return ( C == 4 )
    }
}
I adapted the Python code, using bruteforce (4096 iterations) to set 12 flags and test all statements on each iteration.
If the proposed flags match the results after validating each statement, we have the solution.
I show all cases where we have at least S-1 matches (being S := 12 statements).

Bonus:
Also, the puzzle can be easily modified without much additional coding.
And it works for AHK 1.0 as well! haha :lol:

Re: Rosetta Code

Posted: 02 Feb 2014, 20:16
by kon
@MasterFocus You beat me to it :lol:
I based mine on the Java version.

Code: Select all

global S
S := {1: 1}
Recurse(2)
ExitApp

Check2() {
	return (S[2] = (S[7]+S[8]+S[9]+S[10]+S[11]+S[12] = 3))
}

Check3() {
	return (S[3] = (S[2]+S[4]+S[6]+S[8]+S[10]+S[12] = 2))
}

Check4() {
	if (S[5])
		return (S[4] = (S[6]+S[7] = 2))
	else
		return (S[4] = 1)
}

Check5() {
	return (S[5] = (S[2]+S[3]+S[4] = 0))
}

Check6() {
	return (S[6] = (S[1]+S[3]+S[5]+S[7]+S[9]+S[11] = 4))
}

Check7() {
	return (S[7] = (S[2]+S[3] = 1))
}

Check8() {
	if (S[7])
		return (S[8] = (S[5]+S[6] = 2))
	else
		return 
}

Check9() {
	return (S[9] = (S[1]+S[2]+S[3]+S[4]+S[5]+S[6] = 3))
}

Check10() {
	return (S[10] = (S[11]+S[12] = 2))
}

Check11() {
	return (S[11] = (S[7]+S[8]+S[9] = 1))
}

Check12(t=0) {
	Loop 11
		if (S[A_Index])
			t++
	return (S[12] = (t = 4))
}

Check() {
	if (Check2() && Check3() && Check4() && Check5() && Check6() Check7() && Check8() && Check9() && Check10() && Check11() && Check12()) {
		for k, v in S
			if (v)
				Out .= k " "
		MsgBox, % "True statements: " Out
	}
}

Recurse(k) {
	if (k = 13)
		Check()
	else {
		S[k] := 0
		Recurse(k+1)
		S[k] := 1
		Recurse(k+1)
	}
}

Re: Rosetta Code

Posted: 02 Feb 2014, 20:58
by MasterFocus
I was trying to fix Anonymous Recursion, but that's the best I could do:

Code: Select all

/*
Fib(x) {
    t := -1
    If ( x >= 0 )
        GoSub, Fib_Label
    Else
        MsgBox, Oops!
    Return t
    Fib_Label:
        i := 0, j := 1
        Loop, % x-1
            t := i+j, i := j, j := t
    Return
}

MsgBox, % "Calling Fib(5) ..."
MsgBox, % "Result: " Fib(5)
MsgBox, % "Calling Fib(-3) ..."
MsgBox, % "Result: " Fib(-3)
ListVars
MsgBox, % "ListVars shows the variables are not global."
;GoSub, Fib_Label ; <--- this yields an error
*/
This currently works, but doesn't fulfill the task, as the calculation itself should be done recursively.
I'm not used to AHK Objects, so maybe someone can figure this out.

On a related note (fixing stuff), can this task actually be completed by AutoHotkey, obeying all four items?

Re: Rosetta Code

Posted: 02 Feb 2014, 23:20
by fischgeek
Anyone look at 100 Doors yet?

Re: Rosetta Code

Posted: 03 Feb 2014, 00:07
by MasterFocus
That should be relatively easy.
I'm putting here 4 versions I came up with. I suppose it's pretty self-explanatory.
Spoiler
Once again, here's everything I'll upload later (hopefully until wednesday):
[list][*]Kaprekar Numbers
[*]Twelve Statements
[*]100 Doors (was actually already solved)[/list]

Re: Rosetta Code

Posted: 03 Feb 2014, 00:48
by joedf
Nice! :D

Re: Rosetta Code

Posted: 03 Feb 2014, 02:32
by smorgasbord
fischgeek wrote:Anyone look at 100 Doors yet?
any perfect sq. like 1,4,9,...100 has odd no. of factors.
rest have even no. of factors.

;)

Re: Rosetta Code

Posted: 03 Feb 2014, 22:34
by smorgasbord
@fischgeek

Code: Select all

m := 1, k := 1
loop, 100{
	gosub, label
	MsgBox  % !mod((sqrt(k)), 1 ) ? k " Open" . "`nFactors-" . list . "`nOdd number of factors" : k " Closed " . "`nFactors-" . list . "`nEven number of factors"
	list := "", 	m := 1, k := k + 1
}  
 exitapp
 esc::exitapp
  label:
 loop, % k/2{
  list .= !mod(k, m) ? m "," : ""
   m++
}
list := list . k
return
   
May Be.

Re: Rosetta Code

Posted: 03 Feb 2014, 23:50
by kon
Fibonacci word/fractal

100 doors is already solved. :?
Looks like @sinkfaze solved it and @tinku99 submitted it. Link

Re: Rosetta Code

Posted: 04 Feb 2014, 22:49
by kon
Added: Draw a cuboid
Does anyone know how to upload an image file like the other examples on that page have done?

I made this animated 3d version just for fun. The dimensions can be changed with hotkeys (Up/Down/Left/Right/PgUp/PgDn/Home/End).
I think this version is more interesting, but it doesn't fit the requirements of the Rosetta Code task.

Code: Select all

#SingleInstance, Force
#NoEnv
SetBatchLines, -1

C1 := 0xff0000aa, C2 := 0xff00aa00, C3 := 0xffaa0000

; Uncomment if Gdip.ahk is not in your standard library
;#Include, Gdip.ahk

If !pToken := Gdip_Startup()
{
   MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
   ExitApp
}
OnExit, Exit

Width := A_ScreenWidth, WC := Width//2 , Height := A_ScreenHeight, HC := Height//2
	, TopLeftX := (A_ScreenWidth - Width)//2, TopLeftY := (A_ScreenHeight - Height)//2

Gui, 1: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui, 1: Show, NA

hwnd1 := WinExist(), hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC()
	, obm := SelectObject(hdc, hbm), G := Gdip_GraphicsFromHDC(hdc), Gdip_SetSmoothingMode(G, 4)
	, speed := 1, s := 120, d := 20, h := 120, 2h := h + h

Loop {
	mcx := (mc := Cos(a := Mod(A_Index, 90)* 0.01745329252)) * s
		, mcy := mc * d
		, msx := (ms := Sin(a)) * s
		, msy := ms * d
	
	; Points
	x1 := WC - mcx,  y1 := HC - msy - h
		, x2  := WC + msx, y2 := HC - mcy - h
		, x3  := WC + mcx, y3 := HC + msy - h
		, x4  := WC - msx, y4 := HC + mcy - h
		, yb1 := y1 + 2h, yb2 := y2 + 2h
		, yb3 := y3 + 2h, yb4 := y4 + 2h
	
	; Fill Top
	P1 := x1 "," y1 "|" x2 "," y2 "|" x3 "," y3 "|" x4 "," y4
		, DrawFace(P1, C3, G)
	
	; Fill Vertical Faces
	P1 := x1 "," y1 "|" x4 "," y4 "|" x4 "," yb4 "|" x1 "," yb1
		, P2 := x4 "," y4 "|" x3 "," y3 "|" x3 "," yb3 "|" x4 "," yb4
		, P3 := x2 "," y2 "|" x2 "," yb2 "|" x3 "," yb3 "|" x3 "," y3
		, i :=Mod(A_Index, 360)
	if (i < 90 || (i < 270 && i >= 180))
		DrawFace(x1 < x4 ? P1 : P3, C1, G)
			, DrawFace(P2, C2, G)
	else {
		if (x1 < x4) 
			DrawFace(P1, C2, G)
				, DrawFace(P2, C1, G)
		else 
			DrawFace(P2, C1, G)
				, DrawFace(P3, C2, G)
	}

	UpdateLayeredWindow(hwnd1, hdc, TopLeftX, TopLeftY, Width, Height)
	if (!Mod(A_Index, speed))
		Sleep, 30
	Gdip_GraphicsClear(G)
}

DrawFace(Points, Color, G) {
	pBrush := Gdip_BrushCreateSolid(Color)
		, Gdip_FillPolygon(G, pBrush, Points, 1)
		, Gdip_DeleteBrush(pBrush)
	return
}

p::Pause

Right::
s++
Set_TT("s", s)
return

Left::
s--
Set_TT("s", s)
return

Up::
d++
Set_TT("d", d)
return

Down::
if (d > 0)
	d--
Set_TT("d", d)
return

PGUP::
h++
2h := h + h
Set_TT("h", h)
return

PGDN::
if (h > 0)
	h--
2h := h + h
Set_TT("h", h)
return

Home::
If (Speed < 3)
	Speed++
Set_TT("Speed", Speed)
return

End::
If (Speed > 1)
	Speed--
Set_TT("Speed", Speed)
return

Set_TT(s, v) {
	ToolTip, % s ": " v
	SetTimer, TT, -1500
	return
}

TT:
ToolTip
return

Esc::
Exit:
SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
	, Gdip_DeleteGraphics(G), Gdip_Shutdown(pToken)
ExitApp
Return
Image

Re: Rosetta Code

Posted: 05 Feb 2014, 00:22
by nnnik
As soon as I find Bentschis OpenGL library somewhere i will rewrite that one.

Re: Rosetta Code

Posted: 05 Feb 2014, 01:18
by kon
I'd be very interested to see that.

Re: Rosetta Code

Posted: 05 Feb 2014, 15:34
by AlphaBravo
kon wrote:Added: Draw a cuboid
off the charts, thanks kon

Re: Rosetta Code

Posted: 05 Feb 2014, 15:46
by kon
AlphaBravo wrote:off the charts, thanks kon
Thanks :D
If I wasn't clear in my post above, the version I posted to Rosetta code just shows a static image. The animated version I posted above (just for fun) doesn't fit the task requirements of a 2x3x4 cuboid. It will always have a square top for the sake of simplicity. I may be able to change it eventually to allow for 2x3x4 in dimensions, but I think that will involve some fairly extensive changes to how the points are calculated.

Re: Rosetta Code

Posted: 05 Feb 2014, 16:48
by nnnik
With OpenGL that would be the easy part.
But I don't have access to my PMs at autohotkey.com
Bentschi PMd me something like this.

Re: Rosetta Code

Posted: 06 Feb 2014, 10:00
by smorgasbord
9 billion names of God the integer
http://rosettacode.org/wiki/9_billion_n ... AutoHotKey
Other parts are easy, shall upload them later.
At least i solved one! :ugeek:

Re: Rosetta Code

Posted: 06 Feb 2014, 20:51
by kon

Re: Rosetta Code

Posted: 06 Feb 2014, 22:30
by joedf
nice!

Re: Rosetta Code

Posted: 07 Feb 2014, 22:28
by AlphaBravo

Re: Rosetta Code

Posted: 08 Feb 2014, 16:38
by kon