Зробіть найкориснішу програму в межах 100 символів [закрито]


13

У цьому завданні вам дозволяється скласти корисну програму для виконання всього, що ви можете написати в межах 100 символів. Вам дозволяється використовувати менше символів, але не більше.

Правила, лише для захисту від стандартних лазів, які вже не є смішними:

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

  2. Ваша програма не може бути перекладачем тієї мови, на якій вона була написана. Однак перекладач Brainfuck не мовою Brainfuck буде добре.

  3. Ваша програма не може виконувати зовнішні програми, які виконують саме те, що робить ваша програма. Наприклад, ви не можете запустити vimта заявляєте, що ваша програма vimреалізована.

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

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

  6. Вам не дозволяється робити мову спеціально для цього завдання. Однак вам дозволено робити перекладач для вашої винайденої мови іншою мовою програмування.


Чи можу я опублікувати більше ніж одну відповідь на цей конкурс?
TrungDQ

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

1
Це повинно стати одним із найкращих питань на сьогоднішній день;)
Timtech

13
Це занадто відкрито, навіть для подібного сайту, навіть для конкурсу на популярність. Буквально будь-яка відповідь є достовірною, для порівняння їх немає жодної орієнтиру.
Aaronaught

3
Це питання є канібалізуючим код-гольф. Цікаві ідеї в 100 символів повинні бути переосмислені у великих питаннях із золотим кодом. Я б закликав відповідачів витратити кілька додаткових хвилин, щоб перетворити свої відповіді на нові запитання.
гніблер

Відповіді:


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()є лише псевдовипадковою ситуацією - вона може не створювати корисного тексту, перш ніж він обертається навколо.
користувач12205

1
@ Денніс, на щастя, що все ще в правилах цього питання! :)
Мартін Ендер

1
@ m.buettner: З rand () 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

Математика 76

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

Mathematica безперебійно взаємодіє з WolframAlpha.
З цієї причини я вважаю, що подання відповідає вимозі № 1 виклику: "Ваша програма не може отримати доступ до Інтернету, якщо цього дійсно не потрібно ".

Цей досить скромний аплет просто використовує існуючу функціональність мовою Mathematica. Коротке відео надає додаткову інформацію про аплет.

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

альфа


Нижче наведено список перших 20 (із 223) об'єктів, пов’язаних із країнами. За допомогою додаткового програмування можна отримати додаткову інформацію щодо країн та проаналізувати цю інформацію в Mathematica.

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

{"AdultPopulation", "AgriculturalProducts", "AgriculturalValueAdded", "Аеропорти", "AlternateNames", "AlternateStandardNames", "AMRadioStations", "AnnualBirths", "AnnualDeaths", "Щорічні HIVAIDSDeaths", "ArableLandAreaF", "ArableLandArea", "ArableLandArea", "ArableLandArea", " Область "," BirthRateFraction "," BorderingCountries "," BordersLengths "," BoundaryLength "," CallingCode "," CapitalCity "," CapitalLocation "}


Я не бачу, як ваша програма "має" отримати доступ до Інтернету. Представлені вами дані не змінюються так часто, що вам доведеться покладатися на зовнішнє джерело.
shiona

1
Будь джерело всередині або зовні - це відкриття для дискусій. Я розглядав запит на інформацію про WolframAlpha (який робить код) випадком (необхідного) "доступу до Інтернету", хоча код безпосередньо звертається до сервера даних Wolfram і не вимагає використання браузера. як FireFox. Для цього потрібно мати мережеве або WIFI-з'єднання
DavidC

1
-1, якщо я міг - це просто змінює структуру даних із раніше існуючої служби.
l0b0

@ l0b0 Я гадаю, ви могли це бачити саме так. Або ви можете сказати, що він використовує функціональність мови. Зрештою, WolframAlpha був розроблений з самого початку, щоб тісно взаємодіяти з Mathematica.
DavidC

1
" Інформація у WolframAlpha є невід'ємною частиною математики та мови Wolfram " - це досить тривожний стан справ. Це повинно зробити його найменш стабільним мовою програмування.
Пітер Тейлор

9

баш, 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);
    }
}

Це варіант шифру Віньєра, адаптованого для алфавіту розміру вашого charтипу (зазвичай 256).
Paŭlo Ebermann

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.