RosettaCodeData/Task/Twelve-statements/Phix/twelve-statements.phix
2026-04-30 12:34:36 -04:00

30 lines
1.3 KiB
Text

function s1(string s) return length(s)=12 end function
function s2(string s) return sum(sq_eq(s[7..12],'1'))=3 end function
function s3(string s) return sum(sq_eq(extract(s,tagset(12,2,2)),'1'))=2 end function
function s4(string s) return s[5]='0' or s[6..7]="11" end function
function s5(string s) return s[2..4]="000" end function
function s6(string s) return sum(sq_eq(extract(s,tagset(12,1,2)),'1'))=4 end function
function s7(string s) return s[2]!=s[3] end function
function s8(string s) return s[7]='0' or s[5..6]="11" end function
function s9(string s) return sum(sq_eq(s[1..6],'1'))=3 end function
function s10(string s) return s[11..12]="11" end function
function s11(string s) return sum(sq_eq(s[7..9],'1'))=1 end function
function s12(string s) return sum(sq_eq(s[1..11],'1'))=4 end function
sequence rtn = {s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12}
string misses = "\n"
for i=0 to power(2,12)-1 do
string s = sprintf("%012b",i)
sequence res = find_all('1',s)
integer t = 0, pass, fail
for b=1 to 12 do
pass = call_func(rtn[b],{s})=(s[b]='1')
if not pass then fail = b end if
t += pass
if b=12 and t=12 then printf(1,"Solution: %v\n",{res}) end if
end for
if t=11 then
misses &= sprintf("Near miss: %v, fail on %d\n",{res,fail})
end if
end for
puts(1,misses)