Які відомі однолінійні або дволінійні програми та рівняння? [зачинено]


22

Я експериментую з новою платформою і намагаюся написати програму, яка займається струнами, довжиною яких не більше 60 символів, і я хотів би заповнити сховище даних деякими відомими або відомими невеликими фрагментами коду та рівняння, оскільки програмування та математика йде разом з темою мого програмного забезпечення. Код може бути будь-якою мовою та рівняннями з будь-якої математичної дисципліни, лише якщо довжиною їх менше 60 символів. Я підозрюю, що люди зірвуться з цього приводу.

Наприклад,

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

60 символів рівно!

Дуже дякую за вашу мудрість!


22
Чому мозковий к був цензурований? Чи не можемо ми бути дорослими і не сказати всім, що вони вміють, а що не вміють читати? У цьому контексті brainf k не є непристойністю.
ChaosPandion

2
Я підозрюю, що це питання буде закритим. Спробуйте вдосконалити його, щоб бути більш конструктивним. Дивіться: blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero

8
@bigown: Це хороший суб'єктивний характер і є конструктивним. Це нічим не відрізняється, ніж просити відомі цитати. Насправді, це краще, тому що він просить відомі код / ​​рівняння "цитати". :-)
Макнейл

@Macneil: Я думаю, те саме, але питання погано, його можна вдосконалити.
Маньєро

3
@bigown: Чесно кажучи, я не можу реально зрозуміти, як це питання може бути більш конструктивним. Не сумніваючись у вас чи так, але дуже ретельно запитав, чи можете ви запропонувати покращення @BeachRunnerJoe? Я насправді дуже сподобався відповідям і багато чого навчився з них. Я хотів би побачити це питання знову.
Joris Meys

Відповіді:


34

Класичний порядок копіювання рядків на C відомий меншою кількістю менших днів тез:

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

3
так, дуже відомий ... ветеранам!
BeachRunnerJoe

13
Хоча я розумію, що він має "історичну" цінність, це страшний жахливий код, тому факт, що він перебуває у використанні - це добре =)
Томас Боніні

9
Ветеран АС негайно розпізнає схему. Це ідіоматично C.
Баррі Браун

6
Завжди думав, що це неймовірно круто.
Малрус

5
Треба сказати, я згоден з @Kop. Всього за декілька символів він виявляє суттєві недоліки його стандартної лібери та її семантики. Однією з найбільш абсурдних речей є рядки, що закінчуються 0, а не з префіксом довжини (що безпечніше і визначає довжину рядка O (1)). Друга річ - це те, що у C немає фактичних булевих значень (що фіксує if (alarm = red) launchNukes();-trap). Dijkstra вважає цей код більш ніж шкідливим. Я погоджуюся, що програмісту на C важливо хоча б зрозуміти цей код, але я думаю, що для нього важливіше знати, як це зробити краще.
back2dos

26

не один рядок, але я представляю останню помилку C у світі:

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

2
Це одне з таких "О, ш * т!" помилки.
Олов'яний чоловік

3
цеLaunchNukes();
hasen

1
якщо це було записано так: якщо (GetRadarInfo () = 1) {...}, ми не отримаємо цю помилку, оскільки вона не компілюється. Тому не завжди вводьте проміжну змінну.
тактот

22

Я бачу, що Гра життя Конуея в APL багато плаває:

Додатковий бонус полягає в тому, що це переконається, що ви правильно керуєте unicode.


2
га! це перше, що я подумав, коли побачив твій код, приємно!
BeachRunnerJoe

Ух, це вражає!
FinnNk

4
Пояснення: youtube.com/watch?v=a9xAKttWgP4
jfs

15
І я думав, що Перл схожий на шум лінії.
Олов'яний чоловік

1
@Greg, просто зачекай, APL використовує більше, ніж римські та грецькі алфавіти, тому що вже не вистачало букв та символів; backspace (більш правильно називається "overstrike") також використовується, оскільки деякі символи потрібно вводити поверх інших символів. Одним із таких був символ розділення зверху квадрата, який представляв інверсію матриці (якщо унарний оператор, або множення на перевернуту матрицю, якщо вона використовувалася як двійковий оператор).
Тангурена

19

Змінена версія відомого одноколісного Perl:

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

Цей регулярний вираз відповідає рядкам, довжина яких є простим.

Оригінальна версія:

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

який відповідає рядкам, що складається з простої кількості 1s.


14

Квікорт:

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

Якщо список порожній, відсортований результат - це порожній список.

Якщо список починається з елемента x, а решта списку - xs, то відсортованим результатом є список, що складається з відсортованого списку, що складається з усіх елементів у xs, менших від x, об'єднаних з елементом x, об'єднаним у відсортований список усіх елементів у xs, більших за x.

(або іншими словами - розділіть на дві палі, всі менші за x і всі більші за x, сортуйте їх обидва та створіть список із меншою, ніж палі, елементом x та купою, більшим ніж x).

Досить легко перемагає зрозумілість версії C.


1
Це стандартний ML? Або Хаскелл?
Баррі Браун

3
Хаскелл. Мені подобається мислення мови.

Мені подобається альтернатива розділенняqsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Кендалл Хопкінс

1
Чи існує версія цієї версії, яка використовує випадкове зведення замість заголовка списку? Це зробило б це ближче до оригіналу CAR Hoare.
Macneil

1
Хоар каже: "Елемент, обраний [як елемент зведення] ... повинен завжди бути таким, який займає місця з найбільшою адресою сегмента, який має бути розділений. Якщо побоюється, що це матиме шкідливий невипадковий результат, випадково обраний елемент спочатку повинен бути розміщений у місцях з найбільшою адресою ". Отже, щоб бути правдою Хоара, нам слід працювати з останнім елементом, а не з першим.

13
  1. Функція Акермана . Реалізація версії Ackermann-Péter повинна містити 60 символів :)

  2. Ця прекрасна шестидесятична константа: 0x5f3759df. Це серце самого коду WTFing, який я коли-небудь бачив: швидкий зворотний квадратний корінь .

  3. Знаменитий своп XOR .

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


3
+1 для зворотного квадратного кореня
Macneil

@Macneil Argh! Я тільки думав про це.
Марк C

13

Коли я вперше з'ясував баш-форкбомбу, я подумав, що це справді солодко.

:(){ :|:& };:

Ого, це просто зло!
Macneil

Подивіться на всі посмішки! Ви могли б назвати це "Бомбою Смайлі!"
Марк C


10

Оскільки ви згадуєте рівняння, це належить до вашого списку:

e^{i\pi}+1=0

( Wolfram Alpha рендеринг : ei pi + 1 = 0)


Так! Добрий ойле Ейлер, ще один хороший!
BeachRunnerJoe

Я пам’ятаю це якe^{i/pi} = i^2
Джош К

@Josh K: Це тому i² == -1, що ви можете врівноважити рівняння, віднімаючи одне з обох сторін, видаляючи +1та змінюючи =0на -1або
Daenyth

7

Як виявити парні числа:

x % 2 == 0

3
Або !(x%2)здоровими мовами.
Крістіан Манн

8
Або !(x & 1)мовами без оптимізації компілятора.
jfs

1
@Christian, цифри не повинні бути булевими - занадто легко помилитися.

7

import this в Python.


EDIT як коментарі не можуть містити розривів рядків: для тих, хто не підручний інтерпретатора Python, це вихід

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!

Я початківець Python. Чого б цього досягти?
Річард

1
@Richard: Спробуйте написати це в інтерактивному інтерпретаторі Python :).
МАК

Це полегшило мою неділю вдень :)
Річард

@ Richard Серйозне запитання: Якщо ви запускаєте це, чи дає вам переповнення стека?
Марк C

6

Не дуже 2 рядки, але я б сказав, що це досить відомо:

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

Насправді деякі мови можуть описати це в одному рядку. Луа приходить на думку, але є і більше.

x, y = y, x

безумовно знаменитий!
BeachRunnerJoe

7
з ints: a ^ = b ^ = a ^ = b;
JulioC

Мені просто цікаво, як це реалізується? чи створює вона тимчасову таблицю (y, x), потім присвоює x 1-й елемент, а y 2-й елемент?
тактот

Також мені цікаво, як часто люди обмінюються значеннями в програмах реального життя.
тактот

1
@tactoth - Swapping зазвичай використовується для реалізації сильно виняткового безпечного призначення в C ++.
Kaz Dragon

6

Мій улюблений приклад обчислення лямбда - комбінатор Y:

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

6

З вправи K&R, ось функція, яка повертає, скільки біт встановлено в заданому числі. В 58 символів:

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

Це займає час, пропорційний кількості встановлених бітів. Частина "ах-ха" тут полягає в тому, що

n = n & (n - 1)

Вилучає крайній правий біт з n.


Дивовижна, приємна довідка про K&R!
BeachRunnerJoe

6

Рекурсивний трикутник Паскаля в одну лінію (Haskell)

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

П'ятдесят два символи, додайте пробілів за смаком. Люб’язно надано "Ефемієнту" у коментарі тут .

Я подумав, що це кращий приклад, ніж криптичні, але короткі рішення J та K (хоча я ще не користувач Haskell).


6

Рулетка Unix (НЕБЕЗПЕЧНО!)

Люб’язно відповідь Бігоуна в жартовій темі (та коментарі):

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

(Це 62 символи, тож ви можете видалити коментар (чи він би працював так?) Або деякі неістотні пробіли.)


2
Будь ласка, позначте це як небезпечне.
Chinmay Kanchi

Я використовую zsh, і він не працює, якщо s / == / - eq / :-)
defhlt


4
DO 10 I=1.3

Це одна з найдорожчих помилок в історії. Це твердження Fortran присвоює змінній float значення 1,3 змінної з назвою DO10I.

Правильний код - заголовок циклу повторюваних висловлювань, поки оператор з міткою 10 і змінна циклу Iприймають значення 1, 2, 3:

DO 10 I=1,3

1
Чому це дорогий клоп?
Баррі Браун

2
Ця помилка була в підпрограмі, яка розраховувала орбітальні траєкторії для космічного польоту Меркурієм 1961 року. Однак він був зафіксований та виправлений до запуску, і тому не був дорогою помилкою. Схожа помилка на місії Mariner, що все ж спричинила невдачу місії. (джерело: Експертне програмування , стор. 31–32.)
Дарел

4

Пристрій Даффа :

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

Том Дафф розгорнув записане на карту пам’яті порт в одній з найбільш химерних конструкцій С, яку бачив світ.


Він не вписується в 60 символів, але це визначно класно. Я пам'ятаю, як застуда бачила, як його ім'я прокручується в минулому, аніж до якогось фільму про Pixar.
Макнейл

2

Що-небудь робити з Hello World приходить на думку. Ви можете скористатися різними варіантами, якщо плануєте зберігати кілька мов.

Щось більш нетривіальне, є Фібоначчі .


1
Фібоначчі, приємний! Ось код ... якщо (k <2) повернути k; інакше повернути fib (k-1) + fib (k-2);
BeachRunnerJoe

1
@BeachRunnerJoe: Ви можете поєднати це з умовним оператором;)
back2dos

3
так, справді! повернення (k <2)? k: fib (k-1) + fib (k-2);
BeachRunnerJoe

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

Вищенаведений рядок розділів коду Scala people(список Personсписків) на два списки залежно від їх віку.

Для того, щоб зробити те ж саме на 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

Зміна значень двох змінних без використання третьої змінної. Це одне з перших речей у програмуванні, про що мені сказали і подумали "Хм ... це круто"

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

Я знаю, що ви можете це зробити за допомогою XORs, але це було моєю ностальгією за сьогодні :)
Jonathon

XOR не має проблем із переповненням. Це?
Робота

2

Чорна магія від Джона Кармака

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

Найбільша кількість, яку можна представити 8 байт (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. Умовний оператор :

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

  2. Корпус вимикача

  3. для кожного циклу [Java]


1
Власне, умовний оператор - це правильна назва. Оператор є потрійним, якщо він бере три аргументи.
back2dos

@ back2dos - Дійсно, і C #, і JavaScript називають це умовним оператором.
ChaosPandion

@ Back2dos - оператор :? чи взяти три аргументи, тому вона називається потрійним оператором. Це правильна термінологія від C наперед. (мабуть, починаючи з BCPL, згідно Вікіпедії ...)
grkvlt

@grkvlt: Я ніколи не казав, що це не має трьох аргументів. Просто ви б не викликали !одинарного оператора чи +двійкового оператора. Це просто не точно.
back2dos

1
@ back2dos - я думаю, це наша проблема - я б у цій ситуації позначав яблуко як "плід", але я думаю, що ми сперечаємось із граматикою, а не з синтаксисом мови програмування, і ви правильно, що ?:це умовний оператор;)
grkvlt

1

Ця Квінка з файлу жаргону в C:

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

Там також є версія LISP, але ви можете знайти багато інших, що плавають навколо, майже на будь-якій мові, яку ви могли б зобразити ...


1

тотожність ейлера, яка пов'язує найкрасивіші числа математичного Всесвіту: 1, 0, e, i і π: e ^ i (π) + 1 = 0



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

Напевно, не відомий, але один із моїх улюблених. Для більшості не відразу видно, чому це працює.


1

Це трохи більше 60 символів, але це дійсно залежить від імені змінної (тому я включаю її!)

нехай readLines (rdr: StreamReader) =
      seq {поки не rdr.EndOfStream зробить
                вихід rdr.ReadLine ()}

Приємна маленька функція для читання файлу в послідовний рядок за рядком у F #.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.