最短代码,随机放置点并连接它们


26

任务

这是一个非常简单的编码任务,您的程序所要做的就是将一个点放置在画布上(或用另一种编码语言替代),并将其连接到所有已放置的点上。您的程序必须接受一个输入,即应放置的点数,并在连接点的情况下输出某种显示。

要求

  • 我必须能够运行它,这意味着它必须具有编译器/工具才能在线运行或公开下载。
  • 允许您使用在设置此挑战之前创建的任何库,只要它并非旨在解决该问题的唯一目的即可。
  • 这是最短的代码任务,即字符。注释,更改颜色的代码(用于修饰)和库将被忽略。
  • 您的答案必须是唯一的,不要窃取其他人的代码,请缩短一些字符并重新发布。
  • 它必须能够在5分钟内运行(值5和100)。它还必须使用至少200 * 200的分辨率,并使用非平凡的分布将每个点放在画布上的随机位置。

现任排行榜

Flawr        - Matlab        - 22  - Confirmed
Falko        - Python 2      - 41  - Confirmed
Wyldstallyns - NetLogo       - 51  - Confirmed 
Ssdecontrol  - R             - 66  - Confirmed
David        - Mathematica   - 95  - Confirmed
ILoveQBasic  - QBasic        - 130 - Confirmed
Adriweb      - TI-Nspire Lua - 145 - Confirmed
Manatwork    - Bash          - 148 - Confirmed
Doorknob     - Python 2      - 158 - Confirmed
Kevin        - TCL           - 161 - Confirmed
M L          - HPPPL         - 231 - Confirmed
Manatwork    - HTML/JS       - 261 - Confirmed - Improved code of Scrblnrd3
Makando      - C#            - 278 - Confirmed
Scrblnrd3    - HTML/JS       - 281 - Confirmed
Geobits      - Java          - 282 - Confirmed

如果我很想念您,很抱歉,只需在您的作品中添加一条评论,这样,我一看到就会立即添加它=)

TL; DR

  • 输入-点数(整数,可以硬编码)
  • 输出-随机放置的点的图像,所有点相互连接(图形)
  • 优胜者-最短代码

1
我可以使用数学库吗?您在要求#2中到底想避免使用哪些库?
内森·梅里尔

2
分辨率是否有限制?如果您让我输出1x1图像,这将非常容易
John Dvorak

3
如果您不说“数学”库,那么“数学”中包含默认PRNG的语言呢?我不想写一个生成器。
Geobits,2014年

1
由于您不允许与该任务直接相关的库代码,并且该任务本质上是绘制随机网络图,因此是否也不允许使用本机图绘制功能?这个限制远没有很好的定义。
2014年

3
@PopeyGilbert我必须说,我从未见过有新用户对他们的问题有如此迅速的反应,并且还分别测试每个答案并保持排行榜。做得好,欢迎来到PPGC!
加尔文的爱好2014年

Answers:


21

Matlab(22)

gplot(ones(n),rand(n))

假设n是点数,对于n = 10,它看起来像这样: 随机图

n=6

随机

讲解

gplot是用于绘制图形的命令。第一个参数是一个n x n发生率矩阵(显然充满了)。第二个参数应该是具有n x 2点坐标的矩阵,但是第二个维度是否大于2并不重要,因此我只是生成一个n x n随机值矩阵(比生成n x 2矩阵短2个字符)。

文档链接


从未使用过Matlab,因此需要花一点时间进行测试-但是从图像上看还可以!恭喜您使用22个字符完成此操作。编辑-事实证明我无法对此进行测试,但是查看图像似乎正确,因此我将其允许。但是其他人可以测试吗?
亚历山大·克拉格斯

3
Thanks =)您可以在这里进行测试:octave-online.net因为octave基本上是MatLab的开源版本。
瑕疵的

27

Java的:318 282 265

因为,您知道,Java:

class M{public static void main(String[]a){new Frame(){public void paint(Graphics g){int i=0,j,d=640,n=25,x[]=new int[n],y[]=x.clone();for(setSize(d,d);i<n;i++)for(j=0,x[i]=(int)(random()*d),y[i]=(int)(random()*d);j<i;g.drawLine(x[i],y[i],x[j],y[j++]));}}.show();}}

它只是一个简单的循环,它会随机产生点,并在当前点和所有先前点之间画线。

25个点的示例:

在此处输入图片说明

带换行符和导入:

import java.awt.*;
import static java.lang.Math.*;

class M{
    public static void main(String[]a){
        new Frame(){
            public void paint(Graphics g){
                int i=0,j,d=640,n=25,x[]=new int[n],y[]=x.clone();
                for(setSize(d,d);i<n;i++)
                    for(j=0,x[i]=(int)(random()*d),y[i]=(int)(random()*d);
                        j<i;
                        g.drawLine(x[i],y[i],x[j],y[j++]));
            }
        }.show();
    }
}

编辑:由于我们不计入进口量,因此我又进口了几件东西以以后保存一些字符。

编辑2:OP添加了硬编码点数的余量。-17个字符:)


真好!祝贺您成为第一个。
亚历山大·克拉格斯

2
首先,但是我敢肯定,从长远来看,它不会是最短的。原因,您知道,Java;)
Geobits,2014年

3
我很佩服那些总是用Java解决任务的人,即使没有希望,我什至会懒得开始日食……所以+1 =)
虚假的2014年

1
@Chruncher是的,Java绝对不是代码高尔夫的最佳语言。但是,这是我学习的第一门语言,而且很容易掌握。但是,这也使我保持了稳定,并且就我个人而言,这是我最喜欢的语言。
亚历山大·克拉格斯

1
不必将main的参数定义为final。您可以切断那些6个字符
排排坐

11

Python 2-41 35

导入一些库以解决此挑战后

from pylab import rand as r
from pylab import plot as p
from itertools import product as x
from itertools import chain as c

我们可以只用一行代码绘制一些连接点:

X=r(5,2);p(*zip(*c(*list(x(X,X)))))

(屏幕截图生成了10分。)


[引用已删除的评论:]我知道,但是这里“图书馆将被忽略”。如果没有,我肯定会以不同的方式实现它。使用这些库不能保存足够的字符来证明import在常规代码高尔夫挑战中的语句是正确的。
Falko 2014年

pylab是标准发行版的一部分吗?我想我们不能仅仅导入我们喜欢的任何东西。在该指标下,您可以使用单个import语句在python中实现任何内容。
Cruncher 2014年

是的,是的。我只是做了我认为有效的事情。但是我不确定。调查评论表明正在进行大量讨论。一旦澄清了这一点,我便愿意调整我的代码。
Falko 2014年

尽管关于允许使用什么库的竞争观点似乎每天都在变化,但绝对应该允许PyLab。
亚历山大·克拉格斯

8

Mathematica 95 87

在belisarius的帮助下。

CompleteGraph[n, VertexSize -> {2, 2},
VertexCoordinates -> Table[RandomInteger[{0, 199}, 2], {n}]]

n = 5

5


n = 100

时间:2.082654秒

100


这已经过验证,我已经开始工作了!Mathematica通常会算作一种语言吗?
亚历山大·克拉格斯

1
@PopeyGilbert当然可以。到目前为止,在Mathematica 中大约有750个答案
Geobits,2014年

哦,哇,好吧!足够公平<3
亚历山大·克拉格斯

迈思认为这更短,并且满足规则CompleteGraph[100, VertexCoordinates -> RandomReal[{0, 199}, {100, 2}]]
belisarius博士2014年

谢谢,您是正确的。我想我不能取胜,所以我想我会让它非常(VertexSize - > {2,2}我没有,但是,忽略了这一事实。100没有必要列入,这Input[]是可选的。
DavidC

7

蟒蛇2,158

如问题所述,导入语句不包括在字符计数中(“库将被忽略”)。

from PIL import Image,ImageDraw
from random import randint

s=[(randint(0,200),randint(0,200))for _ in range(int(input()))]
i=Image.new('RGB',(200,200))
[ImageDraw.Draw(i).line((p,q),255)for p in s for q in s]
i.show()

样本输出:

n = 2(...):

n = 2

n = 10(看起来像是3D奇特的东西):

n = 10

n = 100(看起来有人用红笔去了BLELEEEAARARGHHH):

n = 100

n = 500、1000、10000(分别运行约1.5秒,5-6秒和3.5分钟):

注意:10000点是使用稍微优化的版本运行的,该版本将第3行(不包括导入)更改为:

d=ImageDraw.Draw
for p in s:
  for q in s:d.line((p,q),255)

否则,这将是永远的。:P

取消高尔夫:

from PIL import Image, ImageDraw
from random import randint
point_count = int(input())
image_size = 200
points = [(randint(0, image_size), randint(0, image_size)) for _ in range(point_count)]
image = Image.new('RGB', (200, 200))
draw = ImageDraw.Draw(image)
for start_point in points:
    for end_point in points:
        draw.line((start_point, end_point), 255)
image.show()

1
恭喜您是目前进入时间最短的人!喜欢您对n = 100的评论。最好将image.new和image_size设置为800。看起来不那么奇怪=)
Alexander Craggs

@PopeyGilbert所以我可以从我的删除导入语句?我以为“忽略库”意味着不算库本身(通常)。
Geobits,2014年

是的,因为某些语言的基本功能很少,必须导入所有内容。如果您认为这不是公平的Geobits,请说=)我想尝试使之公平。
亚历山大·克拉格斯

@PopeyGilbert我刚刚问过,因为这不是规范,想在我从代码中砍掉更多字符之前清除它:D
Geobits,2014年

1
由于分辨率仅须至少 200x200的,你可以通过设置保存一些字符(5,我认为)x=255,并用它来代替的情况下200255
2014年

5

R,66

这是边缘作弊,但我仍然认为这是在规则范围内。通过加载设置igraphlibrary(igraph),它可以从CRAN与下载install.packages("igraph")。然后将输入分配给variable N。根据规则,这些不计入总数。

G=graph.adjacency(matrix(1,N,N),"un")
plot(G,layout=layout.random)

N = 50

在此处输入图片说明

请注意,此代码还会绘制自连接。消除它们(尽管没有针对它们的规则)会添加6个字符:

G=graph.adjacency(matrix(1,N,N),"un",diag=F)
plot(G,layout=layout.random)

R,141

这是基于R的诚实至善解决方案:

p=replicate(2,runif(N))
g=as.matrix(expand.grid(1:N,1:N))
plot.new()
apply(g,1,function(i) segments(p[i[1],1],p[i[1],2],p[i[2],1],p[i[2],2]))

尽管您仍然需要N手动输入。

N = 50

在此处输入图片说明

我想知道for循环中的字符是否少于,apply但是我对自己所拥有的感到满意。


我将接受自连接,从技术上讲,问题是为所有点画一条线。我已经测试过并确认了。
亚历山大·克拉格斯

您介意连接这些点的箭头吗?通过,"un"在第一行结尾处消除,可以节省另外5个。
shadowtalker 2014年

如果您不介意,我认为我们应该保留它,因此必须是连接每个点的线。这样,答案在每个答案中都会看起来相似。
亚历山大·克拉格斯

5

QBasic或QuickBasic,130个字符

SCREEN 1:RANDOMIZE:N=10:DIM X(100),Y(100):FOR I=1 TO N:X(I)=RND*320:Y(I)=RND*200:FOR J=1 TO I:LINE(X(I),Y(I))-(X(J),Y(J)):NEXT J,I

代码变体

  • 如果不想提示您输入种子,请替换RANDOMIZERANDOMIZE TIMER
  • 如果要提示您输入N,请N=10INPUT N或替换INPUT "N";N

样品运行

对于N=5,使用在DOSBox 0.74上运行的QBasic 1.1进行了测试:

对于N=100,使用在DOSBox 0.74上运行的QBasic 1.1进行了测试:


哦,哇,N = 5的漂亮图片!喜欢当种子为42时是五角星。经过测试并确认。
亚历山大·克拉格斯

4

Bash + ImageMagick:148个字符

c=()
while((i++<$1)); do
p=$[RANDOM%200],$[RANDOM%200]
c+=($p)
for e in ${c[@]};do
d+="line $p $e"
done
done
convert -size 200x200 xc: -draw "$d" x:

样品运行:

bash-4.3$ time ./line.sh 5

real    0m5.256s
user    0m0.137s
sys     0m0.017s

样本输出:

5个连接点

样品运行:

bash-4.3$ time ./line.sh 25

real    0m3.043s
user    0m0.574s
sys     0m0.023s

样本输出:

25个连接点

样品运行:

bash-4.3$ time ./line.sh 100

real    0m5.662s
user    0m11.156s
sys     0m0.076s

样本输出:

100个连接点


经过测试并确认。做得好!
亚历山大·克拉格斯

非常抱歉,我完全忘记将其添加到排行榜吗?我现在就做。
亚历山大·克拉格斯

4

TCL 161个字符

显然不会取胜,但会击败这里提出的其他几项,我认为它很好地利用了一种被低估的语言。

for {set i 0} {$i<10} {incr i} {lappend l [expr rand()*291] [expr rand()*204]}
pack [canvas .c]
foreach {x y} $l {foreach {w z} $l {.c create line $x $y $w $z}}

例

我系统上的默认画布大小似乎为291x204。不知道为什么,但是使用它可以节省13个字符。

相当快,在不到5秒的时间内可以得到400分,在大约10 s内可以得到500分。大小和点数可以任意缩放,颜色和线条样式可以更改,当然要以字符为代价。取消高尔夫球运动并使用变量使其更清晰,更容易缩放和着色:

set n 20
set width 500
set height 500
set bg_color black
set line_color white
for {set i 0} {$i < $n} {incr i} {
        lappend points [expr rand() * $width] [expr rand() * $height]
}
canvas .c -width $width -height $height -background $bg_color 
pack .c
foreach {x1 y1} $points {
        foreach {x2 y2} $points {
                .c create line $x1 $y1 $x2 $y2 -fill $line_color
        }
}       

1
图像看起来不错,很遗憾,我的计算机无法正常工作,因此我稍后将对其进行测试。祝贺您使用了这种未被充分认识的语言。
亚历山大·克拉格斯

刚刚确认,恭喜成功!
Alexander Craggs 2014年



4

[TI-Nspire]的Lua - 145 135 130

(更新的固定版本)

屏幕截图,n = 10

首先将允许的math.random导入为“ r”: r=math.random

实际代码:

function on.paint(g)t={}for b=1,2*n-1,2 do t[b]=r(318)t[b+1]=r(212)for c=1,b-1,2 do g:drawLine(t[b],t[b+1],t[c],t[c+1])end end end

注意:此代码可在TI-Nspire计算器上运行(TI在该平台的最新OS上添加了Lua脚本,并具有基于偶数的API,例如允许用户绘制图形等。)
也可以在此处在线尝试(只需擦除演示脚本,并n=10以例如开头 )


是我学习Lua的时间了!
Beta Decay

1
这似乎与fuandon删除的PowerShell答案和Vlo删除的R答案一样遭受相同的错误:您将点成对连接,而不是每个点都与所有其他点相连。(Lua在此站点上非常罕见。请修复您的代码,而不是删除它。)
manatwork 2014年

糟糕,我会尽快修复的!
Adriweb 2014年

我们走了,谢谢你让我知道:)
Adriweb 2014年

这已经过测试并确认!在使用Lua方面做得很好。
亚历山大·克拉格斯

3

C#Windows表格268

static void k(int n,int s){var f=new Form{Height=s+50,Width=s+25};f.Paint+=(u,v)=>{var r=new Random();var p=new Point[n];while(n>0)p[--n]=new Point(r.Next(s),r.Next(s));foreach(var a in p)foreach(var b in p)f.CreateGraphics().DrawLine(Pens.Tan,a,b);};f.ShowDialog();}

N = 5

使用5点绘制

N = 50

使用N = 50绘制

完整代码如下

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    static class Program
    {
        static void Main()
        {
            k(50, 200);
        }
        static void k(int n, int s)
        {
            var f = new Form {Height = s + 50, Width = s + 25};
            f.Paint += (u, v) =>
            {
                var r = new Random();
                var p = new Point[n];
                while (n > 0)
                    p[--n] = new Point(r.Next(s), r.Next(s));
                foreach (var a in p)
                    foreach (var b in p)
                        f.CreateGraphics().DrawLine(Pens.Tan, a, b);
            };
            f.ShowDialog();
        }
    }
}

经过测试并确认!当我检查字符数时,我使用了完整的代码,并且对<700个字符...>。<感到惊讶。无论如何,恭喜您成功报名!
Alexander Craggs 2014年

难道没有像Pens.Tan代替之类的捷径new Pen(Color.Tan)吗?
CompuChip

更改为使用Pens.Tan,节省了额外的10
Zed Coder

2

HTML / JS,210,多亏了操作

<canvas id=q /><script>c=q.getContext("2d");r=Math.random;e=prompt(a=[]);for(i=0;i<e;i++){a[i]={x:r()*300,y:r()*150};for(j in a)c.beginPath()+c.moveTo(a[i].x,a[i].y)+c.lineTo(a[j].x,a[j].y)+c.stroke()}</script>

JSFiddle


这已经过验证,我已经开始工作了!
2014年

您可以使用~~,而不是m.floor保存5个字节
威廉·巴博萨

使canvas标签自动闭合,并删除id值周围的单引号:<canvas id=q />。(请注意,您必须在最后一个属性值和自动关闭之间留一个空格/。)顺便说一句,在Firefox中,如果没有m.floor()和,效果很好~~
manatwork


第一次尝试使用manatwork的jsfiddle时,我以为警报框需要密码!我很困惑。一个人有多愚蠢。我认为这与其他人的回答有足够的不同,可以保证在排行榜中占据另一个位置。别人认为这足够不同吗?
Alexander Craggs 2014年

2

C#WPF 306 296

partial class W:Window{public W(){InitializeComponent();int x=5,i=0,j,z=200;int[]f=new int[x],s=new int[x];var r=new Random();var X=new Grid();AddChild(X);for(;i<x;i++){f[i]=r.Next(z);s[i]=r.Next(z);for(j=i;j>=0;)X.Children.Add(newLine(){X1=s[j],Y1=f[j--],X2=s[i],Y2=f[i],Stroke=Brushes.Red});}}}

我想说的是,我可以删除Stroke = Brushed.Red。但是可悲的是,这意味着我正在绘制透明的线条,而我的猜测是,它实际上并不重要。:PI也可以通过仅在XAML视图中创建网格来节省几个字节。但这似乎是不公平的,因此我剥离了XAML成为一块空白画布。(我不将XAML视为字节...)

partial class W:Window
{
    public W()
    {
        InitializeComponent();
        int x=5,i=0,j,z=200;
        int[]f=new int[x],s=new int[x];
        var r = new Random();
        var X = new Grid();
        AddChild(X);
        for (;i<x;i++)
        {
            f[i]=r.Next(z);
            s[i]=r.Next(z);
            for (j=i;j>=0;)
                X.Children.Add(new Line()
                {
                    X1 = s[j],
                    Y1 = f[j--],
                    X2 = s[i],
                    Y2 = f[i],
                    Stroke = Brushes.Red
                });
        }
    }
}

XAML

<Window x:Class="W"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
</Window>

5

5

100

100


4
由于它是WPF,它将因内存不足异常而在3k点左右崩溃。
WozzeC 2014年

经过测试并确认,在C#WPF中做得很好!
亚历山大·克拉格斯

2
var声明变量时可以使用来缩短一点。
MarcinJuraszek 2014年

确实是的。谢谢!我还能够从“ this.AddChild”中删除“ this”。
WozzeC 2014年

1

HPPPL, 231 220

(用于HP Prime彩色图形计算器的HP Prime编程语言)

打高尔夫球。在每次创建新点后立即绘制所有可能的新线,从而减少了11个字符。只有两个嵌套循环,而不是前三个。

export c(n) begin rect();local g,h;a:=makemat(0,n,2);for g from 1 to n do a(g,1):=ip(random(1,320));a(g,2):=ip(random(1,240));if g>1 then for h from 1 to g-1 do line_p(a(h,1),a(h,2),a(g,1),a(g,2));end;end;end;freeze;end;

空球(270个字符):

export randomnet(n)
begin
rect();
local g,h;
a:=makemat(0,n,2);
for g from 1 to n do
  a(g,1):=ip(random(1,320));
  a(g,2):=ip(random(1,240));
    if g>1 then
      for h from 1 to g-1 do
        line_p(a(h,1),a(h,2),a(g,1),a(g,2));
      end;
    end;
end;
freeze;
end;

例子:

c(10)

connect_10_points_HPPPL

connect_10_points_HPPPL_2

c(30)

connect_30_points_HPPPL

HP Prime彩色图形计算器具有320x240像素的彩色显示屏。

在此处输入图片说明

可以在HP网站或以下位置获得与连接套件一起使用的仿真器:http : //www.hp-prime.de/en/category/6-downloads

...仍在等待硬件到达。随后将更新执行时间。

今天,我的HP Prime到了。这是实际计算器上n = 100的执行时间:

平均执行时间

n = 100时约为0.65 s。

在我的Core i5 2410M笔记本电脑上,仿真器的速度大约是其四倍(约0.178 s)。


1
好吧,我什至从未听说过这种编程语言,但是恭喜,它可以在模拟器上运行!我已将您添加到页首横幅。
亚历山大·克拉格斯

谢谢。一旦有了硬件,我将检查执行时间。该仿真器比实际的计算器要快。但是我认为n = 100的5分钟限制对于计算器而言非常慷慨。
ML 2015年

1

NetLogo,51个字节

crt 9 [create-links-with other turtles fd random 9]

根据需要用其他常量或变量替换9s。

NetLogo输出


1
已添加到排行榜!害怕我不确定如何测试。我已经下载了NetLogo,并将其输入到观察器部分,然后尝试将其设置为绘图上的pen命令,但都没有起作用。如果您能给我一些建议,我可以确认一下=)
Alexander Craggs

F'rinstance:进入“代码”选项卡,并将该​​行换成一个以“ go”开始并以“ end”结束的函数。然后,您可以在第一个按钮上添加一个调用“ go”的按钮,然后单击该按钮。
wyldstallyns

1
已确认!美丽的解决方案。真是太好了,如果您知道乌龟是什么,您可以像英文一样阅读代码。几乎可以肯定,这是最具可读性的解决方案。
亚历山大·克拉格斯

整齐!谢谢!我一直在寻找NetLogo专门针对此类问题的解决方案。具有讽刺意味的是,我也正在构建一个富丽堂皇的前端,以消除这种冗长的细节,以使NetLogo成为真正的高尔夫竞争者。
wyldstallyns

1
嗯,我认为这仍然是一个很好的答案!等不及要查看您的Pyth NetLogo代码,希望可以看到!
亚历山大·克拉格斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.