编写一个程序,输出collatz序列的任何方式(ASCII,图像,视频等)的图形。您必须以这样的方式实现它:您可以通过最大节点数或图中最高数目来调整图形的大小。这是个无聊的例子。
试着以一种创造性的、有洞察力的方式呈现图表,这是一场受欢迎的比赛!
请评论您的代码/算法,并在您的答案中张贴至少一个示例输出。
Collatz序列是通过递归为任意自然数n > 0定义的:

Collatz猜想认为序列结束于圈1,4,2
发布于 2014-08-01 20:56:57
我不知道这是否和你想的完全一样,但我在一段时间前就有了这个想法,但还没来得及去尝试。我们创建一行随机颜色,然后迭代地将每种颜色n替换为collatz(n)处的颜色,或者如果大于最大值,则替换为空像素,直到每一序列转义或收敛。结果是,每个像素逐渐传播到图形中与其连接的位置。
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):

发布于 2014-08-01 18:45:58
#!/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)用dot和m=20创建:

https://codegolf.stackexchange.com/questions/35532
复制相似问题