Was sind einige berühmte Einzeiler- oder Zweizeilerprogramme und Gleichungen? [geschlossen]


22

Ich experimentiere mit einer neuen Plattform und versuche, ein Programm zu schreiben, das sich mit Strings befasst, die nicht länger als 60 Zeichen sind. Ich möchte den Datenspeicher mit einigen berühmten oder bekannten kleinen Codestücken und füllen Gleichungen, da Programmierung und Mathematik zum Thema meiner Software gehören. Der Code kann in einer beliebigen Sprache und mit Gleichungen aus einer beliebigen mathematischen Disziplin verfasst sein, sofern sie nicht länger als 60 Zeichen sind. Ich vermute, die Leute werden für diesen einen Brainfuck machen .

Beispielsweise,

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

Genau 60 Zeichen!

Vielen Dank für Ihre Weisheit!


22
Warum wurde brainf k zensiert? Können wir nicht Erwachsene sein und nicht allen sagen, was sie lesen können und was nicht? Brainf k ist in diesem Zusammenhang keine Obszönität.
ChaosPandion

2
Ich vermute, diese Frage wird geschlossen. Versuchen Sie es zu verbessern, um konstruktiver zu sein. Siehe: blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero

8
@bigown: Dies ist eine gute subjektive und ist konstruktiv. Es ist nicht anders, als nach berühmten Zitaten zu fragen. In der Tat ist es besser, weil es nach berühmten Code / Gleichung "Anführungszeichen" fragt. :-)
Macneil

@Macneil: Ich denke das gleiche, aber die Frage ist schlecht, es kann verbessert werden.
Maniero

3
@bigown: ehrlich gesagt, ich kann nicht wirklich sehen, wie diese Frage konstruktiver sein könnte. Um nicht zu bezweifeln, aber sehr ehrlich gefragt, könnten Sie eine Verbesserung für @BeachRunnerJoe vorschlagen? Ich habe die Antworten sehr genossen und viel von ihnen gelernt. Ich würde gerne sehen, wie diese Frage wieder geöffnet wird.
Joris Meys

Antworten:


34

Die klassische C-String-Kopierroutine ist an diesen Tagen immer weniger Menschen bekannt:

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

3
ja, sehr berühmt ... bei den Veteranen!
BeachRunnerJoe

13
Obwohl ich verstehe, dass es einen "historischen" Wert hat, ist es schrecklich, schrecklicher Code, und die Tatsache, dass er nicht mehr verwendet wird, ist eine gute Sache =)
Thomas Bonini

9
AC-Veteran würde das Muster sofort erkennen. Es ist idiomatisch C.
Barry Brown

6
Ich fand das immer unglaublich cool.
Maulrus

5
Ich muss sagen, ich stimme mit @Kop überein. In nur wenigen Zeichen zeigt es signifikante Fehler seiner Standardbibliothek und seiner Semantik. Eines der absurdesten Dinge ist, dass Zeichenfolgen mit 0-Abschluss anstatt mit einem Längenpräfix versehen werden (was sicherer ist und die Bestimmung der Länge einer Zeichenfolge O (1) erleichtert). Das zweite ist, dass C keine tatsächlichen Booleschen Werte hat (was die if (alarm = red) launchNukes();-Falle behebt ). Dijkstra würde diesen Code für mehr als schädlich halten. Ich stimme zu, dass ein C-Programmierer diesen Code unbedingt verstehen muss, aber ich denke, es ist wichtiger, dass er weiß, wie er es besser machen kann.
back2dos

26

nicht eine Zeile, aber ich präsentiere The World's Last C Bug:

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

2
Das ist eines dieser "Oh sh * t!" fehler.
der Blechmann

3
es istLaunchNukes();
hasen

1
Wenn dies wie folgt geschrieben wurde: if (GetRadarInfo () = 1) {...}, wird dieser Fehler nicht angezeigt, da er nicht kompiliert wird. Führen Sie also nicht immer eine Zwischenvariable ein.
Takt am

22

Ich sehe Conways Spiel des Lebens in APL viel herumschwirren:

Ein zusätzlicher Bonus ist, dass dies sicherstellt, dass Sie den Unicode korrekt handhaben.


2
Ha! Das war das erste, woran ich dachte, als ich deinen Code sah, nett!
BeachRunnerJoe

Wow, das ist beeindruckend!
FinnNk


15
Und ich dachte, Perl sieht aus wie Leitungsrauschen.
der Blechmann

1
@ Greg, warte, APL verwendet mehr als die lateinischen und griechischen Buchstaben, weil es nicht genug Buchstaben und Symbole gibt. Backspace (besser "Overstrike" genannt) wird ebenfalls verwendet, da einige Zeichen über anderen Zeichen stehen müssen. Ein solches Symbol war ein Divisionssymbol auf einem Quadrat, das die Matrixinversion (wenn es ein unärer Operator ist, oder die Multiplikation mit der invertierten Matrix, wenn es als binärer Operator verwendet wird) darstellte.
Tangurena

19

Eine modifizierte Version eines berühmten Perl-Einzeilers:

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

Dieser reguläre Ausdruck stimmt mit Zeichenfolgen überein, deren Länge prim ist.

Die Originalversion ist:

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

das passt zu Strings, die aus einer Primzahl von 1s bestehen.


14

Schnelle Sorte:

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

Wenn die Liste leer ist, ist das sortierte Ergebnis die leere Liste.

Wenn die Liste mit dem Element x beginnt und der Rest der Liste xs ist, ist das sortierte Ergebnis eine Liste, die aus der sortierten Liste besteht, die aus allen Elementen in xs besteht, die kleiner als x sind, und mit dem Element x verknüpft ist, das mit der sortierten Liste aller Elemente verknüpft ist Elemente in xs größer als x.

(oder mit anderen Worten - teilen Sie in zwei Stapel, alle kleiner als x und alle größer als x, sortieren Sie beide und erstellen Sie eine Liste mit dem Stapel kleiner als, dem Element x und dem Stapel größer als).

Übertrifft die Verständlichkeit der C-Version ganz leicht.


1
Das ist Standard ML? Oder Haskell?
Barry Brown

3
Haskell. Ich mag die Denkweise der Sprache.

Ich mag die Partitionierungsalternativeqsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Kendall Hopkins

1
Gibt es eine Version davon, die einen zufälligen Pivot anstelle des Kopfes der Liste verwendet? Das würde es dem Original von CAR Hoare näher bringen.
Macneil

1
Hoare sagt: "Das ausgewählte Element [als Pivot-Element] ... sollte immer dasjenige sein, das die am höchsten adressierten Stellen des zu partitionierenden Segments einnimmt. Wenn befürchtet wird, dass dies ein schädliches, nicht zufälliges Ergebnis zur Folge hat, a zufällig ausgewähltes Objekt sollte zunächst an den am höchsten adressierten Orten platziert werden ". Um Hoare treu zu bleiben, sollten wir mit dem letzten Element arbeiten, nicht mit dem ersten.

13
  1. Die Ackerman-Funktion . Die Implementierung der Ackermann-Péter-Version sollte in 60 Zeichen passen :)

  2. Diese schöne hexadezimale Konstante: 0x5f3759df. Es ist das Herzstück des WTFing-Codes, den ich je gesehen habe: die schnelle Quadratwurzel .

  3. Der berühmte XOR-Tausch .

  4. question = /(bb|[^b]{2})/


3
+1 für die inverse Quadratwurzel
Macneil

@ Macneil Argh! Ich habe nur daran gedacht.
Mark C

13

Als ich die Bash-Gabelbombe zum ersten Mal herausgefunden habe, fand ich sie wirklich süß.

:(){ :|:& };:

Wow, das ist nur böse!
Macneil

Schau dir alle Smilies an! Man könnte das "Die Smiley-Bombe" nennen!
Mark C


10

Da Sie Gleichungen erwähnen, gehört diese auf Ihre Liste:

e^{i\pi}+1=0

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


Ja tut es! Guter alter Euler, noch ein guter!
BeachRunnerJoe

Ich erinnere mich alse^{i/pi} = i^2
Josh K

@Josh K: Das liegt daran i² == -1, dass Sie die Gleichung ausgleichen können, indem Sie eine von beiden Seiten abziehen, die entfernen +1und die =0auf -1oder
ändern

7

So erkennen Sie gerade Zahlen:

x % 2 == 0

3
Oder !(x%2)in vernünftigen Sprachen.
Christian Mann

8
Oder !(x & 1)in Sprachen, ohne den Compiler zu optimieren.
jfs

1
@Christian, Zahlen sollten keine Booleschen Werte sein - zu einfach, um einen Fehler zu machen.

7

import this in Python.


BEARBEITEN, da Kommentare keine Zeilenumbrüche enthalten dürfen: Für Benutzer ohne einen handlichen Python-Interpreter ist dies die Ausgabe

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!

Ich bin ein Python-Anfänger. Was würde dies bewirken?
Richard

1
@ Richard: Versuchen Sie, dies im interaktiven Python-Interpreter zu schreiben :).
MAK

Das hat meinen Sonntagnachmittag aufgehellt :)
Richard

@ Richard Ernsthafte Frage: Wenn Sie dies ausführen, gibt es Ihnen einen Stapelüberlauf?
Mark C

6

Nicht ganz zwei Zeilen, aber ich würde sagen, das ist ziemlich berühmt:

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

Tatsächlich können einige Sprachen es in einer Zeile beschreiben. Lua kommt in den Sinn, aber es gibt noch mehr.

x, y = y, x

definitiv berühmt!
BeachRunnerJoe

7
mit ints: a ^ = b ^ = a ^ = b;
6.

Ich bin nur gespannt, wie das umgesetzt wird. erstellt es eine temporäre Tabelle (y, x) und weist dann x das 1. Element und y das 2. Element zu?
Takt

Ich frage mich auch, wie oft Menschen in der realen Programmierung Werte austauschen.
Takt

1
@tactoth - Swapping wird häufig zum Implementieren von stark ausnahmesicheren Zuweisungen in C ++ verwendet.
Kaz Dragon

6

Mein Lieblingsbeispiel für eine Lambda-Rechnung ist der Y-Kombinator:

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

6

Aus einer Übung in K & R folgt eine Funktion, die zurückgibt, wie viele Bits in der angegebenen Zahl gesetzt sind. Bei 58 Zeichen:

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

Es dauert eine Zeit, die proportional zur Anzahl der gesetzten Bits ist. Der "ah ha" Teil hier ist das

n = n & (n - 1)

Entfernt das am weitesten rechts gesetzte Bit von n.


Tolle, nette K & R Referenz!
BeachRunnerJoe

6

Rekursives Pascal-Dreieck in einer Zeile (Haskell)

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

Fügen Sie zweiundfünfzig Zeichen nach Belieben Leerzeichen hinzu. Mit freundlicher Genehmigung von "Ephemient" im Kommentar hier .

Ich dachte, dies sei ein besseres Beispiel als die kryptischen, aber kurzen Lösungen in J und K (obwohl ich noch kein Haskell-Benutzer bin).


6

Unix Roulette (GEFAHR!)

Mit freundlicher Genehmigung von Bigowns Antwort im Scherz-Thread (und dem Kommentar):

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

(Das ist 62 Zeichen lang, sodass Sie den Kommentar (würde es so funktionieren?) Oder einige nicht wesentliche Leerzeichen entfernen können.)


2
Bitte kennzeichnen Sie dies als gefährlich.
Chinmay Kanchi

Ich benutze zsh und es funktioniert nur, wenn s / == / - eq / :-)
7.

5

Unendliche Fibonacci-Sequenz (Haskell)

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

Warum nicht fibs = 0 : scanl (+) 0 fibs?
FUZxxl

4
DO 10 I=1.3

Dies ist einer der teuersten Fehler in der Geschichte. Diese Fortran-Anweisung weist der genannten Variablen den Gleitkommawert 1,3 zu DO10I.

Der richtige Code - der Header der sich wiederholenden Schleifenanweisungen bis zur Anweisung mit der Bezeichnung 10 und die Schleifenvariable, Idie die Werte 1, 2, 3 akzeptiert:

DO 10 I=1,3

1
Warum ist es ein teurer Fehler?
Barry Brown

2
Dieser Fehler befand sich in einem Unterprogramm, das die Umlaufbahnen für einen Mercury-Raumflug von 1961 berechnete. Es wurde jedoch vor dem Start abgefangen und behoben und war daher kein kostspieliger Fehler. Es war ein ähnlicher Fehler auf einer Mariner Mission , die tat Ursache Scheitern der Mission, though. (Quelle: Expert C Programming , Seiten 31-32.)
Darel

4

Duffs Gerät :

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 entrollte einen speicherabgebildeten Port, der in eines der bizarrsten C-Konstrukte geschrieben wurde, die die Welt je gesehen hat.


Es passt nicht in 60 Zeichen, aber es ist auf jeden Fall cool. Ich erinnere mich, dass es kalt wurde, als sein Name im Abspann eines Pixar-Films vorbeiging.
Macneil

2

Alles, was mit Hello World zu tun hat, fällt mir ein. Sie können verschiedene Varianten wählen, wenn Sie mehrere Sprachen speichern möchten.

Für etwas Nicht-Trivialeres gibt es Fibbonacci .


1
Fibbonacci, schön! Hier ist der Code ... wenn (k <2) k zurückgibt, sonst fib (k-1) + fib (k-2);
BeachRunnerJoe

1
@ BeachRunnerJoe: Vielleicht möchten Sie das mit dem bedingten Operator kombinieren;)
back2dos

3
ja in der Tat! return (k <2)? k: fib (k-1) + fib (k-2);
BeachRunnerJoe

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

Die obige Zeile von Scala-Code-Partitionen people(eine Liste von Persons) in zwei Listen, basierend auf ihrem jeweiligen Alter.

Um das Gleiche in Java zu tun, ist der folgende Code erforderlich:

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

Tauschen Sie die Werte zweier Variablen aus, ohne eine dritte Variable zu verwenden. Dies ist eines der ersten Dinge in der Programmierung, die mir gesagt wurden und ich dachte "Hmm ... das ist cool"

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

Ich weiß, dass du das mit XORs machen kannst , aber das war mein bisschen Nostalgie für heute :)
Jonathon

XOR hat kein Problem mit Überlauf. Macht dies?
Job

2

Schwarze Magie von 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

Die größte Zahl, die durch 8 Byte (Python) dargestellt werden kann

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. Bedingter Operator :

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

  2. Schaltergehäuse

  3. für jede Schleife [Java]


1
Tatsächlich ist der bedingte Operator der richtige Name. Ein Operator ist ternär, wenn er drei Argumente akzeptiert.
back2dos

@ back2dos - In der Tat bezeichnen sowohl C # als auch JavaScript dies als bedingten Operator.
ChaosPandion

@ back2dos - Der Operator?: benötigt drei Argumente, weshalb er als ternärer Operator bezeichnet wird. Dies war die korrekte Terminologie ab C. (anscheinend ab BCPL, laut Wikipedia ...)
grkvlt

@grkvlt: Ich habe nie gesagt, dass es nicht drei Argumente braucht. Es ist nur so, dass Sie !den unären Operator oder +den binären Operator nicht aufrufen würden . Es ist einfach nicht genau.
back2dos

1
@ back2dos - Ich denke, das ist unser Problem - ich würde den Apfel in dieser Situation als "die Frucht" bezeichnen, aber ich denke, wir argumentieren über Grammatik und nicht über die Syntax der Programmiersprache, und Sie haben Recht, dass dies ?:der bedingte Operator ist;)
Grkvlt

1

Dieses Quine aus der Jargon-Datei in C:

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

Es gibt auch eine LISP-Version, aber Sie können viele andere finden , die in so ziemlich jeder Sprache schweben, die Sie sich vorstellen können ...


1

eulers Identität, die die schönsten Zahlen im mathematischen Universum verknüpft: 1, 0, e, i und π: e ^ i (π) + 1 = 0



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

Wahrscheinlich nicht berühmt, aber einer meiner Favoriten. Für die meisten ist es nicht sofort ersichtlich, warum es funktioniert.


1

Dies ist etwas mehr als 60 Zeichen, aber es hängt wirklich von der Benennung der Variablen ab (also schließe ich es ein!)

lies readLines (rdr: StreamReader) =
      seq {während nicht rdr.EndOfStream
                rdr.ReadLine ()} ergibt

Schöne kleine Funktion, um eine Datei Zeile für Zeile in F # in eine Sequenz einzulesen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.