Quels sont les fameux programmes et équations monoplace ou biplace? [fermé]

22

J'expérimente avec une nouvelle plate-forme et j'essaie d'écrire un programme qui traite des chaînes qui ne dépassent pas 60 caractères et je voudrais remplir le magasin de données avec de petits morceaux de code célèbres ou bien connus et équations, puisque la programmation et les mathématiques vont de pair avec le thème de mon logiciel. Le code peut être dans n'importe quelle langue et les équations de n'importe quelle discipline des mathématiques, tant qu'ils sont inférieurs à un total de 60 caractères. Je soupçonne que les gens vont faire un peu de réflexion pour celui-ci.

Par exemple,

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

60 caractères exactement!

Merci beaucoup pour votre sagesse!

BeachRunnerJoe
la source
22
Pourquoi brainf k a- t-il été censuré? Ne pouvons-nous pas être des adultes et ne pas dire à tout le monde ce qu'ils peuvent et ne peuvent pas lire? Dans ce contexte, brainf k n'est pas une obscénité.
ChaosPandion
2
Je soupçonne que cette question sera close. Essayez de l'améliorer pour être plus constructif. Voir: blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero
8
@bigown: C'est une bonne question subjective et constructive. Ce n'est pas différent de demander des citations célèbres. En fait, c'est mieux, car il demande des «guillemets» de code / équation célèbres. :-)
Macneil
@Macneil: Je pense la même chose, mais la question est mauvaise, elle peut être améliorée.
Maniero
3
@bigown: honnêtement, je ne vois pas vraiment comment cette question pourrait être plus constructive. Pour ne pas douter de vous ou ainsi, mais très sincèrement demandé, pourriez-vous suggérer une amélioration à @BeachRunnerJoe? En fait, j'ai beaucoup apprécié les réponses et j'ai beaucoup appris d'eux. J'adorerais voir cette question rouvrir.
Joris Meys

Réponses:

34

La routine classique de copie de chaîne C est connue de moins en moins de gens ces jours-ci:

while (*d++ = *s++);
Macneil
la source
3
oui, très célèbre ... aux vétérans!
BeachRunnerJoe
13
Bien que je comprenne qu'il a une valeur "historique", c'est un code terrible et terrible, donc le fait qu'il tombe en désuétude est une bonne chose =)
Thomas Bonini
9
Un vétéran de l'AC reconnaîtrait immédiatement le schéma. C'est idiomatique C.
Barry Brown
6
J'ai toujours pensé que c'était incroyablement cool.
Maulrus du
5
Je dois dire que je suis d'accord avec @Kop. En quelques caractères, il montre des défauts significatifs de sa bibliothèque standard et de sa sémantique. L'une des choses les plus absurdes est que les chaînes se terminent par 0 au lieu d'être préfixées par la longueur (ce qui est plus sûr et permet de déterminer la longueur d'une chaîne O (1)). La deuxième chose est que C n'a pas de valeurs booléennes réelles (ce qui corrige le if (alarm = red) launchNukes();-trap). Dijkstra considérerait ce code plus que nuisible. Je suis d'accord qu'il est impératif pour un programmeur C de comprendre au moins ce code, mais je pense qu'il est plus important pour lui de savoir comment le faire mieux.
back2dos
26

pas une ligne, mais je présente le dernier bug du monde C:

    status = GetRadarInfo();
    if (status = 1)
      LaunchNukes();
Darel
la source
2
C'est l'un de ces "Oh sh * t!" les erreurs.
The Tin Man
3
c'estLaunchNukes();
hasen
1
si cela a été écrit comme: if (GetRadarInfo () = 1) {...}, nous n'obtiendrions pas ce bogue car il ne se compile pas. N'introduisez donc pas toujours une variable intermédiaire.
tactoth
22

Je vois le jeu de la vie de Conway dans APL flottant beaucoup:

Un bonus supplémentaire est que cela vous permettra de gérer correctement unicode.

Note à soi - pense à un nom
la source
2
Ha! c'est la première chose à laquelle j'ai pensé quand j'ai vu votre code, sympa!
BeachRunnerJoe
Wow, c'est impressionnant!
FinnNk
4
Explication: youtube.com/watch?v=a9xAKttWgP4
jfs
15
Et je pensais que Perl ressemblait à du bruit de ligne.
The Tin Man
1
@Greg, attendez, APL utilise plus que les alphabets romain et grec car il n'y avait pas déjà assez de lettres et de symboles; le retour arrière (plus correctement appelé "surimpression") est également utilisé car certains caractères doivent être saisis par-dessus d'autres caractères. Un tel était un symbole de division au-dessus d'un carré, qui représentait une inversion de matrice (si opérateur unaire, ou une multiplication par la matrice inversée si elle était utilisée comme opérateur binaire).
Tangurena
19

Une version modifiée d'un célèbre monoplace Perl:

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

Cette expression régulière correspond à des chaînes dont la longueur est première.

La version originale est:

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

qui correspond à des chaînes composées d'un nombre premier de 1.

Barry Brown
la source
14

Tri rapide:

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

Si la liste est vide, le résultat trié est la liste vide.

Si la liste commence par l'élément x et que le reste de la liste est xs, le résultat trié est une liste composée de la liste triée composée de tous les éléments en xs inférieurs à x concaténés avec l'élément x concaténés avec la liste triée de tous éléments en x plus grands que x.

(ou en d'autres termes - divisez en deux piles, toutes inférieures à x et toutes supérieures à x, triez-les toutes les deux et créez une liste avec la pile inférieure à, l'élément x et la pile supérieure à).

Bat la compréhensibilité de la version C assez facilement.

utilisateur1249
la source
1
C'est le Standard ML? Ou Haskell?
Barry Brown
3
Haskell. J'aime l'état d'esprit de la langue.
J'aime l'alternative de partitionnementqsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Kendall Hopkins
1
Existe-t-il une version de ceci qui utilise un pivot aléatoire au lieu de la tête de la liste? Cela le rapprocherait de l'original de CAR Hoare.
Macneil
1
Hoare dit "L'élément choisi [comme élément pivot] ... devrait toujours être celui qui occupe les emplacements les plus adressés du segment qui doit être partitionné. Si l'on craint que cela ait un résultat nuisible non aléatoire, un l'élément choisi au hasard doit initialement être placé aux endroits les plus adressés ". Donc, pour être fidèle à Hoare, nous devons travailler avec le dernier élément, pas le premier.
13
  1. La fonction Ackerman . L'implémentation de la version Ackermann-Péter devrait tenir en 60 caractères :)

  2. Cette jolie constante hexadécimale: 0x5f3759df. C'est le cœur du code le plus WTFing que j'ai jamais vu: la racine carrée inverse rapide .

  3. Le fameux swap XOR .

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

arrière2dos
la source
3
+1 pour la racine carrée inverse
Macneil
@Macneil Argh! Je pensais juste à celui-là.
Mark C
13

Quand j'ai découvert le forkbomb bash, je pensais que c'était vraiment adorable.

:(){ :|:& };:
Mat
la source
Wow, c'est juste du mal!
Macneil
Regardez tous les smileys! Vous pourriez appeler cela "La bombe Smiley!"
Mark C
12
print "hello world\n";

et ses dérivations semblent être populaires. :-)

l'homme d'étain
la source
1
+1: facilement le plus «célèbre» - méritant ou non.
Steven Evers
10

Parce que vous mentionnez des équations, celle-ci appartient à votre liste:

e^{i\pi}+1=0

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

Macneil
la source
Oui! Bon vieux Euler, encore un bon!
BeachRunnerJoe
Je m'en souviens commee^{i/pi} = i^2
Josh K
@Josh K: En effet i² == -1, vous pouvez donc équilibrer l'équation en soustrayant un des deux côtés, en supprimant le +1et en le changeant =0en -1ou
Daenyth
7

Comment détecter les nombres pairs:

x % 2 == 0
frogstarr78
la source
3
Ou !(x%2)dans des langues sensées.
Christian Mann
8
Ou !(x & 1)dans les langues sans optimisation du compilateur.
jfs
1
@Christian, les chiffres ne doivent pas être booléens - trop facile de se tromper.
7

import this en Python.


EDIT car les commentaires ne peuvent pas contenir de sauts de ligne: pour ceux qui n'ont pas d'interpréteur Python à portée de main, c'est la sortie

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!
utilisateur1249
la source
Je suis un débutant en Python. Qu'est-ce que cela permettrait?
Richard
1
@Richard: Essayez d'écrire ceci dans l'interpréteur interactif Python :).
MAK
Cela a égayé mon dimanche après-midi :)
Richard
@Richard Question sérieuse: si vous exécutez cela, cela vous donne-t-il un débordement de pile?
Mark C
6

Pas tout à fait 2 lignes mais je dirais que c'est assez célèbre:

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

En fait, certaines langues peuvent le décrire sur une seule ligne. Lua me vient à l'esprit mais il y en a plus.

x, y = y, x
ChaosPandion
la source
définitivement célèbre!
BeachRunnerJoe
7
avec des entiers: a ^ = b ^ = a ^ = b;
JulioC
Je suis simplement curieux de savoir comment cela est mis en œuvre? crée-t-il une table temporaire (y, x), puis affecte-t-il x le 1er élément et y le 2ème élément?
tactoth
Je me demande également à quelle fréquence les gens échangent des valeurs dans la programmation réelle.
tactoth
1
@tactoth - L'échange est couramment utilisé pour implémenter une affectation sûre d'exception en C ++.
Kaz Dragon
6

Mon exemple de calcul lambda préféré est le combinateur Y:

Y = λf.(λx.f (x x)) (λx.f (x x))
Macneil
la source
6

À partir d'un exercice dans K&R, voici une fonction qui retournera combien de bits sont définis dans le nombre donné. À 58 caractères:

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

Cela prend du temps proportionnel au nombre de bits mis. La partie "ah ha" ici est que

n = n & (n - 1)

Supprime le bit défini le plus à droite de n.

Macneil
la source
Impressionnant, belle référence K&R!
BeachRunnerJoe
6

Triangle récursif de Pascal en une seule ligne (Haskell)

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

Cinquante-deux caractères, ajoutez des espaces au goût. Avec l'aimable autorisation de "Ephemient" dans le commentaire ici .

Je pensais que c'était un meilleur exemple que les solutions cryptiques mais brèves de J et K (bien que je ne sois pas encore utilisateur de Haskell).

Mark C
la source
6

Roulette Unix (DANGER!)

Gracieuseté de la réponse de Bigown dans le fil de la blague (et le commentaire):

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

(Cela fait 62 caractères, vous pouvez donc supprimer le commentaire (cela fonctionnerait-il de cette façon?) Ou certains espaces non essentiels.)

Mark C
la source
2
Veuillez marquer ceci comme dangereux.
Chinmay Kanchi
J'utilise zsh et cela ne fonctionne que si s / == / - eq / :-)
defhlt
5

Séquence infinie de Fibonacci (Haskell)

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Kendall Hopkins
la source
Pourquoi ne pas fibs = 0 : scanl (+) 0 fibs?
FUZxxl
4
DO 10 I=1.3

C'est l'un des bugs les plus chers de l'histoire. Cette instruction Fortran affecte la valeur flottante de 1,3 à la variable nommée DO10I.

Le code correct - l'en-tête des instructions répétées de boucle jusqu'à ce que l'instruction étiquetée 10 et la variable de boucle Iacceptant les valeurs 1, 2, 3:

DO 10 I=1,3
azheglov
la source
1
Pourquoi est-ce un bug coûteux?
Barry Brown
2
Ce bug se trouvait dans un sous-programme qui calculait les trajectoires orbitales pour un vol spatial de Mercure en 1961. Cependant, il a été rattrapé et corrigé avant le lancement, et n'était donc pas un bug coûteux. Il y avait un bug similaire sur une mission Mariner qui a cependant causé l'échec de la mission. (source: Programmation Expert C , pages 31-32.)
Darel
4

Appareil 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 a déroulé une écriture de port mappé en mémoire dans l'une des constructions C les plus bizarres que le monde ait vues.

Jesse C. Slicer
la source
Il ne tient pas dans 60 caractères, mais il est cool. Je me souviens d'avoir eu des frissons en voyant son nom défiler dans le générique d'un film Pixar.
Macneil
2

Tout ce qui a à voir avec Hello World me vient à l'esprit. Vous pouvez choisir différentes variantes si vous prévoyez de stocker plusieurs langues.

Pour quelque chose de plus banal, il y a Fibbonacci .

Pêche
la source
1
Fibbonacci, chouette! Voici le code ... if (k <2) return k; else return fib (k-1) + fib (k-2);
BeachRunnerJoe
1
@BeachRunnerJoe: Vous voudrez peut-être combiner cela avec l'opérateur conditionnel;)
back2dos
3
Oui en effet! retour (k <2)? k: fib (k-1) + fib (k-2);
BeachRunnerJoe
2
val (minors, adults) = people.partition(_.age < 18)

La ligne ci-dessus de partitions de code Scala people(une liste de Persons) en deux listes en fonction de leurs âges respectifs.

Il faut beaucoup de code pour faire la même chose 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);
  }
}
manquefaktor
la source
2

Permutation des valeurs de deux variables sans utiliser une troisième variable. C'est l'une des premières choses dans la programmation qui m'a été dit et pensé "Hmm ... c'est cool"

int a,b; 
b=a-b;
a=a-b;
b=a+b;
Jonathon
la source
Je sais que vous pouvez le faire en utilisant XORs, mais ce fut ma nostalgie pour aujourd'hui :)
Jonathon
XOR n'a aucun problème de débordement. Est ce que ca?
Job du
2

Magie noire 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;
}
Rohan Monga
la source
2

Le plus grand nombre pouvant être représenté par 8 octets (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)))
ykombinator
la source
1
  1. Opérateur conditionnel :

    minVal = (a <b)? un B;

  2. Boîtier de commutateur

  3. pour chaque boucle [Java]

Chankey Pathak
la source
1
En fait, l'opérateur conditionnel est le nom correct. Un opérateur est ternaire s'il prend trois arguments.
back2dos
@ back2dos - En effet, C # et JavaScript appellent cela l'opérateur conditionnel.
ChaosPandion
@ back2dos - Le: opérateur? ne prendre trois arguments, ce qui explique pourquoi il est appelé l'opérateur ternaire. C'est la terminologie correcte à partir de C. (apparemment à partir de BCPL, selon Wikipedia ...)
grkvlt
@grkvlt: Je n'ai jamais dit qu'il ne fallait pas trois arguments. C'est juste que vous n'appeleriez pas !l'opérateur unaire ou +l'opérateur binaire. Ce n'est tout simplement pas exact.
back2dos
1
@ back2dos - Je pense que c'est notre problème - je voudrais faire référence à la pomme comme « le fruit » dans cette situation, mais je pense que nous plaidons la grammaire, pas la programmation syntaxe du langage, et vous avez raison ?:est l'opérateur conditionnel;)
grkvlt
1

Cette Quine du fichier Jargon en C:

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

Il y a aussi une version LISP là-bas, mais vous pouvez en trouver beaucoup d' autres flottant dans presque toutes les langues que vous pourriez imaginer ...

grkvlt
la source
1

l'identité d'Euler qui relie les plus beaux nombres de l'univers mathématique: 1, 0, e, i et π: e ^ i (π) + 1 = 0

numan
la source
1

J'en ai eu une bonne et je l'ai écrite en marge.

Tim
la source
2
Nice one Fermat
Richard
1
int gcd(int a, int b)
{
   while(b>0)
   {
      int t = a%b;
      a=b;
      b=t;
   }
   return a;
}

Probablement pas célèbre, mais l'un de mes favoris. Pour la plupart, il n'est pas immédiatement évident pourquoi cela fonctionne.

Jeremiah Nunn
la source
1

C'est un peu plus de 60 caractères mais cela dépend vraiment du nom des variables (donc je l'inclus!)

laissez readLines (rdr: StreamReader) =
      seq {alors que rdr.EndOfStream ne
                donne pas rdr.ReadLine ()}

Belle petite fonction pour lire un fichier dans une séquence ligne par ligne en F #.

Jetti
la source