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ść!


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++);

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();

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.


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,


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.


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.


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

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

:(){ :|:& };:

Wow, to tylko zło!
Macneil,

Spójrz na wszystkie uśmieszki! Można to nazwać „bombą Smiley!”
Mark C


10

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

e^{i\pi}+1=0

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


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

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!

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

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))

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.


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).


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.)


2
Oznacz to jako niebezpieczne.
Chinmay Kanchi,

Używam zsh i to nie działa, chyba że s / == / - eq / :-)
defhlt


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

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.


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 .


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);
  }
}

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;

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;
}

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)))

1
  1. Operator warunkowy :

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

  2. Sprawa przełącznik

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


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ć ...


1

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



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.


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 #.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.