首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >阿诺德猫图

阿诺德猫图
EN

Code Golf用户
提问于 2017-01-02 18:13:36
回答 5查看 3.5K关注 0票数 21

挑战

给定相同宽度和高度的彩色光栅图像,输出在阿诺德猫图下转换的图像。(*详情见下文)

定义

考虑到图像N的大小,我们假设像素的坐标是以0N-1之间的数字表示的。

然后,阿诺德的猫地图定义如下:

坐标[x,y]处的像素被移动到[(2*x + y) mod N, (x + y) mod N]

这只不过是环面上的线性变换:由于mod N,黄色、紫色和绿色部分被映射回初始正方形。

这个映射(让我们称之为f)具有以下属性:

  • 它是双射的,这意味着可逆:它是与矩阵[[2,1],[1,1]]的线性变换。由于它有行列式1,并且只有整数项,逆也只有整数项,由[[1,-1],[-1,2]]给出,这意味着它在整数坐标上也是双射的。
  • 它是N x N图像的一组双射映射的扭转元素,这意味着如果您多次应用它,您将得到原始图像:f(f(...f(x)...)) = x --应用到它自身的映射的次数,其结果是标识的数量保证小于或等于3*N。在以下中,您可以看到在阿诺德的猫映射的给定次数的迭代应用程序之后,猫的图像,以及重复应用程序的样子的动画:

详细信息

  • 您的程序不必处理图像,但是2D数组/矩阵、字符串或类似的2D结构也是可以接受的。
  • 您的(0,0)点位于左下角还是左上角并不重要。(或者在任何其他角落,如果这在您的语言中更方便的话)。请具体说明您在提交时使用的约定。

测试案例

矩阵形式([1,2,3,4]是顶行,1有索引(0,0)2有索引(1,0)5有索引(0,1))

代码语言:javascript
运行
复制
 1     2     3     4
 5     6     7     8
 9    10    11    12
13    14    15    16

maps to:

 1    14    11     8
12     5     2    15
 3    16     9     6
10     7     4    13

 --------------------

 1     2     3
 4     5     6
 7     8     9

 map to:

 1     8     6
 9     4     2
 5     3     7

作为图像(左下角是(0,0)):

EN

回答 5

Code Golf用户

发布于 2017-01-02 19:47:53

Mathematica,44个字节

代码语言:javascript
运行
复制
(n=MapIndexed[RotateLeft[#,1-#2]&,#]&)@*n

林恩奇异算法港。在上一次U+F3C7编码之前,有一个不可见的3字节字符,即UTF-8编码中的];Mathematica将其呈现为上标T,并接受矩阵的转置。

Mathematica,54字节

代码语言:javascript
运行
复制
Table[#2[[Mod[2x-y-1,#]+1,Mod[y-x,#]+1]],{x,#},{y,#}]&

未命名函数采用两个参数,一个正整数#和一个维#x#的2D数组#2,并返回一个形状相似的2D数组。与给定的测试用例一样,坐标{0,0}的点位于左上角,x轴是水平的。使用问题中提到的逆[[1,-1],[-1,2]]直接实现,在第一个坐标中有一个-1来解释数组本身就是1-索引的事实。如果不允许我们把矩阵的维数作为附加参数,那么这个解就长了9个字节(用aS代替第一个#-not#2-with a=Length@#和所有后来的#s )。

票数 5
EN

Code Golf用户

发布于 2017-01-02 20:16:34

Haskell,55字节

代码语言:javascript
运行
复制
m#n|r<-[0..n-1]=[[m!!mod(2*y-x)n!!mod(x-y)n|x<-r]|y<-r]

用法示例:[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] # 4 -> [[1,14,11,8],[12,5,2,15],[3,16,9,6],[10,7,4,13]]

0,0是左上角。这使用了逆变换。

票数 2
EN

Code Golf用户

发布于 2017-01-02 20:41:56

ImageJ宏,29字节

代码语言:javascript
运行
复制
v=getPixel((x+y)%w,(2*y+x)%h)
  • 莉娜的开放形象
  • 从“进程”菜单中选择“数学/宏”。
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/105362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档