Quais são alguns dos programas e equações famosos de uma ou duas linhas? [fechadas]


22

Estou experimentando uma nova plataforma e estou tentando escrever um programa que lida com seqüências de caracteres com mais de 60 caracteres e gostaria de preencher o armazenamento de dados com alguns pequenos pedaços de código famosos e conhecidos e equações, já que programação e matemática combinam com o tema do meu software. O código pode estar em qualquer idioma e nas equações de qualquer disciplina da matemática, desde que tenham menos de um total de 60 caracteres. Eu suspeito que as pessoas vão começar uma foda cerebral por este.

Por exemplo,

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

60 caracteres exatamente!

Muito obrigado pela sua sabedoria!


22
Por que o cérebro foi censurado? Não podemos ser adultos e não contar a todos o que eles podem e não podem ler? Nesse contexto, brainf k não é uma obscenidade.
ChaosPandion

2
Eu suspeito que esta questão será encerrada. Tente melhorá-lo para ser mais construtivo. Veja: blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero

8
@ Bigown: Este é um bom subjetivo e é construtivo. Não é diferente de pedir citações famosas. Na verdade, é melhor, porque está pedindo "citações" famosas de código / equação. :-)
Macneil

@ Macneil: Eu acho o mesmo, mas a pergunta é ruim, pode ser melhorada.
Maniero

3
@ Bigown: honestamente, eu realmente não posso ver como esta questão poderia ser mais construtiva. Para não duvidar de você, você pode sugerir uma melhoria no @BeachRunnerJoe? Na verdade, gostei muito das respostas e aprendi muito com elas. Eu adoraria ver essa pergunta reabrir.
JORIS MEYS #

Respostas:


34

A rotina clássica de cópia da cadeia C é conhecida por cada vez menos pessoas nesses dias:

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

3
sim, muito famoso ... para os veteranos!
precisa

13
Embora eu entenda que tem valor "histórico" é terrível código terrível, então o fato de que ele está caindo em desuso é uma coisa boa =)
Thomas Bonini

9
O veterano da CA reconheceria o padrão imediatamente. É idiomática C.
Barry Brown

6
Sempre achei isso incrivelmente legal.
Maulrus 7/11

5
Devo dizer que concordo com o @Kop. Em apenas alguns caracteres, ele mostra falhas significativas de sua lib padrão e sua semântica. Uma das coisas mais absurdas é que as strings são terminadas em 0 em vez de prefixadas em comprimento (o que é mais seguro e torna a determinação do comprimento de uma sequência O (1)). A segunda coisa é que C não possui valores booleanos reais (que corrigem a if (alarm = red) launchNukes();armadilha). Dijkstra consideraria esse código mais do que prejudicial. Concordo que é imperativo para um programador C entender pelo menos esse código, mas acho que é mais importante que ele saiba como fazê-lo melhor.
Novidade

26

não uma linha, mas apresento o último bug do mundo C:

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

2
Esse é um daqueles "Oh sh * t!" erros.
the Tin Man

3
éLaunchNukes();
hasen

1
se isso foi escrito como: if (GetRadarInfo () = 1) {...}, não receberíamos esse bug porque ele não é compilado. Portanto, nem sempre introduza variável intermediária.
precisa saber é

22

Vejo o jogo da vida de Conway na APL flutuando bastante:

Um bônus extra é que isso garantirá que você esteja manipulando o unicode corretamente.


2
ha! essa foi a primeira coisa que pensei quando vi seu código, legal!
precisa

Uau, isso é impressionante!
FinnNk


15
E eu pensei que Perl parecia um ruído de linha.
o homem de lata

1
@ Greg, espere, o APL usa mais do que os alfabetos romano e grego porque não havia letras e símbolos suficientes; backspace (mais apropriadamente chamado de "overstrike") também é usado porque alguns caracteres precisam ser digitados sobre outros caracteres. Um deles era um símbolo de divisão no topo de um quadrado, que representava inversão da matriz (se operador unário, ou multiplicação pela matriz invertida, se usado como operador binário).
Tangurena

19

Uma versão modificada de um famoso liner Perl:

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

Essa expressão regular corresponde a strings cujo comprimento é primo.

A versão original é:

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

que corresponde a cadeias que consistem em um número primo de 1s.


14

Ordenação rápida:

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

Se a lista estiver vazia, o resultado classificado será a lista vazia.

Se a lista começar com o elemento xo restante da lista for xs, o resultado classificado será a lista composta pela lista classificada com todos os elementos em xs menores que x concatenados com o elemento x concatenado com a lista classificada de todos elementos em xs maiores que x.

(ou em outras palavras - divida em duas pilhas, todas menores que x e maiores que x, classifique as duas e crie uma lista com a pilha menor que, o elemento x e a pilha maior que).

Supera a compreensibilidade da versão C com bastante facilidade.


1
Este é o ML padrão? Ou Haskell?
Barry Brown

3
Haskell. Eu gosto da mentalidade da linguagem.

Eu gosto da alternativa de particionamentoqsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Kendall Hopkins

1
Existe uma versão disso que usa um pivô aleatório em vez do cabeçalho da lista? Isso o aproximaria do original do CAR Hoare.
Macneil

1
Hoare diz "O item escolhido [como elemento pivô] ... deve sempre ser o que ocupa os locais mais endereçados do segmento a ser particionado. Se houver medo de que isso tenha um resultado prejudicial não aleatório, um o item escolhido aleatoriamente deve ser inicialmente colocado nos locais mais endereçados ". Para ser fiel a Hoare, devemos trabalhar com o último elemento, não o primeiro.


13

Quando descobri o bash forkbomb, achei muito legal.

:(){ :|:& };:

Uau, isso é apenas o mal!
Macneil 11/11

Olhe para todos os smilies! Você poderia chamar isso de "A bomba Smiley!"
Mark C


10

Como você menciona equações, essa pertence à sua lista:

e^{i\pi}+1=0

( Wolfram Alpha renderização : ei pi + 1 = 0)


Sim! Bom e velho Euler, outro bom!
precisa

Lembro-me disso comoe^{i/pi} = i^2
Josh K

@ Josh K: Isso porque i² == -1, para que você possa equilibrar a equação subtraindo uma de ambos os lados, removendo +1e alterando a =0para -1ou
Daenyth

7

Como detectar números pares:

x % 2 == 0

3
Ou !(x%2)em idiomas sãos.
Christian Mann

8
Ou !(x & 1)em idiomas sem otimizar o compilador.
JFS

1
@ Cristão, os números não devem ser booleanos - é muito fácil cometer um erro.

7

import this em Python.


EDITAR como os comentários não podem conter quebras de linha: para aqueles sem um interpretador Python à mão, esta é a saída

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!

Sou iniciante em Python. O que isso alcançaria?
Richard

1
@ Richard: Tente escrever isso no interpretador interativo Python :).
MAK

Isso animou o meu domingo à tarde :)
Richard

@ Richard Pergunta séria: Se você executar isso, isso causa um estouro de pilha?
Mark C

6

Não são exatamente 2 linhas, mas eu diria que isso é bastante famoso:

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

Na verdade, alguns idiomas podem descrevê-lo em uma linha. Lua vem à mente, mas há mais.

x, y = y, x

definitivamente famoso!
precisa

7
com ints: a ^ = b ^ = a ^ = b;
JulioC

Só estou curioso como isso é implementado? ele cria uma tabela temporária (y, x), depois atribui x o primeiro elemento e y o segundo elemento?
Tactoth #

Também estou me perguntando com que frequência as pessoas trocam valores na programação da vida real.
Tactoth #

1
@tactoth - A troca é comumente usada para implementar uma atribuição segura de exceção forte em C ++.
Kaz Dragon

6

Meu exemplo de cálculo lambda favorito é o combinador Y:

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

6

De um exercício de K&R, aqui está uma função que retornará quantos bits estão definidos no número fornecido. Com 58 caracteres:

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

Leva um tempo proporcional ao número de bits definido. A parte "ah ha" aqui é que

n = n & (n - 1)

Remove o bit definido à direita de n.


Referência K&R impressionante e agradável!
precisa

6

Triângulo de Pascal recursivo em uma linha (Haskell)

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

Cinqüenta e dois caracteres, adicione espaços a gosto. Cortesia de "Ephemient" no comentário aqui .

Eu pensei que este era um exemplo melhor do que as soluções enigmáticas, mas breves, em J e K (embora ainda não seja usuário de Haskell).


6

Roleta Unix (PERIGO!)

Cortesia da resposta de Bigown no tópico da piada (e no comentário):

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

(Possui 62 caracteres, para que você possa remover o comentário (funcionaria dessa maneira?) Ou alguns espaços não essenciais.)


2
Por favor, marque isso como perigoso.
Chinmay Kanchi

Eu uso zsh e ele não funciona, a menos s / == / - eq / :-)
defhlt

5

Sequência infinita de Fibonacci (Haskell)

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Por que não fibs = 0 : scanl (+) 0 fibs?
FUZxxl

4
DO 10 I=1.3

Este é um dos bugs mais caros da história. Essa instrução Fortran atribui o valor flutuante de 1,3 à variável denominadaDO10I .

O código correto - o cabeçalho do loop que repete as instruções até que a instrução rotule 10 e a variável do loop que Iaceite os valores 1, 2, 3:

DO 10 I=1,3

1
Por que é um bug caro?
Barry Brown

2
Esse bug estava em uma sub-rotina que calculava trajetórias orbitais para um vôo espacial Mercury de 1961. No entanto, ele foi capturado e corrigido antes do lançamento e, portanto, não era um bug caro. Houve um erro semelhante em uma missão Mariner que fez causa fracasso da missão, no entanto. (fonte: Expert C Programming , páginas 31-32.)
Darel

4

Dispositivo de 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 desenrolou uma gravação de porta mapeada em memória em uma das construções C mais bizarras que o mundo já viu.


Não se encaixa em 60 caracteres, mas é legal. Lembro-me de sentir calafrios ao ver seu nome rolar nos créditos de algum filme da Pixar.
Macneil

2

Tudo a ver com o Hello World vem à mente. Você pode optar por variações diferentes se planejar armazenar vários idiomas.

Para algo mais não trivial, há Fibbonacci .


1
Fibbonacci, bom! Aqui está o código ... if (k <2) retorna k; caso contrário, retorna fib (k-1) + fib (k-2);
precisa

1
@BeachRunnerJoe: você pode querer combinar isso com o operador condicional;)
back2dos

3
sim, de fato! retornar (k <2)? k: fib (k-1) + fib (k-2);
precisa

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

A linha acima de partições de código Scala people(uma lista de Persons) em duas listas com base em suas respectivas idades.

É necessário muito código para fazer a mesma coisa em 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

Trocar os valores de duas variáveis ​​sem usar uma terceira variável. Esta é uma das primeiras coisas na programação que me disseram e pensei "Hmm ... isso é legal"

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

Eu sei que você pode fazer isso usando XORs, mas este foi o meu pouco de nostalgia para hoje :)
Jonathon

XOR não tem nenhum problema com estouro. Faz isso?
Job

2

Magia negra de John Carmack

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

O maior número que pode ser representado por 8 bytes (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. Operador condicional :

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

  2. Switch case

  3. para cada loop [Java]


1
Na verdade, operador condicional é o nome correto. Um operador é ternário se precisar de três argumentos.
back2dos

@ back2dos - De fato, C # e JavaScript chamam isso de operador condicional.
ChaosPandion

@ back2dos - O operador?: usa três argumentos, e é por isso que é chamado de operador ternário. Essa tem sido a terminologia correta de C em diante. (aparentemente a partir de BCPL, de acordo com a Wikipedia ...)
grkvlt

@grkvlt: Eu nunca disse que não é preciso três argumentos. É que você não chamaria !o operador unário ou +o operador binário. Simplesmente não é exato.
back2dos

1
@ back2dos - Acho que este é o nosso problema - eu iria consultar a maçã como "o fruto" nessa situação, mas eu acho que nós estamos discutindo gramática, não de programação sintaxe da linguagem, e você está correto que ?:é o operador condicional;)
grkvlt

1

Este Quine do arquivo Jargon em C:

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

Também existe uma versão LISP, mas você pode encontrar muitas outras por aí, em praticamente qualquer idioma que possa imaginar ...


1

identidade de euler que liga os números mais bonitos do universo matemático: 1, 0, e, ie π: e ^ i (π) + 1 = 0



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

Provavelmente não é famoso, mas um dos meus favoritos. Para a maioria, não é imediatamente aparente por que funciona.


1

Isso tem um pouco mais de 60 caracteres, mas realmente depende da nomeação de variáveis ​​(por isso estou incluindo!)

deixe readLines (rdr: StreamReader) =
      seq {enquanto não rdr.EndOfStream
                produz rdr.ReadLine ()}

Pequena função agradável para ler um arquivo em uma sequência linha por linha em F #.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.