什么是一些著名的一线或两线程序和方程式?[关闭]


22

我正在尝试一个新平台,并且试图编写一个处理不超过60个字符的字符串的程序,我想用一些著名的或众所周知的小代码块填充数据存储,方程式,因为编程和数学与我的软件主题保持一致。该代码可以使用任何语言,也可以使用来自任何数学学科的方程式,只要它们的总长度小于60个字符即可。我怀疑人们会为此而烦恼

例如,

#include<stdio.h>
int main(){printf ("Hi World\n");return 0;}

完全是60个字符!

非常感谢您的智慧!


22
为什么要进行审查?我们难道不能成年,不告诉所有人他们能读什么?在这种情况下,brainf k并不是an亵。
ChaosPandion

2
我怀疑这个问题将会解决。尝试改进它,使其更具建设性。请参阅:blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero

8
@bigown:这是一个很好的主观方法,具有建设性。这与索要著名的报价没有什么不同。实际上,它更好,因为它要求使用著名的代码/等式“引号”。:-)
Macneil's

@Macneil:我也这么认为,但是问题很严重,可以改进。
Maniero 2010年

3
@bigown:说实话,我真的看不出这个问题如何更具建设性。不用怀疑您,但是非常机智地问,您是否可以建议对@BeachRunnerJoe进行改进?实际上,我非常喜欢这些答案,并且从中学到了很多。我很想看到这个问题重新开始。
Joris Meys 2010年

Answers:


34

如今,越来越少的人知道经典的C字符串复制例程:

while (*d++ = *s++);

3
是的,对退伍军人很有名!
BeachRunnerJoe 2010年

13
虽然我知道它具有“历史”价值,但它的代码糟透了,因此,它已成为
废品

9
AC老手会立即识别出该模式。这是地道C.
巴里·布朗

6
一直以为这太酷了。
Maulrus 2010年

5
我必须说,我同意@Kop。仅用几个字符,它就显示了其标准库及其语义的重大缺陷。最荒谬的事情之一是字符串以0终止而不是长度前缀(这是更安全的方法,可以确定字符串O(1)的长度)。第二件事是C没有实际的布尔值(修正了if (alarm = red) launchNukes();-trap)。Dijkstra认为此代码有害无益。我确实同意C程序员至少必须了解此代码,但是我认为对他来说,更好地做到这一点更为重要。
back2dos

26

没有一行,但我介绍了The World's Last C Bug:

    status = GetRadarInfo();
    if (status = 1)
      LaunchNukes();

2
那就是那些“哦,嘘!” 错误。
Tin Man

3
它是LaunchNukes();
hasen

1
如果将其写为:if(GetRadarInfo()= 1){...},我们将不会收到此错误,因为它无法编译。因此,不要总是引入中间变量。
tactoth 2011年

22

我看到Conway在APL中的人生游戏浮动很多:

额外的好处是,这将确保您正确处理unicode。


2
哈!那是我看到您的代码时想到的第一件事,太好了!
BeachRunnerJoe 2010年

哇,真令人印象深刻!
FinnNk 2010年

4
v

15
而且我认为Perl看起来像是线路噪音。
Tin Man 2010年

1
@Greg,请稍等,APL的使用量超过罗马和希腊字母,因为已经没有足够的字母和符号了。因为某些字符需要在其他字符的上方键入,所以也使用了退格键(更恰当地称为“ overstrike”)。一个这样的例子是在正方形顶部的除法符号,表示矩阵求逆(如果是一元运算符,或者如果它用作二进制运算符,则乘以求逆矩阵)。
Tangurena

19

著名的Perl单线版的修改版本:

/^.?$|^(..+?)\1+$/

此正则表达式匹配长度为素数的字符串。

原始版本是:

/^1?$|^(11+?)\1+$/

与由1的质数组成的字符串匹配。


14

快速排序:

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

如果列表为空,则排序结果为空列表。

如果列表以元素x开头,而列表的其余部分为xs,则排序结果为包含排序列表的列表,该列表由xs中小于x的所有元素组成,而元素x与所有元素的排序列表并置xs中的元素大于x。

(或换句话说-分成两个小于x且都大于x的堆,将它们都排序,并创建一个小于堆,元素x和大于堆的列表)。

轻松击败C版本的易懂性。


1
这是标准ML吗?还是Haskell?
巴里·布朗

3
哈斯克尔。我喜欢这种语言的心态。

我喜欢分区替代方案qsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Kendall Hopkins,2010年

1
是否有使用随机数据透视表而不是列表开头的版本?这将使其更接近CAR Hoare的原始版本。
Macneil

1
Hoare说:“选择的[作为枢轴元素] ...的项目应始终是要分割的分段的最高寻址位置。如果担心这会产生有害的非随机结果,随机选择的项目最初应放置在地址最高的位置”。因此,要忠实于Hoare,我们应该使用最后一个元素,而不是第一个元素。


13

当我第一次发现bash前炸弹时,我认为它真的很甜。

:(){ :|:& };:

哇,那真是邪恶!
Macneil

看看所有的表情符号!您可以将其称为“笑脸炸弹!”
Mark C



7

如何检测偶数:

x % 2 == 0

3
!(x%2)用理智的语言。
克里斯汀·曼

8
!(x & 1)使用语言而不优化编译器。
jfs

1
@Christian,数字不应该是布尔值-太容易出错。

7

import this 在Python中。


编辑为注释不能包含换行符:对于那些没有Python解释器的人,这是输出

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

我是Python初学者。这将实现什么?
理查德

1
@Richard:尝试在Python交互式解释器中编写:)。
MAK 2010年

这照亮了我的周日下午:)
理查德(Richard)2010年

@Richard严重的问题:如果运行此命令,是否会导致堆栈溢出?
Mark C

6

不是两行,但我想说这是很有名的:

void swap(float* x, float* y)
{
    float t;
    t = *x;
    *x = *y;
    *y = t;
}

实际上,某些语言可以用一行描述它。Lua浮现在脑海,但还有更多。

x, y = y, x

绝对有名!
BeachRunnerJoe 2010年

7
带有整数:a ^ = b ^ = a ^ = b;
JulioC

我很好奇这是如何实现的?它会创建一个临时表(y,x),然后将x分配给第一个元素,将y分配给第二个元素吗?
tactoth

我也想知道人们在现实生活编程中多久交换一次价值。
tactoth

1
@tactoth-交换通常用于在C ++中实现严格的异常安全分配。
卡兹巨龙

6

我最喜欢的lambda演算示例是Y组合器:

Y = λf.(λx.f (x x)) (λx.f (x x))

6

通过K&R的练习这是一个函数,该函数将返回给定数字中设置的位数。58个字符:

int bits(int n){int b=0;while(n){n=n&(n-1);b++;}return b;}

它花费的时间与设置的位数成正比。这里的“啊哈”部分是

n = n & (n - 1)

从中删除最右边的设置位n


很棒,很好的K&R参考!
BeachRunnerJoe 2010年

6

一行中的递归Pascal三角形(Haskell)

  r n=take(n+1)$iterate(\a->zipWith(+)(0:a)$a++[0])[1]

52个字符,增加了品味的空间。评论中的“ Ephemient”礼貌这里

我认为这是一个比JK中神秘但简短的解决方案更好的示例(尽管我还不是Haskell用户)。


6

Unix轮盘(危险!)

礼貌用语中Bigown的回答(以及评论):

[ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo Click #Roulette

(长度为62个字符,因此您可以删除注释(这样行吗?)或一些不必要的空格。)


2
请将此标记为危险。
Chinmay Kanchi 2010年

我使用zsh,除非s / == /
-eq


4
DO 10 I=1.3

这是历史上最昂贵的错误之一。此Fortran语句将浮点值1.3分配给名为的变量DO10I

正确的代码-循环重复语句的标题,直到标记为10的语句为止,并且循环变量I接受值1、2、3:

DO 10 I=1,3

1
为什么它是一个昂贵的错误?
巴里·布朗

2
该错误在一个子例程中,该子例程计算了1961年Mercury太空飞行的轨道轨迹。但是,它是在发布之前被捕获并修复的,因此不是代价昂贵的错误。不过,水手任务中有类似的错误,但确实导致任务失败。(来源:专家C编程,第31-32页。)
Darel

4

Duff的装置

void send(short *to, short *from, int count)
{
    int n = (count +7 ) / 8;

    switch (count % 8) {
    case 0: do {    *to = *from++;
    case 7:         *to = *from++;
    case 6:         *to = *from++;
    case 5:         *to = *from++;
    case 4:         *to = *from++;
    case 3:         *to = *from++;
    case 2:         *to = *from++;
    case 1:         *to = *from++;
        } while(--n > 0);
    }
}

汤姆·达夫(Tom Duff)展开了一个内存映射的端口写入世界上所见过的最奇怪的C构造之一。


它不能容纳60个字符,但是def很酷。我记得看到他的名字在一些皮克斯电影的片尾里溜走时感到不寒而栗。
Macneil 2010年

2

与“ Hello World”有关的一切都浮现在脑海。如果计划存储多种语言,则可以采用不同的变体。

对于不平凡的东西,有斐波那契


1
斐波那契,太好了!这是代码...如果(k <2)返回k;否则返回fib(k-1)+ fib(k-2);
BeachRunnerJoe

1
@BeachRunnerJoe:您可能希望将其与条件运算符结合使用;)
back2dos 2010年

3
确实是的!返回(k <2)吗?k:fib(k-1)+ fib(k-2);
BeachRunnerJoe

2
val (minors, adults) = people.partition(_.age < 18)

上面的Scala代码分区行peoplePerson)基于它们各自的年龄分为两个列表。

在Java中执行相同的操作需要花费大量的代码:

List<Person> minors = new ArrayList<Person>();
List<Person> adults = new ArrayList<Person>();
for(Person p : people) {
  if(p.age < 18) {
    minors.add(p);
  } else {
    adults.add(p);
  }
}

2

交换两个变量的值而不使用第三个变量。这是我被告知并认为“嗯...太酷了”的编程中的第一件事。

int a,b; 
b=a-b;
a=a-b;
b=a+b;

我知道您可以使用XORs 做到这一点,但这是我今天的怀旧之情:)
Jonathon 2010年

XOR溢出没有问题。做这个?
工作

2

约翰·卡马克的黑魔法

float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // evil floating point bit level hacking
    i  = 0x5f3759df - ( i >> 1 );               // what the ****?
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//  y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

    return y;
}

2

可以由8字节(Python)表示的最大数字

print '\n'.join("%i Byte = %i Bit = largest number: %i" % (j, j*8, 256**j-1) for j in (1 << i for i in xrange(8)))

1
  1. 条件运算符

    minVal =(a <b)?a:b;

  2. 开关盒

  3. for-each循环 [Java]


1
实际上,条件运算符是正确的名称。如果一个运算符带有三个参数,则它是三元的。
back2dos

@ back2dos-实际上,C#和JavaScript都将其称为条件运算符。
ChaosPandion 2010年

@ back2dos-?:运算符确实带有三个参数,这就是为什么它被称为三元运算符。从C开始,这是正确的术语。(根据Wikipedia的说法,显然是从BCPL开始的)
grkvlt 2010年

@grkvlt:我从未说过它不需要三个参数。只是您不会调用!一元运算符或+二进制运算符。这根本不准确。
back2dos

1
@ back2dos-我认为这是我们的问题- 在这种情况下,我苹果称为“水果”,但是我认为我们在争论语法,而不是编程语言语法,并且您是对的,这?:是条件运算符;)
grkvlt

1

奎因行话文件在C:

char * f =“ char * f =%c%s%c; main(){printf(f,34,f,34,10);}%c”; main(){printf(f,34,f, 34,10);}

这里也有一个LISP版本,但是您可以找到许多其他版本,几乎可以用任何您能想象的语言来表达...


1

链接数学世界中最美丽的数字的欧拉身份:1、0,e,i和π:e ^ i(π)+1 = 0



1
int gcd(int a, int b)
{
   while(b>0)
   {
      int t = a%b;
      a=b;
      b=t;
   }
   return a;
}

可能并不出名,但我的最爱之一。在大多数情况下,尚不清楚为什么它起作用。


1

这有点超过60个字符,但实际上取决于变量的命名(所以我包括了它!)

让readLines(rdr:StreamReader)=
      seq {而不是rdr.EndOfStream会
                产生rdr.ReadLine()}

不错的小功能,可以在F#中逐行将文件读入序列。

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.