您可以编写最少多少代码来创建、排序(升序)和打印 100 个随机正整数的列表?最少的代码是指包含在整个源文件中的字符,所以开始缩小。
我有兴趣使用任何和所有编程语言查看答案。让我们尝试为每种语言保留一个答案,编辑以前的答案以更正或简化。如果您无法编辑,请发表评论?
您可以编写最少多少代码来创建、排序(升序)和打印 100 个随机正整数的列表?最少的代码是指包含在整个源文件中的字符,所以开始缩小。
我有兴趣使用任何和所有编程语言查看答案。让我们尝试为每种语言保留一个答案,编辑以前的答案以更正或简化。如果您无法编辑,请发表评论?
J中的10个字符:
/:~100?9e9
解释:
/:~
对数组进行排序(从技术上讲,将列表排序的置换向量应用于自身)
x ? limit
返回 x 个小于限制的随机数
9e9
(9000000000) 是一个合理的上限,可以用 3 个字符表示。!9 (9 阶乘) 更小,但需要少一个字符。
PHP 中的xkcd 样式:
for($i=0;$i<100;$i++) echo "4\n";
Linux,命令行:
% od -dAn -N40 /dev/random | tr ' ' '\n' | sort -nu
4959
6754
8133
10985
11121
14413
17335
20754
21317
30008
30381
33494
34935
41210
41417
43054
48254
51279
54055
55306
我的条目:
echo enter a bunch of ints, hit control-D when done
cat - | sort -n
或者,根据评论中的亚当:
echo enter a bunch of ints, hit control-D when done
sort -n
using System;
using System.Linq;
class A {
static void Main() {
var r=new Random();
new A[100].Select(i=>r.Next()).OrderBy(i=>i).ToList().ForEach(Console.WriteLine);
}
}
编辑:制作完整的程序。假设可以删除换行符和空格,但为了清楚起见保留了:)
编辑:变得更短......我敢有人改进这个......我已经尝试了一个小时。
编辑:我认为这有点短。
编辑:我认为这更短。呃,让我停下来。
编辑:多一行,少一个字符。值得商榷...
A[100]
- 任何旧事物的数组 - 在这种情况下是 A(这是一个不错的短名称)。内容被完全忽略,重要的是数组的大小。
.Select(i=>r.Next())
- 生成可枚举的 100 个 r.Next() 值。
.OrderBy(i=>i)
- 按顺序对前一个进行排序。
.ToList()
- 将排序后的 int 可枚举转换为 List,这样我们就可以使用 ForEach。
ForEach(Console.WriteLine)
- 调用 Console.WriteLine 100 次,传入列表中的每个整数值。
Sort@RandomInteger[2^32, 100]
这给出了 {0,...,2^32} 中的 100 个(排序的)随机整数。
Common Lisp,int 介于 0 和 10000 之间(没有上限,但您必须选择一个)。
(sort (loop repeat 100 collect (random 10000)) #'<)
13 个字符:
a[⍋a←100?9e8]
红宝石的尝试:
p [].tap{|a|100.times{a<<rand(9e9)}}.sort
(少了八个字符,但需要tap
Ruby 1.9 的红隼)
- 对于红宝石 1.8:
p (0..?d).map{rand 1<<32}.sort
30 个字符。(可以通过更改回 9e9 来修剪 2,但有问题的评论说范围应该是 MaxInt32。
F#
let r = new System.Random();;
[ for i in 0..100 -> r.Next()] |> List.sort (fun x y -> x-y);;
哈斯克尔:
import Random
import List
main=newStdGen>>=print.sort.(take 100).randomRs(0,2^32)
在 BASH 中:
for i in `seq 100`; do echo $RANDOM; done | sort -n
Python 打印 100 个随机排序的整数
import random,sys
print sorted(random.randint(1,sys.maxint)for x in range(100))
@Adam已经击败了我,但我认为使用 randint() 和 sys.maxint 无论如何都足以发布。
APL(交互式):
如果您希望数字 0-99(或 1-100,取决于您将工作区中的索引原点设置为 0 还是 1)是唯一的,则需要 8 个字符,如下所示:
↑100?100
如果您不关心唯一性,请执行以下操作(9 个字符):
↑?100ρ100
想要更大的数字?只需将您的上限 N 替换为每行的第二个 100,您的随机数将在 0 - N-1 范围内(如果您的索引原点设置为 1,则为 1-N)。
如果您想保证您的数字范围为 0-99(或 0 - N-1,如果您要获得更大的上限),而不管索引原点设置如何,只需将上述任一行括在括号中并添加
-⎕IO
到最后(其中 ⎕ 是 APL 的四边形字符)。那是额外的6个字符。
Javascript:(通过JSDB或 Mozilla 的Rhino在 shell 模式下使用)
x=[];for(i=0;i<100;i++){x.push((Math.random()+"").slice(-8));};x.sort();
这是一个完整的测试运行:
c:\>java org.mozilla.javascript.tools.shell.Main
Rhino 1.7 release 1 2008 03 06
js> x=[];for(i=0;i<100;i++){x.push((Math.random()+"").slice(-8));};x.sort();
01499626,02403545,02800791,03320788,05748566,07789074,08998522,09040705,09115996,09379424,10940262,11743066,13806434,14113139,14336231,14382956,15581655,16573104,20043435,21234726,21473566,22078813,22378284,22884394,24241003,25108788,25257883,26286262,28212011,29596596,32566749,33329346,33655759,34344559,34666071,35159796,35310143,37233867,37490513,37685305,37845078,38525696,38589046,40538689,41813718,43116428,43658007,43790468,43791145,43809742,44984312,45115129,47283875,47415222,47434661,54777726,55394134,55798732,55969764,56654976,58329996,59079425,59841404,60161896,60185483,60747905,63075065,69348186,69376617,69680882,70145733,70347987,72551703,73122949,73507129,73609605,73979604,75183751,82218859,83285119,85332552,85570024,85968046,86236137,86700519,86974075,87232105,87839338,88577428,90559652,90587374,90916279,90934951,94311632,94422663,94788023,96394742,97573323,98403455,99465016
编辑:看起来我可以通过直接分配而不是“推送”将它缩短几个字符,而且我不需要 {}:
x=[];for(i=0;i<100;i++)x[i]=(Math.random()+"").slice(-8);x.sort();
电源外壳 :
35 个字符(使用 PowerShell 社区扩展,替换Get-Random
):
0..99|%{[int]((random)*10000)}|sort
20 个字符(普通 PowerShell v2):
0..99|%{random}|sort
Perl,比 nrich 的版本短了整整 8 个字节,并且在“使用警告”下运行;:)
perl -wle "$,=' ';print sort map {int rand 100} 1..100"
爪哇:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
class Rnd {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>(100);
for (int i = 0; i < 100; i++) list.add(new Random().nextInt());
Collections.sort(list);
System.out.println(list);
}
}
时髦的:
r=new Random()
List l=[]
100.times{ l << r.nextInt(1000) }
l.sort().each { println it }
Windows BATCH:160。这会在数字中添加前导零,但否则排序会有点混乱(因为排序按字符排序 - 它对数字一无所知)。
@echo off
set n=%random%.tmp
call :a >%n%
type %n%|sort
del /Q %n%
exit /B 0
:a
for /L %%i in (1,1,100) do call :b
exit /B 0
:b
set i=00000%random%
echo %i:~-5%
作为单线和更短的方式(72):
cmd/v/c"for /l %x in (0,1,99)do @(set x=0000!RANDOM!&echo !x:~-5!)"|sort
(defn gen-rands []
(sort (take 100 (repeatedly #(rand-int Integer/MAX_VALUE)))))
在 OCaml 中:
List.sort compare (let rec r = function 0 -> [] | a -> (Random.int 9999)::(r (a-1)) in r 100);;
编辑:在 OCaml 中,在顶层键入将打印出列表,但如果您希望将列表打印到标准输出:
List.iter (fun x -> Printf.printf "%d\n" x) (List.sort compare (let rec r = function 0 -> [] | a -> (Random.int 9999)::(r (a-1)) in r 100));;
C#:
using System;
using System.Collections.Generic;
class App
{
static void Main()
{
List<int> TheList = new List<int>();
Random r = new Random();
for ( int i = 0; i < 10; i++ )
TheList.Add(r.Next());
TheList.Sort();
foreach ( int i in TheList )
Console.WriteLine(i);
}
}
如果您要获取原始字符数,则可以将其压缩更多。但基本上就是这样。
编辑:尝试2:
using System;
class App
{
static void Main()
{
Random r= new Random();
for ( int i = 0, j=0; i < 100; i++ )
Console.WriteLine(j+=r.Next(int.MaxValue/100));
}
}
Python(交互式):
import random
[int(9*random.random())]
什么?它创建一个包含一个随机整数的列表,对其进行排序(简单地),然后将其打印出来。
好的,这是一个严肃的答案
import random
sorted([int(9*random.random()) for x in range(9)])
它在 [0, 9) 中生成 9 个随机整数,对它们进行排序,然后打印它们(在交互式 shell 中)。
这是一个较短的变体,实际上产生了所需的 100:
from random import*
sorted(randint(0,9)for x in' '*100)
Tcl 死了。
创建一个 RANDOM (0-99) 长度列表并将 RANDOM (0-99) 整数放入其中。
也打印到屏幕上,并且可以完全按照 tcl 文件或 tcl shell 中所示的方式运行。
set l {}
proc r {} {expr { int(floor(rand()*99)) }}
for {set i 0} {$i<[r]} {incr i} {lappend l [r]}
puts [lsort -integer $l]
完全确定锻炼
<?
for($i=100;$i--;$l[]=rand());
sort($l);
print_r($l);
mzscheme -e "(sort (build-list 100 (λ x (random 9))) <)"
他说最少的字符,而不是最少的字节。=)
C#
如果您可以对数组大小施加限制,那么:
Array.ForEach(Guid.NewGuid().ToByteArray().OrderBy(c => c).ToArray(), c => Console.WriteLine(c));
否则,可以采用限制较少(但稍微冗长)的角度:
var r = new Random();
(new int[100]).Select(i => r.Next()).OrderBy(i => i).ToList().ForEach(Console.WriteLine);
好吧,我想这是我最后一次回到这个...
116 个字符:
using System;
class A
{
static void Main()
{
var r=new Random();
var n=1D;
for(int i=0;i<100;i++,Console.WriteLine(n+=r.Next()));
}
}
C++ 不是这项工作的正确工具,但这里有:
#include <algorithm>
#include <stdio.h>
#define each(x) n=0; while(n<100) x
int main()
{
int v[100], n;
srand(time(0));
each(v[n++]=rand());
std::sort(v, v+100);
each(printf("%d\n",v[n++]));
}
mackenir:改进了 7 个字符:
namespace System.Linq {
class A {
static void Main() {
var r = new Random();
new A[100].Select( i => r.Next() ).OrderBy( i => i ).ToList().ForEach( Console.WriteLine );
}
}
}
带升压的 C++。太糟糕了#include已经是所有文本的一半了:)
#include <boost/bind.hpp>
#include <algorithm>
#include <vector>
#include <iterator>
#include <cstdlib>
int main() {
using namespace std;
vector<int> a(100);
transform(a.begin(), a.end(), a.begin(), boost::bind(&rand));
sort(a.begin(), a.end());
copy(a.begin(), a.end(), ostream_iterator<int>(cout, "\n"));
}
#!perl print join "\n", sort { $a <=> $b } map { int rand 0xFFFFFFFF } 1 .. 100;
167 个字符的普通旧 c 代码:
main(){int i=100,x[i],n=i;while(i)x[--i]=rand();for(i=0;i<n;i++){int b=x[i],m=i,j=0;for(;j<n;j++)if(x[j]<x[m])m=j;x[i]=x[m];x[m]=b;}i=n;while(i)printf("%d ",x[--i]);}
Java,再次
import java.util.*;
class R
{
public static void main(String[]a)
{
List x=new Stack();
while(x.size()<100)x.add((int)(Math.random()*9e9));
Collections.sort(x);
System.out.print(x);
}
}
我不认为它可以比这更短。我还剪掉了不必要的空间。
LE:哦,是的,它可以:) 受丁的帖子的启发..
import java.util.*;
class R
{
public static void main(String[]a)
{
Set x=new TreeSet();
while(x.size()<100)x.add((int)(Math.random()*9e9));
System.out.print(x);
}
}
序言,78 个字符:
r([]).
r([H|T]):-random(0,1000000,H),r(T).
f(L):-length(R,100),r(R),sort(R,L).
REPL 中的用法:
| ?- f(X).
X = [1251,4669,8789,8911,14984,23742,56213,57037,63537,91400,92620,108276,119079,142333,147308,151550,165893,166229,168975,174102,193298,205352,209594,225097,235321,266204,272888,275878,297271,301940,303985,345550,350280,352111,361328,364440,375854,377868,385223,392425,425140,445678,450775,457946,462066,468444,479858,484924,491882,504791,513519,517089,519866,531646,539337,563568,571166,572387,584991,587890,599029,601745,607147,607666,608947,611480,657287,663024,677185,691162,699737,710479,726470,726654,734985,743713,744415,746582,751525,779632,783294,802581,802856,808715,822814,837585,840118,843627,858917,862213,875946,895935,918762,925689,949127,955871,988494,989959,996765,999664]
yes
正如我的一些老师所说,这是不言自明的:-)
[100.{rand}+*]$
xkcd 风格的 Python 答案 - 比当前答案更短!
print [4]*100
真正的答案,63 个字符:
from random import*;print sorted(randrange(9e9)for i in[0]*100)
打印在 C++ 中排序的 [0,100] 范围内的随机 100 个随机数
srand((unsigned int)time(NULL)); list<int> r;
for (int i=0;i<100;i++) r.push_back((int)((100)*rand()/(float)RAND_MAX));
r.sort();
for (list<int>::iterator j=r.begin();j!=r.end();j++) cout << *j << endl;
如果您不关心奇偶校验,请替换r.push_back((int)((100)*rand()/(float)RAND_MAX))
为r.push_back(rand()%(101))
--
这是一个 200 个字符的完整程序:
#include <algorithm>
#include <iostream>
#include <random>
using namespace std;int main(){int a[100];generate_n(a,100,tr1::mt19937());sort(a,a+100);for(int i=0;i<100;++i){cout<<a[i]<<endl;}return 0;}
数组符号比我能找到的任何标准容器都要短。 tr1::mt19937
是我能找到的最短的随机数生成器。 using namespace std;
比几个实例短std::
。
Common Lisp(我记得,可能有一些细节错误):
(setf a '(99 61 47))
(setf a (sort a))
(princ a)
数字当然是随机的;我现在通过掷骰子选择了它们。
(也许我们可以把定义收紧一点?)
Perl 命令行:
perl -e 'print $_, "\n" foreach sort map {int rand 10} (1..10)'
打印 0 到 9 之间的 10 个整数并对其进行排序。
爪哇:
public void randList()
{
final int NUM_INTS = 100;
Random r = new Random();
List<Integer> s = new ArrayList<Integer>();
for(int i = 0; i < NUM_INTS; i++)
s.add(r.nextInt());
Collections.sort(s);
for(Integer i : s)
System.out.println(i);
}
可能会更短,但上面的内容非常清楚并且大部分符合最佳实践。这将生成警告(原始类型)并且具有错误的变量名称,但会更短一些。
void rl()
{
Random r = new Random();
List s = new ArrayList();
for(int i = 0; i < 100; i++)
s.add(r.nextInt());
for(Object i : s)
System.out.println((Integer) i);
}
我不会接受它作为程序规范,太不精确了!:-)
卢阿版本:
t=table;l={}for i=1,20 do l[#l+1]=math.random(99)end;t.sort(l)print(t.concat(l,' '))
可能会稍微缩短,也可能会有更智能的代码。
一个命令行 PHP 单行(是的,尾随分号是必需的......)
php -r 'while (++$i % 101) $j[] = rand(0, 99); sort($j); echo implode(" ", $j)."\n";'
VB - 151 个字符:
可悲的是,它不如 C# 优雅......
Sub Main()
Dim r = New Random
Enumerable.Range(1, 100) _
.Select(Function(i) r.Next) _
.OrderBy(Function(i) i) _
.ToList _
.ForEach(AddressOf Console.WriteLine)
End Sub
这不是一个玩笑。这是我目前能做的最好的。:)
JavaScript:
a=[];for(i=0;i<100;i++){b=Math.round(Math.random()*100);a[i]=b;}c=0;
while(c==0){c=1;for(j=0;j<99;j++){if(a[j]>a[j+1]){d=a[j];a[j]=a[j+1];a[j+1]=d;c=0;}}}
for(k=0;k<100;k++)document.write(a[k],"<br>")
这是我可以用 Delphi 2007 Win32 控制台应用程序做的最好的事情(除了删除一些换行符和缩进):
{$APPTYPE CONSOLE}
var a:array[0..99] of integer; i,j,k:integer;
begin
FOR i:=0 to 99 DO a[i]:=random(maxint)+1;
FOR i:=0 to 98 DO
FOR j:=i+1 to 99 DO
IF a[j]<a[i] THEN begin
k:=a[i]; a[i]:=a[j]; a[j]:=k
end;
FOR i:=0 to 99 DO writeln(a[i])
end.
AFAIK,没有一个标准单元包含排序程序,所以我不得不写我知道的最短的一个。此外,由于我没有调用 Randomize,因此每次运行时都会产生相同的结果。
编辑:我采用“正整数”来表示整数类型范围内的每个正(非零)数,因此使用 maxint(系统常数)和“+1”来确保它不为零。
普通的旧 C,没有那么小以至于被混淆:
#include <stdio.h>
#include <stdlib.h>
static int cmp(const void *a, const void *b)
{
return *(const int *) a > *(const int *) b;
}
int main(void)
{
int x[100], i;
for(i = 0; i < 100; i++)
x[i] = rand();
qsort(x, 100, sizeof *x, cmp);
for(i = 0; i < 100; i++)
printf("%d\n", x[i]);
return 0;
}
这在 Linux 中使用 gcc 4.1.2 构建而没有警告。在实际代码中,我当然会:
sizeof x
用于剩余的引用void main() {
array a=({});
while (sizeof(a)<100) a+=({random(1<<30)});
sort(a);
foreach (a, int b) write("%d\n",b);
}
我无法编辑或评论,所以这里是 Java v3(前 2 个有负数):
import java.util.TreeSet;
class Test {
public static void main(String[] args) {
Collection<Double> s = new TreeSet<Double>();
while (s.size() < 100) s.add(Math.random());
System.out.println(s);
}
}
Erlang,157 个字符
-module (intpr).
-export ([q/0]).
q() ->
lists:foldl(
fun(X,A)->io:format("~p,",[X]),A end,
n,
lists:sort(
lists:map(fun(_)->random:uniform(100) end, lists:seq(1,100))
)
).
当然这不是最好的 erlang 解决方案,基本上它会创建一个从 1 到 100 的列表(只是因为我没有找到更好/更短的初始化列表的方法)并使用随机整数(<100)映射每个项目,然后结果列表已排序。最后,列表是“折叠的”,用作浏览所有项目并打印它们的一种方式。
你会认为 SQL 会擅长这种事情:-
SELECT * FROM
(SELECT TRUNC(dbms_random.value(1,100)) r
FROM user_objects
WHERE rownum < 101)
ORDER BY r
这是 108 个字符的 Oracle 版本。有人可能会在使用 TOP 100 语法的不同变体中做得更好。
编辑,82 个字符:
select trunc(dbms_random.value(1,100))
from dual
connect by level < 101
order by 1
Delphi...按字母排序的版本
program PrintRandomSorted;
{$APPTYPE CONSOLE}
uses SysUtils,Classes;
var I:Byte;
begin
with TStringList.Create do
begin
for I in [0..99] do
Add(IntToStr(Random(MaxInt)));
Sort; Write(Text); Free;
end;
end.
正确排序,使用泛型..
program PrintRandomSorted;
{$APPTYPE CONSOLE}
uses SysUtils, generics.collections;
var I:Byte;S:String;
begin
with TList<Integer>.Create do
begin
for I in [0..99] do Add(Random(MaxInt));
Sort;
for I in [0..99] do WriteLn(Items[I]);
Free;
end;
end.
请注意,没有人用 C 或 C++ 给出答案?
一旦它们被称为高级语言(与汇编程序相比)。好吧,我想现在他们是低级的。
蟒蛇,71个字符
import random
print sorted(random.randint(0,2**31)for i in range(100))
冷融合:
<cfloop index="i" to="100" from="1">
<cfset a[i] = randrange(1,10000)>
</cfloop>
<cfset ArraySort(a, "numeric")>
<cfdump var="#a#">
Qt4 版本 (c++),116 个字符。
#include <QtCore>
int main(){QList<int>l;int i=101;while(--i)l<<qrand()%101;qSort(l);foreach(i,l)printf("%d\n",i);}
-> wc -c main.cpp
116 main.cpp
C#
var sequence = Enumerable.Range(1, 100)
.OrderBy(n => n * n * (new Random()).Next());
foreach (var el in sequence.OrderBy(n => n))
Console.Out.WriteLine(el);
F#
let rnd = System.Random(System.DateTime.Now.Millisecond)
List.init 100 (fun _ -> rnd.Next(100))
|> List.sort
|> List.iter (fun (x: int) -> System.Console.Out.WriteLine(x))
C 没有分配一个数组(基本上是在最后一个打印的值上添加一个随机整数,隐式排序):
#include <stdlib.h>
int main(int argc, char **argv) {
int i;
unsigned long baseline = 0;
srand(atoi(argv[1]));
for ( i = 0 ; i < 100 ; i++ ) {
baseline += rand();
printf("%ld\n", baseline);
}
}
通过通常的混淆+换行符的删除,可以减少到 136 个字符。
ps:很明显,在命令行上使用 $RANDOM 运行。
C#
var r=new Random();
var l=from i in new C[100] let n=r.Next() orderby n select n;
81 个字符(包括换行符)
MATLAB:
arrayfun( @(x) display(x), sort( rand(1,100) ) )
使用 C - 152 个字符
main(){int a=100,b,t,x[a];while(a--)x[a]=rand();a=100;while(b=a--)while(b--)if(x[a]>x[b]){t=x[a];x[a]=x[b];x[b]=t;}a=100;while(a--)printf("%d\n",x[a]);}
或扩大
#include <stdio.h>
int main()
{
int a=100,b,t,x[a];
while(a--)x[a]=rand();
a=100;
while(b=a--)
while(b--)
if(x[a]>x[b])
{
t=x[a];
x[a]=x[b];
x[b]=t;
}
a=100;
while(a--)
printf("%d\n",x[a]);
}
: _
sort(round(runif(100)*99+1))
Windows 命令外壳 - 71 个字符
cmd/v/c"for /L %i in (0,1,99)do @set r= !random!&echo !r:~-5!"|sort
斯卡拉:(61 个字符)
1 to 100 map {_ ⇒ Random.nextInt} sortBy identity foreach println
编辑:
通过定义内联可以进一步压缩(56 个字符)identity
。
1 to 100 map {_ ⇒ Random.nextInt} sortBy {i ⇒ i} foreach println