mortar-pygments.rb 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/CHANGELOG.md +71 -0
- data/Gemfile +2 -0
- data/LICENSE +17 -0
- data/README.md +121 -0
- data/Rakefile +66 -0
- data/bench.rb +22 -0
- data/cache-lexers.rb +8 -0
- data/lexers +0 -0
- data/lib/pygments/lexer.rb +148 -0
- data/lib/pygments/mentos.py +351 -0
- data/lib/pygments/popen.rb +406 -0
- data/lib/pygments/version.rb +3 -0
- data/lib/pygments.rb +8 -0
- data/pygments.rb.gemspec +25 -0
- data/test/test_data.c +2581 -0
- data/test/test_data.py +514 -0
- data/test/test_data_generated +2582 -0
- data/test/test_pygments.rb +287 -0
- data/vendor/custom_lexers/github.py +565 -0
- data/vendor/pygments-main/AUTHORS +153 -0
- data/vendor/pygments-main/CHANGES +889 -0
- data/vendor/pygments-main/LICENSE +25 -0
- data/vendor/pygments-main/MANIFEST.in +6 -0
- data/vendor/pygments-main/Makefile +59 -0
- data/vendor/pygments-main/REVISION +1 -0
- data/vendor/pygments-main/TODO +15 -0
- data/vendor/pygments-main/docs/generate.py +472 -0
- data/vendor/pygments-main/docs/pygmentize.1 +94 -0
- data/vendor/pygments-main/docs/src/api.txt +270 -0
- data/vendor/pygments-main/docs/src/authors.txt +5 -0
- data/vendor/pygments-main/docs/src/changelog.txt +5 -0
- data/vendor/pygments-main/docs/src/cmdline.txt +147 -0
- data/vendor/pygments-main/docs/src/filterdevelopment.txt +70 -0
- data/vendor/pygments-main/docs/src/filters.txt +42 -0
- data/vendor/pygments-main/docs/src/formatterdevelopment.txt +169 -0
- data/vendor/pygments-main/docs/src/formatters.txt +48 -0
- data/vendor/pygments-main/docs/src/index.txt +69 -0
- data/vendor/pygments-main/docs/src/installation.txt +71 -0
- data/vendor/pygments-main/docs/src/integrate.txt +48 -0
- data/vendor/pygments-main/docs/src/java.txt +70 -0
- data/vendor/pygments-main/docs/src/lexerdevelopment.txt +603 -0
- data/vendor/pygments-main/docs/src/lexers.txt +67 -0
- data/vendor/pygments-main/docs/src/moinmoin.txt +39 -0
- data/vendor/pygments-main/docs/src/plugins.txt +93 -0
- data/vendor/pygments-main/docs/src/quickstart.txt +202 -0
- data/vendor/pygments-main/docs/src/rstdirective.txt +22 -0
- data/vendor/pygments-main/docs/src/styles.txt +143 -0
- data/vendor/pygments-main/docs/src/tokens.txt +349 -0
- data/vendor/pygments-main/docs/src/unicode.txt +49 -0
- data/vendor/pygments-main/external/autopygmentize +64 -0
- data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +144 -0
- data/vendor/pygments-main/external/markdown-processor.py +67 -0
- data/vendor/pygments-main/external/moin-parser.py +112 -0
- data/vendor/pygments-main/external/pygments.bashcomp +38 -0
- data/vendor/pygments-main/external/rst-directive-old.py +77 -0
- data/vendor/pygments-main/external/rst-directive.py +83 -0
- data/vendor/pygments-main/ez_setup.py +276 -0
- data/vendor/pygments-main/pygmentize +7 -0
- data/vendor/pygments-main/pygments/__init__.py +91 -0
- data/vendor/pygments-main/pygments/cmdline.py +441 -0
- data/vendor/pygments-main/pygments/console.py +74 -0
- data/vendor/pygments-main/pygments/filter.py +74 -0
- data/vendor/pygments-main/pygments/filters/__init__.py +356 -0
- data/vendor/pygments-main/pygments/formatter.py +95 -0
- data/vendor/pygments-main/pygments/formatters/__init__.py +68 -0
- data/vendor/pygments-main/pygments/formatters/_mapping.py +92 -0
- data/vendor/pygments-main/pygments/formatters/bbcode.py +109 -0
- data/vendor/pygments-main/pygments/formatters/html.py +821 -0
- data/vendor/pygments-main/pygments/formatters/img.py +553 -0
- data/vendor/pygments-main/pygments/formatters/latex.py +378 -0
- data/vendor/pygments-main/pygments/formatters/other.py +115 -0
- data/vendor/pygments-main/pygments/formatters/rtf.py +136 -0
- data/vendor/pygments-main/pygments/formatters/svg.py +154 -0
- data/vendor/pygments-main/pygments/formatters/terminal.py +112 -0
- data/vendor/pygments-main/pygments/formatters/terminal256.py +222 -0
- data/vendor/pygments-main/pygments/lexer.py +765 -0
- data/vendor/pygments-main/pygments/lexers/__init__.py +240 -0
- data/vendor/pygments-main/pygments/lexers/_asybuiltins.py +1645 -0
- data/vendor/pygments-main/pygments/lexers/_clbuiltins.py +232 -0
- data/vendor/pygments-main/pygments/lexers/_lassobuiltins.py +5172 -0
- data/vendor/pygments-main/pygments/lexers/_luabuiltins.py +249 -0
- data/vendor/pygments-main/pygments/lexers/_mapping.py +355 -0
- data/vendor/pygments-main/pygments/lexers/_openedgebuiltins.py +562 -0
- data/vendor/pygments-main/pygments/lexers/_phpbuiltins.py +3787 -0
- data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +233 -0
- data/vendor/pygments-main/pygments/lexers/_robotframeworklexer.py +557 -0
- data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +40 -0
- data/vendor/pygments-main/pygments/lexers/_sourcemodbuiltins.py +1072 -0
- data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +360 -0
- data/vendor/pygments-main/pygments/lexers/_vimbuiltins.py +13 -0
- data/vendor/pygments-main/pygments/lexers/agile.py +2290 -0
- data/vendor/pygments-main/pygments/lexers/asm.py +398 -0
- data/vendor/pygments-main/pygments/lexers/compiled.py +3723 -0
- data/vendor/pygments-main/pygments/lexers/dalvik.py +104 -0
- data/vendor/pygments-main/pygments/lexers/dotnet.py +671 -0
- data/vendor/pygments-main/pygments/lexers/foxpro.py +428 -0
- data/vendor/pygments-main/pygments/lexers/functional.py +2731 -0
- data/vendor/pygments-main/pygments/lexers/github.py +565 -0
- data/vendor/pygments-main/pygments/lexers/hdl.py +356 -0
- data/vendor/pygments-main/pygments/lexers/jvm.py +1112 -0
- data/vendor/pygments-main/pygments/lexers/math.py +1918 -0
- data/vendor/pygments-main/pygments/lexers/other.py +3778 -0
- data/vendor/pygments-main/pygments/lexers/parsers.py +778 -0
- data/vendor/pygments-main/pygments/lexers/shell.py +424 -0
- data/vendor/pygments-main/pygments/lexers/special.py +100 -0
- data/vendor/pygments-main/pygments/lexers/sql.py +609 -0
- data/vendor/pygments-main/pygments/lexers/templates.py +1742 -0
- data/vendor/pygments-main/pygments/lexers/text.py +1893 -0
- data/vendor/pygments-main/pygments/lexers/web.py +4045 -0
- data/vendor/pygments-main/pygments/modeline.py +40 -0
- data/vendor/pygments-main/pygments/plugin.py +74 -0
- data/vendor/pygments-main/pygments/scanner.py +104 -0
- data/vendor/pygments-main/pygments/style.py +117 -0
- data/vendor/pygments-main/pygments/styles/__init__.py +70 -0
- data/vendor/pygments-main/pygments/styles/autumn.py +65 -0
- data/vendor/pygments-main/pygments/styles/borland.py +51 -0
- data/vendor/pygments-main/pygments/styles/bw.py +49 -0
- data/vendor/pygments-main/pygments/styles/colorful.py +81 -0
- data/vendor/pygments-main/pygments/styles/default.py +73 -0
- data/vendor/pygments-main/pygments/styles/emacs.py +72 -0
- data/vendor/pygments-main/pygments/styles/friendly.py +72 -0
- data/vendor/pygments-main/pygments/styles/fruity.py +42 -0
- data/vendor/pygments-main/pygments/styles/manni.py +75 -0
- data/vendor/pygments-main/pygments/styles/monokai.py +106 -0
- data/vendor/pygments-main/pygments/styles/murphy.py +80 -0
- data/vendor/pygments-main/pygments/styles/native.py +65 -0
- data/vendor/pygments-main/pygments/styles/pastie.py +75 -0
- data/vendor/pygments-main/pygments/styles/perldoc.py +69 -0
- data/vendor/pygments-main/pygments/styles/rrt.py +33 -0
- data/vendor/pygments-main/pygments/styles/tango.py +141 -0
- data/vendor/pygments-main/pygments/styles/trac.py +63 -0
- data/vendor/pygments-main/pygments/styles/vim.py +63 -0
- data/vendor/pygments-main/pygments/styles/vs.py +38 -0
- data/vendor/pygments-main/pygments/token.py +195 -0
- data/vendor/pygments-main/pygments/unistring.py +140 -0
- data/vendor/pygments-main/pygments/util.py +277 -0
- data/vendor/pygments-main/scripts/check_sources.py +242 -0
- data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +32 -0
- data/vendor/pygments-main/scripts/epydoc.css +280 -0
- data/vendor/pygments-main/scripts/find_codetags.py +205 -0
- data/vendor/pygments-main/scripts/find_error.py +170 -0
- data/vendor/pygments-main/scripts/get_vimkw.py +43 -0
- data/vendor/pygments-main/scripts/pylintrc +301 -0
- data/vendor/pygments-main/scripts/reindent.py +291 -0
- data/vendor/pygments-main/scripts/vim2pygments.py +933 -0
- data/vendor/pygments-main/setup.cfg +7 -0
- data/vendor/pygments-main/setup.py +90 -0
- data/vendor/pygments-main/tests/dtds/HTML4-f.dtd +37 -0
- data/vendor/pygments-main/tests/dtds/HTML4-s.dtd +869 -0
- data/vendor/pygments-main/tests/dtds/HTML4.dcl +88 -0
- data/vendor/pygments-main/tests/dtds/HTML4.dtd +1092 -0
- data/vendor/pygments-main/tests/dtds/HTML4.soc +9 -0
- data/vendor/pygments-main/tests/dtds/HTMLlat1.ent +195 -0
- data/vendor/pygments-main/tests/dtds/HTMLspec.ent +77 -0
- data/vendor/pygments-main/tests/dtds/HTMLsym.ent +241 -0
- data/vendor/pygments-main/tests/examplefiles/ANTLRv3.g +608 -0
- data/vendor/pygments-main/tests/examplefiles/AcidStateAdvanced.hs +209 -0
- data/vendor/pygments-main/tests/examplefiles/AlternatingGroup.mu +102 -0
- data/vendor/pygments-main/tests/examplefiles/BOM.js +1 -0
- data/vendor/pygments-main/tests/examplefiles/CPDictionary.j +611 -0
- data/vendor/pygments-main/tests/examplefiles/Config.in.cache +1973 -0
- data/vendor/pygments-main/tests/examplefiles/Constants.mo +158 -0
- data/vendor/pygments-main/tests/examplefiles/DancingSudoku.lhs +411 -0
- data/vendor/pygments-main/tests/examplefiles/Deflate.fs +578 -0
- data/vendor/pygments-main/tests/examplefiles/Errors.scala +18 -0
- data/vendor/pygments-main/tests/examplefiles/File.hy +174 -0
- data/vendor/pygments-main/tests/examplefiles/Get-CommandDefinitionHtml.ps1 +66 -0
- data/vendor/pygments-main/tests/examplefiles/IPDispatchC.nc +104 -0
- data/vendor/pygments-main/tests/examplefiles/IPDispatchP.nc +671 -0
- data/vendor/pygments-main/tests/examplefiles/Intro.java +1660 -0
- data/vendor/pygments-main/tests/examplefiles/Makefile +1131 -0
- data/vendor/pygments-main/tests/examplefiles/Object.st +4394 -0
- data/vendor/pygments-main/tests/examplefiles/OrderedMap.hx +584 -0
- data/vendor/pygments-main/tests/examplefiles/RoleQ.pm6 +23 -0
- data/vendor/pygments-main/tests/examplefiles/SmallCheck.hs +378 -0
- data/vendor/pygments-main/tests/examplefiles/Sorting.mod +470 -0
- data/vendor/pygments-main/tests/examplefiles/Sudoku.lhs +382 -0
- data/vendor/pygments-main/tests/examplefiles/addressbook.proto +30 -0
- data/vendor/pygments-main/tests/examplefiles/antlr_throws +1 -0
- data/vendor/pygments-main/tests/examplefiles/apache2.conf +393 -0
- data/vendor/pygments-main/tests/examplefiles/as3_test.as +143 -0
- data/vendor/pygments-main/tests/examplefiles/as3_test2.as +46 -0
- data/vendor/pygments-main/tests/examplefiles/as3_test3.as +3 -0
- data/vendor/pygments-main/tests/examplefiles/aspx-cs_example +27 -0
- data/vendor/pygments-main/tests/examplefiles/autoit_submit.au3 +25 -0
- data/vendor/pygments-main/tests/examplefiles/badcase.java +2 -0
- data/vendor/pygments-main/tests/examplefiles/batchfile.bat +49 -0
- data/vendor/pygments-main/tests/examplefiles/bigtest.nsi +308 -0
- data/vendor/pygments-main/tests/examplefiles/boot-9.scm +1557 -0
- data/vendor/pygments-main/tests/examplefiles/ca65_example +284 -0
- data/vendor/pygments-main/tests/examplefiles/cbmbas_example +9 -0
- data/vendor/pygments-main/tests/examplefiles/cells.ps +515 -0
- data/vendor/pygments-main/tests/examplefiles/ceval.c +2604 -0
- data/vendor/pygments-main/tests/examplefiles/cheetah_example.html +13 -0
- data/vendor/pygments-main/tests/examplefiles/classes.dylan +125 -0
- data/vendor/pygments-main/tests/examplefiles/condensed_ruby.rb +10 -0
- data/vendor/pygments-main/tests/examplefiles/coq_RelationClasses +447 -0
- data/vendor/pygments-main/tests/examplefiles/database.pytb +20 -0
- data/vendor/pygments-main/tests/examplefiles/de.MoinMoin.po +2461 -0
- data/vendor/pygments-main/tests/examplefiles/demo.ahk +181 -0
- data/vendor/pygments-main/tests/examplefiles/demo.cfm +38 -0
- data/vendor/pygments-main/tests/examplefiles/django_sample.html+django +68 -0
- data/vendor/pygments-main/tests/examplefiles/dwarf.cw +17 -0
- data/vendor/pygments-main/tests/examplefiles/erl_session +10 -0
- data/vendor/pygments-main/tests/examplefiles/escape_semicolon.clj +1 -0
- data/vendor/pygments-main/tests/examplefiles/evil_regex.js +48 -0
- data/vendor/pygments-main/tests/examplefiles/example.Rd +78 -0
- data/vendor/pygments-main/tests/examplefiles/example.bug +54 -0
- data/vendor/pygments-main/tests/examplefiles/example.c +2080 -0
- data/vendor/pygments-main/tests/examplefiles/example.ceylon +52 -0
- data/vendor/pygments-main/tests/examplefiles/example.clay +33 -0
- data/vendor/pygments-main/tests/examplefiles/example.cls +15 -0
- data/vendor/pygments-main/tests/examplefiles/example.cob +3556 -0
- data/vendor/pygments-main/tests/examplefiles/example.cpp +2363 -0
- data/vendor/pygments-main/tests/examplefiles/example.gs +106 -0
- data/vendor/pygments-main/tests/examplefiles/example.gst +7 -0
- data/vendor/pygments-main/tests/examplefiles/example.hx +142 -0
- data/vendor/pygments-main/tests/examplefiles/example.jag +48 -0
- data/vendor/pygments-main/tests/examplefiles/example.kt +47 -0
- data/vendor/pygments-main/tests/examplefiles/example.lagda +19 -0
- data/vendor/pygments-main/tests/examplefiles/example.lua +250 -0
- data/vendor/pygments-main/tests/examplefiles/example.monkey +152 -0
- data/vendor/pygments-main/tests/examplefiles/example.moo +26 -0
- data/vendor/pygments-main/tests/examplefiles/example.moon +629 -0
- data/vendor/pygments-main/tests/examplefiles/example.msc +43 -0
- data/vendor/pygments-main/tests/examplefiles/example.nim +1010 -0
- data/vendor/pygments-main/tests/examplefiles/example.ns2 +69 -0
- data/vendor/pygments-main/tests/examplefiles/example.p +34 -0
- data/vendor/pygments-main/tests/examplefiles/example.pas +2708 -0
- data/vendor/pygments-main/tests/examplefiles/example.prg +161 -0
- data/vendor/pygments-main/tests/examplefiles/example.rb +1852 -0
- data/vendor/pygments-main/tests/examplefiles/example.reg +19 -0
- data/vendor/pygments-main/tests/examplefiles/example.rexx +50 -0
- data/vendor/pygments-main/tests/examplefiles/example.rhtml +561 -0
- data/vendor/pygments-main/tests/examplefiles/example.rkt +95 -0
- data/vendor/pygments-main/tests/examplefiles/example.rpf +4 -0
- data/vendor/pygments-main/tests/examplefiles/example.sh-session +19 -0
- data/vendor/pygments-main/tests/examplefiles/example.shell-session +45 -0
- data/vendor/pygments-main/tests/examplefiles/example.sml +156 -0
- data/vendor/pygments-main/tests/examplefiles/example.snobol +15 -0
- data/vendor/pygments-main/tests/examplefiles/example.stan +108 -0
- data/vendor/pygments-main/tests/examplefiles/example.tea +34 -0
- data/vendor/pygments-main/tests/examplefiles/example.ts +28 -0
- data/vendor/pygments-main/tests/examplefiles/example.u +548 -0
- data/vendor/pygments-main/tests/examplefiles/example.weechatlog +9 -0
- data/vendor/pygments-main/tests/examplefiles/example.xhtml +376 -0
- data/vendor/pygments-main/tests/examplefiles/example.xtend +34 -0
- data/vendor/pygments-main/tests/examplefiles/example.yaml +302 -0
- data/vendor/pygments-main/tests/examplefiles/example2.aspx +29 -0
- data/vendor/pygments-main/tests/examplefiles/example2.msc +79 -0
- data/vendor/pygments-main/tests/examplefiles/example_elixir.ex +363 -0
- data/vendor/pygments-main/tests/examplefiles/example_file.fy +128 -0
- data/vendor/pygments-main/tests/examplefiles/firefox.mak +586 -0
- data/vendor/pygments-main/tests/examplefiles/flipflop.sv +19 -0
- data/vendor/pygments-main/tests/examplefiles/foo.sce +6 -0
- data/vendor/pygments-main/tests/examplefiles/format.ml +1213 -0
- data/vendor/pygments-main/tests/examplefiles/fucked_up.rb +77 -0
- data/vendor/pygments-main/tests/examplefiles/function.mu +1 -0
- data/vendor/pygments-main/tests/examplefiles/functional.rst +1472 -0
- data/vendor/pygments-main/tests/examplefiles/garcia-wachs.kk +133 -0
- data/vendor/pygments-main/tests/examplefiles/genclass.clj +510 -0
- data/vendor/pygments-main/tests/examplefiles/genshi_example.xml+genshi +193 -0
- data/vendor/pygments-main/tests/examplefiles/genshitext_example.genshitext +33 -0
- data/vendor/pygments-main/tests/examplefiles/glsl.frag +7 -0
- data/vendor/pygments-main/tests/examplefiles/glsl.vert +13 -0
- data/vendor/pygments-main/tests/examplefiles/grammar-test.p6 +22 -0
- data/vendor/pygments-main/tests/examplefiles/hello.smali +40 -0
- data/vendor/pygments-main/tests/examplefiles/hello.sp +9 -0
- data/vendor/pygments-main/tests/examplefiles/html+php_faulty.php +1 -0
- data/vendor/pygments-main/tests/examplefiles/http_request_example +15 -0
- data/vendor/pygments-main/tests/examplefiles/http_response_example +29 -0
- data/vendor/pygments-main/tests/examplefiles/import.hs +4 -0
- data/vendor/pygments-main/tests/examplefiles/inet_pton6.dg +71 -0
- data/vendor/pygments-main/tests/examplefiles/intro.ik +24 -0
- data/vendor/pygments-main/tests/examplefiles/ints.php +10 -0
- data/vendor/pygments-main/tests/examplefiles/intsyn.fun +675 -0
- data/vendor/pygments-main/tests/examplefiles/intsyn.sig +286 -0
- data/vendor/pygments-main/tests/examplefiles/irb_heredoc +8 -0
- data/vendor/pygments-main/tests/examplefiles/irc.lsp +214 -0
- data/vendor/pygments-main/tests/examplefiles/java.properties +16 -0
- data/vendor/pygments-main/tests/examplefiles/jbst_example1.jbst +28 -0
- data/vendor/pygments-main/tests/examplefiles/jbst_example2.jbst +45 -0
- data/vendor/pygments-main/tests/examplefiles/jinjadesignerdoc.rst +713 -0
- data/vendor/pygments-main/tests/examplefiles/json.lasso +301 -0
- data/vendor/pygments-main/tests/examplefiles/json.lasso9 +213 -0
- data/vendor/pygments-main/tests/examplefiles/lighttpd_config.conf +13 -0
- data/vendor/pygments-main/tests/examplefiles/linecontinuation.py +47 -0
- data/vendor/pygments-main/tests/examplefiles/livescript-demo.ls +41 -0
- data/vendor/pygments-main/tests/examplefiles/logos_example.xm +28 -0
- data/vendor/pygments-main/tests/examplefiles/ltmain.sh +2849 -0
- data/vendor/pygments-main/tests/examplefiles/main.cmake +42 -0
- data/vendor/pygments-main/tests/examplefiles/markdown.lsp +679 -0
- data/vendor/pygments-main/tests/examplefiles/matlab_noreturn +3 -0
- data/vendor/pygments-main/tests/examplefiles/matlab_sample +30 -0
- data/vendor/pygments-main/tests/examplefiles/matlabsession_sample.txt +37 -0
- data/vendor/pygments-main/tests/examplefiles/metagrammar.treetop +455 -0
- data/vendor/pygments-main/tests/examplefiles/mg_sample.pro +73 -0
- data/vendor/pygments-main/tests/examplefiles/minehunt.qml +112 -0
- data/vendor/pygments-main/tests/examplefiles/minimal.ns2 +4 -0
- data/vendor/pygments-main/tests/examplefiles/moin_SyntaxReference.txt +340 -0
- data/vendor/pygments-main/tests/examplefiles/multiline_regexes.rb +38 -0
- data/vendor/pygments-main/tests/examplefiles/nanomsg.intr +95 -0
- data/vendor/pygments-main/tests/examplefiles/nasm_aoutso.asm +96 -0
- data/vendor/pygments-main/tests/examplefiles/nasm_objexe.asm +30 -0
- data/vendor/pygments-main/tests/examplefiles/nemerle_sample.n +87 -0
- data/vendor/pygments-main/tests/examplefiles/nginx_nginx.conf +118 -0
- data/vendor/pygments-main/tests/examplefiles/numbers.c +12 -0
- data/vendor/pygments-main/tests/examplefiles/objc_example.m +32 -0
- data/vendor/pygments-main/tests/examplefiles/objc_example2.m +24 -0
- data/vendor/pygments-main/tests/examplefiles/perl_misc +62 -0
- data/vendor/pygments-main/tests/examplefiles/perl_perl5db +998 -0
- data/vendor/pygments-main/tests/examplefiles/perl_regex-delims +120 -0
- data/vendor/pygments-main/tests/examplefiles/perlfunc.1 +856 -0
- data/vendor/pygments-main/tests/examplefiles/phpMyAdmin.spec +163 -0
- data/vendor/pygments-main/tests/examplefiles/phpcomplete.vim +567 -0
- data/vendor/pygments-main/tests/examplefiles/pleac.in.rb +1223 -0
- data/vendor/pygments-main/tests/examplefiles/postgresql_test.txt +47 -0
- data/vendor/pygments-main/tests/examplefiles/pppoe.applescript +10 -0
- data/vendor/pygments-main/tests/examplefiles/psql_session.txt +122 -0
- data/vendor/pygments-main/tests/examplefiles/py3_test.txt +2 -0
- data/vendor/pygments-main/tests/examplefiles/py3tb_test.py3tb +4 -0
- data/vendor/pygments-main/tests/examplefiles/pycon_test.pycon +14 -0
- data/vendor/pygments-main/tests/examplefiles/pytb_test2.pytb +2 -0
- data/vendor/pygments-main/tests/examplefiles/pytb_test3.pytb +4 -0
- data/vendor/pygments-main/tests/examplefiles/python25-bsd.mak +234 -0
- data/vendor/pygments-main/tests/examplefiles/qsort.prolog +13 -0
- data/vendor/pygments-main/tests/examplefiles/r-console-transcript.Rout +38 -0
- data/vendor/pygments-main/tests/examplefiles/ragel-cpp_rlscan +280 -0
- data/vendor/pygments-main/tests/examplefiles/ragel-cpp_snippet +2 -0
- data/vendor/pygments-main/tests/examplefiles/regex.js +22 -0
- data/vendor/pygments-main/tests/examplefiles/reversi.lsp +427 -0
- data/vendor/pygments-main/tests/examplefiles/robotframework.txt +39 -0
- data/vendor/pygments-main/tests/examplefiles/ruby_func_def.rb +11 -0
- data/vendor/pygments-main/tests/examplefiles/rust_example.rs +233 -0
- data/vendor/pygments-main/tests/examplefiles/scilab.sci +30 -0
- data/vendor/pygments-main/tests/examplefiles/session.dylan-console +9 -0
- data/vendor/pygments-main/tests/examplefiles/sibling.prolog +19 -0
- data/vendor/pygments-main/tests/examplefiles/simple.md +747 -0
- data/vendor/pygments-main/tests/examplefiles/smarty_example.html +209 -0
- data/vendor/pygments-main/tests/examplefiles/source.lgt +343 -0
- data/vendor/pygments-main/tests/examplefiles/sources.list +62 -0
- data/vendor/pygments-main/tests/examplefiles/sphere.pov +18 -0
- data/vendor/pygments-main/tests/examplefiles/sqlite3.sqlite3-console +27 -0
- data/vendor/pygments-main/tests/examplefiles/squid.conf +30 -0
- data/vendor/pygments-main/tests/examplefiles/string.jl +1031 -0
- data/vendor/pygments-main/tests/examplefiles/string_delimiters.d +21 -0
- data/vendor/pygments-main/tests/examplefiles/stripheredoc.sh +3 -0
- data/vendor/pygments-main/tests/examplefiles/swig_java.swg +1329 -0
- data/vendor/pygments-main/tests/examplefiles/swig_std_vector.i +225 -0
- data/vendor/pygments-main/tests/examplefiles/test.R +153 -0
- data/vendor/pygments-main/tests/examplefiles/test.adb +211 -0
- data/vendor/pygments-main/tests/examplefiles/test.agda +102 -0
- data/vendor/pygments-main/tests/examplefiles/test.asy +131 -0
- data/vendor/pygments-main/tests/examplefiles/test.awk +121 -0
- data/vendor/pygments-main/tests/examplefiles/test.bas +29 -0
- data/vendor/pygments-main/tests/examplefiles/test.bb +95 -0
- data/vendor/pygments-main/tests/examplefiles/test.bmx +145 -0
- data/vendor/pygments-main/tests/examplefiles/test.boo +39 -0
- data/vendor/pygments-main/tests/examplefiles/test.bro +250 -0
- data/vendor/pygments-main/tests/examplefiles/test.cs +374 -0
- data/vendor/pygments-main/tests/examplefiles/test.css +54 -0
- data/vendor/pygments-main/tests/examplefiles/test.cu +36 -0
- data/vendor/pygments-main/tests/examplefiles/test.d +135 -0
- data/vendor/pygments-main/tests/examplefiles/test.dart +23 -0
- data/vendor/pygments-main/tests/examplefiles/test.dtd +89 -0
- data/vendor/pygments-main/tests/examplefiles/test.ebnf +31 -0
- data/vendor/pygments-main/tests/examplefiles/test.ec +605 -0
- data/vendor/pygments-main/tests/examplefiles/test.ecl +58 -0
- data/vendor/pygments-main/tests/examplefiles/test.eh +315 -0
- data/vendor/pygments-main/tests/examplefiles/test.erl +169 -0
- data/vendor/pygments-main/tests/examplefiles/test.evoque +33 -0
- data/vendor/pygments-main/tests/examplefiles/test.fan +818 -0
- data/vendor/pygments-main/tests/examplefiles/test.flx +57 -0
- data/vendor/pygments-main/tests/examplefiles/test.gdc +13 -0
- data/vendor/pygments-main/tests/examplefiles/test.groovy +97 -0
- data/vendor/pygments-main/tests/examplefiles/test.html +339 -0
- data/vendor/pygments-main/tests/examplefiles/test.ini +10 -0
- data/vendor/pygments-main/tests/examplefiles/test.java +653 -0
- data/vendor/pygments-main/tests/examplefiles/test.jsp +24 -0
- data/vendor/pygments-main/tests/examplefiles/test.maql +45 -0
- data/vendor/pygments-main/tests/examplefiles/test.mod +374 -0
- data/vendor/pygments-main/tests/examplefiles/test.moo +51 -0
- data/vendor/pygments-main/tests/examplefiles/test.myt +166 -0
- data/vendor/pygments-main/tests/examplefiles/test.nim +93 -0
- data/vendor/pygments-main/tests/examplefiles/test.opa +10 -0
- data/vendor/pygments-main/tests/examplefiles/test.p6 +252 -0
- data/vendor/pygments-main/tests/examplefiles/test.pas +743 -0
- data/vendor/pygments-main/tests/examplefiles/test.php +505 -0
- data/vendor/pygments-main/tests/examplefiles/test.plot +333 -0
- data/vendor/pygments-main/tests/examplefiles/test.ps1 +108 -0
- data/vendor/pygments-main/tests/examplefiles/test.pypylog +1839 -0
- data/vendor/pygments-main/tests/examplefiles/test.r3 +94 -0
- data/vendor/pygments-main/tests/examplefiles/test.rb +177 -0
- data/vendor/pygments-main/tests/examplefiles/test.rhtml +43 -0
- data/vendor/pygments-main/tests/examplefiles/test.scaml +8 -0
- data/vendor/pygments-main/tests/examplefiles/test.ssp +12 -0
- data/vendor/pygments-main/tests/examplefiles/test.tcsh +830 -0
- data/vendor/pygments-main/tests/examplefiles/test.vb +407 -0
- data/vendor/pygments-main/tests/examplefiles/test.vhdl +161 -0
- data/vendor/pygments-main/tests/examplefiles/test.xqy +138 -0
- data/vendor/pygments-main/tests/examplefiles/test.xsl +23 -0
- data/vendor/pygments-main/tests/examplefiles/test2.pypylog +120 -0
- data/vendor/pygments-main/tests/examplefiles/truncated.pytb +15 -0
- data/vendor/pygments-main/tests/examplefiles/type.lisp +1218 -0
- data/vendor/pygments-main/tests/examplefiles/underscore.coffee +603 -0
- data/vendor/pygments-main/tests/examplefiles/unicode.applescript +5 -0
- data/vendor/pygments-main/tests/examplefiles/unicodedoc.py +11 -0
- data/vendor/pygments-main/tests/examplefiles/unix-io.lid +37 -0
- data/vendor/pygments-main/tests/examplefiles/webkit-transition.css +3 -0
- data/vendor/pygments-main/tests/examplefiles/while.pov +13 -0
- data/vendor/pygments-main/tests/examplefiles/wiki.factor +384 -0
- data/vendor/pygments-main/tests/examplefiles/xml_example +1897 -0
- data/vendor/pygments-main/tests/examplefiles/zmlrpc.f90 +798 -0
- data/vendor/pygments-main/tests/old_run.py +138 -0
- data/vendor/pygments-main/tests/run.py +49 -0
- data/vendor/pygments-main/tests/support/tags +36 -0
- data/vendor/pygments-main/tests/support.py +15 -0
- data/vendor/pygments-main/tests/test_basic_api.py +295 -0
- data/vendor/pygments-main/tests/test_clexer.py +31 -0
- data/vendor/pygments-main/tests/test_cmdline.py +105 -0
- data/vendor/pygments-main/tests/test_examplefiles.py +99 -0
- data/vendor/pygments-main/tests/test_html_formatter.py +178 -0
- data/vendor/pygments-main/tests/test_latex_formatter.py +55 -0
- data/vendor/pygments-main/tests/test_lexers_other.py +68 -0
- data/vendor/pygments-main/tests/test_perllexer.py +137 -0
- data/vendor/pygments-main/tests/test_regexlexer.py +47 -0
- data/vendor/pygments-main/tests/test_token.py +46 -0
- data/vendor/pygments-main/tests/test_using_api.py +40 -0
- data/vendor/pygments-main/tests/test_util.py +135 -0
- data/vendor/simplejson/.gitignore +10 -0
- data/vendor/simplejson/.travis.yml +5 -0
- data/vendor/simplejson/CHANGES.txt +291 -0
- data/vendor/simplejson/LICENSE.txt +19 -0
- data/vendor/simplejson/MANIFEST.in +5 -0
- data/vendor/simplejson/README.rst +19 -0
- data/vendor/simplejson/conf.py +179 -0
- data/vendor/simplejson/index.rst +628 -0
- data/vendor/simplejson/scripts/make_docs.py +18 -0
- data/vendor/simplejson/setup.py +104 -0
- data/vendor/simplejson/simplejson/__init__.py +510 -0
- data/vendor/simplejson/simplejson/_speedups.c +2745 -0
- data/vendor/simplejson/simplejson/decoder.py +425 -0
- data/vendor/simplejson/simplejson/encoder.py +567 -0
- data/vendor/simplejson/simplejson/ordered_dict.py +119 -0
- data/vendor/simplejson/simplejson/scanner.py +77 -0
- data/vendor/simplejson/simplejson/tests/__init__.py +67 -0
- data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +55 -0
- data/vendor/simplejson/simplejson/tests/test_check_circular.py +30 -0
- data/vendor/simplejson/simplejson/tests/test_decimal.py +66 -0
- data/vendor/simplejson/simplejson/tests/test_decode.py +83 -0
- data/vendor/simplejson/simplejson/tests/test_default.py +9 -0
- data/vendor/simplejson/simplejson/tests/test_dump.py +67 -0
- data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +46 -0
- data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +32 -0
- data/vendor/simplejson/simplejson/tests/test_errors.py +34 -0
- data/vendor/simplejson/simplejson/tests/test_fail.py +91 -0
- data/vendor/simplejson/simplejson/tests/test_float.py +19 -0
- data/vendor/simplejson/simplejson/tests/test_indent.py +86 -0
- data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +20 -0
- data/vendor/simplejson/simplejson/tests/test_namedtuple.py +121 -0
- data/vendor/simplejson/simplejson/tests/test_pass1.py +76 -0
- data/vendor/simplejson/simplejson/tests/test_pass2.py +14 -0
- data/vendor/simplejson/simplejson/tests/test_pass3.py +20 -0
- data/vendor/simplejson/simplejson/tests/test_recursion.py +67 -0
- data/vendor/simplejson/simplejson/tests/test_scanstring.py +117 -0
- data/vendor/simplejson/simplejson/tests/test_separators.py +42 -0
- data/vendor/simplejson/simplejson/tests/test_speedups.py +20 -0
- data/vendor/simplejson/simplejson/tests/test_tuple.py +49 -0
- data/vendor/simplejson/simplejson/tests/test_unicode.py +109 -0
- data/vendor/simplejson/simplejson/tool.py +39 -0
- metadata +566 -0
@@ -0,0 +1,158 @@
|
|
1
|
+
within Modelica;
|
2
|
+
package Constants
|
3
|
+
"Library of mathematical constants and constants of nature (e.g., pi, eps, R, sigma)"
|
4
|
+
|
5
|
+
import SI = Modelica.SIunits;
|
6
|
+
import NonSI = Modelica.SIunits.Conversions.NonSIunits;
|
7
|
+
|
8
|
+
extends Modelica.Icons.Library2;
|
9
|
+
|
10
|
+
// Mathematical constants
|
11
|
+
final constant Real e=Modelica.Math.exp(1.0);
|
12
|
+
final constant Real pi=2*Modelica.Math.asin(1.0); // 3.14159265358979;
|
13
|
+
final constant Real D2R=pi/180 "Degree to Radian";
|
14
|
+
final constant Real R2D=180/pi "Radian to Degree";
|
15
|
+
|
16
|
+
// Machine dependent constants
|
17
|
+
// (the definition is a temporary fix since not adapted to the
|
18
|
+
// machine where the Modelica translator is running)
|
19
|
+
final constant Real eps=1.e-15 "Biggest number such that 1.0 + eps = 1.0";
|
20
|
+
final constant Real small=1.e-60
|
21
|
+
"Smallest number such that small and -small are representable on the machine";
|
22
|
+
final constant Real inf=1.e+60
|
23
|
+
"Biggest Real number such that inf and -inf are representable on the machine";
|
24
|
+
final constant Integer Integer_inf=2147483647
|
25
|
+
"Biggest Integer number such that Integer_inf and -Integer_inf are representable on the machine";
|
26
|
+
|
27
|
+
// Constants of nature
|
28
|
+
// (name, value, description from http://physics.nist.gov/cuu/Constants/)
|
29
|
+
final constant SI.Velocity c=299792458 "Speed of light in vacuum";
|
30
|
+
final constant SI.Acceleration g_n=9.80665
|
31
|
+
"Standard acceleration of gravity on earth";
|
32
|
+
final constant Real G(final unit="m3/(kg.s2)") = 6.6742e-11
|
33
|
+
"Newtonian constant of gravitation";
|
34
|
+
final constant SI.FaradayConstant F = 9.64853399e4 "Faraday constant, C/mol";
|
35
|
+
final constant Real h(final unit="J.s") = 6.6260693e-34 "Planck constant";
|
36
|
+
final constant Real k(final unit="J/K") = 1.3806505e-23 "Boltzmann constant";
|
37
|
+
final constant Real R(final unit="J/(mol.K)") = 8.314472 "Molar gas constant";
|
38
|
+
final constant Real sigma(final unit="W/(m2.K4)") = 5.670400e-8
|
39
|
+
"Stefan-Boltzmann constant";
|
40
|
+
final constant Real N_A(final unit="1/mol") = 6.0221415e23
|
41
|
+
"Avogadro constant";
|
42
|
+
final constant Real mue_0(final unit="N/A2") = 4*pi*1.e-7 "Magnetic constant";
|
43
|
+
final constant Real epsilon_0(final unit="F/m") = 1/(mue_0*c*c)
|
44
|
+
"Electric constant";
|
45
|
+
final constant NonSI.Temperature_degC T_zero=-273.15
|
46
|
+
"Absolute zero temperature";
|
47
|
+
|
48
|
+
annotation (
|
49
|
+
Documentation(info="<html>
|
50
|
+
<p>
|
51
|
+
This package provides often needed constants from mathematics, machine
|
52
|
+
dependent constants and constants from nature. The latter constants
|
53
|
+
(name, value, description) are from the following source:
|
54
|
+
</p>
|
55
|
+
|
56
|
+
<dl>
|
57
|
+
<dt>Peter J. Mohr and Barry N. Taylor (1999):</dt>
|
58
|
+
<dd><b>CODATA Recommended Values of the Fundamental Physical Constants: 1998</b>.
|
59
|
+
Journal of Physical and Chemical Reference Data, Vol. 28, No. 6, 1999 and
|
60
|
+
Reviews of Modern Physics, Vol. 72, No. 2, 2000. See also <a href=
|
61
|
+
\"http://physics.nist.gov/cuu/Constants/\">http://physics.nist.gov/cuu/Constants/</a></dd>
|
62
|
+
</dl>
|
63
|
+
|
64
|
+
<p>CODATA is the Committee on Data for Science and Technology.</p>
|
65
|
+
|
66
|
+
<dl>
|
67
|
+
<dt><b>Main Author:</b></dt>
|
68
|
+
<dd><a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a><br>
|
69
|
+
Deutsches Zentrum für Luft und Raumfahrt e. V. (DLR)<br>
|
70
|
+
Oberpfaffenhofen<br>
|
71
|
+
Postfach 11 16<br>
|
72
|
+
D-82230 Weßling<br>
|
73
|
+
email: <a href=\"mailto:Martin.Otter@dlr.de\">Martin.Otter@dlr.de</a></dd>
|
74
|
+
</dl>
|
75
|
+
|
76
|
+
|
77
|
+
<p>
|
78
|
+
Copyright © 1998-2009, Modelica Association and DLR.
|
79
|
+
</p>
|
80
|
+
<p>
|
81
|
+
<i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
82
|
+
under the terms of the <b>Modelica license</b>, see the license conditions
|
83
|
+
and the accompanying <b>disclaimer</b>
|
84
|
+
<a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense\">here</a>.</i>
|
85
|
+
</p><br>
|
86
|
+
</html>
|
87
|
+
", revisions="<html>
|
88
|
+
<ul>
|
89
|
+
<li><i>Nov 8, 2004</i>
|
90
|
+
by <a href=\"http://www.robotic.dlr.de/Christian.Schweiger/\">Christian Schweiger</a>:<br>
|
91
|
+
Constants updated according to 2002 CODATA values.</li>
|
92
|
+
<li><i>Dec 9, 1999</i>
|
93
|
+
by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
94
|
+
Constants updated according to 1998 CODATA values. Using names, values
|
95
|
+
and description text from this source. Included magnetic and
|
96
|
+
electric constant.</li>
|
97
|
+
<li><i>Sep 18, 1999</i>
|
98
|
+
by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
99
|
+
Constants eps, inf, small introduced.</li>
|
100
|
+
<li><i>Nov 15, 1997</i>
|
101
|
+
by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
102
|
+
Realized.</li>
|
103
|
+
</ul>
|
104
|
+
</html>"),
|
105
|
+
Invisible=true,
|
106
|
+
Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,
|
107
|
+
100}}), graphics={
|
108
|
+
Line(
|
109
|
+
points={{-34,-38},{12,-38}},
|
110
|
+
color={0,0,0},
|
111
|
+
thickness=0.5),
|
112
|
+
Line(
|
113
|
+
points={{-20,-38},{-24,-48},{-28,-56},{-34,-64}},
|
114
|
+
color={0,0,0},
|
115
|
+
thickness=0.5),
|
116
|
+
Line(
|
117
|
+
points={{-2,-38},{2,-46},{8,-56},{14,-64}},
|
118
|
+
color={0,0,0},
|
119
|
+
thickness=0.5)}),
|
120
|
+
Diagram(graphics={
|
121
|
+
Rectangle(
|
122
|
+
extent={{200,162},{380,312}},
|
123
|
+
fillColor={235,235,235},
|
124
|
+
fillPattern=FillPattern.Solid,
|
125
|
+
lineColor={0,0,255}),
|
126
|
+
Polygon(
|
127
|
+
points={{200,312},{220,332},{400,332},{380,312},{200,312}},
|
128
|
+
fillColor={235,235,235},
|
129
|
+
fillPattern=FillPattern.Solid,
|
130
|
+
lineColor={0,0,255}),
|
131
|
+
Polygon(
|
132
|
+
points={{400,332},{400,182},{380,162},{380,312},{400,332}},
|
133
|
+
fillColor={235,235,235},
|
134
|
+
fillPattern=FillPattern.Solid,
|
135
|
+
lineColor={0,0,255}),
|
136
|
+
Text(
|
137
|
+
extent={{210,302},{370,272}},
|
138
|
+
lineColor={160,160,164},
|
139
|
+
fillColor={0,0,0},
|
140
|
+
fillPattern=FillPattern.Solid,
|
141
|
+
textString="Library"),
|
142
|
+
Line(
|
143
|
+
points={{266,224},{312,224}},
|
144
|
+
color={0,0,0},
|
145
|
+
thickness=1),
|
146
|
+
Line(
|
147
|
+
points={{280,224},{276,214},{272,206},{266,198}},
|
148
|
+
color={0,0,0},
|
149
|
+
thickness=1),
|
150
|
+
Line(
|
151
|
+
points={{298,224},{302,216},{308,206},{314,198}},
|
152
|
+
color={0,0,0},
|
153
|
+
thickness=1),
|
154
|
+
Text(
|
155
|
+
extent={{152,412},{458,334}},
|
156
|
+
lineColor={255,0,0},
|
157
|
+
textString="Modelica.Constants")}));
|
158
|
+
end Constants;
|
@@ -0,0 +1,411 @@
|
|
1
|
+
A Sukodku solver by Chris Kuklewicz (haskell (at) list (dot) mightyreason (dot) com)
|
2
|
+
The usual BSD license applies, copyright 2006.
|
3
|
+
Uploaded to HaskellWiki as DancingSudoku.lhs
|
4
|
+
|
5
|
+
I compile on a powerbook G4 (Mac OS X, ghc 6.4.2) using
|
6
|
+
ghc -optc-O3 -funbox-strict-fields -O2 --make -fglasgow-exts
|
7
|
+
|
8
|
+
This is a translation of Knuth's GDANCE from dance.w / dance.c
|
9
|
+
|
10
|
+
http://www-cs-faculty.stanford.edu/~uno/preprints.html
|
11
|
+
http://www-cs-faculty.stanford.edu/~uno/programs.html
|
12
|
+
http://en.wikipedia.org/wiki/Dancing_Links
|
13
|
+
|
14
|
+
I have an older verison that uses lazy ST to return the solutions on
|
15
|
+
demand, which was more useful when trying to generate new puzzles to
|
16
|
+
solve.
|
17
|
+
|
18
|
+
> module Main where
|
19
|
+
|
20
|
+
> import Prelude hiding (read)
|
21
|
+
> import Control.Monad
|
22
|
+
> import Control.Monad.Fix
|
23
|
+
> import Data.Array.IArray
|
24
|
+
> import Control.Monad.ST.Strict
|
25
|
+
> import Data.STRef.Strict
|
26
|
+
> import Data.Char(intToDigit,digitToInt)
|
27
|
+
> import Data.List(unfoldr,intersperse,inits)
|
28
|
+
|
29
|
+
> new = newSTRef
|
30
|
+
> {-# INLINE new #-}
|
31
|
+
> read = readSTRef
|
32
|
+
> {-# INLINE read #-}
|
33
|
+
> write = writeSTRef
|
34
|
+
> {-# INLINE write #-}
|
35
|
+
> modify = modifySTRef
|
36
|
+
> {-# INLINE modify #-}
|
37
|
+
|
38
|
+
Data types to prevent mixing different index and value types
|
39
|
+
|
40
|
+
> type A = Int
|
41
|
+
> newtype R = R A deriving (Show,Read,Eq,Ord,Ix,Enum)
|
42
|
+
> newtype C = C A deriving (Show,Read,Eq,Ord,Ix,Enum)
|
43
|
+
> newtype V = V A deriving (Show,Read,Eq,Ord,Ix,Enum)
|
44
|
+
> newtype B = B A deriving (Show,Read,Eq,Ord,Ix,Enum)
|
45
|
+
|
46
|
+
Sudoku also has block constraints, so we want to look up a block
|
47
|
+
index in an array:
|
48
|
+
|
49
|
+
> lookupBlock :: Array (R,C) B
|
50
|
+
> lookupBlock = listArray bb [ toBlock ij | ij <- range bb ]
|
51
|
+
> where ra :: Array Int B
|
52
|
+
> ra = listArray (0,pred (rangeSize b)) [B (fst b) .. B (snd b)]
|
53
|
+
> toBlock (R i,C j) = ra ! ( (div (index b j) 3)+3*(div (index b i) 3) )
|
54
|
+
|
55
|
+
The values for an unknown location is 'u'.
|
56
|
+
The bound and range are given by b and rng. And bb is a 2D bound.
|
57
|
+
|
58
|
+
> u = V 0 -- unknown value
|
59
|
+
> b :: (Int,Int)
|
60
|
+
> b = (1,9) -- min and max bounds
|
61
|
+
> rng = enumFromTo (fst b) (snd b) -- list from '1' to '9'
|
62
|
+
> bb = ((R (fst b),C (fst b)),(R (snd b),C (snd b)))
|
63
|
+
|
64
|
+
A Spec can be turned into a parsed array with ease:
|
65
|
+
|
66
|
+
> type Hint = ((R,C),V)
|
67
|
+
> newtype Spec = Spec [Hint] deriving (Eq,Show)
|
68
|
+
|
69
|
+
> type PA = Array (R,C) V
|
70
|
+
|
71
|
+
> parse :: Spec -> PA
|
72
|
+
> parse (Spec parsed) = let acc old new = new
|
73
|
+
> in accumArray acc u bb parsed
|
74
|
+
|
75
|
+
The dancing links algorithm depends on a sparse 2D node structure.
|
76
|
+
Each column represents a constraint. Each row represents a Hint.
|
77
|
+
The number of possible hints is 9x9x9 = 271
|
78
|
+
|
79
|
+
> type (MutInt st) = (STRef st) Int
|
80
|
+
|
81
|
+
The pointer types:
|
82
|
+
|
83
|
+
> type (NodePtr st) = (STRef st) (Node st)
|
84
|
+
> type (HeadPtr st) = (STRef st) (Head st)
|
85
|
+
|
86
|
+
The structures is a 2D grid of nodes, with Col's on the top of
|
87
|
+
columns and a sparse collection of nodes. Note that topNode of Head
|
88
|
+
is not a strict field. This is because the topNode needs to refer to
|
89
|
+
the Head, and they are both created monadically.
|
90
|
+
|
91
|
+
> type HeadName = (Int,Int,Int) -- see below for meaning
|
92
|
+
|
93
|
+
> data Head st = Head {headName:: !HeadName
|
94
|
+
> ,topNode:: (Node st) -- header node for this column
|
95
|
+
> ,len:: !(MutInt st) -- number of nodes below this head
|
96
|
+
> ,next,prev:: !(HeadPtr st) -- doubly-linked list
|
97
|
+
> }
|
98
|
+
|
99
|
+
> data Node st = Node {getHint:: !Hint
|
100
|
+
> ,getHead:: !(Head st) -- head for the column this node is in
|
101
|
+
> ,up,down,left,right :: !(NodePtr st) -- two doubly-linked lists
|
102
|
+
> }
|
103
|
+
|
104
|
+
> instance Eq (Head st) where
|
105
|
+
> a == b = headName a == headName b
|
106
|
+
|
107
|
+
> instance Eq (Node st) where
|
108
|
+
> a == b = up a == up b
|
109
|
+
|
110
|
+
To initialize the structures is a bit tedious. Knuth's code reads in
|
111
|
+
the problem description from a data file and builds the structure
|
112
|
+
based on that. Rather than short strings, I will use HeadName as the
|
113
|
+
identifier.
|
114
|
+
|
115
|
+
The columns are (0,4,5) for nodes that put some value in Row 4 Col 5
|
116
|
+
(1,2,3) for nodes that put Val 3 in Row 2 and some column
|
117
|
+
(2,7,4) for nodes that put Val 4 in Col 7 and some row
|
118
|
+
(3,1,8) for nodes that put Val 8 in some (row,column) in Block 1
|
119
|
+
|
120
|
+
The first head is (0,0,0) which is the root. The non-root head data
|
121
|
+
will be put in an array with the HeadName as an index.
|
122
|
+
|
123
|
+
> headNames :: [HeadName]
|
124
|
+
> headNames = let names = [0,1,2,3]
|
125
|
+
> in (0,0,0):[ (l,i,j) | l<-names,i<-rng,j<-rng]
|
126
|
+
|
127
|
+
A "row" of left-right linked nodes is a move. It is defined by a
|
128
|
+
list of head names.
|
129
|
+
|
130
|
+
> type Move = [(Hint,HeadName)]
|
131
|
+
|
132
|
+
Initial hints are enforced by making them the only legal move for
|
133
|
+
that location. Blank entries with value 'u = V 0' have a move for
|
134
|
+
all possible values [V 1..V 9].
|
135
|
+
|
136
|
+
> parseSpec :: Spec -> [Move]
|
137
|
+
> parseSpec spec =
|
138
|
+
> let rowsFrom :: Hint -> [Move]
|
139
|
+
> rowsFrom (rc@(R r,C c),mv@(V v')) =
|
140
|
+
> if mv == u then [ rsyms v | v <- rng ]
|
141
|
+
> else [ rsyms v' ]
|
142
|
+
> where (B b) = lookupBlock ! rc
|
143
|
+
> rsyms :: A -> Move
|
144
|
+
> rsyms v = map ( (,) (rc,V v) ) [(0,r,c),(1,r,v),(2,c,v),(3,b,v)]
|
145
|
+
> in concatMap rowsFrom (assocs (parse spec))
|
146
|
+
|
147
|
+
mkDList creates doubly linked lists using a monadic smart
|
148
|
+
constructor and the recursive "mdo" notation as documented at
|
149
|
+
http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#mdo-notation
|
150
|
+
http://www.cse.ogi.edu/PacSoft/projects/rmb/
|
151
|
+
|
152
|
+
For more fun with this, see the wiki page at
|
153
|
+
http://haskell.org/hawiki/TyingTheKnot
|
154
|
+
|
155
|
+
> mkDList :: (MonadFix m) => (b -> a -> b -> m b) -> [a] -> m b
|
156
|
+
> mkDList _ [] = error "must have at least one element"
|
157
|
+
> mkDList mkNode xs = mdo (first,last) <- go last xs first
|
158
|
+
> return first
|
159
|
+
> where go prev [] next = return (next,prev)
|
160
|
+
> go prev (x:xs) next = mdo this <- mkNode prev x rest
|
161
|
+
> (rest,last) <- go this xs next
|
162
|
+
> return (this,last)
|
163
|
+
|
164
|
+
toSimple takes a function and a header node and iterates (read . function)
|
165
|
+
until the header is reached again, but does not return the header
|
166
|
+
itself.
|
167
|
+
|
168
|
+
> toSingle step header = loop =<< (read . step) header
|
169
|
+
> where loop y = if header/=y then liftM (y:) (read (step y) >>= loop)
|
170
|
+
> else return []
|
171
|
+
>
|
172
|
+
|
173
|
+
forEach is an optimization of (toSimple step header >>= mapM_ act)
|
174
|
+
|
175
|
+
> forEach step header act = loop =<< (read . step) header
|
176
|
+
> where loop y = if header/=y then (act y >> (read (step y)) >>= loop)
|
177
|
+
> else return ()
|
178
|
+
|
179
|
+
Now make the root node and all the head nodes. This also exploits mdo:
|
180
|
+
|
181
|
+
> makeHeads :: [HeadName] -> (ST st) (Head st)
|
182
|
+
> makeHeads names = mkDList makeHead names
|
183
|
+
> where makeHead before name after = mdo
|
184
|
+
> ~newTopNode <- liftM4 (Node ((R 0,C 0),V 0) newHead) (new newTopNode) (new newTopNode)
|
185
|
+
> (new newTopNode) (new newTopNode)
|
186
|
+
> newHead <- liftM3 (Head name newTopNode)
|
187
|
+
> (new 0) (new after) (new before)
|
188
|
+
> return newHead
|
189
|
+
|
190
|
+
The Head nodes will be places in an array for easy lookup while building moves:
|
191
|
+
|
192
|
+
> type HArray st = Array HeadName (Head st)
|
193
|
+
> hBounds = ((0,1,1),(3,9,9))
|
194
|
+
> type Root st = (Head st,HArray st)
|
195
|
+
|
196
|
+
The addMove function creates the (four) nodes that represent a move and adds
|
197
|
+
them to the data structure. The HArray in Root makes for a fast
|
198
|
+
lookup of the Head data.
|
199
|
+
|
200
|
+
> addMove :: forall st. (Root st) -> Move -> (ST st) (Node st)
|
201
|
+
> addMove (_,ha) move = mkDList addNode move
|
202
|
+
> where addNode :: (Node st) -> (Hint,HeadName) -> (Node st) -> (ST st) (Node st)
|
203
|
+
> addNode before (hint,name) after = do
|
204
|
+
> let head = ha ! name
|
205
|
+
> let below = topNode head
|
206
|
+
> above <- read (up below)
|
207
|
+
> newNode <- liftM4 (Node hint head) (new above) (new below)
|
208
|
+
> (new before) (new after)
|
209
|
+
> write (down above) newNode
|
210
|
+
> write (up below) newNode
|
211
|
+
> modify (len head) succ
|
212
|
+
> l <- read (len head)
|
213
|
+
> seq l (return newNode)
|
214
|
+
|
215
|
+
Create the column headers, including the fast lookup array. These
|
216
|
+
will be resused between puzzles.
|
217
|
+
|
218
|
+
> initHA :: (ST st) (Root st)
|
219
|
+
> initHA = do
|
220
|
+
> root <- makeHeads headNames
|
221
|
+
> heads <- toSingle next root
|
222
|
+
> let ha = array hBounds (zip (map headName heads) heads)
|
223
|
+
> return (root,ha)
|
224
|
+
|
225
|
+
Take the Root from initHA and a puzzle Spec and fill in all the Nodes.
|
226
|
+
|
227
|
+
> initRoot :: (Root st) -> Spec -> (ST st) ()
|
228
|
+
> initRoot root spec = do
|
229
|
+
> let moves = parseSpec spec
|
230
|
+
> mapM_ (addMove root) moves
|
231
|
+
|
232
|
+
Return the column headers to their condition after initHA
|
233
|
+
|
234
|
+
> resetRoot :: (Root st) -> (ST st) ()
|
235
|
+
> resetRoot (root,ha) = do
|
236
|
+
> let heads@(first:_) = elems ha
|
237
|
+
> let resetHead head = do
|
238
|
+
> write (len head) 0
|
239
|
+
> let node = topNode head
|
240
|
+
> write (down node) node
|
241
|
+
> write (up node) node
|
242
|
+
> reset (last:[]) = do
|
243
|
+
> write (prev root) last
|
244
|
+
> write (next root) first
|
245
|
+
> reset (before:xs@(head:[])) = do
|
246
|
+
> resetHead head
|
247
|
+
> write (prev head) before
|
248
|
+
> write (next head) root
|
249
|
+
> reset xs
|
250
|
+
> reset (before:xs@(head:after:_)) = do
|
251
|
+
> resetHead head
|
252
|
+
> write (prev head) before
|
253
|
+
> write (next head) after
|
254
|
+
> reset xs
|
255
|
+
> reset (root:heads)
|
256
|
+
|
257
|
+
getBest iterates over the unmet constraints (i.e. the Head that are
|
258
|
+
reachable from root). It locates the one with the lowest number of
|
259
|
+
possible moves that will solve it, aborting early if it finds 0 or 1
|
260
|
+
moves.
|
261
|
+
|
262
|
+
> getBest :: (Head st) -> (ST st) (Maybe (Head st))
|
263
|
+
> getBest root = do
|
264
|
+
> first <- read (next root)
|
265
|
+
> if first == root then return Nothing
|
266
|
+
> else do
|
267
|
+
> let findMin m best head | head == root = return (Just best)
|
268
|
+
> | otherwise = do
|
269
|
+
> l <- read (len head)
|
270
|
+
> if l <= 1 then return (Just head)
|
271
|
+
> else if l < m then findMin l head =<< read (next head)
|
272
|
+
> else findMin l best =<< read (next head)
|
273
|
+
> findMin 10 first first
|
274
|
+
|
275
|
+
The unlink and relink operations are from where Knuth got the name
|
276
|
+
"dancing links". So long as "a" does not change in between, the
|
277
|
+
relink call will undo the unlink call. Similarly, the unconver will
|
278
|
+
undo the changes of cover and unconverOthers will undo coverOthers.
|
279
|
+
|
280
|
+
> unlink :: (a->STRef st a) -> (a->STRef st a) -> a -> (ST st) ()
|
281
|
+
> unlink prev next a = do
|
282
|
+
> before <- read (prev a)
|
283
|
+
> after <- read (next a)
|
284
|
+
> write (next before) after
|
285
|
+
> write (prev after) before
|
286
|
+
|
287
|
+
> relink :: (a->STRef st a) -> (a->STRef st a) -> a -> (ST st) ()
|
288
|
+
> relink prev next a = do
|
289
|
+
> before <- read (prev a)
|
290
|
+
> after <- read (next a)
|
291
|
+
> write (next before) a
|
292
|
+
> write (prev after) a
|
293
|
+
|
294
|
+
> cover :: (Head st) -> (ST st) ()
|
295
|
+
> cover head = do
|
296
|
+
> unlink prev next head
|
297
|
+
> let eachDown rr = forEach right rr eachRight
|
298
|
+
> eachRight nn = do
|
299
|
+
> unlink up down nn
|
300
|
+
> modify (len $ getHead nn) pred
|
301
|
+
> forEach down (topNode head) eachDown
|
302
|
+
|
303
|
+
> uncover :: (Head st) -> (ST st) ()
|
304
|
+
> uncover head = do
|
305
|
+
> let eachUp rr = forEach left rr eachLeft
|
306
|
+
> eachLeft nn = do
|
307
|
+
> modify (len $ getHead nn) succ
|
308
|
+
> relink up down nn
|
309
|
+
> forEach up (topNode head) eachUp
|
310
|
+
> relink prev next head
|
311
|
+
|
312
|
+
> coverOthers :: (Node st) -> (ST st) ()
|
313
|
+
> coverOthers node = forEach right node (cover . getHead)
|
314
|
+
|
315
|
+
> uncoverOthers :: (Node st) -> (ST st) ()
|
316
|
+
> uncoverOthers node = forEach left node (uncover . getHead)
|
317
|
+
|
318
|
+
A helper function for gdance:
|
319
|
+
|
320
|
+
> choicesToSpec :: [(Node st)] -> Spec
|
321
|
+
> choicesToSpec = Spec . (map getHint)
|
322
|
+
|
323
|
+
This is the heart of the algorithm. I have altered it to return only
|
324
|
+
the first solution, or produce an error if none is found.
|
325
|
+
|
326
|
+
Knuth used several goto links to do what is done below with tail
|
327
|
+
recursion.
|
328
|
+
|
329
|
+
> gdance :: (Head st) -> (ST st) Spec -- [Spec]
|
330
|
+
> gdance root =
|
331
|
+
> let
|
332
|
+
> forward choices = do
|
333
|
+
> maybeHead <- getBest root
|
334
|
+
> case maybeHead of
|
335
|
+
> Nothing -> if null choices
|
336
|
+
> then error "No choices in forward" -- return [] -- for [Spec]
|
337
|
+
> else do -- nextSols <- recover choices -- for [Spec]
|
338
|
+
> return $ (choicesToSpec choices) -- :nextSols -- for [Spec]
|
339
|
+
> Just head -> do cover head
|
340
|
+
> startRow <- readSTRef (down (topNode head))
|
341
|
+
> advance (startRow:choices)
|
342
|
+
>
|
343
|
+
> advance choices@(newRow:oldChoices) = do
|
344
|
+
> let endOfRows = topNode (getHead newRow)
|
345
|
+
> if (newRow == endOfRows)
|
346
|
+
> then do uncover (getHead newRow)
|
347
|
+
> if (null oldChoices)
|
348
|
+
> then error "No choices in advance" -- return [] -- for [Spec]
|
349
|
+
> else recover oldChoices
|
350
|
+
> else do coverOthers newRow
|
351
|
+
> forward choices
|
352
|
+
>
|
353
|
+
> recover (oldRow:oldChoices) = do
|
354
|
+
> uncoverOthers oldRow
|
355
|
+
> newRow <- readSTRef (down oldRow)
|
356
|
+
> advance (newRow:oldChoices)
|
357
|
+
>
|
358
|
+
> in forward []
|
359
|
+
|
360
|
+
|
361
|
+
Convert a text board into a Spec
|
362
|
+
|
363
|
+
> parseBoard :: String -> Spec
|
364
|
+
> parseBoard s = Spec (zip rcs vs'check)
|
365
|
+
> where rcs :: [(R,C)]
|
366
|
+
> rcs = [ (R r,C c) | r <- rng, c <- rng ]
|
367
|
+
> isUnset c = (c=='.') || (c==' ') || (c=='0')
|
368
|
+
> isHint c = ('1'<=c) && (c<='9')
|
369
|
+
> cs = take 81 $ filter (\c -> isUnset c || isHint c) s
|
370
|
+
> vs :: [V]
|
371
|
+
> vs = map (\c -> if isUnset c then u else (V $ digitToInt c)) cs
|
372
|
+
> vs'check = if 81==length vs then vs else error ("parse of board failed\n"++s)
|
373
|
+
|
374
|
+
This is quite useful as a utility function which partitions the list into groups of n elements.
|
375
|
+
Used by showSpec.
|
376
|
+
|
377
|
+
> groupTake :: Int->[a]->[[a]]
|
378
|
+
> groupTake n b = unfoldr foo b
|
379
|
+
> where foo [] = Nothing
|
380
|
+
> foo b = Just (splitAt n b)
|
381
|
+
|
382
|
+
Make a nice 2D ascii board from the Spec (not used at the moment)
|
383
|
+
|
384
|
+
> showSpec :: Spec -> String
|
385
|
+
> showSpec spec = let pa = parse spec
|
386
|
+
> g = groupTake 9 (map (\(V v) -> if v == 0 then '.' else intToDigit v) $ elems pa)
|
387
|
+
> addV line = concat $ intersperse "|" (groupTake 3 line)
|
388
|
+
> addH list = concat $ intersperse ["---+---+---"] (groupTake 3 list)
|
389
|
+
> in unlines $ addH (map addV g)
|
390
|
+
|
391
|
+
One line display
|
392
|
+
|
393
|
+
> showCompact spec = map (\(V v) -> intToDigit v) (elems (parse spec))
|
394
|
+
|
395
|
+
The main routine is designed to handle the input from http://www.csse.uwa.edu.au/~gordon/sudoku17
|
396
|
+
|
397
|
+
> main = do
|
398
|
+
> all <- getContents
|
399
|
+
> let puzzles = zip [1..] (map parseBoard (lines all))
|
400
|
+
> root <- stToIO initHA
|
401
|
+
> let act :: (Int,Spec) -> IO ()
|
402
|
+
> act (i,spec) = do
|
403
|
+
> answer <- stToIO (do initRoot root spec
|
404
|
+
> answer <- gdance (fst root)
|
405
|
+
> resetRoot root
|
406
|
+
> return answer)
|
407
|
+
> print (i,showCompact answer)
|
408
|
+
> mapM_ act puzzles
|
409
|
+
|
410
|
+
> inits' xn@(_:_) = zipWith take [0..] $ map (const xn) $ undefined:xn
|
411
|
+
> inits' _ = undefined
|