Jakie są znane programy i równania jedno-liniowe lub dwuwarstwowe? [Zamknięte]

22

Eksperymentuję z nową platformą i próbuję napisać program, który zajmuje się łańcuchami nie dłuższymi niż 60 znaków i chciałbym zapełnić magazyn danych niektórymi znanymi lub dobrze znanymi małymi fragmentami kodu i równania, ponieważ programowanie i matematyka są zgodne z tematem mojego oprogramowania. Kod może być w dowolnym języku i równaniach z dowolnej dyscypliny matematyki, pod warunkiem, że ich długość wynosi mniej niż 60 znaków. Podejrzewam, że ludzie wybiją sobie mózg na ten temat.

Na przykład,

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

60 znaków dokładnie!

Dziękuję bardzo za twoją mądrość!

BeachRunnerJoe
źródło
22
Dlaczego ocenzurowano brainf k? Czy nie możemy być dorośli i nie powiedzieć wszystkim, co potrafią, a czego nie potrafią czytać? W tym kontekście brainf k nie jest nieprzyzwoitością.
ChaosPandion
2
Podejrzewam, że to pytanie zostanie zamknięte. Spróbuj go ulepszyć, aby był bardziej konstruktywny. Zobacz: blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero
8
@bigown: To dobry subiektywny i konstruktywny. Nie różni się niczym od proszenia o znane cytaty. W rzeczywistości jest lepiej, ponieważ wymaga słynnych cytatów z kodu / równania. :-)
Macneil
@Macneil: Myślę tak samo, ale pytanie jest słabe, można je poprawić.
Maniero,
3
@bigown: szczerze mówiąc, naprawdę nie rozumiem, w jaki sposób to pytanie może być bardziej konstruktywne. Nie wątpiąc w to, ale bardzo szczerze zapytany, czy możesz zasugerować ulepszenie @BeachRunnerJoe? Właściwie bardzo podobały mi się odpowiedzi i wiele się od nich nauczyłem. Chciałbym zobaczyć to pytanie ponownie.
Joris Meys,

Odpowiedzi:

34

Klasyczna procedura kopiowania ciągów C znana jest coraz mniej osób przez te dni:

while (*d++ = *s++);
Macneil
źródło
3
tak, bardzo sławny ... dla weteranów!
BeachRunnerJoe
13
Rozumiem, że ma wartość „historyczną”, jest to okropny, okropny kod, więc fakt, że nie działa, jest dobrą rzeczą =)
Thomas Bonini
9
Weteran prądu przemiennego natychmiast rozpozna wzór. To idiomatyczne C.
Barry Brown
6
Zawsze uważałem, że to niesamowicie fajne.
Maulrus,
5
Muszę powiedzieć, zgadzam się z @Kop. W zaledwie kilku znakach pokazuje znaczące wady standardowej biblioteki lib i semantyki. Jedną z najbardziej absurdalnych rzeczy jest to, że łańcuchy są zakończone 0 zamiast prefiksu długości (co jest bezpieczniejsze i sprawia, że ​​określenie długości łańcucha O (1)). Po drugie, C nie ma rzeczywistych wartości boolowskich (co naprawia if (alarm = red) launchNukes();-trap). Dijkstra uznałby ten kod za bardziej niż szkodliwy. Zgadzam się, że programista C musi koniecznie zrozumieć ten kod, ale myślę, że ważniejsze jest, aby wiedział, jak to zrobić lepiej.
back2dos,
26

nie jedna linia, ale przedstawiam The Last Last Bug Bug:

    status = GetRadarInfo();
    if (status = 1)
      LaunchNukes();
Darel
źródło
2
To jeden z tych „O kurwa!” błędy.
Tin Man,
3
jestLaunchNukes();
hasen
1
jeśli zostało to zapisane jako: if (GetRadarInfo () = 1) {...}, nie dostalibyśmy tego błędu, ponieważ nie można go skompilować. Dlatego nie zawsze wprowadzaj zmienną pośrednią.
tactoth 27.01.11
22

Widzę, jak Conway's Game of Life w APL często się unosi:

Dodatkowym bonusem jest to, że zapewni to poprawną obsługę Unicode.

Uwaga do samodzielnego wymyślenia imienia
źródło
2
ha! to pierwsza rzecz, o której pomyślałem, kiedy zobaczyłem twój kod, miło!
BeachRunnerJoe
Wow, to imponujące!
FinnNk,
4
Objaśnienie: youtube.com/watch?v=a9xAKttWgP4
jfs
15
I myślałem, że Perl wygląda jak hałas z linii.
Tin Man,
1
@Greg, poczekaj, APL używa więcej niż alfabetu rzymskiego i greckiego, ponieważ nie było już wystarczającej liczby liter i symboli; Backspace (bardziej poprawnie nazywany „overstrike”) jest również używany, ponieważ niektóre znaki muszą być wpisywane na innych znakach. Jednym z nich był symbol podziału na kwadracie, który reprezentował odwrócenie macierzy (jeśli operator jednoargumentowy lub pomnożenie przez odwróconą macierz, jeśli został użyty jako operator binarny).
Tangurena,
19

Zmodyfikowana wersja słynnego jedno liniowego Perla:

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

To wyrażenie regularne dopasowuje ciągi, których długość jest liczbą pierwszą.

Oryginalna wersja to:

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

który pasuje do ciągów znaków składających się z pierwszej liczby 1.

Barry Brown
źródło
14

Szybkie sortowanie:

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

Jeśli lista jest pusta, posortowany wynik jest pustą listą.

Jeśli lista zaczyna się od elementu x, a resztą listy jest xs, wówczas posortowany wynik jest listą składającą się z posortowanej listy składającej się ze wszystkich elementów w xs mniejszych niż x połączonych z elementem x połączonym z posortowaną listą wszystkich elementy w xs większe niż x.

(lub innymi słowy - podziel na dwa stosy, wszystkie mniejsze niż x i wszystkie większe niż x, posortuj je oba i utwórz listę ze stosem mniejszym niż, elementem x i stosem większym niż).

Dość łatwo przewyższa zrozumiałość wersji C.

1249
źródło
1
To jest Standard ML? A może Haskell?
Barry Brown,
3
Haskell. Lubię sposób myślenia w języku.
Podoba mi się alternatywa dla partycjonowaniaqsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Kendall Hopkins
1
Czy istnieje wersja tego, która używa losowego elementu przestawnego zamiast nagłówka listy? To by zbliżyło go do oryginału CAR Hoare.
Macneil
1
Hoare mówi: „Element wybrany [jako element obrotu] ... powinien zawsze być tym, który zajmuje najlepiej adresowane lokalizacje segmentu, który ma zostać podzielony. Jeśli obawia się, że będzie to miało szkodliwy nieprzypadkowy wynik, losowo wybrany element powinien początkowo zostać umieszczony w najlepiej adresowanych lokalizacjach ”. Tak więc, aby być wiernym Hoare, powinniśmy pracować z ostatnim elementem, a nie pierwszym.
13
  1. Funkcja Ackermana . Implementacja wersji Ackermann-Péter powinna mieścić się w 60 znakach :)

  2. Ta piękna stała szesnastkowa: 0x5f3759df. Jest to serce najbardziej kodu WTFing, jaki kiedykolwiek widziałem: szybki odwrotny pierwiastek kwadratowy .

  3. Słynna zamiana XOR .

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

back2dos
źródło
3
+1 za odwrotny pierwiastek kwadratowy
Macneil
@Macneil Argh! Właśnie o tym myślałem.
Mark C
13

Kiedy po raz pierwszy wymyśliłem bash Forkbomb, pomyślałem, że to naprawdę słodkie.

:(){ :|:& };:
Matt
źródło
Wow, to tylko zło!
Macneil,
Spójrz na wszystkie uśmieszki! Można to nazwać „bombą Smiley!”
Mark C
12
print "hello world\n";

i jego pochodne wydają się być popularne. :-)

Blaszany Człowiek
źródło
1
+1: łatwo najsłynniejszy - zasłużony czy nie.
Steven Evers,
10

Ponieważ wspominasz równania, ten należy do twojej listy:

e^{i\pi}+1=0

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

Macneil
źródło
Tak! Dobry stary Euler, kolejny dobry!
BeachRunnerJoe
Pamiętam to jakoe^{i/pi} = i^2
Josh K
@Josh K: To dlatego, że i² == -1, dzięki czemu można zrównoważyć równanie przez odjęcie jednego z obu stron, usuwanie +1i zmianę =0do -1lub
Daenyth
7

Jak wykryć liczby parzyste:

x % 2 == 0
frogstarr78
źródło
3
Lub !(x%2)w rozsądnych językach.
Christian Mann,
8
Lub !(x & 1)w językach bez optymalizacji kompilatora.
jfs
1
@Christian, liczby nie powinny być liczbami logicznymi - zbyt łatwo popełnić błąd.
7

import this w Pythonie.


EDYTUJ, ponieważ komentarze nie mogą zawierać podziałów linii: Dla tych, którzy nie mają przydatnego interpretera Pythona, jest to wynik

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!
user1249
źródło
Jestem początkującym Pythonem. Co by to osiągnęło?
Richard,
1
@ Richard: Spróbuj napisać to w interaktywnym tłumaczu Pythona :).
MAK
To rozjaśniło moje niedzielne popołudnie :)
Richard
@Richard Poważne pytanie: jeśli to uruchomisz, czy spowoduje to przepełnienie stosu?
Mark C
6

Nie do końca 2 linie, ale powiedziałbym, że jest to dość znane:

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

W rzeczywistości niektóre języki mogą to opisać w jednym wierszu. Lua przychodzi na myśl, ale jest ich więcej.

x, y = y, x
ChaosPandion
źródło
zdecydowanie sławny!
BeachRunnerJoe
7
z ints: a ^ = b ^ = a ^ = b;
JulioC,
Jestem tylko ciekawy, jak to się realizuje? czy tworzy tymczasową tabelę (y, x), a następnie przypisuje x 1. element, ay 2. element?
tactoth
Zastanawiam się również, jak często ludzie zamieniają wartości w programowaniu w prawdziwym życiu.
tactoth
1
@tactoth - Zamiana jest powszechnie używana do implementacji silnie wyjątkowego bezpiecznego przypisywania w C ++.
Kaz Dragon
6

Moim ulubionym przykładem rachunku lambda jest kombinator Y:

Y = λf.(λx.f (x x)) (λx.f (x x))
Macneil
źródło
6

Z ćwiczenia w K&R, oto funkcja, która zwraca liczbę bitów ustawionych w podanej liczbie. Przy 58 znakach:

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

Zajmuje to czas proporcjonalny do liczby ustawionych bitów. Oto część „ah ha”

n = n & (n - 1)

Usuwa najbardziej prawy ustawiony bit z n.

Macneil
źródło
Niesamowite, miłe referencje K&R!
BeachRunnerJoe
6

Rekurencyjny trójkąt Pascala w jednej linii (Haskell)

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

52 znaki, dodaj spacje do smaku. Dzięki uprzejmości „Ephemient” w komentarzu tutaj .

Myślałem, że to lepszy przykład niż tajemnicze, ale krótkie rozwiązania w J i K (chociaż nie jestem jeszcze użytkownikiem Haskell).

Mark C
źródło
6

Unix Roulette (NIEBEZPIECZEŃSTWO!)

Dzięki uprzejmości odpowiedzi Bigown w wątku dowcipu (i komentarz):

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

(Ma on 62 znaki, więc możesz usunąć komentarz (czy to zadziałałoby w ten sposób?) Lub niektóre nieistotne spacje.)

Mark C
źródło
2
Oznacz to jako niebezpieczne.
Chinmay Kanchi,
Używam zsh i to nie działa, chyba że s / == / - eq / :-)
defhlt
5

Infinite Fibonacci Sequence (Haskell)

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Kendall Hopkins
źródło
Dlaczego nie fibs = 0 : scanl (+) 0 fibs?
FUZxxl,
4
DO 10 I=1.3

To jeden z najdroższych błędów w historii. Ta instrukcja Fortran przypisuje wartość zmiennoprzecinkową 1.3 do nazwanej zmiennej DO10I.

Prawidłowy kod - nagłówek powtarzających się instrukcji pętli, aż instrukcja zostanie oznaczona jako 10, a zmienna pętli Iprzyjmuje wartości 1, 2, 3:

DO 10 I=1,3
azheglov
źródło
1
Dlaczego jest to drogi błąd?
Barry Brown,
2
Ten błąd występował w procedurze obliczającej trajektorie orbitalne dla lotu kosmicznego Merkurego w 1961 r. Został jednak wykryty i naprawiony przed uruchomieniem, dlatego nie był to kosztowny błąd. Był podobny błąd na Mariner misji, którą zrobił przyczynę niepowodzenia misji, choć. (źródło: Expert C Programming , strony 31-32.)
Darel
4

Urządzenie Duffa :

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 rozwinął zmapowany w pamięci port, zapisując go w jednym z najdziwniejszych konstruktorów C, jakie widział świat.

Jesse C. Slicer
źródło
Nie pasuje do 60 znaków, ale zdecydowanie jest fajny. Pamiętam dreszcze, kiedy jego imię przewijało się w napisach do jakiegoś filmu Pixar.
Macneil,
2

Przychodzi mi na myśl wszystko, co wiąże się z Hello World. Możesz wybrać różne warianty, jeśli planujesz przechowywanie wielu języków.

Czegoś więcej nietrywialne, tam Fibbonacci .

Brzoskwinia
źródło
1
Fibbonacci, niezły! Oto kod ... if (k <2) zwraca k; w przeciwnym razie zwraca fib (k-1) + fib (k-2);
BeachRunnerJoe
1
@BeachRunnerJoe: Możesz połączyć to z operatorem warunkowym;)
back2dos
3
w rzeczy samej! zwrot (k <2)? k: fib (k-1) + fib (k-2);
BeachRunnerJoe
2
val (minors, adults) = people.partition(_.age < 18)

Powyższa linia podziałów kodu Scala people(lista Persons) na dwie listy w zależności od ich wieku.

Wykonanie tej samej czynności w Javie wymaga dużej części kodu:

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);
  }
}
missingfaktor
źródło
2

Zamiana wartości dwóch zmiennych bez użycia trzeciej zmiennej. To jedna z pierwszych rzeczy w programowaniu, które powiedziano mi i pomyślałem „Hmm ... to fajnie”

int a,b; 
b=a-b;
a=a-b;
b=a+b;
Jonathon
źródło
Wiem, że możesz to zrobić za pomocą XORs, ale to była moja odrobina nostalgii na dziś :)
Jonathon
XOR nie ma problemu z przepełnieniem. Czy to
Job
2

Czarna magia od Johna Carmacka

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
źródło
2

Największa liczba, która może być reprezentowana przez 8 bajtów (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
źródło
1
  1. Operator warunkowy :

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

  2. Sprawa przełącznik

  3. dla każdej pętli [Java]

Chankey Pathak
źródło
1
W rzeczywistości operator warunkowy jest poprawną nazwą. Operator jest trójskładnikowy, jeśli przyjmuje trzy argumenty.
back2dos,
@ back2dos - W rzeczywistości zarówno C #, jak i JavaScript nazywają to operatorem warunkowym.
ChaosPandion
@ back2dos - The: operator? robi się trzy argumenty, dlatego nazywany jest operatorem trójskładnikowych. To jest poprawna terminologia, począwszy od C. (podobno zaczynając od BCPL, według Wikipedii ...)
grkvlt
@grkvlt: Nigdy nie mówiłem, że nie wymaga trzech argumentów. Po prostu nie zadzwonisz !do operatora jednoargumentowego lub +operatora binarnego. To po prostu nie jest dokładne.
back2dos
1
@ back2dos - Myślę, że to nasz problem - w tej sytuacji nazwałbym jabłko „owocem”, ale myślę, że dyskutujemy o gramatyce, a nie o składni języka programowania, i masz rację, ?:to jest operator warunkowy;)
grkvlt
1

Ta Quine z pliku żargonu w C:

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

Jest tam również wersja LISP, ale możesz znaleźć wiele innych unoszących się wokół, w prawie dowolnym języku, który możesz zobrazować ...

grkvlt
źródło
1

tożsamość eulera, która łączy najpiękniejsze liczby we wszechświecie matematycznym: 1, 0, e, i oraz π: e ^ i (π) + 1 = 0

numan
źródło
1

Miałem dobry i zapisałem go na marginesie.

Tim
źródło
2
Niezły Fermat
Richard
1
int gcd(int a, int b)
{
   while(b>0)
   {
      int t = a%b;
      a=b;
      b=t;
   }
   return a;
}

Prawdopodobnie nie sławny, ale jeden z moich ulubionych. Dla większości nie od razu wiadomo, dlaczego to działa.

Jeremiasz Nunn
źródło
1

Jest to nieco ponad 60 znaków, ale tak naprawdę zależy od nazewnictwa zmiennych (więc to uwzględniam!)

niech readLines (rdr: StreamReader) =
      seq {podczas gdy rdr.EndOfStream nie
                daje rdr.ReadLine ()}

Przyjemna mała funkcja do odczytu pliku w sekwencji wiersz po wierszu w F #.

Jetti
źródło