Quali sono alcuni famosi programmi ed equazioni a una o due linee? [chiuso]


22

Sto sperimentando una nuova piattaforma e sto provando a scrivere un programma che si occupa di stringhe non più lunghe di 60 caratteri e mi piacerebbe popolare l'archivio dati con alcuni piccoli pezzi di codice famosi o noti e equazioni, dal momento che la programmazione e la matematica seguono il tema del mio software. Il codice può essere in qualsiasi lingua e le equazioni di qualsiasi disciplina matematica, purché siano lunghe meno di un totale di 60 caratteri. Ho il sospetto che la gente scoppierà un po 'di cervello per questo.

Per esempio,

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

60 caratteri esattamente!

Grazie mille per la tua saggezza!


22
Perché Brainf K è stato censurato? Non possiamo essere adulti e non dire a tutti cosa sanno e cosa non sanno leggere? In questo contesto brainf k non è un'oscenità.
ChaosPandion,

2
Sospetto che questa domanda sarà chiusa. Prova a migliorarlo per essere più costruttivo. Vedi: blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero

8
@bigown: questo è un buon soggettivo ed è costruttivo. Non è diverso dal chiedere citazioni famose. In effetti, è meglio, perché sta chiedendo il famoso codice / equazione "virgolette". :-)
Macneil,

@Macneil: penso lo stesso, ma la domanda è scarsa, può essere migliorata.
Maniero,

3
@bigown: onestamente, non riesco davvero a vedere come questa domanda potrebbe essere più costruttiva. Non dubitare di te o così, ma molto sinceramente chiesto, potresti suggerire un miglioramento a @BeachRunnerJoe? In realtà mi sono piaciute molto le risposte e ho imparato molto da loro. Mi piacerebbe vedere riaprire questa domanda.
Joris Meys,

Risposte:


34

La classica routine di copia di stringhe C è conosciuta da sempre meno persone in questi giorni:

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

3
sì, molto famoso ... per i veterani!
BeachRunnerJoe,

13
Mentre capisco che ha un valore "storico" è un codice terribile terribile, quindi il fatto che stia cadendo in disuso è una buona cosa =)
Thomas Bonini,

9
Il veterano AC riconoscerebbe immediatamente il modello. È idiomatico C.
Barry Brown,

6
Ho sempre pensato che fosse incredibilmente bello.
Maulrus,

5
Devo dire che sono d'accordo con @Kop. In pochi caratteri, mostra difetti significativi della sua lib standard e della sua semantica. Una delle cose più assurde sono le stringhe con terminazione 0 anziché prefisso di lunghezza (che è più sicuro e rende determinante la lunghezza di una stringa O (1)). La seconda cosa è che C non ha valori booleani effettivi (che corregge il if (alarm = red) launchNukes();-trap). Dijkstra considererebbe questo codice più che dannoso. Sono d'accordo che sia indispensabile per un programmatore C comprendere almeno questo codice, ma penso che sia più importante per lui saperlo fare meglio.
back2dos,

26

non una riga, ma presento The Last Last C Bug:

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

2
Questa è una di quelle "Oh merda!" errori.
Tin Man,

3
èLaunchNukes();
hasen il

1
se è stato scritto come: if (GetRadarInfo () = 1) {...}, non avremmo questo bug perché non viene compilato. Quindi non introdurre sempre variabili intermedie.
Tattoth il

22

Vedo Conway's Game of Life in APL fluttuare molto intorno:

Un ulteriore vantaggio è che questo assicurerà la corretta gestione dell'unicode.


2
ah! questa è la prima cosa che ho pensato quando ho visto il tuo codice, bello!
BeachRunnerJoe

Wow, è impressionante!
FinnNk,


15
E pensavo che Perl sembrasse un rumore di linea.
Tin Man,

1
@Greg, aspetta, APL usa più degli alfabeti romani e greci perché non c'erano già abbastanza lettere e simboli; backspace (più propriamente chiamato "overstrike") viene utilizzato anche perché alcuni caratteri devono essere digitati sopra altri caratteri. Uno di questi era un simbolo di divisione in cima a un quadrato, che rappresentava l'inversione della matrice (se operatore unario, o la moltiplicazione per la matrice invertita se veniva usato come operatore binario).
Tangurena,

19

Una versione modificata di un famoso one-liner Perl:

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

Questa espressione regolare corrisponde a stringhe la cui lunghezza è primaria.

La versione originale è:

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

che corrisponde a stringhe costituite da un numero primo di 1s.


14

quicksort:

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

Se l'elenco è vuoto, il risultato ordinato è l'elenco vuoto.

Se l'elenco inizia con l'elemento x e il resto dell'elenco è xs, il risultato ordinato è un elenco costituito dall'elenco ordinato costituito da tutti gli elementi in xs inferiori a x concatenati con l'elemento x concatenato con l'elenco ordinato di tutti elementi in xs più grandi di x.

(o in altre parole: dividere in due pile, tutte inferiori a x e tutte più grandi di x, ordinarle entrambe e creare un elenco con il mucchio minore di, l'elemento xe il mucchio maggiore di).

Batte abbastanza facilmente la comprensibilità della versione C.


1
Questo è Standard ML? O Haskell?
Barry Brown,

3
Haskell. Mi piace la mentalità della lingua.

Mi piace l'alternativa al partizionamentoqsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Kendall Hopkins,

1
Esiste una versione di questo che utilizza un perno casuale anziché il capo dell'elenco? Ciò lo renderebbe più vicino all'originale CAR Hoare.
Macneil,

1
Hoare dice "L'elemento scelto [come elemento pivot] ... dovrebbe sempre essere quello che occupa le posizioni più alte del segmento che deve essere partizionato. Se si teme che ciò avrà un risultato dannosamente non casuale, un l'elemento scelto a caso dovrebbe essere inizialmente collocato nelle posizioni più indirizzate ". Quindi, per essere fedeli a Hoare, dovremmo lavorare con l'ultimo elemento, non il primo.


13

Quando ho scoperto per la prima volta il forkbomb di bash, ho pensato che fosse davvero dolce.

:(){ :|:& };:

Wow, è solo un male!
Macneil,

Guarda tutte le faccine! Potresti chiamarla "La bomba di smiley!"
Marco C,


10

Poiché menzioni le equazioni, questa appartiene al tuo elenco:

e^{i\pi}+1=0

( Wolfram Alpha di rendering : ei pi + 1 = 0)


Sì lo fa! Buon vecchio Eulero, un altro buono!
BeachRunnerJoe

Lo ricordo comee^{i/pi} = i^2
Josh K

@Josh K: Questo perché i² == -1, così puoi bilanciare l'equazione sottraendo uno da entrambi i lati, rimuovendo +1e cambiando =0in -1o
Daenyth

7

Come rilevare i numeri pari:

x % 2 == 0

3
O !(x%2)in lingue sane.
Christian Mann,

8
O !(x & 1)in lingue senza ottimizzare il compilatore.
jfs,

1
@Christian, i numeri non dovrebbero essere booleani - troppo facili per sbagliare.

7

import this in Python.


EDIT come commenti non possono contenere interruzioni di riga: per quelli senza un interprete Python a portata di mano, questo è l'output

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!

Sono un principiante di Python. Cosa raggiungerebbe questo?
Richard,

1
@Richard: prova a scrivere questo nell'interprete interattivo Python :).
MAK,

Questo ha illuminato la mia domenica pomeriggio :)
Richard

@Richard Domanda seria: se esegui questo, ti dà uno stack overflow?
Segna C

6

Non abbastanza 2 righe ma direi che questo è abbastanza famoso:

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

In realtà alcune lingue possono descriverlo in una riga. Mi viene in mente Lua ma ce ne sono altri.

x, y = y, x

sicuramente famoso!
BeachRunnerJoe

7
con ints: a ^ = b ^ = a ^ = b;
JulioC,

Sono solo curioso di come viene implementato? crea una tabella temporanea (y, x), quindi assegna x il 1o elemento y il 2o elemento?
Tattoth

Mi chiedo anche quanto spesso le persone scambiano valori nella programmazione della vita reale.
Tattoth

1
@tactoth - Lo scambio viene comunemente utilizzato per implementare assegnazioni sicure con eccezionale eccezione in C ++.
Kaz Dragon

6

Il mio esempio di calcolo lambda preferito è il combinatore Y:

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

6

Da un esercizio in K&R, ecco una funzione che restituirà quanti bit sono impostati nel numero indicato. A 58 caratteri:

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

Richiede un tempo proporzionale al numero di bit impostati. La parte "ah ah" qui è quella

n = n & (n - 1)

Rimuove il bit impostato più a destra da n .


Ottimo riferimento K&R!
BeachRunnerJoe,

6

Triangolo ricorsivo di Pascal in una linea (Haskell)

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

Cinquantadue personaggi, aggiungono spazi a piacere. Per gentile concessione di "Ephemient" nel commento qui .

Ho pensato che questo fosse un esempio migliore delle soluzioni criptiche ma brevi in J e K (anche se non sono ancora un utente Haskell).


6

Unix Roulette (PERICOLO!)

Per gentile concessione della risposta di Bigown nel thread joke (e nel commento):

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

(Sono lunghi 62 caratteri, quindi puoi rimuovere il commento (funzionerebbe in questo modo?) O alcuni spazi non essenziali.)


2
Si prega di contrassegnarlo come pericoloso.
Chinmay Kanchi,

Uso zsh e non funziona a meno che s / == / - eq / :-)
defhlt

5

Sequenza infinita di Fibonacci (Haskell)

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

Perché no fibs = 0 : scanl (+) 0 fibs?
FUZxxl,

4
DO 10 I=1.3

Questo è uno dei bug più costosi della storia. Questa istruzione Fortran assegna il valore float di 1,3 alla variabile denominata DO10I.

Il codice corretto: l'intestazione delle istruzioni ripetute del ciclo fino a quando l'istruzione è etichettata 10 e la variabile del ciclo Iaccetta i valori 1, 2, 3:

DO 10 I=1,3

1
Perché è un bug costoso?
Barry Brown,

2
Questo errore si trovava in una subroutine che calcolava le traiettorie orbitali per un volo spaziale Mercury del 1961. Tuttavia, è stato catturato e risolto prima del lancio e quindi non era un bug costoso. C'era un bug simile in una missione Mariner che ha fatto fallimento causa della missione, però. (fonte: Programmazione Expert C , pagine 31-32.)
Darel,

4

Dispositivo di 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 srotolò una porta mappata in memoria e scrisse in uno dei costrutti C più bizzarri che il mondo abbia mai visto.


Non si adatta a 60 caratteri, ma è sicuramente bello. Ricordo di aver avuto i brividi nel vedere il suo nome scorrere nei titoli di coda di alcuni film della Pixar.
Macneil,

2

Mi viene in mente qualsiasi cosa abbia a che fare con Hello World. Potresti scegliere diverse varianti se prevedi di memorizzare più lingue.

Per qualcosa di più non banale, c'è Fibbonacci .


1
Fibbonacci, bello! Ecco il codice ... if (k <2) restituisce k; altrimenti restituisce fib (k-1) + fib (k-2);
BeachRunnerJoe,

1
@BeachRunnerJoe: potresti combinarlo con l'operatore condizionale;)
back2dos

3
si Certamente! ritorno (k <2)? k: fib (k-1) + fib (k-2);
BeachRunnerJoe,

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

La riga sopra di partizioni di codice Scala people(un elenco di Persons) in due elenchi in base alle rispettive età.

Ci vuole gran parte del codice seguente per fare la stessa cosa in 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

Scambiare i valori di due variabili senza usare una terza variabile. Questa è una delle prime cose nella programmazione che mi è stato detto e pensato "Hmm ... è fantastico"

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

So che puoi farlo usando XORs, ma questa è stata la mia nostalgia per oggi :)
Jonathon

XOR non ha problemi con l'overflow. Fa questo?
Giobbe

2

Magia nera di 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

Il numero più grande che può essere rappresentato da 8 byte (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. Operatore condizionale :

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

  2. Scatola dell'interruttore

  3. per ogni ciclo [Java]


1
In realtà, l'operatore condizionale è il nome corretto. Un operatore è ternario se accetta tre argomenti.
back2dos,

@ back2dos - In effetti, sia C # che JavaScript lo chiamano operatore condizionale.
ChaosPandion,

@ back2dos - L': operatore? fa prendere tre argomenti, che è il motivo per cui è chiamata l'operatore ternario. Questa è stata la terminologia corretta da C. in poi. (apparentemente a partire da BCPL, secondo Wikipedia ...)
grkvlt

@grkvlt: non ho mai detto che non ci vogliono tre argomenti. È solo che non chiameresti !l'operatore unario o +l'operatore binario. Semplicemente non è esatto.
back2dos

1
@ back2dos - credo che questo è il nostro problema - mi piacerebbe fare riferimento alla mela come "il frutto" in quella situazione, ma penso che stiamo discutendo la grammatica, non di programmazione sintassi del linguaggio, e Lei ha ragione che?: è l'operatore condizionale;)
grkvlt,

1

Questo Quine dal Jargon File in C:

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

Esiste anche una versione LISP, ma puoi trovarne molte altre che fluttuano in giro, in quasi tutte le lingue che potresti immaginare ...


1

identità di eulero che collega i numeri più belli dell'universo matematico: 1, 0, e, i e π: e ^ i (π) + 1 = 0



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

Probabilmente non famoso, ma uno dei miei preferiti. Per la maggior parte non è immediatamente chiaro il motivo per cui funziona.


1

Questo è un po 'più di 60 caratteri, ma dipende davvero dalla denominazione variabile (quindi lo sto includendo!)

lascia readLines (rdr: StreamReader) =
      seq {mentre non rdr.EndOfStream
                produce rdr.ReadLine ()}

Bella piccola funzione per leggere un file in una sequenza riga per riga in F #.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.