Zrób najbardziej przydatny program o długości do 100 znaków [zamknięty]

13

W tym zadaniu możesz stworzyć przydatny program do robienia wszystkiego, co możesz napisać w ciągu 100 znaków. Możesz używać mniej znaków, ale nie więcej.

Zasady, aby chronić przed standardowymi lukami, które nie są już śmieszne:

  1. Twój program nie może uzyskać dostępu do Internetu, chyba że naprawdę musi. Na przykład program, który pokazuje najczęściej zadawane pytania na tej stronie, może użyć Internetu, aby sprawdzić to pytanie. Jednak przeglądanie Internetu w celu znalezienia jego prawdziwego źródła i uruchomienia nie jest dozwolone.

  2. Twój program nie może być tłumaczem języka, w którym został napisany. Jednak interpreter Brainfuck w języku innym niż Brainfuck byłby w porządku.

  3. Twój program nie może wykonywać programów zewnętrznych, które robią dokładnie to samo, co program. Na przykład nie można uruchomić vimi twierdzić, że program jest vimimplementacją.

  4. Twój program nie może być niebezpieczny dla komputera, na którym jest uruchomiony, i innych komputerów. Nie możesz pisać programów takich jak rmdir /(przykład tutaj celowo nie działa, nie naprawiaj go) i twierdzisz, że jest to przydatny program do usuwania wszystkich plików z komputera.

  5. Twój program może być tak wolny, jak chcesz i zużywać tyle zasobów, ile chcesz, o ile możesz udowodnić, że robi to, co powinien.

  6. Nie wolno tworzyć języka specjalnie do tego zadania. Jednak możesz zrobić tłumacza dla twojego wymyślonego języka w innym języku programowania.

Konrad Borowski
źródło
Czy mogę opublikować więcej niż jedną odpowiedź na ten konkurs?
TrungDQ
@TrungDQ: Jasne.
Konrad Borowski
1
To musi być jedno z najlepszych do tej pory pytań;)
Timtech
13
Jest to zbyt otwarte, nawet w przypadku witryny takiej jak ta, nawet w przypadku konkursu popularności. Dosłownie każda odpowiedź jest poprawna, nie ma żadnych ram odniesienia dla ich porównania.
Aaronaught
3
To pytanie dotyczy gry w golfa kodowego. Interesujące 100 pomysłów na postaci powinno być w stanie przeformułować się w wielkie pytania ze złotego kodu. Zachęcam ankieterów do poświęcenia kilku dodatkowych minut na przekształcenie ich odpowiedzi w nowe pytania.
gnibbler

Odpowiedzi:

26

C - 47 bajtów

Poniższy program generuje każdy dokument, jaki kiedykolwiek napisano w historii ludzkości, wraz z każdym dokumentem, który kiedykolwiek zostanie napisany, oraz mnóstwo ciekawych tekstów, których żaden człowiek nigdy nie wymyśli (wraz z „odrobiną śmieci” pomiędzy nimi). Daj mi trochę czasu. Co więcej, za każdym razem, gdy go uruchomisz, najpierw wyświetli inne teksty! Jeśli to nie jest przydatne! (A wszystko to w granicach połowy limitu znaków!)

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

Jeśli nie zależy ci na tym, aby za każdym razem generowało coś innego, potrzebujesz tylko 41 bajtów !

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

Niezupełnie zgodny z C99, ale kompiluje się płynnie gcc.exe (GCC) 4.7.0 20111220.

Stan reguł

Twój program może być tak wolny, jak chcesz i zużywać tyle zasobów, ile chcesz, o ile możesz udowodnić, że robi to, co powinien.

Nie ma problemu.

Niektóre rzeczy, ten program wyświetli:

  • rozwiązanie każdego problemu Millennium
  • artykuły w jutrzejszej gazecie
  • całe dzieła Szekspira (oczywiście)
  • twój najciemniejszy sekret
  • wszystkie pozostałe odpowiedzi na to pytanie

Raczej nie, ponieważ (jak as poprawnie wspomniany w komentarzu) rand () jest tylko pseudolosowym generatorem, który w pewnym momencie się zawinie - prawdopodobnie o wiele za wcześnie, aby wygenerować wiele znaczących tekstów. Wątpię jednak, aby pobieranie danych z prawdziwego (sprzętowego) generatora liczb losowych było możliwe zdalnie w ciągu 100 znaków. Ale zostawię to tutaj dla zabawy.

Jak zauważa Dennis, losowość algorytmu można nieco poprawić (w ramach limitu znaków), używając rand()^rand()>>16zamiast rand().

Martin Ender
źródło
10
Niekoniecznie. rand()jest tylko pseudolosowym - nie może wygenerować żadnego przydatnego tekstu, zanim się zapętli.
user12205
1
@Dennis na szczęście jest to nadal zgodne z zasadami tego pytania! :)
Martin Ender
1
@ m.buettner: Dzięki funkcji GLIBC rand () istnieje prosta algebraiczna relacja między bajtami danych wyjściowych programu : Patrząc na wynik jako tablicę x, masz x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, gdzie c[i]jest 0 z prawdopodobieństwem 0,75 i 1 z prawdopodobieństwem 0,25. To prawie oznacza, że ​​nie może wygenerować żadnej z wymienionych przez Ciebie rzeczy.
Dennis
1
@ m.buettner: Nie poprawi to PRNG, ale możesz usunąć liniowość za pomocą rand()^rand()>>16zamiast zwykłego rand(). Jeśli szukasz sposobów oszczędzania na bajtach, usuń inti %256.
Dennis
18

BBC BASIC, 84 znaków

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

Rysuje rozwiązania równań różniczkowych pierwszego i drugiego rzędu.

Pobiera jako dane wejściowe użytkownika:

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

Zainspirowany oprogramowaniem do rozwiązywania równań różniczkowych o nazwie Polymath, którego użyłem podczas studiów jako inżynier chemik. Wprowadzamy różne równania dla reagentów i produktów i obserwujemy, jak zmieniał się cały system reakcji w czasie. Bardzo proste oprogramowanie (niewiele bardziej skomplikowane niż to), ale o wiele wygodniejsze w tym celu niż Excel. Niestety nie mogę wykonać pełnego klonu Polymatha na 100 znaków.

wprowadź opis zdjęcia tutaj

Level River St
źródło
10

Mathematica 76

Ten program tworzy aplet, który wyświetla informacje dotyczące różnych właściwości dla dowolnego z 240 krajów. Otwiera się informacjami o dorosłej populacji Afganistanu. Użytkownik może zmienić ustawienia kraju i nieruchomości za pomocą list rozwijanych.

Mathematica współpracuje płynnie z WolframAlpha.
Z tego powodu uważam, że przesłanie spełnia wymaganie nr 1 wyzwania: „Twój program nie może uzyskać dostępu do Internetu, chyba że naprawdę musi ”.

Ten raczej skromny aplet wykorzystuje po prostu istniejącą funkcjonalność w języku Mathematica. Krótki film zawiera dodatkowe informacje na temat apletu.

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

alfa


Poniżej znajduje się lista pierwszych 20 (z 223) nieruchomości związanych z krajami. Dzięki dodatkowemu programowaniu można uzyskać dodatkowe informacje dotyczące krajów i analizować te informacje w Mathematica.

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

{„AdultPopulation”, „AgriculturalProducts”, „AgriculturalValueAdded”, „Airports”, „AlternateNames”, „AlternateStandardNames”, „AMRadioStations”, „AnnualBirths”, „AnnualDeaths”, „AnnualHIVAIDSDeaths”, „ArableLandArea”, „Arable” Obszar ”,„ BirthRateFraction ”,„ BorderingCountries ”,„ BordersLengths ”,„ BoundaryLength ”,„ CallingCode ”,„ CapitalCity ”,„ CapitalLocation ”}

DavidC
źródło
Nie rozumiem, w jaki sposób Twój program „musi” uzyskać dostęp do Internetu. Prezentowane dane nie zmieniają się tak często, abyś musiał polegać na źródle zewnętrznym.
shiona
1
To, czy źródło jest w środku, czy na zewnątrz, jest przedmiotem dyskusji. Rozważałem prośbę o informacje na temat WolframAlpha (którą tworzy kod) jako przypadek (niezbędnego) „dostępu do Internetu”, mimo że kod bezpośrednio konsultuje się z serwerem danych Wolfram i nie wymaga użycia przeglądarki jak FireFox. Wymaga połączenia z siecią lub Wi
Fi
1
-1, gdybym mógł - to po prostu mung struktury danych z wcześniej istniejącej usługi.
l0b0
@ l0b0 Przypuszczam, że można to zobaczyć w ten sposób. Lub możesz powiedzieć, że wykorzystuje on funkcjonalność języka. W końcu WolframAlpha została zaprojektowana od podstaw, aby ściśle współpracować z Mathematica.
DavidC
1
Informacje w WolframAlpha są integralną częścią Mathematica, a język Wolfram ” jest dość niepokojącym stanem rzeczy. To musi sprawić, że będzie to najmniej stabilny język programowania.
Peter Taylor
9

bash, 100 bajtów

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

Ten skrypt drukuje kryptograficznie bezpieczny strumień bajtów. Pobiera opcjonalny argument określający liczbę bajtów, które powinien wydrukować. Domyślnie wyjście będzie nieskończone.

Przydatne w przypadkach, gdy czytanie z /dev/urandomjest zbyt cholernie wolne.

Reper

$ 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

Ten skrypt generuje do 1,5 GiB na sekundę na moim i7-3770.

Natomiast czytanie z /dev/urandomgeneruje zaledwie 1 GiB na minutę .

Jak to działa

  • head -c${1--1} /dev/zerowyprowadza określoną liczbę bajtów zero. Jeśli nie określono żadnej wartości, ${1--1}równa się -1, a głowica generuje nieskończoną ilość.

  • openssl enc -aes-128-ctr -pass file:/dev/randomużywa AES-128 w trybie licznika do szyfrowania bajtów zerowych, odczytując hasło z /dev/random.

  • tail -c+17 pozbywa się 16-bajtowego nagłówka wyjścia.

Dennis
źródło
Zauważ, że ten strumień można odróżnić od „prawdziwego” losowego strumienia, patrząc na pierwsze 2 ^ 68 bajtów wyjściowych (prawdziwy losowy strumień powinien mieć zduplikowane bloki, ten nie będzie).
Paŭlo Ebermann
@ PaŭloEbermann: Oczywiście masz rację. Z drugiej strony wygenerowanie tylu bajtów na mojej maszynie zajęłoby ponad 6000 lat ...
Dennis
7

JavaScript

Rozwiąż dowolne równanie (cóż, nie wszystkie, ale powinno działać z typowymi funkcjami ...)

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}

Bez ES6 (105 znaków):

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}

Wystarczy podać lewą stronę równania, zakładając, że prawa strona jest równa zero.

Przykład:

  • r("x*x-9") zwroty 3
  • r("Math.sin(x)-1")zwraca 1.5707963394347828(pi / 2)
  • r("Math.pow(2,x)-512") zwroty 9

Ostrzeżenie: może się różnić w przypadku niektórych funkcji (lub jeśli nie ma rozwiązania) i zawiesić kartę przeglądarki lub zwrócić NaN.

Michael M.
źródło
6

C - 99 znaków

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

Ten program umożliwia szyfrowanie i deszyfrowanie dowolnego rodzaju danych.

Stosowanie

Najpierw ... skompiluj to!

gcc crypto.c crypto

Jeśli chcesz zaszyfrować zawartość mypreciousdata.txtkluczem mysecretkeyi zapisać wynik w myprotecteddata.txt:

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

Teraz, jeśli chcesz odzyskać zdekodowaną zawartość myprotecteddata.txt:

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

Im dłuższy klucz, tym bezpieczniej!

Wyjaśnienie

Poniżej znajdziesz rozwinięty i skomentowany kod:

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);
    }
}
Mathieu Rodic
źródło
Jest to wariant szyfru Vigenère dostosowany do alfabetu wielkości twojego chartypu (zwykle 256).
Paŭlo Ebermann
5

GolfScript

Udało mi się wycisnąć to dokładnie na 100 znaków!

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

Pobiera wejście zaszyfrowanego tekstu ROT-n i wypisuje go w postaci zdekodowanej. (Zaczerpnięte stąd .) Na przykład, gdy podano dane wejściowe pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom, dane wyjściowe to 8hellopeopleofprogrammingpuzzlescodegolfstackexchange.

Klamka
źródło
5

JavaScript

Aby wygenerować unikalny identyfikator w javascript
Math.random().toString(30).slice(2);

Produkuje coś takiego: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

ciągi 30–32 znaków alfanumerycznych

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

Produkuje coś takiego: 'uq2sze67hsacq5mi'

Sznurki o długości 14-16.

Rana Deep
źródło
4

C ++ 57

#include<iostream>
#include<conio.h>
int main(){std::cout<<getch();}  

Ten program pobiera znaki i wyświetla wartość ASCII.

Mukul Kumar
źródło
4
Kod Brainfuck $ jest znacznie krótszy,:
Timtech
2
@Timtech Nie wiem, pieprzyć mózg $
Mukul Kumar
3

Fortran - 85 bajtów

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

Wczytuje liczbę i drukuje sumę cyfr . Przydatny w przypadku problemów z Project Euler .

Kyle Kanos
źródło
W jaki sposób pomaga to w problemach z projektem Euler?
Paŭlo Ebermann
@ PaŭloEbermann: Być może powinienem dodać „trochę” przed Project Euler. Wiem na pewno, że problemy 16, 20 i 119 używają liczb cyfrowych, nie jestem pewien co do innych, ale wiele ich problemów nie potrzebuje tego.
Kyle Kanos