首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collatz图绘图

Collatz图绘图
EN

Code Golf用户
提问于 2014-08-01 16:45:51
回答 2查看 1.2K关注 0票数 6

编写一个程序,输出collatz序列的任何方式(ASCII,图像,视频等)的图形。您必须以这样的方式实现它:您可以通过最大节点数或图中最高数目来调整图形的大小。这是个无聊的例子。

试着以一种创造性的、有洞察力的方式呈现图表,这是一场受欢迎的比赛!

请评论您的代码/算法,并在您的答案中张贴至少一个示例输出。

背景: Collatz序列

Collatz序列是通过递归为任意自然数n > 0定义的:

Collatz猜想认为序列结束于圈1,4,2

EN

回答 2

Code Golf用户

回答已采纳

发布于 2014-08-01 20:56:57

Ruby (通过ChunkyPNG)

我不知道这是否和你想的完全一样,但我在一段时间前就有了这个想法,但还没来得及去尝试。我们创建一行随机颜色,然后迭代地将每种颜色n替换为collatz(n)处的颜色,或者如果大于最大值,则替换为空像素,直到每一序列转义或收敛。结果是,每个像素逐渐传播到图形中与其连接的位置。

代码语言:javascript
复制
gem 'chunky_png'
require 'chunky_png'

def random_color
  ChunkyPNG::Color.rgba(*(1..3).map{rand(1..255)},255)
end

def collatz(n)
  n.even? ? n/2 : 3*n + 1
end

def collatz_grid(max)
  grid = []
  colors = (1..max).map { |i|  random_color  }
  collatz_steps = (1..max).map { |n| collatz(n) }
  overflow = ChunkyPNG::Color::TRANSPARENT
  while colors.uniq.count > 4
    grid << colors
    colors = collatz_steps.map { |i| colors[i-1] || overflow }
  end

  img = ChunkyPNG::Image.new(max, grid.size, ChunkyPNG::Color::TRANSPARENT)
  max.times do |x|
    grid.size.times do |y|
      img[x,y] = grid[y][x]
    end
  end
  img.save("collatz#{max}.png")
end

下面的图片,建议在一个新的窗口中打开它们并放大。

collatz_grid(100)

collatz_grid(10000)

票数 4
EN

Code Golf用户

发布于 2014-08-01 18:45:58

Python+Graphviz

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import networkx as nx
import os

"""Tool to generate collatz sequence graphs."""


def collatz_one(x):
    """Make a single step in the collatz sequence."""
    if x % 2 == 0:
        x = x/2
    else:
        x = 3*x + 1
    return x


def main(max_collatz=20):
    """Create the collatz graph. """
    G = nx.DiGraph()
    seen = [1]
    G.add_node("1")
    edges = []

    for i in range(1, max_collatz):
        while i != 1:
            if i not in seen:
                seen.append(i)
                G.add_node(str(i))
                j = collatz_one(i)
                edges.append((str(i), str(j)))
                i = j
            else:
                i = 1

    for i, j in edges:
        G.add_edge(i, j)
    nx.write_dot(G, 'test.dot')
    os.system("dot -Tpng test.dot -o test.png")

if __name__ == '__main__':
    from argparse import ArgumentParser
    parser = ArgumentParser(description=__doc__)
    parser.add_argument("-m", dest="m",
                        help=("The first 1..m elements are guaranteed "
                              "to be included"),
                        default=20,
                        type=int)

    args = parser.parse_args()
    main(args.m)

图像

dotm=20创建:

票数 5
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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