Machen Sie das nützlichste Programm innerhalb von 100 Zeichen [geschlossen]

13

In dieser Aufgabe dürfen Sie ein nützliches Programm erstellen, um alles zu tun, was Sie innerhalb von 100 Zeichen schreiben können. Sie dürfen weniger, aber nicht mehr Zeichen verwenden.

Regeln, nur um vor Standardlücken zu schützen, die nicht mehr lustig sind:

  1. Ihr Programm kann nicht auf das Internet zugreifen, es sei denn, es muss wirklich. Beispielsweise kann das Programm, das die am häufigsten gestellte Frage auf dieser Website anzeigt, das Internet verwenden, um diese Frage zu überprüfen. Es ist jedoch nicht gestattet, im Internet zu surfen, um die tatsächliche Quelle zu finden und diese auszuführen.

  2. Ihr Programm kann kein Dolmetscher für die Sprache sein, in der es geschrieben wurde. Brainfuck-Dolmetscher in einer anderen Sprache als Brainfuck sind jedoch in Ordnung.

  3. Ihr Programm kann keine externen Programme ausführen, die genau das tun, was Ihr Programm tut. Beispielsweise können Sie nicht ausführen vimund behaupten, dass Ihr Programm vimimplementiert ist.

  4. Ihr Programm kann für den Computer, auf dem es ausgeführt wird, und für andere Computer nicht gefährlich sein. Sie dürfen kein Programm wie rmdir /das schreiben (das Beispiel hier funktioniert absichtlich nicht, korrigieren Sie es nicht) und behaupten, es sei ein nützliches Programm, um alle Dateien auf dem Computer zu entfernen.

  5. Ihr Programm kann so langsam sein, wie Sie möchten, und so viele Ressourcen verwenden, wie Sie möchten, solange Sie nachweisen können, dass es das tut, was es beabsichtigt.

  6. Sie dürfen keine Sprache speziell für diese Aufgabe erstellen. Sie dürfen jedoch einen Interpreter für Ihre erfundene Sprache in einer anderen Programmiersprache erstellen.

Konrad Borowski
quelle
Kann ich mehr als eine Antwort für diesen Wettbewerb posten?
TrungDQ
@ TrungDQ: Sicher.
Konrad Borowski
1
Dies muss eine der besten Fragen sein;)
Timtech
13
Dies ist viel zu offen, selbst für eine Website wie diese, selbst für einen Beliebtheitswettbewerb. Wörtlich ist jede Antwort gültig, es gibt keinen Bezugsrahmen für den Vergleich.
Aaronaught
3
Diese Frage kannibalisiert Code-Golf. Interessante Ideen für 100 Charaktere sollten in großartige Code-Gold-Fragen umformuliert werden können. Ich möchte die Antwortenden dazu ermutigen, ein paar zusätzliche Minuten zu investieren, um ihre Antworten in neue Fragen zu verwandeln.
Gnibbler

Antworten:

26

C - 47 Bytes

Das folgende Programm gibt jedes Dokument aus, das jemals in der Geschichte der Menschheit geschrieben wurde, zusammen mit jedem Dokument, das jemals geschrieben werden wird, und jede Menge interessanter Texte, die kein Mensch jemals finden wird (zusammen mit einem "kleinen bisschen" Müll dazwischen). Lass dir etwas Zeit. Außerdem werden jedes Mal, wenn Sie es ausführen, zuerst andere Texte ausgegeben! Wenn das nicht sinnvoll ist! (Und das alles innerhalb der halben Zeichengrenze!)

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

Wenn es Ihnen egal ist, jedes Mal etwas anderes auszugeben, brauchen Sie nur 41 Bytes !

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

Nicht ganz C99-konform, aber es funktioniert einwandfrei gcc.exe (GCC) 4.7.0 20111220.

Die Regeln besagen

Ihr Programm kann so langsam sein, wie Sie möchten, und so viele Ressourcen verwenden, wie Sie möchten, solange Sie nachweisen können, dass es das tut, was es beabsichtigt.

Kein Problem.

Einige Dinge, die dieses Programm ausgibt:

  • Eine Lösung für jedes Millenniumsproblem
  • die zeitungsartikel von morgen
  • die kompletten Werke von Shakespeare (natürlich)
  • dein dunkelstes Geheimnis
  • alle anderen Antworten auf diese Frage

Nicht wirklich, denn (wie im Kommentar richtig erwähnt) ist rand () nur ein Pseudo-Zufallsgenerator, der sich irgendwann ändert - wahrscheinlich viel zu früh, um eine Menge aussagekräftiger Texte zu produzieren. Ich bezweifle jedoch, dass das Abrufen von Daten von einem echten (Hardware-) Zufallszahlengenerator aus der Ferne innerhalb von 100 Zeichen möglich ist. Ich lasse das hier zum Spaß.

Wie Dennis bemerkt, könnte die Zufälligkeit des Algorithmus etwas verbessert werden (innerhalb der Zeichenbegrenzung), indem rand()^rand()>>16anstelle von verwendet wird rand().

Martin Ender
quelle
10
Nicht unbedingt. rand()ist nur pseudozufällig - es wird möglicherweise kein nützlicher Text erzeugt, bevor es eine Schleife durchläuft.
user12205
1
@ Tennis zum Glück ist das noch im Rahmen der Regeln dieser Frage! :)
Martin Ender
1
@ m.buettner: Mit GLIBC der rand () , gibt es eine einfache algebraische Beziehung zwischen Byte Ausgangs Ihres Programms: die Ausgabe als Array Anzeigen xhaben Sie x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, wo c[i]0 mit einer Wahrscheinlichkeit von 0,75 und 1 mit einer Wahrscheinlichkeit von 0,25. Das bedeutet so ziemlich, dass es keines der Dinge erzeugen kann, die Sie erwähnt haben.
Dennis
1
@ m.buettner: Es wird das PRNG nicht viel besser machen, aber Sie können die Linearität entfernen, indem Sie rand()^rand()>>16anstelle von plain verwenden rand(). Wenn Sie nach Möglichkeiten suchen, Bytes zu sparen, entfernen Sie intund %256.
Dennis
18

BBC BASIC, 84 Zeichen

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

Zeichnet die Lösungen für Differentialgleichungen erster und zweiter Ordnung.

Nimmt als Benutzereingabe:

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

Inspiriert von einer Software zur Lösung von Differentialgleichungen namens Polymath, die ich während meines Studiums als Chemieingenieur verwendet habe. Wir würden verschiedene Gleichungen für Reaktanten und Produkte eingeben und sehen, wie sich das gesamte Reaktionssystem im Laufe der Zeit verändert. Eine sehr einfache Software (nicht viel komplexer als diese), aber für diesen Zweck viel praktischer als Excel. Leider kann ich keinen vollständigen Klon von Polymath in 100 Zeichen erstellen.

Bildbeschreibung hier eingeben

Level River St
quelle
10

Mathematica 76

Dieses Programm erstellt ein Applet, das Informationen zu verschiedenen Eigenschaften für 240 Länder anzeigt. Es öffnet sich mit Informationen über die erwachsene Bevölkerung Afghanistans. Der Benutzer kann die Land- und Eigenschafteneinstellungen über Dropdown-Listen ändern.

Mathematica arbeitet reibungslos mit WolframAlpha zusammen.
Aus diesem Grund glaube ich, dass die Einreichung die Anforderung Nr. 1 der Herausforderung erfüllt: "Ihr Programm kann nicht auf das Internet zugreifen, es sei denn, es muss wirklich ".

Dieses eher bescheidene Applet nutzt einfach die vorhandenen Funktionen in der Mathematica-Sprache. Ein kurzes Video enthält einige zusätzliche Informationen zum Applet.

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

Alpha


Unten finden Sie eine Liste der ersten 20 (von 223) mit Länderbezug. Mit einer zusätzlichen Programmierung kann man zusätzliche Informationen über Länder erhalten und diese Informationen in Mathematica analysieren.

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

{"AdultPopulation", "AgriculturalProducts", "AgriculturalValueAdded", "Airports", "AlternateNames", "AlternateStandardNames", "AMRadioStations", "AnnualBirths", "AnnualDeaths", "AnnualHIVAIDSDeaths", "ArableLandArea", "ArableLandL Bereich "," BirthRateFraction "," BorderingCountries "," BordersLengths "," BoundaryLength "," CallingCode "," CapitalCity "," CapitalLocation "}

DavidC
quelle
Ich sehe nicht, wie Ihr Programm auf das Internet "zugreifen" muss. Die Daten, die Sie präsentieren, ändern sich nicht so häufig, dass Sie sich auf eine externe Quelle verlassen müssten.
Shiona
1
Ob die Quelle drinnen oder draußen liegt, ist umstritten. Ich betrachtete die Anforderung von Informationen über WolframAlpha (die der Code macht) als einen Fall von (notwendigem) "Zugang zum Internet", obwohl der Code direkt einen Wolfram-Datenserver konsultiert und die Verwendung eines Browsers nicht erfordert wie FireFox. Es erfordert, dass man eine Netzwerk- oder WIFI-Verbindung hat
DavidC
1
-1 wenn ich könnte - dies mungiert einfach eine Datenstruktur aus einem vorhandenen Dienst.
l0b0
@ l0b0 Ich nehme an, du könntest es so sehen. Oder Sie könnten sagen, dass es die Funktionalität der Sprache ausnutzt. Immerhin wurde WolframAlpha von Grund auf für eine enge Zusammenarbeit mit Mathematica konzipiert.
DavidC
1
" Die Informationen in WolframAlpha sind ein wesentlicher Bestandteil von Mathematica und die Wolfram-Sprache " ist ein ziemlich alarmierender Zustand. Das muss es zur am wenigsten stabilen Programmiersprache machen.
Peter Taylor
9

Bash, 100 Bytes

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

Dieses Skript druckt einen kryptografisch sicheren Strom von Bytes. Es ist ein optionales Argument erforderlich, das die Anzahl der zu druckenden Bytes angibt. Standardmäßig ist die Ausgabe unendlich.

Nützlich in Fällen, in denen Lesen von /dev/urandom zu langsam ist.

Benchmark

$ 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

Dieses Skript generiert auf meinem i7-3770 bis zu 1,5 GiB pro Sekunde.

Das Lesen von /dev/urandomschafft es dagegen, kaum 1 GiB pro Minute zu erzeugen .

Wie es funktioniert

  • head -c${1--1} /dev/zerogibt die angegebene Anzahl von Null Bytes aus. Wenn keine Menge angegeben ist, ist sie ${1--1}gleich -1 und head gibt eine unendliche Menge aus.

  • openssl enc -aes-128-ctr -pass file:/dev/randomverwendet AES-128 im Zählermodus, um die Null-Bytes zu verschlüsseln und liest das Passwort aus /dev/random.

  • tail -c+17 entfernt den 16-Byte-Header der Ausgabe.

Dennis
quelle
Beachten Sie, dass dieser Stream von einem "echten" Zufalls-Stream durch Betrachten der ersten 2 ^ 68 Ausgangsbytes unterschieden werden kann (ein echter Zufalls-Stream sollte dort doppelte Blöcke haben, dies wird nicht der Fall sein).
Paŭlo Ebermann
@ PaŭloEbermann: Du hast offensichtlich recht. Andererseits würde es über 6.000 Jahre dauern, um so viele Bytes auf meinem Computer zu generieren ...
Dennis
7

Javascript

Löse eine Gleichung (nun ja, nicht alle, aber sollte mit gemeinsamen Funktionen funktionieren ...)

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}

Ohne ES6 (105 Zeichen):

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}

Geben Sie einfach die linke Seite der Gleichung an, unter der Annahme, dass die rechte Seite Null ist.

Beispiel:

  • r("x*x-9") kehrt zurück 3
  • r("Math.sin(x)-1")kehrt zurück 1.5707963394347828(pi / 2)
  • r("Math.pow(2,x)-512") kehrt zurück 9

Warnung: Bei einigen Funktionen kann es zu Abweichungen kommen (oder wenn es keine Lösung gibt), und die Registerkarte Ihres Browsers kann eingefroren oder NaN zurückgegeben werden.

Michael M.
quelle
6

C - 99 Zeichen

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

Dieses Programm ermöglicht das Ver- und Entschlüsseln beliebiger Daten.

Verwendung

Zuerst ... kompiliere es!

gcc crypto.c crypto

Wenn Sie den Inhalt von mypreciousdata.txtmit dem Schlüssel verschlüsseln möchten mysecretkey, speichern Sie das Ergebnis in myprotecteddata.txt:

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

Wenn Sie nun den dekodierten Inhalt von myprotecteddata.txt:

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

Je länger der Schlüssel, desto sicherer!

Erläuterung

Den erweiterten und kommentierten Code finden Sie unten:

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
quelle
Dies ist eine Variante der Vigenère-Chiffre, die für ein Alphabet der Größe Ihres charTyps (normalerweise 256) angepasst ist .
Paŭlo Ebermann
5

GolfScript

Ich habe es geschafft, dies in genau 100 Zeichen zu quetschen!

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

Es nimmt die Eingabe von ROT-n-verschlüsseltem Text entgegen und gibt den dekodierten Text aus. (Entnommen hier .) Wenn zum Beispiel der Eingabe gegeben pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom, ist der Ausgang 8hellopeopleofprogrammingpuzzlescodegolfstackexchange.

Türknauf
quelle
5

JavaScript

So generieren Sie eine eindeutige ID in Javascript
Math.random().toString(30).slice(2);

Produziert so etwas wie: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

Zeichenfolgen mit 30-32 alphanumerischen Zeichen

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

Produziert so etwas wie: 'uq2sze67hsacq5mi'

Saitenlänge 14-16.

Rana Deep
quelle
4

C ++ 57

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

Dieses Programm nimmt eine Zeicheneingabe und gibt seinen ASCII-Wert aus.

Mukul Kumar
quelle
4
Der Brainfuck $ Code ist viel kürzer -,:
Timtech
2
@ Timtech Ich weiß nicht, Brainfuck $
Mukul Kumar
3

Fortran - 85 Bytes

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

Liest eine Zahl ein und gibt die Summe der Ziffern aus . Nützlich bei Problemen mit Project Euler .

Kyle Kanos
quelle
Wie hilft das bei Problemen mit dem Projekt Euler?
Paŭlo Ebermann
@ PaŭloEbermann: Vielleicht hätte ich "einiges" vor Project Euler hinzufügen sollen. Ich weiß sicher, dass die Probleme 16, 20 und 119 Ziffernsummen verwenden, nicht sicher, aber viele ihrer Probleme brauchen diese nicht .
Kyle Kanos