Каковы некоторые известные однострочные или двухстрочные программы и уравнения? [закрыто]


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? Я на самом деле очень любил ответы и многому научился у них. Я бы хотел, чтобы этот вопрос снова открылся.
Йорис Мейс

Ответы:


34

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

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

3
да, очень известный ... ветеранам!
BeachRunnerJoe

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

9
Ветеран переменного тока распознал бы образец немедленно. Это идиоматический C.
Барри Браун

6
Всегда думал, что это невероятно круто.
Maulrus

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

26

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

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

2
Это один из тех "О, блин!" ошибки.
Жестянщик

3
этоLaunchNukes();
hasen

1
если бы это было записано как: if (GetRadarInfo () = 1) {...}, мы бы не получили эту ошибку, потому что она не компилируется. Поэтому не всегда вводите промежуточную переменную.
такт

22

Я вижу игру жизни Конвея в APL, которая витает вокруг:

Дополнительным бонусом является то, что это обеспечит правильную обработку юникода.


2
ха! это первое, о чем я подумал, когда увидел твой код, хорошо!
BeachRunnerJoe

Вау, это впечатляет!
FinnNk

4
Объяснение: youtube.com/watch?v=a9xAKttWgP4
jfs

15
И я подумал, что Perl похож на шум линии.
Жестянщик

1
@ Грег, просто подожди, APL использует больше, чем латинский и греческий алфавиты, потому что уже не было достаточно букв и символов; Backspace (более правильно называется «overstrike») также используется, потому что некоторые символы должны быть набраны поверх других символов. Одним из таких был символ деления на вершине квадрата, который представлял инверсию матрицы (если унарный оператор, или умножение на инвертированную матрицу, если он использовался в качестве бинарного оператора).
Tangurena

19

Модифицированная версия знаменитой однострочной версии Perl:

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

Это регулярное выражение соответствует строкам, длина которых проста.

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

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

который соответствует строки, состоящие из простого числа 1 с.


14

Quicksort:

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

Если список пуст, отсортированный результат - пустой список.

Если список начинается с элемента x, а остальная часть списка - xs, то отсортированным результатом является список, состоящий из отсортированного списка, состоящего из всех элементов в xs меньше x, сцепленных с элементом x, сцепленным с отсортированным списком всех элементы в хз больше, чем х.

(или другими словами - разделите на две кучи, все меньше чем x и все больше, чем x, отсортируйте их обе и создайте список с кучей меньше, элементом x и кучей больше).

Бьет понятность версии C довольно легко.


1
Это стандартный ML? Или Хаскелл?
Барри Браун

3
Haskell. Мне нравится мышление языка.

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

1
Есть ли версия этого, которая использует случайный стержень вместо заголовка списка? Это сделало бы его ближе к оригиналу CAR Hoare.
Макнейл

1
Хоар говорит: «Элемент, выбранный [в качестве основного элемента] ... всегда должен быть тем, который занимает наиболее адресуемые местоположения сегмента, который должен быть разделен. Если есть опасения, что это приведет к вредному неслучайному результату, произвольно выбранный элемент должен быть изначально размещен в наиболее адресованных местах ». Поэтому, чтобы быть верным Хоару, мы должны работать с последним элементом, а не с первым.

13
  1. Функция Аккермана . Реализация версии Аккермана-Петера должна вписаться в 60 символов :)

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

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

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


3
+1 для обратного квадратного корня
Макнейл

@Macneil Argh! Я просто думал об этом.
Марк C

13

Когда я впервые понял, что такое бомба-вилка, я подумал, что это действительно мило.

:(){ :|:& };:

Вау, это просто зло!
Макнейл

Посмотри на все смайлики! Вы могли бы назвать это "Смайли бомба!"
Марк C


10

Поскольку вы упоминаете уравнения, это принадлежит вашему списку:

e^{i\pi}+1=0

( Wolfram Alpha рендеринг : эи пи + 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
@ Кристиан, числа не должны быть логическими - слишком легко ошибиться.

7

import this в Python.


РЕДАКТИРОВАТЬ, поскольку комментарии не могут содержать разрывы строк: для тех, у кого нет удобного интерпретатора 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 :).
MAK

Это скрасило мой воскресный день :)
Ричард

@Richard Серьезный вопрос: если вы запустите это, это даст вам переполнение стека?
Марк С

6

Не совсем 2 строки, но я бы сказал, что это довольно известный:

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

На самом деле некоторые языки могут описать это в одной строке. Луа приходит на ум, но есть и другие.

x, y = y, x

безусловно, известный!
BeachRunnerJoe

7
с целыми числами: 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 рулетка (ОПАСНОСТЬ!)

Предоставлено ответом Bigown в ветке шутки (и комментарий):

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

(Это 62 символа в длину, так что вы можете удалить комментарий (так будет работать?) Или некоторые ненужные пробелы.)


2
Пожалуйста, отметьте это как опасное.
Чинмай Канчи

Я использую zsh, и он не работает, если только s / == / - eq / :-)
defhlt


4
DO 10 I=1.3

Это одна из самых дорогих ошибок в истории. Этот оператор Fortran назначает значение с плавающей запятой равным 1,3 названной переменной DO10I.

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

DO 10 I=1,3

1
Почему это дорогая ошибка?
Барри Браун

2
Эта ошибка была в подпрограмме, которая вычисляла орбитальные траектории для космического полета Меркурия 1961 года. Тем не менее, он был обнаружен и исправлен перед запуском, и поэтому не был дорогостоящей ошибкой. Была похожая ошибка в миссии «Моряк», которая, однако, привела к провалу миссии. (источник: Expert C Programming , стр. 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);
    }
}

Том Дафф развернул запись порта с отображением в памяти в одну из самых причудливых конструкций C, которые когда-либо видел мир.


Это не вписывается в 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, но на сегодня это была моя ностальгия :)
Джонатон

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)? а: б;

  2. Переключатель чехол

  3. цикл for-each [Java]


1
На самом деле условный оператор - это правильное имя. Оператор является троичным, если он принимает три аргумента.
back2dos

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

@ back2dos - оператор:? ли взять три аргумента, поэтому она называется тройным оператором. Это правильная терминология с C и далее. (очевидно, начиная с BCPL, согласно Википедии ...)
grkvlt

@grkvlt: я никогда не говорил, что не нужно три аргумента. Просто вы не назвали !бы унарный оператор или +бинарный оператор. Это просто не точно.
back2dos

1
@ back2dos - я думаю, что это наша проблема - я бы назвал яблоко «плодом» в этой ситуации, но я думаю, что мы обсуждаем грамматику, а не синтаксис языка программирования, и вы правы, что ?:это условный оператор;)
grkvlt

1

это Куайн из файла Jargon в C:

символ * F = "символ * F =% C% S% с; основными () {Е (е, 34, F, 34,10);}% С"; основными () {Е (е, 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.