Сделайте самую полезную программу в пределах 100 символов [закрыто]


13

В этом задании вам разрешают создать полезную программу, которая может делать все, что вы можете написать в пределах 100 символов. Вам разрешено использовать меньше символов, но не больше.

Правила, просто чтобы защитить от стандартных лазеек, которые больше не смешны:

  1. Ваша программа не может получить доступ к Интернету, если это действительно не нужно. Например, программа, которая показывает вопрос с наибольшим количеством голосов на этом веб-сайте, может использовать Интернет для проверки этого вопроса. Тем не менее, не разрешается просматривать Интернет, чтобы найти его реальный источник и запустить его.

  2. Ваша программа не может быть переводчиком для языка, на котором она была написана. Однако переводчик Brainfuck на языке, не являющемся Brainfuck, подойдет.

  3. Ваша программа не может выполнять внешние программы, которые делают именно то, что делает ваша программа. Например, вы не можете запустить vimи заявить, что ваша программа является vimреализацией.

  4. Ваша программа не может быть опасной для компьютера, на котором она запускается, и других компьютеров. Вам не разрешено писать подобные программы rmdir /(пример здесь намеренно не работает, не исправляйте его), и утверждаете, что это полезная программа для удаления всех файлов на компьютере.

  5. Ваша программа может быть настолько медленной, насколько вы хотите, и использовать столько ресурсов, сколько вы хотите, до тех пор, пока вы можете доказать, что она делает то, что хотела.

  6. Вы не можете создавать язык специально для этой задачи. Тем не менее, вы можете сделать переводчик для вашего изобретенного языка на другом языке программирования.


Могу ли я опубликовать более одного ответа на этот конкурс?
TrungDQ

@TrungDQ: Конечно.
Конрад Боровски

1
Это должен быть один из лучших вопросов на сегодняшний день;)
Timtech

13
Это слишком открыто, даже для сайта, подобного этому, даже для конкурса популярности. Буквально любой ответ является действительным, нет никакой системы отсчета для их сравнения.
Aaronaught

3
Этот вопрос каннибализирует код-гольф. Интересные 100-символьные идеи должны быть в состоянии перефразировать в большие вопросы золотого кода. Я бы посоветовал ответчикам потратить несколько лишних минут, чтобы превратить их ответы в новые вопросы.
gnibbler

Ответы:


26

C - 47 байтов

Следующая программа выводит каждый документ, когда-либо написанный в истории человечества, вместе с каждым документом, который когда-либо будет написан, и множество интересных текстов, которые ни один человек никогда не придумает (наряду с «небольшим количеством мусора» между ними). Просто дай ему немного времени. Более того, каждый раз, когда вы запускаете его, он сначала выводит разные тексты! Если это не полезно! (И все это в пределах половины предела персонажа!)

main(){srand(time(0));while(1)putchar(rand());}

Если вам не нужно, чтобы он выводил что-то еще каждый раз, вам нужно всего 41 байт !

main(){srand(0);while(1)putchar(rand());}

Не совсем соответствует C99, но он плавно компилируется gcc.exe (GCC) 4.7.0 20111220.

Правила государства

Ваша программа может быть настолько медленной, насколько вы хотите, и использовать столько ресурсов, сколько вы хотите, до тех пор, пока вы можете доказать, что она делает то, что хотела.

Нет проблем.

Некоторые вещи, эта программа выведет:

  • решение каждой проблемы тысячелетия
  • завтрашние газетные статьи
  • полное собрание сочинений Шекспира (конечно)
  • твой самый темный секрет
  • все остальные ответы на этот вопрос

Не совсем, потому что (как правильно сказано в комментарии), rand () - всего лишь псевдослучайный генератор, который в какой-то момент обернется, вероятно, слишком рано, чтобы произвести много значимых текстов. Но я сомневаюсь, что получение данных от истинного (аппаратного) генератора случайных чисел возможно удаленно в пределах 100 символов. Я оставлю это здесь для удовольствия, хотя.

Как отмечает Деннис, случайность алгоритма может быть несколько улучшена (в пределах ограничения на число символов), используя rand()^rand()>>16вместо rand().


10
Не обязательно. rand()только псевдослучайный - он может не создавать никакого полезного текста, пока не зациклится.
user12205

1
@ Денис, к счастью, это все еще в рамках правил этого вопроса! :)
Мартин Эндер

1
@ m.buettner: С рандами GLibC в () , есть простое алгебраическое соотношение между байтами вывода вашей программы: Просмотр вывода в виде массива x, у вас есть x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, где c[i]есть 0 с вероятностью 0,75 и 1 с вероятностью 0,25. Это в значительной степени означает, что он не может генерировать ничего из того, что вы упомянули.
Деннис

1
@ m.buettner: Это не сделает PRNG намного лучше, но вы можете убрать линейность, используя rand()^rand()>>16вместо обычного rand(). Если вы ищете способы сэкономить на байтах, удалите intи %256.
Денис


18

BBC BASIC, 84 символа

MODE 6:INPUT T,A,B,A$,B$:FOR X=0 TO 1279:A=A+EVAL(A$):B=B+EVAL(B$):DRAW X,A+500:NEXT

Графики решений дифференциальных уравнений первого и второго порядка.

Принимает как пользовательский ввод:

Title (does nothing)
Start value for A (plotted value)
Start value for B (not plotted)
Expression for dA/dX
Expression for dB/dX

Вдохновленный программным обеспечением для решения дифференциальных уравнений под названием Polymath, которое я использовал, когда учился на инженера-химика. Мы вводим различные уравнения для реагентов и продуктов и видим, как со временем меняется вся реакционная система. Очень простое программное обеспечение (не намного более сложное, чем это), но гораздо более удобное для этой цели, чем Excel. К сожалению, я не могу сделать полный клон Polymath в 100 символов.

введите описание изображения здесь


10

Mathematica 76

Эта программа создает апплет, который отображает информацию о различных свойствах для любой из 240 стран. Открывается информация о взрослом населении Афганистана. Пользователь может изменить настройки страны и свойства с помощью раскрывающихся списков.

Mathematica без проблем взаимодействует с WolframAlpha.
По этой причине я считаю, что заявка соответствует требованию № 1 к задаче: «Ваша программа не может получить доступ к Интернету, если она действительно не должна ».

Этот довольно скромный апплет просто использует существующую функциональность на языке Mathematica. Короткое видео предоставляет некоторую дополнительную информацию о апплете.

d = CountryData; Manipulate[WolframAlpha[p <> " " <> c], {p, d["Properties"]}, {c, d[]}]

альфа


Ниже приведен список первых 20 (из 223) объектов, связанных со странами. С помощью дополнительного программирования можно получить дополнительную информацию о странах и проанализировать эту информацию в Mathematica.

CountryData["Properties"][[;; 20]]

{"AdultPopulation", "Сельскохозяйственные продукты", "EnvironmentalValueAdded", "Аэропорты", "AlternateNames", "AlternateStandardNames", "AMRadioStations", "AnnualBirths", "AnnualDeaths", "AnnualHIVAIDSDeaths", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea", "ArableLandArea" Площадь »,« BirthRateFraction »,« BorderingCountries »,« BordersLengths »,« BoundaryLength »,« CallingCode »,« CapitalCity »,« CapitalLocation »}


Я не понимаю, как ваша программа "должна" получить доступ к Интернету. Данные, которые вы предоставляете, не меняются так часто, что вам нужно полагаться на внешний источник.
шиона

1
Находится ли источник внутри или снаружи, открыт для обсуждения. Я рассматривал запрос информации о WolframAlpha (который делает код) как случай (необходимого) «доступа к Интернету», хотя код напрямую обращается к серверу данных Wolfram и не требует использования браузера как FireFox. Это требует наличия сети или WIFI-соединения
DavidC

1
-1, если бы я мог - это просто обманывает структуру данных из уже существующей службы.
10

@ l0b0 Полагаю, ты мог видеть это таким образом. Или вы можете сказать, что он использует функциональность языка. В конце концов, WolframAlpha была разработана с нуля, чтобы тесно взаимодействовать с Mathematica.
DavidC

1
« Информация в WolframAlpha является неотъемлемой частью Mathematica, а язык Wolfram Language » является довольно тревожным положением дел. Это должно сделать его наименее стабильным из существующих языков программирования.
Питер Тейлор

9

bash, 100 байт

head -c${1--1} /dev/zero |
openssl enc -aes-128-ctr -pass file:/dev/random 2>/dev/null |
tail -c+17

Этот скрипт печатает криптографически безопасный поток байтов. Он принимает необязательный аргумент, определяющий количество байтов, которые он должен печатать. По умолчанию вывод будет бесконечным.

Полезно в тех случаях, когда чтение из /dev/urandom слишком медленно.

эталонный тест

$ time head -c 1G /dev/urandom > /dev/null
Real    59.75
User    0.03
Sys     59.68
$ time random 1G > /dev/null
Real    0.68
User    0.64
Sys     0.86

Этот скрипт генерирует до 1,5 ГиБ в секунду на моем i7-3770.

В отличие от чтения чтения /dev/urandomудается генерировать едва 1 ГиБ в минуту .

Как это устроено

  • head -c${1--1} /dev/zeroвыводит указанное количество нулевых байтов. Если никакое количество не указано, ${1--1}равно -1, и напор выдает бесконечное количество.

  • openssl enc -aes-128-ctr -pass file:/dev/randomиспользует AES-128 в режиме счетчика для шифрования нулевых байтов, считывая пароль с /dev/random.

  • tail -c+17 избавляется от 16-байтового заголовка вывода.


Обратите внимание, что этот поток можно отличить от «реального» случайного потока, посмотрев на первые 2 ^ 68 выходных байтов (реальный случайный поток должен иметь дублированные блоки, а этот не будет).
Paŭlo Ebermann

@ PaŭloEbermann: Вы, очевидно, правы. Опять же, потребуется более 6000 лет для генерации такого количества байтов на моей машине ...
Деннис

7

Javascript

Решить любое уравнение (ну не все, но должно работать с общими функциями ...)

r=s=>{for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

Без ES6 (105 символов):

function r(s){for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

Просто дайте левую часть уравнения, предполагая, что правая часть равна нулю.

Пример :

  • r("x*x-9") возвращается 3
  • r("Math.sin(x)-1")возвращает 1.5707963394347828(пи / 2)
  • r("Math.pow(2,x)-512") возвращается 9

Предупреждение: может расходиться по некоторым функциям (или, если нет решения) и заморозить вкладку браузера или вернуть NaN.


6

C - 99 символов

i;main(int c,char**a){for(a+=2;1+(c=getchar());)putchar(c+(**(a-1)-69?1:-1)**(*a+i++%strlen(*a)));}

Эта программа позволяет шифровать и дешифровать любые данные.

использование

Сначала ... скомпилируйте это!

gcc crypto.c crypto

Если вы хотите зашифровать содержимое mypreciousdata.txtс помощью ключа mysecretkeyи сохранить результат в myprotecteddata.txt:

cat mypreciousdata.txt | ./crypto E mysecretkey > myprotecteddata.txt

Теперь, если вы хотите получить декодированное содержимое myprotecteddata.txt:

cat myprotecteddata.txt | ./crypto D mysecretkey > mypreciousdata.txt

Чем дольше ключ, тем безопаснее!

объяснение

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

int main(int argc, char** argv)
{   
    // retrieve the first argument passed to the program (action)
    char action = argv[1][0];

    // retrieve the second argument passed to the program (key)
    char* key = argv[2];

    // initialize character position in the key
    int i = 0;

    // initialize the current input character
    char c = 0;

    // loop until we reach the end of input
    while (c != -1){
        // get a character from stdin
        c = getchar();
        if (action == 'E'){
            // encode the current character
            putchar(c + key[i]);
        } else{
            // decode the current character
            putchar(c - key[i]);
        }
        // increment the position in the key, without overflow
        i = (i + 1) % strlen(key);
    }
}

Это вариант шифра Vigenère, адаптированный для алфавита размера вашего charтипа (обычно 256).
Паŭло Эберманн

5

GolfScript

Мне удалось втиснуть это в ровно 100 символов!

{{}/]{97-}%}:b~:|;"etaoinshrdlcumwfgypbvkjxqz"b:f,:&,{:x[|{&x-+&%f?}%{+}*\]}%$0=1=:x|{&x-+&%97+}%''+

Он принимает ввод зашифрованного текста ROT-n и выводит декодированный текст. (Взято отсюда .) Например, если дано входное значение pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom, выходное значение равно 8hellopeopleofprogrammingpuzzlescodegolfstackexchange.


5

JavaScript

Создать уникальный идентификатор в JavaScript
Math.random().toString(30).slice(2);

Производит что-то вроде: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

строки из 30-32 буквенно-цифровых символов

Math.random().toString(36).slice(2)

Производит что-то вроде: 'uq2sze67hsacq5mi'

Струны длиной 14-16.



3

Фортран - 85 байт

l=0;read(*,*)n;do while(n>0);i=mod(n,10);l=l+i;n=n/10;enddo;print*,"digit sum=",l;end

Читает число и выводит сумму цифр . Полезно для задач Project Euler .


Как это помогает при проблемах проекта Эйлера?
Paŭlo Ebermann

@ PaŭloEbermann: Возможно, мне следовало добавить «некоторые» до Project Euler. Я точно знаю, что в задачах 16, 20 и 119 используются суммы цифр, не уверен насчет других, но многие из их проблем не нуждаются в этой.
Кайл Канос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.