塔珀自指公式自定义图形批处理构造器

24game
渐入佳境
渐入佳境
帖子: 42
注册时间: 2016年09月02日 22:09
拥有现金: 锁定
Has thanked: 3 times
Been thanked: 15 times
联系:

塔珀自指公式自定义图形批处理构造器

帖子 #1 24game » 2016年10月08日 00:18

测试于 64bit Win7 Mathematica 10.0

你这虽然木有 BATCH 版块, 但是有 MATH, 也一样了
就在你这玩个首发啦

图片

Code: [全选] [展开/收缩] [Download] (Untitled.bat)
  1. ::..........................................................................................................
  2. ::..........................................................................................................
  3. ::..........................................................................................................
  4. ::..........................................................................................................
  5. ::..........................................................................................................
  6. ::..........................................................................................................
  7. ::............####  ####   ####   ####   ###  ##### #   #  ###  #   # #####   #   # ##### #####.............
  8. ::............#   # #   # #       #   # #   #   #   #   # #   # ## ## #       ##  # #       #  .............
  9. ::............####  ####   ###    ####  #####   #   ##### #   # # # # #####   # # # #####   #  .............
  10. ::............#   # #   #     #   #   # #   #   #   #   # #   # #   # #       #  ## #       #  .............
  11. ::............####  ####  ####  # ####  #   #   #   #   #  ###  #   # ##### # #   # #####   #  .............
  12. ::..........................................................................................................
  13. ::..........................................................................................................
  14. ::..........................................................................................................
  15. ::..........................................................................................................
  16. ::..........................................................................................................
  17. ::..........................................................................................................
  18. ::                        上面区域除了左边的两个冒号外, 右边部分保持 106 宽 X 17 高
  19. ::                    不要增加多余的任何空行, 不要删除行, 不要用 # . 空格 之外的字符作图
  20. ::                                  # 是绘图像素, . 号和 空格 都是空白像素
  21. ::
  22. ::                                             BBS.BATHOME.NET
  23. :: aa77dd@163.com 20161008_001459
  24. ::
  25. :: 图像显示调整参数参考
  26. :: http://math.stackexchange.com/questions ... athematica
  27. :: 公式表达:  1/2 < floor(mod(floor(y/17)*2^(-17*floor(x)-mod(floor(y), 17)),2))
  28. :: Tupper's self-referential formula @ wikipedia
  29. :: https://en.wikipedia.org/wiki/Tupper%27 ... al_formula
  30. ::
  31. :: 公式自身图形常数值
  32. :: k=960939379918958884971672962127852754715004339660129306651505519271\
  33. :: 7028023952664246896428421743507181212671537827706233559932372808741443\
  34. :: 0789132596394133772348785773574982392662971551717371699516523289053822\
  35. :: 1612403238855866184013235585136048828693337902491454229288667081096184\
  36. :: 4960917051834540678277315517054053816273809676025656250169814820834187\
  37. :: 8316384911559022561000365235137034387446184837873723819822484986346503\
  38. :: 3159410054974700593138339226497249461751545728366702369745461014655997\
  39. :: 933798537483143786841806593422227898388722980000748404719;
  40.  
  41. @echo off & setlocal enabledelayedexpansion
  42. chcp 936
  43. mode 110
  44. for /f usebackq^ delims^= %%a in ("%~f0") do (
  45.     set /a cnt+=1
  46.     if !cnt! leq 17 (
  47.         for %%i in (!cnt!) do (
  48.             set "L%%i=%%a"
  49.             set "L%%i=!L%%i:~2!"
  50.             set "L%%i=!L%%i:#=1!"
  51.             set "L%%i=!L%%i:.= !"
  52.             echo;[!L%%i!]
  53.         )
  54.     )
  55. )
  56.  
  57. REM 左下角最最高位, 右上角是最低位
  58. set "BIN="
  59. for /L %%c in (0 1 105) do (
  60.     for /L %%r in (17 -1 1) do (
  61.         set "BIN=!BIN!!L%%r:~%%c,1!"
  62.         if "!BIN!"==" " set "BIN="
  63.     )
  64. )
  65.  
  66. set "oFile=BBS.BATHOME.NET.Tupper_s_self-referential_formula.nb"
  67.  
  68. >"!oFile!"  (
  69.     echo;k=17*FromDigits["!BIN: =0!",2]; sh = 1;
  70.     echo;tb = Table[
  71.     echo; 1/2 ^< Floor[ Mod[Floor[y/17]*2^^^(-17 Floor[x] - Mod[Floor[y], 17]^), 2]],
  72.     echo; {y, k + 17 - sh, k, -sh}, {x, 106 - sh, 0, -sh}];
  73.     echo;g = Graphics[Raster[tb /. {True -^> 0, False -^> 1}], ImagePadding -^> None, PlotRangePadding -^> None]
  74. )
  75.  
  76. call :runNbAtMathematica
  77. pause
  78. exit
  79.  
  80.  
  81. :runNbAtMathematica
  82.  
  83. for /f "delims== tokens=1*" %%a in ('ftype ^| findstr /i /r "\.nb.*Mathematica.exe"') do (
  84.     set "MathematicaPath=%%~dpnb.exe"
  85.     echo;找到 Mathematica 路径 !MathematicaPath!  启动 Mathematica ...
  86.     start "" "!MathematicaPath!" "%~dp0!oFile!"
  87.     exit /b
  88. )
  89. if not defined MathematicaPath echo;未安装 Mathematica
  90. exit /b
上次由 24game 在 2016年10月08日 10:53,总共编辑 1 次。

头像
paktc
渐入佳境
渐入佳境
帖子: 47
注册时间: 2016年07月21日 20:34
拥有现金: 锁定
储蓄: 锁定
Has thanked: 6 times
Been thanked: 5 times
联系:

Re: 塔珀自指公式自定义图形批处理构造器

帖子 #2 paktc » 2016年10月08日 08:24

[知乎]这个图像看起来和原不等式一样的不等式是怎么发现的?
其实核心还是数学

for /f delims^= %%a in (%~s0) do (
中的 %~s0 还是改为 'type %0' 比较谨慎,%0默认包含双引号。

我的桌面因为本来有a.bat 保存的时候变成了 a (1).bat
短名为 A(1)~1.BAT

但是这个短名实际调用的时候提示,此时不应有 ~1.BAT)。

参考:
[文件操作] BAT中%%~si 产生的文件短名并不可信

24game
渐入佳境
渐入佳境
帖子: 42
注册时间: 2016年09月02日 22:09
拥有现金: 锁定
Has thanked: 3 times
Been thanked: 15 times
联系:

Re: 塔珀自指公式自定义图形批处理构造器

帖子 #3 24game » 2016年10月08日 10:28

paktc 写了:BAT中%%~si 产生的文件短名并不可信


在 英文版 32 位 XP 下确实发现此问题, 中文 64位 WIN7 下没有发现问题

另外, %~i 和 %~fi 和 %~dpnxi 的扩展在两种测试环境下都没有问题

只要有 ~ 号时, 无论全路径中有无空格, 都不会扩展出 双引号

我选择以后用 "%~fi"

"%~i" (在某种情形会没有路径, 而只有文件名部分)

"%~dpnxi" 也没有发现问题, 但是效果和 "%~fi" 一样的

测试代码

Code: [全选] [展开/收缩] [Download] (Untitled.bat)
  1. @echo off
  2.  
  3. title "%~0"
  4. cd /d "%~dp0"
  5.  
  6. set "workPath=D:\错误实例test\复件 a\"
  7.  
  8. if "%~1"=="" (
  9.     2>nul md "%workPath%"
  10.     copy /y "%~0" "%workPath%shortname.bat"
  11.  
  12.     REM start "" "%workPath%"
  13.     start "" "%workPath%shortname.bat" 1
  14.     exit
  15. )
  16.  
  17. echo;%%0
  18. echo;%0
  19. echo;
  20.  
  21. echo;%%~0
  22. echo;%~0
  23. echo;
  24.  
  25. echo;%%~f0
  26. echo;%~f0
  27. echo;
  28.  
  29. echo;%%~dpnx0
  30. echo;%~dpnx0
  31. echo;
  32.  
  33. echo;%%~s0
  34. echo;%~s0
  35. echo;
  36.  
  37. for %%a in (*) do (
  38.     echo;"%%%% a"
  39.     echo;"%%a"
  40.     echo;
  41.  
  42.     echo;"%%%% ~fa"
  43.     echo;"%%~fa"
  44.     echo;
  45.  
  46.     echo;%%%% ~sa
  47.     echo;%%~sa
  48.     echo;
  49.  
  50.     echo;"%%%% ~snxa"
  51.     echo;"%%~snxa"
  52.     echo;
  53.  
  54.     echo;"%%%% ~fsa"
  55.     echo;"%%~fsa"
  56.     echo;
  57.  
  58.     echo;   "%%%% ~fsa" for copy
  59.     echo;   copy /y "%%~fsa" D:\
  60.             copy /y "%%~fsa" D:\
  61.     echo;
  62.  
  63.     echo;   "%%%% ~sa" for copy
  64.     echo;   copy /y "%%~sa" D:\
  65.             copy /y "%%~sa" D:\
  66.     echo;
  67.  
  68.     echo;   %%%% ~sa for copy
  69.     echo;   copy /y %%~sa D:\
  70.             copy /y %%~sa D:\
  71.     echo;
  72.  
  73.     echo;   "%%%% ~a" for copy
  74.     echo;   copy /y "%%~a" D:\
  75.             copy /y "%%~a" D:\
  76.     echo;
  77.  
  78.     echo;   "%%%% ~fa" for copy
  79.     echo;   copy /y "%%~fa" D:\
  80.             copy /y "%%~fa" D:\
  81.     echo;
  82.  
  83.     echo;   "%%%% ~dpnxa" for copy
  84.     echo;   copy /y "%%~dpnxa" D:\
  85.             copy /y "%%~dpnxa" D:\
  86.     echo;
  87. )
  88. del d:\shortname.bat
  89. pause
  90. cd \ & rd /s /q "%workPath%" & exit

头像
paktc
渐入佳境
渐入佳境
帖子: 47
注册时间: 2016年07月21日 20:34
拥有现金: 锁定
储蓄: 锁定
Has thanked: 6 times
Been thanked: 5 times
联系:

Re: 塔珀自指公式自定义图形批处理构造器

帖子 #4 paktc » 2016年10月08日 10:54

我的环境是win7 64位的,一般的空格不会引起这个问题。
我前面的说法和引用的链接跑偏了,是 a (1).bat 中的 () 在for句内的时候好像起了作用

  1. @echo off
  2. echo %~s0
  3.  
  4. rem 这里没问题
  5. type %~s0
  6. pause
  7.  
  8. rem 这里,挂了
  9. for /f delims^= %%a in (%~s0) do (
  10.     echo %%a
  11. )
  12. pause

对于%~s0,用type,加双引号可以:
Code: [全选] [展开/收缩] [Download] (Untitled.bat)
  1. for /f delims^= %%a in ('type "%~s0"') do (
  2.     echo %%a
  3. )

参考了1楼更新后的代码,这样也可以:
Code: [全选] [展开/收缩] [Download] (Untitled.bsh)
  1. for /f usebackq^ delims^= %%in ("%~s0") do (
  2.     echo %%a
  3. ) 

24game
渐入佳境
渐入佳境
帖子: 42
注册时间: 2016年09月02日 22:09
拥有现金: 锁定
Has thanked: 3 times
Been thanked: 15 times
联系:

Re: 塔珀自指公式自定义图形批处理构造器

帖子 #5 24game » 2016年10月08日 11:24

确实如此, () 在批处理里也总要注意

用 "%~f0" 圆括号没问题

头像
paktc
渐入佳境
渐入佳境
帖子: 47
注册时间: 2016年07月21日 20:34
拥有现金: 锁定
储蓄: 锁定
Has thanked: 6 times
Been thanked: 5 times
联系:

Re: 塔珀自指公式自定义图形批处理构造器

帖子 #6 paktc » 2016年10月08日 11:25

24game 写了:确实如此, () 在批处理里也总要注意

用 "%~f0" 圆括号没问题


话说楼主那个公式绘制图的有没有其他语言的实现(k值和公式固定的),比如python或者C

BatchScript 版块已经悄然走起 :crazylaugh4

头像
523066680
Administrator
Administrator
帖子: 333
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 29 times
Been thanked: 22 times
联系:

Re: 塔珀自指公式自定义图形批处理构造器

帖子 #7 523066680 » 2016年10月08日 19:39

win7 64, mathematica 9.0测试可用
ftype那个方法真是好用啊

我在尝试Perl,结果只看到 1/2,后面一塌糊涂,正在探索哪里出了问题
.
* * * ** *** * * *** **** *** ** * **** ** * ** * *** * *** * **** ** * * * *
* **** * * * ** * ** * ** * * * ** *** ** * ** ** ******* *** ***** *
** * ** * * *** ** * ****** * * * ******** * * ** * ** * * * ******** ****** *
* ** ** * * * * * *** ** ** * *** ***** * * ** **** * ** * ** ******** * * * *
* * ** ***** * * * * * ** * ** * * ** * * ** * * ** *** * * **** * ******* ** *
* ****** * ** *** * * * * * ** * * * ***** ** * * ** * * * ** * ** ****** ** * *
*** * **** * * * * * * * * ** ** *** * * * * * ** * ** ** ** **** * ** * * *
* * ** * * * ** * ** * * ** * * *** * **** ** * ** *** * * * * ** * *** * **** *
*** * ** ** * ** ** * * * * * ** * * * * * * * ** ** ***** ** *** * ******* ** ** *
* ** * * *** ** * * * * ******* * * * * * **** * * **** * * * * *
** * * * * * ** ** *** **** ** *** * **** ** * *** *** * * * **** ***** ** * **** * * * *
* **** ** *** ** **** * **** *** ** **** * * *** *** * ** * * ***** ** * * * * *
* *** ****** * * * *** ** ** * * * * ** * * **** ** **** * *** * ** *
* * *** ** * * *** ** * ** * ******* * *** **** * ** *** ** ** * * * * ** * *
*** * * * * * ** ** **** * * ** * *** ** ** * ** *** * * * * ** * ** * ** * *
***** *** ****** * * * * * **** * * *** ** *** ** * * ** * * ** * *
* ** * ****** ** *** * *** ** ** ** ** * *** *** ** *** ** ******* *** * ** * ****
* * * ** *** * * *** **** *** ** * **** ** * ** * *** * *** * **** ** * * * *


Code: [全选] [展开/收缩] [Download] (Untitled.pl)
  1. use Math::BigInt;
  2. use Math::BigFloat;
  3.  
  4. BEGIN
  5. {
  6.     use utf8;
  7.     use strict;
  8.     use Time::HiRes 'sleep';
  9.     use Win32::Console;
  10.     use IO::Handle;
  11.  
  12.     STDOUT->autoflush(1);
  13.     our ($MAX_COL, $MAX_LINE) = (200, 30);
  14.     our $MATRIX = $MAX_COL * $MAX_LINE;
  15.  
  16.     our $OUT= Win32::Console->new(STD_OUTPUT_HANDLE);
  17.     system("mode con cols=$MAX_COL");
  18.     $OUT->Window(1, 0, 0, 200, 29);
  19. }
  20.  
  21. sub floor
  22. {
  23.     return Math::BigFloat->bfloor(shift);
  24. }
  25.  
  26. sub mod
  27. {
  28.     return Math::BigInt->bmod( shift, shift );
  29. }
  30.  
  31. $k = Math::BigInt->new('9609393799189588849716729621278527547150043396601'.
  32.     '293066515055192717028023952664246896428421743507181212671537827706233'.
  33.     '559932372808741443078913259639413377234878577357498239266297155171737'.
  34.     '169951652328905382216124032388558661840132355851360488286933379024914'.
  35.     '542292886670810961844960917051834540678277315517054053816273809676025'.
  36.     '656250169814820834187831638491155902256100036523513703438744618483787'.
  37.     '372381982248498634650331594100549747005931383392264972494617515457283'.
  38.     '667023697454610146559979337985374831437868418065934222278983887229800'.
  39.     '00748404719');
  40. $result = Math::BigInt->new();
  41.  
  42. for $n (0 .. 16)
  43. {
  44.     for $x (0..106)
  45.     {
  46.         $y = $k + $n;
  47.         $result = floor(
  48.             mod( floor( $y/17 ) * ( 2** (-17*floor($x) - mod( floor($y), 17) ) ), 2)
  49.         );
  50.  
  51.         if ($result >= 0.5)
  52.         {
  53.             #print $x, " ", $y-$k ,"\n";
  54.             $OUT->Cursor(150-$x, $n);
  55.             $OUT->Write("*");
  56.         }
  57.     }
  58. }
  59.  
  60. $OUT->Cursor(1, 20);
  61. $OUT->Write("Over");
  62. <STDIN>;


灵台方寸山 写了:...

快点出来写个Python版的,我记得python原生支持大数操作

华丽的分割线

2016-10-08 补充,试了python,提示
OverflowError: integer division result too large for a float

于是去wikipedia找到了python的版本 http://www.pypedia.com/index.php/Tupper ... al_formula
Code: [全选] [展开/收缩] [Download] (Untitled.py)
  1. from functools import reduce
  2.  
  3. def Tupper_self_referential_formula():
  4.  
  5.     k = 4858450636189713423582095962494202044581400587983244549483093085061934704708809928450644769865524364849997247024915119110411605739177407856919754326571855442057210445735883681829823754139634338225199452191651284348332905131193199953502413758765239264874613394906870130562295813219481113685339535565290850023875092856892694555974281546386510730049106723058933586052544096664351265349363643957125565695936815184334857605266940161251266951421550539554519153785457525756590740540157929001765967965480064427829131488548259914721248506352686630476300
  6.  
  7.     def f(x,y):
  8.         d = ((-17 * x) - (y % 17))
  9.         e = reduce(lambda x,y: x*y, [2 for x in range(-d)]) if d else 1
  10.         f = (y / 17) / e
  11.         g = f % 2
  12.         return 0.5 < g
  13.  
  14.     for y in range(k+16, k-1, -1):
  15.         line = ""
  16.         for x in range(0, 107):
  17.             if f(x,y):
  18.                 line += "@"
  19.             else:
  20.                 line += " "
  21.         print(line)
  22.  
  23.  
  24. #Method name =Tupper_self_referential_formula()
  25. if __name__ == '__main__':
  26.     #print(__pypdoc__)
  27.  
  28.     returned = Tupper_self_referential_formula()
  29.     if returned:
  30.         print('Method returned:')
  31.         print(str(returned))

依旧提示
f = (y / 17) / e
OverflowError: integer division result too large for a float
stackoverflow上面几个方法都是用Decimal,试过了没用,烦 =_=

头像
523066680
Administrator
Administrator
帖子: 333
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 29 times
Been thanked: 22 times
联系:

Re: 塔珀自指公式自定义图形批处理构造器

帖子 #8 523066680 » 2016年10月08日 22:50

我觉得知乎这个高分回答可能有点问题

这个图像看起来和原不等式一样的不等式是怎么发现的? - 回答作者: 陆zz

首先,指出1/2是完全不必要的。
事实上,由于任何数除以2的余数后都在[0,2)之间


计算机编程中是存在小数取余的,例如
math.fmod(2.6, 2.0) = 0.6
(python)

头像
灵台方寸山
出类拔萃
出类拔萃
帖子: 79
注册时间: 2016年08月06日 16:40
拥有现金: 锁定
储蓄: 锁定
来自: [color=red]斜月三星洞[/color]
Has thanked: 24 times
Been thanked: 17 times

Re: 塔珀自指公式自定义图形批处理构造器

帖子 #9 灵台方寸山 » 2016年10月08日 23:00

:grimace 我数学小学生水平都不如的,我倒是想写。
:crazylaugh3 :oh_no
少发点科普,对中医产业,骗子产业不好。

头像
灵台方寸山
出类拔萃
出类拔萃
帖子: 79
注册时间: 2016年08月06日 16:40
拥有现金: 锁定
储蓄: 锁定
来自: [color=red]斜月三星洞[/color]
Has thanked: 24 times
Been thanked: 17 times

Re: 塔珀自指公式自定义图形批处理构造器

帖子 #10 灵台方寸山 » 2016年10月08日 23:05

python3 取余
3 % 2

除法并取整数
3 // 2

除法 返回浮点数
3 / 2

位与运算判断偶数奇数
3 & 1
:crazylaugh3 :oh_no
少发点科普,对中医产业,骗子产业不好。


回到 “Math”

在线用户

用户浏览此论坛: 没有注册用户 和 0 访客