¿Cuáles son algunos de los famosos programas y ecuaciones de una o dos líneas? [cerrado]


22

Estoy experimentando con una nueva plataforma y estoy tratando de escribir un programa que trate con cadenas que no tengan más de 60 caracteres y me gustaría llenar el almacén de datos con algunos pequeños fragmentos de código famosos o conocidos y ecuaciones, ya que la programación y las matemáticas van junto con el tema de mi software. El código puede estar en cualquier idioma y las ecuaciones de cualquier disciplina matemática, siempre que tengan menos de 60 caracteres de longitud. Sospecho que la gente va a romper un poco de cerebro por este.

Por ejemplo,

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

¡60 caracteres exactamente!

¡Muchas gracias por tu sabiduría!


22
¿Por qué se censuró el cerebro ? ¿No podemos ser adultos y no decirles a todos lo que pueden y no pueden leer? En este contexto, brainf k no es una obscenidad.
ChaosPandion

2
Sospecho que esta pregunta se cerrará. Intenta mejorarlo para ser más constructivo. Ver: blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero

8
@bigown: Este es un buen subjetivo y es constructivo. No es diferente a pedir citas famosas. De hecho, es mejor, porque está pidiendo famosas "citas" de código / ecuación. :-)
Macneil

@ Macneil: Pienso lo mismo, pero la pregunta es pobre, se puede mejorar.
Maniero

3
@bigown: honestamente, realmente no puedo ver cómo esta pregunta podría ser más constructiva. Sin dudarlo más o menos, pero muy sinceramente preguntado, ¿podría sugerir una mejora para @BeachRunnerJoe? De hecho, disfruté mucho las respuestas y aprendí mucho de ellas. Me encantaría volver a abrir esta pregunta.
Joris Meys, el

Respuestas:


34

La rutina clásica de copia de cadenas en C es conocida por cada vez menos personas estos días:

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

3
sí, muy famoso ... ¡a los veteranos!
BeachRunnerJoe

13
Si bien entiendo que tiene un valor "histórico", es un código terrible terrible, por lo que el hecho de que esté cayendo en desuso es algo bueno =)
Thomas Bonini

99
El veterano de AC reconocería el patrón de inmediato. Es idiomático C.
Barry Brown

66
Siempre pensé que esto era increíblemente genial.
Maulrus

55
Debo decir que estoy de acuerdo con @Kop. En solo unos pocos caracteres, muestra fallas significativas de su lib estándar y su semántica. Una de las cosas más absurdas es que las cadenas tienen terminación 0 en lugar de un prefijo de longitud (que es más seguro y determina la longitud de una cadena O (1)). Lo segundo es que C no tiene valores booleanos reales (lo que corrige elif (alarm = red) launchNukes(); trampa). Dijkstra consideraría este código más que dañino. Estoy de acuerdo en que es imprescindible que un programador de C entienda al menos este código, pero creo que es más importante para él saber cómo hacerlo mejor.
back2dos

26

no una línea, pero presento The Last C C Bug del mundo:

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

2
Ese es uno de esos "¡Oh, mierda!" errores
el hombre de hojalata

3
esLaunchNukes();
hasen

1
si eso se ha escrito como: if (GetRadarInfo () = 1) {...}, no obtendríamos este error porque no se compila. Por lo tanto, no siempre introduzca una variable intermedia.
tactoth

22

Veo el juego de la vida de Conway en APL flotando mucho:

Una ventaja adicional es que esto asegurará que esté manejando Unicode correctamente.


2
¡decir ah! eso fue lo primero que pensé cuando vi tu código, ¡bien!
BeachRunnerJoe

Wow, eso es impresionante!
FinnNk


15
Y pensé que Perl parecía ruido de línea.
The Tin Man

1
@ Greg, solo espera, APL usa más que los alfabetos romano y griego porque ya no había suficientes letras y símbolos; la retroceso (más propiamente llamada "sobrecarga") también se usa porque algunos caracteres deben escribirse encima de otros caracteres. Uno de ellos era un símbolo de división en la parte superior de un cuadrado, que representaba la inversión de la matriz (si era un operador unario, o la multiplicación por la matriz invertida si se usaba como operador binario).
Tangurena

19

Una versión modificada de un famoso Perl one-liner:

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

Esta expresión regular coincide con cadenas cuya longitud es primo.

La versión original es:

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

que coincide con cadenas que consisten en un número primo de 1s.


14

Ordenación rápida:

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

Si la lista está vacía, el resultado ordenado es la lista vacía.

Si la lista comienza con el elemento x, y el resto de la lista es xs, entonces el resultado ordenado es una lista que consiste en la lista ordenada que consiste en todos los elementos en xs menos que x concatenados con el elemento x concatenado con la lista ordenada de todos elementos en xs mayores que x.

(o, en otras palabras, divídalos en dos pilas, todas menores que xy todas mayores que x, ordénelas y cree una lista con la pila menor que, el elemento xy la pila mayor que).

Supera la comprensibilidad de la versión C con bastante facilidad.


1
¿Esto es ML estándar? O Haskell?
Barry Brown el

3
Haskell Me gusta la mentalidad del lenguaje.

Me gusta la alternativa de particiónqsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Kendall Hopkins, el

1
¿Existe una versión de esto que use un pivote aleatorio en lugar del encabezado de la lista? Eso lo acercaría al original de CAR Hoare.
Macneil

1
Hoare dice: "El elemento elegido [como elemento pivote] ... siempre debe ser el que ocupa las ubicaciones más altas del segmento que se va a dividir. Si se teme que esto tendrá un resultado no aleatorio perjudicial, un El elemento elegido al azar debe colocarse inicialmente en las ubicaciones con la dirección más alta ". Entonces, para ser fieles a Hoare, debemos trabajar con el último elemento, no con el primero.


13

Cuando descubrí por primera vez el bash forkbomb, pensé que era realmente dulce.

:(){ :|:& };:

Wow, eso es simplemente malvado!
Macneil

¡Mira todas las caritas! Podrías llamar a esto "¡La bomba Smiley!"
Mark C


10

Como mencionas ecuaciones, esta pertenece a tu lista:

e^{i\pi}+1=0

( Wolfram Alpha renderizado : ei pi + 1 = 0)


Si lo hace! ¡Buen viejo Euler, otro bueno!
BeachRunnerJoe

Recuerdo esto comoe^{i/pi} = i^2
Josh K

@Josh K: Eso se debe a i² == -1que puedes equilibrar la ecuación restando uno de ambos lados, eliminando +1y cambiando =0a -1o
Daenyth

7

Cómo detectar números pares:

x % 2 == 0

3
O !(x%2)en idiomas sanos.
Christian Mann el

8
O !(x & 1)en idiomas sin optimizar el compilador.
jfs

1
@Christian, los números no deberían ser booleanos, es muy fácil cometer un error.

7

import this en Python


EDITAR ya que los comentarios no pueden contener saltos de línea: para aquellos sin un intérprete de Python a mano, esta es la salida

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!

Soy un principiante de Python. ¿Qué lograría esto?
Richard

1
@ Richard: Intente escribir esto en el intérprete interactivo de Python :).
MAK

Esto iluminó mi domingo por la tarde :)
Richard

@Richard Pregunta seria: Si ejecuta esto, ¿le da un desbordamiento de pila?
Mark C

6

No son exactamente 2 líneas, pero diría que esto es bastante famoso:

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

En realidad, algunos idiomas pueden describirlo en una línea. Lua viene a mi mente pero hay más.

x, y = y, x

definitivamente famoso!
BeachRunnerJoe

77
con entradas: a ^ = b ^ = a ^ = b;
JulioC

Tengo curiosidad de cómo se implementa esto? ¿crea una tabla temporal (y, x), luego asigna x el primer elemento yy el segundo elemento?
tactoth

También me pregunto con qué frecuencia las personas intercambian valores en la programación de la vida real.
tactoth

1
@tactoth: el intercambio se usa comúnmente para implementar una asignación segura de excepciones fuertes en C ++.
Kaz Dragon

6

Mi ejemplo favorito de cálculo lambda es el combinador Y:

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

6

De un ejercicio en K&R, aquí hay una función que devolverá cuántos bits se establecen en el número dado. A los 58 caracteres:

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

Lleva tiempo proporcional al número de bits establecido. La parte de "ah ja" aquí es que

n = n & (n - 1)

Elimina el bit de ajuste más a la derecha de n .


¡Impresionante, buena referencia de K&R!
BeachRunnerJoe

6

Triángulo recursivo de Pascal en una línea (Haskell)

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

Cincuenta y dos personajes, agregan espacios al gusto. Cortesía de "Ephemient" en el comentario. aquí .

Pensé que este era un mejor ejemplo que las soluciones crípticas pero breves en J y K (aunque todavía no soy un usuario de Haskell).


6

Ruleta Unix (¡PELIGRO!)

Cortesía de la respuesta de Bigown en el hilo de broma (y el comentario):

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

(Tiene 62 caracteres de longitud, por lo que puede eliminar el comentario (¿funcionaría de esa manera?) O algunos espacios no esenciales).


2
Por favor marque esto como peligroso.
Chinmay Kanchi

Uso zsh y no funciona a menos que s / == / - eq / :-)
defhlt

5

Secuencia de Fibonacci infinita (Haskell)

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

¿Por qué no fibs = 0 : scanl (+) 0 fibs?
FUZxxl

4
DO 10 I=1.3

Este es uno de los errores más caros de la historia. Esta declaración de Fortran asigna el valor flotante de 1.3 a la variable nombrada DO10I.

El código correcto: el encabezado de las declaraciones repetitivas del bucle hasta que la declaración etiquetada 10 y la variable del bucle que Iacepta los valores 1, 2, 3:

DO 10 I=1,3

1
¿Por qué es un error costoso?
Barry Brown

2
Este error estaba en una subrutina que calculaba las trayectorias orbitales para un vuelo espacial Mercury de 1961. Sin embargo, fue detectado y reparado antes del lanzamiento y, por lo tanto, no fue un error costoso. Sin embargo, hubo un error similar en una misión Mariner que causó el fracaso de la misión. (fuente: Programación Expert C , 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 desenrolló una escritura de puerto mapeada en memoria en una de las construcciones en C más extrañas que el mundo haya visto.


No cabe en 60 caracteres, pero definitivamente es genial. Recuerdo sentir escalofríos al ver su nombre pasar en los créditos de alguna película de Pixar.
Macneil

2

Todo lo que tenga que ver con Hello World me viene a la mente. Podría optar por diferentes variaciones si planea almacenar varios idiomas.

Para algo más no trivial, está Fibbonacci .


1
¡Fibbonacci, agradable! Aquí está el código ... if (k <2) devuelve k; de lo contrario, devuelve fib (k-1) + fib (k-2);
BeachRunnerJoe

1
@BeachRunnerJoe: es posible que desee combinar eso con el operador condicional;)
back2dos

3
si de hecho! retorno (k <2)? k: fib (k-1) + fib (k-2);
BeachRunnerJoe

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

La línea anterior de particiones de código Scala people(una lista de Persons) en dos listas basadas en sus respectivas edades.

Se necesita el siguiente código para hacer lo mismo en 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

Intercambiando los valores de dos variables sin usar una tercera variable. Esta es una de las primeras cosas en programación que me dijeron y pensé "Hmm ... eso es genial"

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

Sé que puedes hacer esto usando XORs, pero esta fue mi nostalgia por hoy :)
Jonathon

XOR no tiene problemas con el desbordamiento. ¿Haz esto?
Trabajo

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

El número más grande que puede 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. Interruptor de caja

  3. for-each loop [Java]


1
En realidad, operador condicional es el nombre correcto. Un operador es ternario si toma tres argumentos.
back2dos

@ back2dos: de hecho, tanto C # como JavaScript lo llaman operador condicional.
ChaosPandion

@ back2dos - El: operador? hace tomar tres argumentos, por lo que se llama el operador ternario. Esta ha sido la terminología correcta de C en adelante. (aparentemente a partir de BCPL, según Wikipedia ...)
grkvlt

@grkvlt: Nunca dije que no se necesitan tres argumentos. Es solo que no llamarías !al operador unario o +al operador binario. Simplemente no es exacto.
back2dos

1
@ back2dos - Creo que este es nuestro problema - me gustaría hacer referencia a la manzana como "fruto" en esa situación, pero creo que estamos discutiendo la gramática, la sintaxis del lenguaje de programación no, y usted razón en que ?:es el operador condicional;)
grkvlt

1

Este Quine del archivo de jerga en C:

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

También hay una versión LISP allí, pero puedes encontrar muchas otras flotando, en casi cualquier idioma que puedas imaginar ...


1

identidad de euler que une los números más bellos del universo matemático: 1, 0, e, i y π: e ^ i (π) + 1 = 0



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

Probablemente no famoso, pero uno de mis favoritos. Para la mayoría, no es inmediatamente evidente por qué funciona.


1

Esto tiene un poco más de 60 caracteres, pero realmente depende de los nombres variables (¡así que lo incluyo!)

deje que readLines (rdr: StreamReader) =
      seq {mientras que no rdr.EndOfStream
                produzca rdr.ReadLine ()}

Pequeña y agradable función para leer un archivo en una secuencia línea por línea en F #.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.