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

24game
渐入佳境
渐入佳境
帖子: 54
注册时间: 2016年09月02日 22:09
联系:

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

帖子 24game »

测试于 64bit Win7 Mathematica 10.0

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

图片
::..........................................................................................................
::..........................................................................................................
::..........................................................................................................
::..........................................................................................................
::..........................................................................................................
::..........................................................................................................
::............#### #### #### #### ### ##### # # ### # # ##### # # ##### #####.............
::............# # # # # # # # # # # # # # ## ## # ## # # # .............
::............#### #### ### #### ##### # ##### # # # # # ##### # # # ##### # .............
::............# # # # # # # # # # # # # # # # # # ## # # .............
::............#### #### #### # #### # # # # # ### # # ##### # # # ##### # .............
::..........................................................................................................
::..........................................................................................................
::..........................................................................................................
::..........................................................................................................
::..........................................................................................................
::..........................................................................................................
:: 上面区域除了左边的两个冒号外, 右边部分保持 106 宽 X 17 高
:: 不要增加多余的任何空行, 不要删除行, 不要用 # . 空格 之外的字符作图
:: # 是绘图像素, . 号和 空格 都是空白像素
::
:: BBS.BATHOME.NET
:: aa77dd@163.com 20161008_001459
::
:: 图像显示调整参数参考
:: http://math.stackexchange.com/questions ... athematica
:: 公式表达: 1/2 < floor(mod(floor(y/17)*2^(-17*floor(x)-mod(floor(y), 17)),2))
:: Tupper's self-referential formula @ wikipedia
:: https://en.wikipedia.org/wiki/Tupper%27 ... al_formula
::
:: 公式自身图形常数值
:: k=960939379918958884971672962127852754715004339660129306651505519271\
:: 7028023952664246896428421743507181212671537827706233559932372808741443\
:: 0789132596394133772348785773574982392662971551717371699516523289053822\
:: 1612403238855866184013235585136048828693337902491454229288667081096184\
:: 4960917051834540678277315517054053816273809676025656250169814820834187\
:: 8316384911559022561000365235137034387446184837873723819822484986346503\
:: 3159410054974700593138339226497249461751545728366702369745461014655997\
:: 933798537483143786841806593422227898388722980000748404719;

@echo off & setlocal enabledelayedexpansion
chcp 936
mode 110
for /f usebackq^ delims^= %%a in ("%~f0") do (
set /a cnt+=1
if !cnt! leq 17 (
for %%i in (!cnt!) do (
set "L%%i=%%a"
set "L%%i=!L%%i:~2!"
set "L%%i=!L%%i:#=1!"
set "L%%i=!L%%i:.= !"
echo;[!L%%i!]
)
)
)

REM 左下角最最高位, 右上角是最低位
set "BIN="
for /L %%c in (0 1 105) do (
for /L %%r in (17 -1 1) do (
set "BIN=!BIN!!L%%r:~%%c,1!"
if "!BIN!"==" " set "BIN="
)
)

set "oFile=BBS.BATHOME.NET.Tupper_s_self-referential_formula.nb"

>"!oFile!" (
echo;k=17*FromDigits["!BIN: =0!",2]; sh = 1;
echo;tb = Table[
echo; 1/2 ^< Floor[ Mod[Floor[y/17]*2^^^(-17 Floor[x] - Mod[Floor[y], 17]^), 2]],
echo; {y, k + 17 - sh, k, -sh}, {x, 106 - sh, 0, -sh}];
echo;g = Graphics[Raster[tb /. {True -^> 0, False -^> 1}], ImagePadding -^> None, PlotRangePadding -^> None]
)

call :runNbAtMathematica
pause
exit


:runNbAtMathematica

for /f "delims== tokens=1*" %%a in ('ftype ^| findstr /i /r "\.nb.*Mathematica.exe"') do (
set "MathematicaPath=%%~dpnb.exe"
echo;找到 Mathematica 路径 !MathematicaPath! 启动 Mathematica ...
start "" "!MathematicaPath!" "%~dp0!oFile!"
exit /b
)
if not defined MathematicaPath echo;未安装 Mathematica
exit /b
上次由 24game 在 2016年10月08日 10:53,总共编辑 1 次。
头像
paktc
出类拔萃
出类拔萃
帖子: 65
注册时间: 2016年07月21日 20:34
联系:

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

帖子 paktc »

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

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
渐入佳境
渐入佳境
帖子: 54
注册时间: 2016年09月02日 22:09
联系:

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

帖子 24game »

paktc 写了:BAT中%%~si 产生的文件短名并不可信
在 英文版 32 位 XP 下确实发现此问题, 中文 64位 WIN7 下没有发现问题

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

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

我选择以后用 "%~fi"

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

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

测试代码
@echo off

title "%~0"
cd /d "%~dp0"

set "workPath=D:\错误实例test\复件 a\"

if "%~1"=="" (
2>nul md "%workPath%"
copy /y "%~0" "%workPath%shortname.bat"

REM start "" "%workPath%"
start "" "%workPath%shortname.bat" 1
exit
)

echo;%%0
echo;%0
echo;

echo;%%~0
echo;%~0
echo;

echo;%%~f0
echo;%~f0
echo;

echo;%%~dpnx0
echo;%~dpnx0
echo;

echo;%%~s0
echo;%~s0
echo;

for %%a in (*) do (
echo;"%%%% a"
echo;"%%a"
echo;

echo;"%%%% ~fa"
echo;"%%~fa"
echo;

echo;%%%% ~sa
echo;%%~sa
echo;

echo;"%%%% ~snxa"
echo;"%%~snxa"
echo;

echo;"%%%% ~fsa"
echo;"%%~fsa"
echo;

echo; "%%%% ~fsa" for copy
echo; copy /y "%%~fsa" D:\
copy /y "%%~fsa" D:\
echo;

echo; "%%%% ~sa" for copy
echo; copy /y "%%~sa" D:\
copy /y "%%~sa" D:\
echo;

echo; %%%% ~sa for copy
echo; copy /y %%~sa D:\
copy /y %%~sa D:\
echo;

echo; "%%%% ~a" for copy
echo; copy /y "%%~a" D:\
copy /y "%%~a" D:\
echo;

echo; "%%%% ~fa" for copy
echo; copy /y "%%~fa" D:\
copy /y "%%~fa" D:\
echo;

echo; "%%%% ~dpnxa" for copy
echo; copy /y "%%~dpnxa" D:\
copy /y "%%~dpnxa" D:\
echo;
)
del d:\shortname.bat
pause
cd \ & rd /s /q "%workPath%" & exit
头像
paktc
出类拔萃
出类拔萃
帖子: 65
注册时间: 2016年07月21日 20:34
联系:

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

帖子 paktc »

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

rem 这里没问题
type %~s0
pause

rem 这里,挂了
for /f delims^= %%a in (%~s0) do (
echo %%a
)
pause
对于%~s0,用type,加双引号可以:
for /f delims^= %%a in ('type "%~s0"') do (
echo %%a
)
参考了1楼更新后的代码,这样也可以:
for?/f?usebackq^?delims^=?%%a?in?("%~s0")?do?(
????echo?%%a
)?
24game
渐入佳境
渐入佳境
帖子: 54
注册时间: 2016年09月02日 22:09
联系:

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

帖子 24game »

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

用 "%~f0" 圆括号没问题
头像
paktc
出类拔萃
出类拔萃
帖子: 65
注册时间: 2016年07月21日 20:34
联系:

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

帖子 paktc »

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

用 "%~f0" 圆括号没问题
话说楼主那个公式绘制图的有没有其他语言的实现(k值和公式固定的),比如python或者C

BatchScript 版块已经悄然走起 :crazylaugh4
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

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

帖子 523066680 »

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

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

use Math::BigInt;
use Math::BigFloat;

BEGIN
{
use utf8;
use strict;
use Time::HiRes 'sleep';
use Win32::Console;
use IO::Handle;

STDOUT->autoflush(1);
our ($MAX_COL, $MAX_LINE) = (200, 30);
our $MATRIX = $MAX_COL * $MAX_LINE;

our $OUT= Win32::Console->new(STD_OUTPUT_HANDLE);
system("mode con cols=$MAX_COL");
$OUT->Window(1, 0, 0, 200, 29);
}

sub floor
{
return Math::BigFloat->bfloor(shift);
}

sub mod
{
return Math::BigInt->bmod( shift, shift );
}

$k = Math::BigInt->new('9609393799189588849716729621278527547150043396601'.
'293066515055192717028023952664246896428421743507181212671537827706233'.
'559932372808741443078913259639413377234878577357498239266297155171737'.
'169951652328905382216124032388558661840132355851360488286933379024914'.
'542292886670810961844960917051834540678277315517054053816273809676025'.
'656250169814820834187831638491155902256100036523513703438744618483787'.
'372381982248498634650331594100549747005931383392264972494617515457283'.
'667023697454610146559979337985374831437868418065934222278983887229800'.
'00748404719');
$result = Math::BigInt->new();

for $n (0 .. 16)
{
for $x (0..106)
{
$y = $k + $n;
$result = floor(
mod( floor( $y/17 ) * ( 2** (-17*floor($x) - mod( floor($y), 17) ) ), 2)
);

if ($result >= 0.5)
{
#print $x, " ", $y-$k ,"\n";
$OUT->Cursor(150-$x, $n);
$OUT->Write("*");
}
}
}

$OUT->Cursor(1, 20);
$OUT->Write("Over");
<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
from functools import reduce

def Tupper_self_referential_formula():

k = 4858450636189713423582095962494202044581400587983244549483093085061934704708809928450644769865524364849997247024915119110411605739177407856919754326571855442057210445735883681829823754139634338225199452191651284348332905131193199953502413758765239264874613394906870130562295813219481113685339535565290850023875092856892694555974281546386510730049106723058933586052544096664351265349363643957125565695936815184334857605266940161251266951421550539554519153785457525756590740540157929001765967965480064427829131488548259914721248506352686630476300

def f(x,y):
d = ((-17 * x) - (y % 17))
e = reduce(lambda x,y: x*y, [2 for x in range(-d)]) if d else 1
f = (y / 17) / e
g = f % 2
return 0.5 < g

for y in range(k+16, k-1, -1):
line = ""
for x in range(0, 107):
if f(x,y):
line += "@"
else:
line += " "
print(line)


#Method name =Tupper_self_referential_formula()
if __name__ == '__main__':
#print(__pypdoc__)

returned = Tupper_self_referential_formula()
if returned:
print('Method returned:')
print(str(returned))
依旧提示
f = (y / 17) / e
OverflowError: integer division result too large for a float
stackoverflow上面几个方法都是用Decimal,试过了没用,烦 =_=
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

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

帖子 523066680 »

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

这个图像看起来和原不等式一样的不等式是怎么发现的? - 回答作者: 陆zz
首先,指出1/2是完全不必要的。
事实上,由于任何数除以2的余数后都在[0,2)之间
计算机编程中是存在小数取余的,例如
math.fmod(2.6, 2.0) = 0.6
(python)
头像
灵台方寸山
出类拔萃
出类拔萃
帖子: 76
注册时间: 2016年08月06日 16:40
来自: [color=red]斜月三星洞[/color]

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

帖子 灵台方寸山 »

:grimace 我数学小学生水平都不如的,我倒是想写。
:crazylaugh3 :oh_no
少发点科普,对中医产业,骗子产业不好。
头像
灵台方寸山
出类拔萃
出类拔萃
帖子: 76
注册时间: 2016年08月06日 16:40
来自: [color=red]斜月三星洞[/color]

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

帖子 灵台方寸山 »

python3 取余
3 % 2

除法并取整数
3 // 2

除法 返回浮点数
3 / 2

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

在线用户

正浏览此版面之用户: 没有注册用户 和 2 访客