【问题标题】:Create, sort, and print a list of 100 random ints in the fewest chars of code以最少的代码字符创建、排序和打印包含 100 个随机整数的列表
【发布时间】:2008-12-08 21:01:57
【问题描述】:

创建、排序(升序)和打印包含 100 个随机正整数的列表的最少代码量是多少?最少的代码量是指包含在整个源文件中的字符,所以开始缩小。

我有兴趣使用任何和所有编程语言查看答案。让我们尝试为每种语言保留一个答案,编辑以前的答案以更正或简化。如果无法编辑,请发表评论?

【问题讨论】:

  • 这些问题不总是以某人定义一个运行时环境而告终吗?只需按一下键就可以完成正确的事情吗?
  • 是的。我想知道,我们可以在多大程度上影响代码的先决条件?
  • - 输出应该如何格式化?
  • 正整数 = ???任何正整数,例如随机0和1?还是必须是从 -(2^(K-1)) 到 (2^(K-1))-1 的均匀分布,对于 K = 8 或 16 或 32?
  • 似乎有人定义了一个名为 J 的运行时,用 10 次按键来实现完全正确的事情:P

标签: language-agnostic code-golf rosetta-stone


【解决方案1】:

J 中的 10 个字符:

/:~100?9e9

解释:

/:~ 对数组进行排序(技术上,将列表排序的置换向量应用于自身)

x ? limit 返回 x 个小于限制的随机数

9e9 (9000000000) 是一个合理的上限,可以用 3 个字符表示。 !9(9 阶乘)更小,但需要少一个字符。

【讨论】:

  • 那很热。你赢了。 wtf 是 J
  • 它是 APL 系列语言之一。保证赢得代码高尔夫锦标赛,直到有人进入高尔夫。 APL 可能比 J 略短,但不可输入的字符集让我很反感。 en.wikipedia.org/wiki/J_(programming_language)
【解决方案2】:

xkcd style 在 PHP 中:

for($i=0;$i<100;$i++) echo "4\n";

【讨论】:

  • 再为 xkcd 参考 +1
【解决方案3】:

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

【讨论】:

  • 请注意,'od -dAn -N200 /dev/urandom -w2|sort -n' 行较短,但输出与最长的数字右对齐。
  • 在 MacOS X 上试试 man /dev/random,比 cat /dev/random 好得多。 ;)
  • 从这里气馁: cat /dev/random 实际上消耗大量时间来产生输出,因为它坚持系统收集熵。它通常会“冻结”,直到您输入内容或移动鼠标以继续生成数字。
【解决方案4】:

我的条目:

echo enter a bunch of ints, hit control-D when done
cat - | sort -n

或者,根据 cmets 中的亚当:

echo enter a bunch of ints, hit control-D when done
sort -n

【讨论】:

  • 这很好,但我们应该计算构成外壳的代码吗?
  • 你甚至不需要 "cat -" 部分:让 sort 从标准输入读取!
  • @Albert - 那么其他条目是否必须计算构成运行时库和开发环境的代码? ;-)
  • @Albert:如果您要包含构成外壳的代码,那么您是否包含构建它的 C 运行时?您是否包括构建的操作系统?您是否包含机器的微码指令?疯狂在哪里结束?
  • +1 因为如果你摆脱了回声,这实际上会击败 J。我不认为这是可能的。
【解决方案5】:

C#

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);
    }
}

EDIT:制作完整的程序。假设可以删除换行符和空格,但为了清楚起见,请保留 :)

编辑:变得更短......我敢于有人改进这个......我已经尝试了一个小时。

编辑:我认为这有点短。

编辑:我认为这更短。呃,让我停下来。

编辑:多一行,少一个字符。值得商榷...


说明

A[100] - 任何旧事物的数组 - 在本例中是 A(这是一个不错的短名称)。内容被完全忽略,重要的是数组的大小。

.Select(i=&gt;r.Next()) - 生成一个可枚举的 100 个 r.Next() 值。

.OrderBy(i=&gt;i) - 按顺序排序前一个。

.ToList() - 将排序后的 int 枚举转换为 List,这样我们就可以使用 ForEach。

ForEach(Console.WriteLine) - 调用 Console.WriteLine 100 次,传入列表中的每个整数值。

【讨论】:

  • 我打败了你 4 个字符(即使在删除了你多余的 System namespace refs: (new int[1000]).Select(i => r.Next()).OrderBy(i => i ).ToList().ForEach(Console.WriteLine);
  • 我又敲掉了 2 个字符,将 int 更改为 A
  • ...以及相当于 OrderBy(i=>i) 的排序扩展方法。
  • @mackenir 是的,ForEach 不在 IEnumerable 上让我困惑了一段时间。
  • @Vilx 自从学习了 linq lambda 的东西——我上瘾了。我到处都用它。滥用 ToLIst()ForEach() 是一个讨厌的黑客攻击。对 enumerable 的 foreach 要干净得多。
【解决方案6】:

数学,28 个字符

Sort@RandomInteger[2^32, 100]

在 {0,...,2^32} 中给出 100 个(排序的)随机整数。

【讨论】:

    【解决方案7】:

    Common Lisp,int 介于 0 和 10000 之间(没有上限,但您必须选择一个)。

    (sort (loop repeat 100 collect (random 10000)) #'<)
    

    【讨论】:

    • 顺便说一下,有 47 个字符(随机 9 个)
    • 您可以通过删除括号旁边的空格来节省 3 个字符!
    【解决方案8】:

    APL

    13 个字符:

    a[⍋a←100?9e8]
    

    【讨论】:

    • 而且没有任何希腊语!我印象深刻。
    【解决方案9】:

    F#

    let r = new System.Random();;
    
    [ for i in 0..100 -> r.Next()] |> List.sort (fun x y -> x-y);;
    

    【讨论】:

      【解决方案10】:

      Ruby 的尝试:

      p [].tap{|a|100.times{a<<rand(9e9)}}.sort
      

      (少了八个字符,但需要 Ruby 1.9 的 tap kestrel)

      -对于 ruby​​ 1.8:

      p (0..?d).map{rand 1<<32}.sort
      

      30 个字符。 (可以通过改回 9e9 来修剪 2,但有问题的评论说范围应该是 MaxInt32。

      【讨论】:

        【解决方案11】:

        Haskell:

        import Random
        import List
        main=newStdGen>>=print.sort.(take 100).randomRs(0,2^32)
        

        【讨论】:

        • 可以缩短(在我看来,它甚至更好,更容易阅读:))。模块是一样的——main=newStdGen>>=print.sort.take 100.randomRs(0::Int,9)
        • 我把它缩短了(并改变了上限:-p)
        【解决方案12】:

        在 BASH 中:

        for i in `seq 100`; do echo $RANDOM; done | sort -n
        

        【讨论】:

        • &lt;powershell user&gt; 你称那优雅还是简洁? &lt;/powershell user&gt;
        【解决方案13】:

        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
        

        编辑:看起来我可以通过直接分配而不是“推送”将它缩短几个字符,而且我不需要 {}s:

        x=[];for(i=0;i<100;i++)x[i]=(Math.random()+"").slice(-8);x.sort();
        

        【讨论】:

        • x=[];for(i=0;i
        • for(x=[],i=100;i;)x[--i]=(Math.random()+"").slice(-8);x.sort( )
        • for(i=100,n=[];i;)n[--i]=(1+Math.random())*1e9
        • 再修剪一个:for(i=100,n=[];i;)n[--i]=(1+Math.random())*1e9|0;n.sort ()
        • 为什么是“1+”?这对我来说很好: for(i=100,n=[];i;)n[--i]=Math.random()*1e9|0;n.sort();
        【解决方案14】:

        Python 打印 100 个随机排序的整数

        import random,sys
        print sorted(random.randint(1,sys.maxint)for x in range(100))
        

        @Adam 已经击败了我,但我认为使用 randint() 和 sys.maxint 已经足够不同,无论如何都可以发布。

        【讨论】:

        • 我是为了简洁,但您的帖子仍然具有建设性。
        • 不要介意你的输出不是所要求的 import sys, random print '\n'.join([str(y) for y in sorted([random.randint(1,sys. maxint) for x in range(100)])])
        • 好吧,这取决于我们是否假设它应该是每行一个;描述只是说“打印 100 个整数”:-)
        【解决方案15】:

        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 个字符。

        【讨论】:

        • 啊,apl。我怎么一点都没有想你。
        • 我经常听到 APL 被描述为一种只写语言。 :-) 凭借其不同的角色集,很容易理解原因,尤其是在面对复杂的单线游戏时,例如此处显示的康威人生游戏中的单线游戏 (catpad.net/michael/apl)。
        • 这在我的 APL 解释器中没有给出排序列表。
        【解决方案16】:

        Powershell:

        35 个字符(使用 PowerShell 社区扩展,替换 Get-Random):

        0..99|%{[int]((random)*10000)}|sort
        

        20 个字符(普通 PowerShell v2):

        0..99|%{random}|sort
        

        【讨论】:

          【解决方案17】:

          Perl,比 nrich 的版本短了整整 8 个字节,并且在“使用警告”下运行; :)

          perl -wle "$,=' ';print sort map {int rand 100} 1..100"
          

          【讨论】:

          • perl -wE"$,=' ';say sort map int rand 9, 1..100 甚至更短
          【解决方案18】:

          Java:

          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);
              }
          }
          

          【讨论】:

          • 我比我更喜欢这个,因为它是一个完整的应用程序(我只是提供了一个方法就作弊了)而且它的内容更紧凑。
          • 是否 System.out.println(list);实际打印出单个整数?哇。我不知道。
          • ArrayList 的 toString 打印整个列表,是的。
          • 是的,确实如此。我没有在我的中使用它,因为 IIRC 它的打印结果类似于 [1, 2, 3, ..., n],并且我想要一个简单的每行一个整数输出,就像许多其他人正在做的那样。跨度>
          • 不会像那样调用 new Random() 导致在同一毫秒内反复使用相同的种子吗?
          【解决方案19】:

          时髦的:

          r=new Random()
          List l=[]
          100.times{ l << r.nextInt(1000) }
          l.sort().each { println it }
          

          【讨论】:

            【解决方案20】:

            Clojure

            (defn gen-rands []
            (sort (take 100 (repeatedly #(rand-int Integer/MAX_VALUE)))))
            

            【讨论】:

            • 如果你重复删除 take 和 ,并用 'for' 替换它们,你可以减少 5 个字符。如果没有多余的空格和函数 def,您可以减少到 54 个字符。如果您像大多数其他人所做的那样硬编码最大值,则更少。
            • (sort(for[x(range 100)][(rand-int Integer/MAX_VALUE)])) 类似的东西。
            【解决方案21】:

            在 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));;
            

            【讨论】:

              【解决方案22】:

              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
              

              【讨论】:

                【解决方案23】:

                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++]));
                }
                

                【讨论】:

                  【解决方案24】:

                  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 );
                          }
                      }
                  }
                  

                  【讨论】:

                    【解决方案25】:

                    带有升压的 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"));
                    }
                    

                    【讨论】:

                      【解决方案26】:

                      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()));
                          }
                      }
                      

                      【讨论】:

                      • 见上面的 linqish 版本。它更短。
                      • 我比你少了 4 个字符——即使在我删除了你对系统命名空间的额外引用之后;)打败那个傻瓜:P
                      • 不,我们仍然让您领先 3 个字符 - 假设您添加回 NEEDED System 命名空间。
                      • 哈哈哈!下次我会找你的,小工具!
                      • 好吧,我只是想嘀咕这个输出加倍的事实是如何使它出错的...... :)
                      【解决方案27】:

                      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]);}
                      

                      【讨论】:

                        【解决方案28】:

                        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:哦,是的,它可以 :) 受到 ding 帖子的启发..

                        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);
                            }
                        }
                        

                        【讨论】:

                          【解决方案29】:
                          mzscheme -e "(sort (build-list 100 (λ x (random 9))) <)"
                          

                          他说最少的字符,而不是最少的字节。 =)

                          【讨论】:

                            【解决方案30】:

                            Tcl 死了。

                            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]
                            

                            PHP 也不错。

                            确认完全锻炼

                            
                            <?
                            for($i=100;$i--;$l[]=rand());
                            sort($l);
                            print_r($l);
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2017-04-16
                              • 2021-03-06
                              • 2018-04-14
                              • 1970-01-01
                              • 2019-06-14
                              • 1970-01-01
                              • 2020-02-13
                              • 2012-11-06
                              相关资源
                              最近更新 更多