SequentialMachine
Jump to navigation
Jump to search
The sequential machine can transform input into more useful tokens. A useful form for this data is a vector of the number correct and character strings for the guesses. We can obtain this by some transformations after retaining digit and space characters. ;: can output only characters from the input, rank 1 at at most.
example=: 0 : 0 NB. http://projecteuler.net/problem=185 90342 ;2 correct 70794 ;0 correct 39458 ;2 correct 34109 ;1 correct 51545 ;2 correct 12531 ;1 correct ) [tokens=: (1 ; (2 2 2$1 1 0 0 1 0 0 3) ; <<'0123456789 ') ;: example 90342 2 70794 0 39458 2 34109 1 51545 2 12531 1 't correct'=: |: _2 [\". tokens correct 2 0 2 1 2 1 ]guess=: ": ,. t 90342 70794 39458 34109 51545 12531 NB. Ha ha---now you await the solution! MONAD=: : [: DYAD=: [: : tail=: {: MONAD ravel=: , MONAD box=: < MONAD shape_of=: $ MONAD copy=: # DYAD nub=: ~. MONAD ravel=: , MONAD tally=: # MONAD product=: (*/) MONAD unequal=: ~: DYAD open=: > MONAD set_of_atoms=: nub@:ravel itemize=: ,: MONAD all=: (*./) MONAD any=: (+./) MONAD equal=: = DYAD head=: {. MONAD link=: ; DYAD e185=: 4 : 0 correct=. x label_trick_APL_diamond. guess=. y L=. length_last_dimension guess if. correct any@:equal L do. NB. take first of several possible answers possible=. guess link/@:(head"2)@:(copy~ L&equal) correct else. possible=. L (copy box@:set_of_atoms) guess end. while. 1 (unequal product@:(tally@open)) possible do. NB. something end. possible ) NB. tests ok, and solves special case puzzles. 4 4 e185 'bcde',:'aaak' NB. bad input with plausible result +-+-+-+-+ |b|c|d|e| +-+-+-+-+ 4 e185 ,:'bcde' +-+-+-+-+ |b|c|d|e| +-+-+-+-+ 245 e185 ,:'bbbbbbb' +-+-+-+-+-+-+-+ |b|b|b|b|b|b|b| +-+-+-+-+-+-+-+