Buat program yang paling berguna dalam 100 karakter [ditutup]

13

Dalam tugas ini, Anda diizinkan membuat program yang berguna untuk melakukan apa pun yang dapat Anda tulis dalam 100 karakter. Anda diizinkan menggunakan lebih sedikit karakter, tetapi tidak lebih.

Aturan, hanya untuk melindungi dari celah standar yang tidak lagi lucu:

  1. Program Anda tidak dapat mengakses internet, kecuali memang harus. Misalnya, program yang menampilkan pertanyaan paling banyak diperbarui di situs web ini dapat menggunakan Internet untuk memeriksa pertanyaan ini. Namun, tidak diperbolehkan menjelajah Internet untuk menemukan sumber aslinya dan menjalankannya.

  2. Program Anda tidak bisa menjadi penerjemah untuk bahasa yang ditulisnya. Namun, penerjemah Brainfuck dalam bahasa non-Brainfuck akan baik-baik saja.

  3. Program Anda tidak dapat menjalankan program eksternal yang melakukan persis seperti yang dilakukan program Anda. Misalnya, Anda tidak dapat menjalankan vim, dan mengklaim bahwa program Anda adalah vimimplementasi.

  4. Program Anda tidak dapat berbahaya bagi komputer yang sedang dijalankan dan komputer lain. Anda tidak diperbolehkan menulis program seperti rmdir /(contoh di sini sengaja tidak berfungsi, jangan memperbaikinya), dan mengklaim itu adalah program yang berguna untuk menghapus semua file di komputer.

  5. Program Anda mungkin selambat yang Anda inginkan, dan gunakan sumber daya sebanyak yang Anda inginkan, selama Anda dapat membuktikannya melakukan apa yang seharusnya dilakukan.

  6. Anda tidak diizinkan membuat bahasa khusus untuk tugas ini. Namun, Anda diizinkan membuat juru bahasa untuk bahasa yang Anda temukan dalam beberapa bahasa pemrograman lain.

Konrad Borowski
sumber
Bisakah saya mengirim lebih dari satu jawaban untuk kontes ini?
TrungDQ
@ TrungDQ: Tentu.
Konrad Borowski
1
Ini harus menjadi salah satu pertanyaan terbaik sampai saat ini;)
Timtech
13
Ini terlalu terbuka, bahkan untuk situs seperti ini, bahkan untuk kontes popularitas. Secara harfiah jawaban apa pun valid, tidak ada kerangka referensi apa pun untuk membandingkannya.
Aaronaught
3
Pertanyaan ini adalah kanibalisasi kode-golf. Ide-ide 100 karakter yang menarik harus dapat diulang menjadi pertanyaan kode-emas yang hebat. Saya mendorong para penjawab untuk meluangkan beberapa menit ekstra untuk mengubah jawaban mereka menjadi pertanyaan baru.
gnibbler

Jawaban:

26

C - 47 byte

Program berikut menampilkan setiap dokumen yang pernah ditulis dalam sejarah manusia, bersama dengan setiap dokumen yang akan pernah ditulis dan banyak teks menarik yang tidak akan pernah muncul manusia (bersama dengan "sedikit" sampah di antaranya). Beri saja waktu. Selain itu, setiap kali Anda menjalankannya, itu akan menampilkan teks yang berbeda terlebih dahulu! Jika itu tidak bermanfaat! (Dan semua itu dalam setengah batas karakter!)

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

Jika Anda tidak peduli tentang itu menghasilkan sesuatu yang lain setiap kali, Anda hanya perlu 41 byte !

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

Tidak cukup C99 menyesuaikan, tetapi kompilasi dengan lancar gcc.exe (GCC) 4.7.0 20111220.

Aturan menyatakan

Program Anda mungkin selambat yang Anda inginkan, dan gunakan sumber daya sebanyak yang Anda inginkan, selama Anda dapat membuktikannya melakukan apa yang seharusnya dilakukan.

Tidak masalah.

Beberapa hal, program ini akan menampilkan:

  • solusi untuk setiap Masalah Milenium
  • artikel surat kabar besok
  • karya lengkap Shakespeare (tentu saja)
  • rahasia tergelapmu
  • semua jawaban lain untuk pertanyaan ini

Tidak juga, karena (seperti ace disebutkan dalam komentar), rand () hanya generator pseudo-acak, yang akan membungkus di beberapa titik - mungkin terlalu dini untuk menghasilkan banyak teks yang bermakna. Tapi saya ragu bahwa mendapatkan data dari generator nomor acak (perangkat keras) yang sebenarnya mungkin dari jarak jauh dalam 100 karakter. Saya akan meninggalkan ini di sini untuk bersenang-senang.

Sebagai catatan Dennis, keacakan algoritma, bisa agak ditingkatkan (dalam batas karakter), dengan menggunakan rand()^rand()>>16alih-alih rand().

Martin Ender
sumber
10
Belum tentu. rand()hanya pseudorandom - mungkin tidak menghasilkan teks yang berguna sebelum diulang.
user12205
1
@Dennis untungnya masih dalam aturan pertanyaan ini! :)
Martin Ender
1
@ m.buettner: Dengan GLIBC's rand () , ada hubungan aljabar sederhana antara byte dari output program Anda: Anda melihat output sebagai array x, Anda miliki x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, di mana c[i]0 dengan probabilitas 0,75 dan 1 dengan probabilitas 0,25. Ini berarti bahwa itu tidak dapat menghasilkan hal-hal yang Anda sebutkan.
Dennis
1
@ m.buettner: Ini tidak akan membuat PRNG jauh lebih baik, tetapi Anda dapat menghapus linearitas menggunakan rand()^rand()>>16alih-alih polos rand(). Jika Anda mencari cara untuk menghemat byte, hapus intdan %256.
Dennis
18

BBC BASIC, 84 karakter

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

Plot solusi untuk persamaan diferensial orde pertama dan kedua.

Dibawa sebagai input pengguna:

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

Terinspirasi oleh perangkat lunak penyelesaian persamaan diferensial yang disebut Polymath yang saya gunakan ketika belajar untuk menjadi insinyur kimia. Kami akan memasukkan persamaan yang berbeda untuk reaktan dan produk dan melihat bagaimana keseluruhan sistem reaksi berubah seiring waktu. Perangkat lunak yang sangat sederhana (tidak jauh lebih kompleks dari ini) tetapi jauh lebih nyaman untuk tujuan ini daripada Excel. Sayangnya saya tidak dapat melakukan klon lengkap Polymath dalam 100 karakter.

masukkan deskripsi gambar di sini

Level River St
sumber
10

Mathematica 76

Program ini membuat applet yang menampilkan informasi mengenai berbagai properti untuk 240 negara. Ini dibuka dengan informasi tentang populasi orang dewasa Afghanistan. Pengguna dapat mengubah pengaturan negara dan properti melalui daftar drop-down.

Mathematica beroperasi dengan lancar dengan WolframAlpha.
Untuk alasan ini saya percaya kiriman memenuhi persyaratan # 1 dari tantangan: "Program Anda tidak dapat mengakses internet, kecuali jika benar-benar harus ".

Applet yang agak sederhana ini hanya menggunakan fungsionalitas yang ada dalam bahasa Mathematica. Video pendek memberikan beberapa informasi tambahan tentang applet.

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

alfa


Di bawah ini adalah daftar 20 (dari 223) properti pertama yang terkait dengan negara. Dengan pemrograman tambahan, seseorang dapat memperoleh informasi tambahan mengenai negara dan menganalisis informasi ini dalam Mathematica.

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

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

DavidC
sumber
Saya tidak melihat bagaimana program Anda "harus" mengakses internet. Data yang Anda tampilkan tidak berubah sesering yang Anda perlukan untuk mengandalkan sumber luar.
shiona
1
Apakah sumbernya di dalam atau di luar terbuka untuk diperdebatkan. Saya mempertimbangkan permintaan untuk informasi tentang WolframAlpha (yang dibuat oleh kode) untuk menjadi kasus (diperlukan) "akses ke internet", meskipun kode tersebut secara langsung berkonsultasi dengan server data Wolfram dan tidak memerlukan penggunaan browser. seperti FireFox. Itu memang mengharuskan seseorang memiliki koneksi jaringan atau WIFI
DavidC
1
-1 jika saya bisa - ini hanya munges struktur data dari layanan yang sudah ada sebelumnya.
l0b0
@ l0b0 Saya kira Anda bisa melihatnya seperti itu. Atau Anda mungkin mengatakan bahwa itu mengeksploitasi fungsionalitas bahasa. Setelah semua, WolframAlpha dirancang dari bawah ke atas untuk bekerja sama erat dengan Mathematica.
DavidC
1
" Informasi dalam WolframAlpha adalah bagian integral dari Mathematica dan Bahasa Wolfram " adalah keadaan yang agak mengkhawatirkan. Itu harus membuatnya menjadi bahasa pemrograman yang paling tidak stabil yang ada.
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

Script ini mencetak aliran byte yang aman secara kriptografis. Dibutuhkan argumen opsional yang menetapkan jumlah byte yang harus dicetak. Secara default, output akan menjadi tak terbatas.

Berguna dalam kasus di mana membaca dari /dev/urandomterlalu lambat.

Tolok ukur

$ 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

Script ini menghasilkan hingga 1,5 GiB per detik pada i7-3770 saya.

Sebaliknya, membaca dari /dev/urandommengelola menghasilkan hampir 1 GiB per menit .

Bagaimana itu bekerja

  • head -c${1--1} /dev/zeromenghasilkan jumlah yang ditentukan dari nol byte. Jika tidak ada jumlah yang ditentukan, ${1--1}sama dengan -1 dan head menghasilkan jumlah yang tak terbatas.

  • openssl enc -aes-128-ctr -pass file:/dev/randommenggunakan AES-128 dalam mode penghitung untuk mengenkripsi nol byte, membaca kata sandi dari /dev/random.

  • tail -c+17 menghilangkan header 16-byte output.

Dennis
sumber
Perhatikan bahwa aliran ini dapat dibedakan dari aliran acak "nyata" dengan melihat byte keluaran 2 ^ 68 pertama (aliran acak nyata seharusnya memiliki blok duplikat di sana, yang ini tidak akan).
Paŭlo Ebermann
@ PaŭloEbermann: Anda jelas benar. Kemudian lagi, akan diperlukan lebih dari 6.000 tahun untuk menghasilkan banyak byte pada mesin saya ...
Dennis
7

Javascript

Memecahkan persamaan apa pun (well, tidak semua, tetapi harus berfungsi dengan fungsi umum ...)

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}

Tanpa ES6 (105 karakter):

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}

Berikan saja sisi kiri persamaan dengan asumsi bahwa sisi kanan adalah nol.

Contoh:

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

Peringatan: dapat menyimpang dari beberapa fungsi (atau jika tidak ada solusi) dan membekukan tab browser Anda, atau mengembalikan NaN.

Michael M.
sumber
6

C - 99 karakter

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

Program ini memungkinkan enkripsi dan dekripsi segala jenis data.

Pemakaian

Pertama ... kompilasi!

gcc crypto.c crypto

Jika Anda ingin mengenkripsi konten mypreciousdata.txtdengan kunci mysecretkey, dan simpan hasilnya di myprotecteddata.txt:

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

Sekarang, jika Anda ingin mengambil konten yang diterjemahkan myprotecteddata.txt:

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

Semakin lama kuncinya, semakin aman!

Penjelasan

Silakan temukan kode yang diperluas dan dikomentari di bawah ini:

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
sumber
Ini adalah varian dari cipher Vigenère yang diadaptasi untuk alfabet ukuran chartipe Anda (biasanya 256).
Paŭlo Ebermann
5

GolfScript

Saya berhasil memeras ini menjadi 100 karakter!

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

Dibutuhkan input dari ROT-n teks terenkripsi dan output teks diterjemahkan. (Diambil dari sini .) Misalnya, ketika diberi input pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom, outputnya adalah 8hellopeopleofprogrammingpuzzlescodegolfstackexchange.

Gagang pintu
sumber
5

JavaScript

Untuk menghasilkan id unik dalam javascript
Math.random().toString(30).slice(2);

Menghasilkan sesuatu seperti: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

string 30-32 karakter alfanumerik

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

Menghasilkan sesuatu seperti: 'uq2sze67hsacq5mi'

String dengan panjang 14-16.

Rana Deep
sumber
4

C ++ 57

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

Program ini mengambil input karakter dan menampilkan nilai ASCII-nya.

Mukul Kumar
sumber
4
The Brainfuck $ code jauh lebih pendek -,:
Timtech
2
@Timtech Saya tidak tahu brainfuck $
Mukul Kumar
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

Membaca angka dan mencetak jumlah digit . Berguna untuk Project Euler masalah .

Kyle Kanos
sumber
Bagaimana ini membantu untuk masalah Euler proyek?
Paŭlo Ebermann
@ PaŭloEbermann: Mungkin saya harus menambahkan "beberapa" sebelum Project Euler. Saya tahu pasti. Masalah 16, 20 & 119 menggunakan jumlah digit, tidak yakin tentang yang lain, tetapi banyak dari masalah mereka tidak memerlukan yang ini.
Kyle Kanos