Crea il programma più utile entro 100 caratteri [chiuso]


13

In questa attività, ti è permesso creare un programma utile per fare tutto ciò che puoi scrivere entro 100 caratteri. Puoi usare meno caratteri, ma non di più.

Regole, solo per proteggere da scappatoie standard che non sono più divertenti:

  1. Il tuo programma non può accedere a Internet, a meno che non sia necessario. Ad esempio, il programma che mostra la domanda più votata su questo sito Web può utilizzare Internet per verificare questa domanda. Tuttavia, non è consentito navigare in Internet per trovare la sua vera fonte ed eseguirlo.

  2. Il tuo programma non può essere un interprete per la lingua in cui è stato scritto. Tuttavia, l'interprete Brainfuck in una lingua non Brainfuck andrebbe bene.

  3. Il tuo programma non può eseguire programmi esterni che fanno esattamente ciò che fa il tuo programma. Ad esempio, non è possibile eseguire vime dichiarare che il programma è in fase di vimimplementazione.

  4. Il tuo programma non può essere pericoloso per il computer su cui è in esecuzione e altri computer. Non è consentito scrivere programmi come rmdir /(l'esempio qui intenzionalmente non funziona, non risolverlo) e dichiarare che è un programma utile per rimuovere tutti i file sul computer.

  5. Il tuo programma potrebbe essere lento quanto desideri e utilizzare tutte le risorse che desideri, purché tu possa provare che fa quello che voleva fare.

  6. Non sei autorizzato a creare una lingua specifica per questa attività. Tuttavia, ti è permesso fare interprete per il tuo linguaggio inventato in qualche altro linguaggio di programmazione.


Posso pubblicare più di una risposta per questo concorso?
TrungDQ,

@TrungDQ: Sicuro.
Konrad Borowski il

1
Questa deve essere una delle migliori domande fino ad oggi;)
Timtech,

13
È troppo aperto, anche per un sito come questo, anche per un concorso di popolarità. Letteralmente ogni risposta è valida, non esiste alcun quadro di riferimento per confrontarle.
Aaronaught,

3
Questa domanda sta cannibalizzando il code-golf. Interessanti idee di 100 personaggi dovrebbero poter essere riformulate in grandi domande in codice oro. Incoraggerei i rispondenti a dedicare qualche minuto in più per trasformare le loro risposte in nuove domande.
Gnibbler,

Risposte:


26

C - 47 byte

Il seguente programma produce tutti i documenti mai scritti nella storia umana, insieme a tutti i documenti che verranno mai scritti e un sacco di testi interessanti che nessun umano potrà mai trovare (insieme a un "po '" di immondizia in mezzo). Dagli un po 'di tempo. Inoltre, ogni volta che lo esegui, verranno prima emessi testi diversi! Se questo non è utile! (E tutto ciò entro la metà del limite del personaggio!)

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

Se non ti interessa emettere qualcos'altro ogni volta, hai solo bisogno di 41 byte !

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

Non abbastanza C99 conforme, ma si compila senza problemi gcc.exe (GCC) 4.7.0 20111220.

Le regole dichiarano

Il tuo programma potrebbe essere lento quanto desideri e utilizzare tutte le risorse che desideri, purché tu possa provare che fa quello che voleva fare.

Nessun problema.

Alcune cose, questo programma produrrà:

  • una soluzione per ogni problema del millennio
  • articoli di giornale di domani
  • le opere complete di Shakespeare (ovviamente)
  • il tuo segreto più oscuro
  • tutte le altre risposte a questa domanda

Non proprio, perché (come l'asso correttamente citato nel commento), rand () è solo un generatore pseudo-casuale, che si avvolgerà a un certo punto - probabilmente troppo presto per produrre molti testi significativi. Ma dubito che ottenere dati da un vero generatore di numeri casuali (hardware) sia possibile in remoto entro 100 caratteri. Lascio questo qui per divertimento, però.

Come osserva Dennis, la casualità dell'algoritmo potrebbe essere leggermente migliorata (entro il limite di caratteri), usando rand()^rand()>>16invece di rand().


10
Non necessariamente. rand()è solo pseudocasuale: potrebbe non produrre alcun testo utile prima che si giri.
user12205

1
@Dennis per fortuna che è ancora entro le regole di questa domanda! :)
Martin Ender,

1
@ m.buettner: Con rand di GLIBC () , c'è una semplice relazione algebrica tra i byte di uscita del vostro programma: Visualizzazione dell'output come un array x, avete x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, dove c[i]è 0 con probabilità 0,75 e 1 con probabilità 0.25. Questo praticamente significa che non può generare nessuna delle cose che hai menzionato.
Dennis,

1
@ m.buettner: non renderà il PRNG molto migliore, ma puoi rimuovere la linearità usando rand()^rand()>>16invece di plain rand(). Se stai cercando modi per risparmiare sui byte, rimuovi inte %256.
Dennis,


18

BBC BASIC, 84 caratteri

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

Traccia le soluzioni alle equazioni differenziali del primo e del secondo ordine.

Accetta come input dell'utente:

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

Ispirato da un software di risoluzione delle equazioni differenziali chiamato Polymath che ho usato quando studiavo per essere un ingegnere chimico. Vorremmo inserire diverse equazioni per reagenti e prodotti e vedere come l'intero sistema di reazione è cambiato nel tempo. Un software molto semplice (non molto più complesso di questo) ma molto più conveniente per questo scopo di Excel. Sfortunatamente non posso fare un clone completo di Polymath in 100 caratteri.

enter image description here


10

Mathematica 76

Questo programma costruisce un'applet che visualizza informazioni relative a varie proprietà per uno dei 240 paesi. Si apre con informazioni sulla popolazione adulta dell'Afghanistan. L'utente può modificare le impostazioni del Paese e delle proprietà tramite gli elenchi a discesa.

Mathematica interagisce senza problemi con WolframAlpha.
Per questo motivo credo che l'invio soddisfi il requisito n. 1 della sfida: "Il tuo programma non può accedere a Internet, a meno che non sia necessario ".

Questa applet piuttosto modesta fa semplicemente uso delle funzionalità esistenti nel linguaggio Mathematica. Un breve video fornisce alcune informazioni aggiuntive sull'applet.

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

alpha


Di seguito è riportato un elenco delle prime 20 (di 223) proprietà correlate ai paesi. Con una programmazione aggiuntiva è possibile ottenere ulteriori informazioni sui paesi e analizzare tali informazioni in Mathematica.

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

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


Non vedo come il tuo programma "deve" accedere a Internet. I dati che presenti non cambiano così frequentemente che dovresti fare affidamento su una fonte esterna.
shiona,

1
Se la fonte è dentro o fuori è aperta al dibattito. Stavo considerando la richiesta di informazioni su WolframAlpha (che fa il codice) come un caso di (necessario) "accesso a Internet", anche se il codice consulta direttamente un server di dati Wolfram e non richiede l'uso di un browser come FireFox. Richiede che uno abbia una connessione di rete o WIFI
DavidC

1
-1 se potessi - questo semplicemente muta una struttura di dati da un servizio preesistente.
l0b0

@ l0b0 Suppongo che tu possa vederlo in quel modo. Oppure potresti dire che sfrutta la funzionalità della lingua. Dopotutto, WolframAlpha è stato progettato da zero per interagire strettamente con Mathematica.
DavidC

1
" Le informazioni in WolframAlpha sono parte integrante di Mathematica e il linguaggio Wolfram " è una situazione piuttosto allarmante. Ciò deve renderlo il linguaggio di programmazione meno stabile esistente.
Peter Taylor,

9

bash, 100 byte

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

Questo script stampa un flusso crittograficamente sicuro di byte. Prende un argomento facoltativo che specifica il numero di byte che deve stampare. Per impostazione predefinita, l'output sarà infinito.

Utile nei casi in cui la lettura /dev/urandomè troppo dannatamente lenta.

Prova delle prestazioni

$ 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

Questo script genera fino a 1,5 GiB al secondo sul mio i7-3770.

Al contrario, la lettura da /dev/urandomriesce a generare appena 1 GiB al minuto .

Come funziona

  • head -c${1--1} /dev/zerogenera la quantità specificata di zero byte. Se non viene specificato alcun importo, ${1--1}pari -1 e testa emette una quantità infinita.

  • openssl enc -aes-128-ctr -pass file:/dev/randomutilizza AES-128 in modalità contatore per crittografare i byte zero, leggendo la password da /dev/random.

  • tail -c+17 elimina l'intestazione a 16 byte dell'output.


Si noti che questo flusso può essere distinto da un flusso casuale "reale" guardando i primi 2 ^ 68 byte di output (un flusso casuale reale dovrebbe avere blocchi duplicati lì, questo non lo farà).
Paŭlo Ebermann,

@ PaŭloEbermann: hai ovviamente ragione. Inoltre, occorrerebbero oltre 6.000 anni per generare tanti byte sulla mia macchina ...
Dennis

7

Javascript

Risolvi qualsiasi equazione (beh, non tutte, ma dovrebbe funzionare con funzioni comuni ...)

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}

Senza ES6 (105 caratteri):

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}

Basta dare il lato sinistro dell'equazione supponendo che il lato destro sia zero.

Esempio :

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

Attenzione: può divergere su alcune funzioni (o se non c'è soluzione) e bloccare la scheda del browser o restituire NaN.


6

C - 99 caratteri

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

Questo programma consente la crittografia e la decrittografia di qualsiasi tipo di dati.

uso

Prima di tutto ... compilarlo!

gcc crypto.c crypto

Se si desidera crittografare il contenuto di mypreciousdata.txtcon la chiave mysecretkeye archiviare il risultato in myprotecteddata.txt:

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

Ora, se si desidera recuperare i contenuti decodificati di myprotecteddata.txt:

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

Più lunga è la chiave, più sicura!

Spiegazione

Di seguito troverai il codice espanso e commentato:

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

Questa è una variante del codice Vigenère adattato per un alfabeto delle dimensioni del tuo chartipo (di solito 256).
Paŭlo Ebermann,

5

GolfScript

Sono riuscito a comprimerlo esattamente in 100 caratteri!

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

Prende l'input del testo crittografato ROT-n e genera il testo decodificato. (Tratto da qui .) Ad esempio, quando viene fornito l'input pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom, l'output è 8hellopeopleofprogrammingpuzzlescodegolfstackexchange.


5

JavaScript

Per generare un ID univoco in JavaScript
Math.random().toString(30).slice(2);

Produce qualcosa di simile: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

stringhe di 30-32 caratteri alfanumerici

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

Produce qualcosa di simile: 'uq2sze67hsacq5mi'

Stringhe di lunghezza 14-16.



3

Fortran - 85 byte

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

Legge un numero e stampa la somma delle cifre . Utile per problemi di Project Euler .


In che modo aiuta a risolvere i problemi di Eulero del progetto?
Paŭlo Ebermann,

@ PaŭloEbermann: Forse avrei dovuto aggiungere "alcuni" prima di Project Euler. So per certo che i problemi 16, 20 e 119 usano somme di cifre, non sono sicuro degli altri, ma molti dei loro problemi non ne hanno bisogno.
Kyle Kanos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.