September 2017 Update

This commit is contained in:
Ingy döt Net 2017-09-23 10:01:46 +02:00
parent bba7bfd280
commit ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions

View file

@ -1,58 +1,60 @@
#import system.
#import system'routines.
#import extensions.
import system'routines.
import extensions.
#class(extension)op
extension op
{
#method printSolution : bits
= self zip:bits &into:
(:s:b) [ s iif:"T":"F" + (s xor:b) iif:"* ":" " ] summarize:(String new).
printSolution : bits
= self zip:bits by
(:s:b)( s iif("T","F") + (s xor:b) iif("* "," ") ); summarize(String new).
toBit
= self iif(1,0).
}
#symbol puzzle =
puzzle =
(
bits [ bits length == 12 ],
(:bits)( bits length == 12 ),
bits [ bits last:6 select &each:x [ x iif:1:0 ] summarize == 3 ],
(:bits)( bits last:6; selectBy(:x)( x toBit ); summarize == 3 ),
bits [ bits zip:(RangeEnumerator new &from:1 &to:12)
&into:(:x:i) [ (i int is &even)and:x iif:1:0 ] summarize == 2 ],
(:bits)( bits zip(RangeEnumerator new from:1 to:12)
by(:x:i)( (i int; isEven)and:x; toBit ); summarize == 2 ),
bits [ bits@4 iif:(bits@5 && bits@6):true ],
(:bits)( bits[4] iif(bits[5] && bits[6],true) ),
bits [ (bits@1 || bits@2 || bits@3) not ],
(:bits)( (bits[1] || bits[2] || bits[3]) not ),
bits [ bits zip:(RangeEnumerator new &from:1 &to:12)
&into:(:x:i) [ (i int is &odd)and:x iif:1:0 ] summarize == 4 ],
(:bits)( bits zip(RangeEnumerator new from:1 to:12)
by(:x:i)( (i int; isOdd)and:x; toBit ); summarize == 4 ),
bits [ (bits@1) xor:(bits@2) ],
(:bits)( bits[1] xor(bits[2]) ),
bits [ bits@6 iif:(bits@5 && bits@4):true ],
(:bits)( bits[6] iif(bits[5] && bits[4],true) ),
bits [ bits top:6 select &each:x [ x iif:1:0 ] summarize == 3 ],
(:bits)( bits top:6; selectBy(:x)( x toBit ); summarize == 3 ),
bits [ bits@10 && bits@11 ],
(:bits)( bits[10] && bits[11] ),
bits [ ((bits@6) iif:1:0 + (bits@7) iif:1:0 + (bits@8) iif:1:0)==1 ],
(:bits)( (bits[6] toBit + bits[7] toBit + bits[8] toBit)==1 ),
bits [ bits top:11 select &each:x [ x iif:1:0 ] summarize == 4 ]
(:bits)( bits top:11; selectBy(:x)( x toBit ); summarize == 4 )
).
#symbol program =
program =
[
console writeLine:"".
0 till:(2 power &int:12) &doEach:n
0 till(2 power int:12) do(:n)
[
#var bits := BitArray32 new:n top:12 toArray.
#var results := puzzle select &each: r [ r eval:bits ] toArray.
var bits := BitArray32 new:n; top:12; toArray.
var results := puzzle selectBy(:r)( r eval:bits ); toArray.
#var counts := bits zip:results &into:(:b:r) [ b xor:r iif:1:0 ] summarize.
var counts := bits zip:results by(:b:r)( b xor:r; toBit ); summarize.
counts =>
0 ? [ console writeLine:"Total hit :":(results printSolution:bits). ]
1 ? [ console writeLine:"Near miss :":(results printSolution:bits). ]
12 ? [ console writeLine:"Total miss:":(results printSolution:bits). ].
0 [ console printLine("Total hit :",results printSolution:bits) ];
1 [ console printLine("Near miss :",results printSolution:bits) ];
12 [ console printLine("Total miss:",results printSolution:bits) ].
].
console readChar.

View file

@ -0,0 +1,45 @@
// version 1.1.3
typealias Predicate = (String) -> Boolean
val predicates = listOf<Predicate>(
{ it.length == 13 }, // indexing starts at 0 but first bit ignored
{ (7..12).count { i -> it[i] == '1' } == 3 },
{ (2..12 step 2).count { i -> it[i] == '1' } == 2 },
{ it[5] == '0' || (it[6] == '1' && it[7] == '1') },
{ it[2] == '0' && it[3] == '0' && it[4] == '0' },
{ (1..11 step 2).count { i -> it[i] == '1' } == 4 },
{ (it[2] == '1') xor (it[3] == '1') },
{ it[7] == '0' || (it[5] == '1' && it[6] == '1') },
{ (1..6).count { i -> it[i] == '1' } == 3 },
{ it[11] == '1' && it[12] == '1' },
{ (7..9).count { i -> it[i] == '1' } == 1 },
{ (1..11).count { i -> it[i] == '1' } == 4 }
)
fun show(s: String, indent: Boolean) {
if (indent) print(" ")
for (i in s.indices) if (s[i] == '1') print("$i ")
println()
}
fun main(args: Array<String>) {
println("Exact hits:")
for (i in 0..4095) {
val s = i.toString(2).padStart(13, '0')
var j = 1
if (predicates.all { it(s) == (s[j++] == '1') }) show(s, true)
}
println("\nNear misses:")
for (i in 0..4095) {
val s = i.toString(2).padStart(13, '0')
var j = 1
if (predicates.count { it(s) == (s[j++] == '1') } == 11) {
var k = 1
val iof = predicates.indexOfFirst { it(s) != (s[k++] == '1') } + 1
print(" (Fails at statement ${"%2d".format(iof)}) ")
show(s, false)
}
}
}

View file

@ -0,0 +1,26 @@
var conditions = [
{ false },
{|a| a.len == 13 },
{|a| Math.sum(a[7..12]) == 3 },
{|a| Math.sum(a[2..12 `by` 2]) == 2 },
{|a| a[5] ? (a[6] && a[7]) : true },
{|a| !a[2] && !a[3] && !a[4] },
{|a| Math.sum(a[1..11 `by` 2]) == 4 },
{|a| a[2] == true^a[3] },
{|a| a[7] ? (a[5] && a[6]) : true },
{|a| Math.sum(a[1..6]) == 3 },
{|a| Math.sum(a[11,12]) == 2 },
{|a| Math.sum(a[7..9]) == 1 },
{|a| Math.sum(a[1..11]) == 4 },
]
func miss(args) {
1..12 -> grep {|i| conditions[i](args) != args[i] }
}
for k in (^(1<<12)) {
var t = ("0%012b" % k -> chars.map {|bit| bit == '1' ? true : false })
var no = miss(t)
no.len == 0 && say "Solution: true statements are #{1..12->grep{t[_]}.join(' ')}"
no.len == 1 && say "1 miss (#{no[0]}): true statements are #{1..12->grep{t[_]}.join(' ')}"
}

View file

@ -0,0 +1,30 @@
var statements; // list of 13 Bools, statements[0] is garbage to make 1 based
fcn s0 { False } // dummy for padding
fcn s1 { True }
fcn s2 { statements[-6,*].filter().len()==3 }
fcn s3 { [2..12,2].apply(statements.get).filter().len()==2 }
fcn s4 { if(statements[5]) statements[6]==statements[7]==True else True }
fcn s5 { statements[2,3].filter().len()==0 }
fcn s6 { [1..12,2].apply(statements.get).filter().len()==4 }
fcn s7 { statements[2]!=statements[3] }
fcn s8 { if(statements[7]) statements[5]==statements[6]==True else True }
fcn s9 { statements[1,6].filter().len()==3 }
fcn s10{ statements[11]==statements[12]==True }
fcn s11{ statements[7,3].filter().len()==1 }
fcn s12{ statements[1,11].filter().len()==4 }
filters:=T(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12);
foreach n in ((2).pow(12)){ // 4k
// 5-->"0000000000101"-->("0","0"..."1")-->(F,F,...T)
statements="%013.2B".fmt(n).split("").apply('==("1"));
r:=filters.run(True); // and return list of results
if(r==statements) print("<<<<<<<<<<<<<<<<Solution");
else{
diff:=r.zipWith('!=,statements);
if(diff.sum(0)==1) print("Diff @",diff.filter1n());
}
}
fcn print(msg){
(12).pump(List,'wrap(n){ statements[n] and n or Void.Skip })
.concat(",").println(" : ",vm.pasteArgs());
}