Créez le programme le plus utile en 100 caractères [fermé]


13

Dans cette tâche, vous êtes autorisé à créer un programme utile pour faire tout ce que vous pouvez écrire à moins de 100 caractères. Vous êtes autorisé à utiliser moins de caractères, mais pas plus.

Des règles, juste pour se protéger des failles standard qui ne sont plus drôles:

  1. Votre programme ne peut pas accéder à Internet, sauf si c'est vraiment le cas. Par exemple, le programme qui affiche la question la plus votée sur ce site Web peut utiliser Internet pour vérifier cette question. Cependant, il n'est pas autorisé à naviguer sur Internet afin de trouver sa véritable source et de l'exécuter.

  2. Votre programme ne peut pas être un interprète pour la langue dans laquelle il a été écrit. Cependant, un interprète Brainfuck dans une langue autre que Brainfuck conviendrait.

  3. Votre programme ne peut pas exécuter des programmes externes qui font exactement ce que fait votre programme. Par exemple, vous ne pouvez pas exécuter vimet prétendre que votre programme estvim implémentation.

  4. Votre programme ne peut pas être dangereux pour l'ordinateur sur lequel il est exécuté et pour d'autres ordinateurs. Vous n'êtes pas autorisé à écrire un programme commermdir / (l'exemple ici ne fonctionne pas intentionnellement, ne le corrigez pas) et prétendez que c'est un programme utile pour supprimer tous les fichiers sur l'ordinateur.

  5. Votre programme peut être aussi lent que vous le souhaitez et utiliser autant de ressources que vous le souhaitez, tant que vous pouvez prouver qu'il fait ce qu'il voulait faire.

  6. Vous n'êtes pas autorisé à créer un langage spécifiquement pour cette tâche. Cependant, vous êtes autorisé à faire interprète pour votre langue inventée dans un autre langage de programmation.


Puis-je poster plus d'une réponse pour ce concours?
TrungDQ

@TrungDQ: Bien sûr.
Konrad Borowski

1
Cela doit être l'une des meilleures questions à ce jour;)
Timtech

13
C'est beaucoup trop ouvert, même pour un site comme celui-ci, même pour un concours de popularité. Littéralement, n'importe quelle réponse est valable, il n'y a aucun cadre de référence pour les comparer.
Aaronaught

3
Cette question cannibalise le code-golf. Les idées intéressantes de 100 personnages devraient pouvoir être reformulées en grandes questions de code-or. J'encourage les répondeurs à consacrer quelques minutes supplémentaires à transformer leurs réponses en nouvelles questions.
gnibbler

Réponses:


26

C - 47 octets

Le programme suivant génère tous les documents jamais écrits dans l'histoire de l'humanité, ainsi que tous les documents qui seront jamais écrits et des tonnes de textes intéressants qu'aucun humain ne trouvera jamais (avec un "petit" morceau de déchets entre les deux). Donnez-lui juste un peu de temps. De plus, chaque fois que vous l'exécutez, il affichera d'abord différents textes! Si ce n'est pas utile! (Et tout cela dans la moitié de la limite de caractères!)

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

Si vous ne vous souciez pas de produire quelque chose d'autre à chaque fois, vous n'avez besoin que de 41 octets !

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

Pas tout à fait conforme à C99, mais il compile facilement avec gcc.exe (GCC) 4.7.0 20111220.

Les règles indiquent

Votre programme peut être aussi lent que vous le souhaitez et utiliser autant de ressources que vous le souhaitez, tant que vous pouvez prouver qu'il fait ce qu'il voulait faire.

Aucun problème.

Certaines choses, ce programme affichera:

  • une solution à chaque problème du millénaire
  • les articles de journaux de demain
  • les œuvres complètes de Shakespeare (bien sûr)
  • ton plus sombre secret
  • toutes les autres réponses à cette question

Pas vraiment, car (comme Ace le mentionne correctement dans le commentaire), rand () n'est qu'un générateur pseudo-aléatoire, qui s'enroulera à un moment donné - probablement beaucoup trop tôt pour produire beaucoup de textes significatifs. Mais je doute que l'obtention de données à partir d'un véritable générateur de nombres aléatoires (matériel) soit possible à distance en moins de 100 caractères. Je laisse cela ici pour le plaisir, cependant.

Comme le note Dennis, le caractère aléatoire de l'algorithme pourrait être quelque peu amélioré (dans la limite des caractères), en utilisant à la rand()^rand()>>16place de rand().


10
Pas nécessairement. rand()est uniquement pseudo-aléatoire - il ne peut produire aucun texte utile avant de boucler.
user12205

1
@Dennis, heureusement, cela reste dans les règles de cette question! :)
Martin Ender

1
@ m.buettner: Avec rand () de GLIBC , il existe une relation algébrique simple entre les octets de la sortie de votre programme: xvous voyez la sortie sous forme de tableau x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, où c[i]0 est avec une probabilité de 0,75 et 1 avec une probabilité de 0,25. Cela signifie à peu près qu'il ne peut générer aucune des choses que vous avez mentionnées.
Dennis

1
@ m.buettner: Cela n'améliorera pas beaucoup le PRNG, mais vous pouvez supprimer la linéarité en utilisant à la rand()^rand()>>16place de plain rand(). Si vous cherchez des moyens d'économiser sur les octets, supprimez intet %256.
Dennis


18

BBC BASIC, 84 caractères

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

Trace les solutions des équations différentielles du premier et du deuxième ordre.

Prend comme entrée utilisateur:

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

Inspiré par un logiciel de résolution d'équations différentielles appelé Polymath que j'ai utilisé lors de mes études d'ingénieur chimiste. Nous saisirions différentes équations pour les réactifs et les produits et verrions comment l'ensemble du système réactionnel a changé au fil du temps. Un logiciel très simple (pas beaucoup plus complexe que cela) mais beaucoup plus pratique à cet effet qu'Excel. Malheureusement, je ne peux pas faire un clone complet de Polymath en 100 caractères.

enter image description here


10

Mathematica 76

Ce programme construit une applet qui affiche des informations concernant diverses propriétés pour l'un des 240 pays. Il s'ouvre sur des informations sur la population adulte d'Afghanistan. L'utilisateur peut modifier les paramètres de pays et de propriété via des listes déroulantes.

Mathematica interagit sans problème avec WolframAlpha.
Pour cette raison, je pense que la soumission répond à l'exigence n ° 1 du défi: "Votre programme ne peut pas accéder à Internet, à moins qu'il ne le doive vraiment ".

Cette applet plutôt modeste utilise simplement les fonctionnalités existantes dans le langage Mathematica. Une courte vidéo fournit des informations supplémentaires sur l'applet.

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

alpha


Vous trouverez ci-dessous une liste des 20 premières propriétés (sur 223) liées aux pays. Avec une programmation supplémentaire, on peut obtenir des informations supplémentaires sur les pays et analyser ces informations dans Mathematica.

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

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


Je ne vois pas comment votre programme "doit" accéder à Internet. Les données que vous présentez ne changent pas si souvent que vous devrez vous fier à une source extérieure.
shiona

1
Que la source soit à l'intérieur ou à l'extérieur est sujet à débat. Je considérais la demande d'informations sur WolframAlpha (que fait le code) comme un cas (nécessaire) d '"accès à Internet", même si le code consulte directement un serveur de données Wolfram et ne nécessite pas l'utilisation d'un navigateur comme FireFox. Cela nécessite d'avoir une connexion réseau ou WIFI
DavidC

1
-1 si je le pouvais - cela ne fait que munir une structure de données d'un service préexistant.
l0b0

@ l0b0 Je suppose que vous pouvez le voir de cette façon. Ou vous pourriez dire qu'il exploite les fonctionnalités du langage. Après tout, WolframAlpha a été conçu dès le départ pour interagir étroitement avec Mathematica.
DavidC

1
" Les informations contenues dans WolframAlpha font partie intégrante de Mathematica et du Wolfram Language " est une situation plutôt alarmante. Cela doit en faire le langage de programmation le moins stable qui existe.
Peter Taylor

9

bash, 100 octets

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

Ce script imprime un flux d'octets cryptographiquement sécurisé. Il prend un argument facultatif spécifiant le nombre d'octets qu'il doit imprimer. Par défaut, la sortie sera infinie.

Utile dans les cas où la lecture /dev/urandomest tout simplement trop lente.

Référence

$ 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

Ce script génère jusqu'à 1,5 Gio par seconde sur mon i7-3770.

En revanche, la lecture de /dev/urandomparvient à générer à peine 1 Gio par minute .

Comment ça fonctionne

  • head -c${1--1} /dev/zerorenvoie la quantité spécifiée de zéro octet. Si aucun montant n'est spécifié, ${1--1}est égal à -1 et la tête génère une quantité infinie.

  • openssl enc -aes-128-ctr -pass file:/dev/randomutilise AES-128 en mode compteur pour chiffrer les zéro octets, en lisant le mot de passe /dev/random.

  • tail -c+17 supprime l'en-tête de 16 octets de la sortie.


Notez que ce flux peut être distingué d'un flux aléatoire "réel" en regardant les premiers 2 ^ 68 octets de sortie (un flux aléatoire réel devrait y avoir des blocs dupliqués, celui-ci ne le sera pas).
Paŭlo Ebermann

@ PaŭloEbermann: Vous avez évidemment raison. Là encore, il faudrait plus de 6 000 ans pour générer autant d'octets sur ma machine ...
Dennis

7

Javascript

Résoudre n'importe quelle équation (enfin, pas toutes, mais devrait fonctionner avec des fonctions communes ...)

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}

Sans ES6 (105 caractères):

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}

Donnez simplement le côté gauche de l'équation en supposant que le côté droit est nul.

Exemple :

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

Attention: peut diverger sur certaines fonctions (ou s'il n'y a pas de solution) et figer l'onglet de votre navigateur, ou retourner NaN.


6

C - 99 caractères

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

Ce programme permet le cryptage et le décryptage de tout type de données.

Usage

D'abord ... compilez-le!

gcc crypto.c crypto

Si vous souhaitez crypter le contenu de mypreciousdata.txtavec la clé mysecretkeyet stocker le résultat dans myprotecteddata.txt:

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

Maintenant, si vous souhaitez récupérer le contenu décodé de myprotecteddata.txt:

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

Plus la clé est longue, plus c'est sûr!

Explication

Veuillez trouver le code développé et commenté ci-dessous:

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);
    }
}

Il s'agit d'une variante du chiffre Vigenère adapté à un alphabet de la taille de votre chartype (généralement 256).
Paŭlo Ebermann

5

GolfScript

J'ai réussi à le presser en exactement 100 caractères!

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

Il prend l'entrée du texte chiffré ROT-n et sort le texte décodé. (Pris à partir d' ici .) Par exemple, lorsque donné l'entrée pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom, la sortie est8hellopeopleofprogrammingpuzzlescodegolfstackexchange .


5

Javascript

Pour générer un identifiant unique en javascript
Math.random().toString(30).slice(2);

Produit quelque chose comme: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

chaînes de 30 à 32 caractères alphanumériques

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

Produit quelque chose comme: 'uq2sze67hsacq5mi'

Cordes de longueur 14-16.



3

Fortran - 85 octets

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

Lit un nombre et imprime la somme des chiffres . Utile pour les problèmes de Project Euler .


Comment cela aide-t-il les problèmes du projet Euler?
Paŭlo Ebermann

@ PaŭloEbermann: J'aurais peut-être dû ajouter "certains" avant le projet Euler. Je sais à coup sûr que les problèmes 16, 20 et 119 utilisent des sommes numériques, pas sûrs des autres, mais beaucoup de leurs problèmes n'ont pas besoin de celui-ci.
Kyle Kanos
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.