100文字以内で最も有用なプログラムを作成する[終了]


13

このタスクでは、100文字以内で記述できるあらゆることを行う便利なプログラムを作成できます。より少ない文字を使用できますが、それ以上は使用できません。

もはや面白くない標準的な抜け穴から保護するためのルール:

  1. 本当に必要な場合を除き、プログラムはインターネットにアクセスできません。たとえば、このWebサイトで最も投票された質問を表示するプログラムは、インターネットを使用してこの質問を確認できます。ただし、実際のソースを見つけて実行するためにインターネットを閲覧することは許可されていません。

  2. あなたのプログラムは、それが書かれた言語の通訳者になることはできません。しかし、非Brainfuck言語のBrainfuckインタープリターは問題ありません。

  3. プログラムは、プログラムが行うことを正確に行う外部プログラムを実行できません。たとえば、を実行しvimて、プログラムがvim実装であると主張することはできません。

  4. プログラムは、それが実行されているコンピューターや他のコンピューターにとって危険ではありません。次のようなプログラムを書くことは許可されておらずrmdir /(ここの例は意図的に機能しないため、修正しないでください)、コンピューター上のすべてのファイルを削除するのに役立つプログラムであると主張します。

  5. あなたのプログラムは、あなたがそれがすることを意味することを証明できる限り、あなたが望むほど遅く、あなたが望む限り多くのリソースを使うかもしれません。

  6. このタスク専用の言語を作成することはできません。ただし、他のプログラミング言語で作成した言語のインタープリターを作成することは許可されています。


このコンテストに複数の回答を投稿できますか?
TrungDQ 14年

@TrungDQ:もちろん。
コンラッドボロスキー14年

1
これは、これまでで最高の質問の1つにならなければなりません;)
ティムテック14年

13
このようなサイトでも、人気コンテストでも、これはあまりにもオープンエンドです。文字通り答えはすべて有効であり、それらを比較するための参照フレームはまったくありません。
アーロンノート14年

3
この質問は、コードゴルフを共食いしています。興味深い100のキャラクターのアイデアは、すばらしいコードゴールドの質問に言い換えることができるはずです。回答者に数分かけて、回答を新しい質問に変えることをお勧めします。
ニブラー14年

回答:


26

C-47バイト

次のプログラムは、人間の歴史でこれまでに書かれたすべての文書、これまでに書かれたすべての文書、および人間が思いつかない興味深いテキストを出力します。少し時間をおいてください。さらに、実行するたびに、最初に異なるテキストが出力されます!それ役に立たない場合!(そして、それらはすべて文字数制限の半分以内です!)

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

毎回何か他のものを出力することを気にしないのであれば、必要なのは41バイトだけです!

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

C99に完全には準拠していませんが、でスムーズにコンパイルできgcc.exe (GCC) 4.7.0 20111220ます。

ルールの状態

あなたのプログラムは、あなたがそれがすることを意味することを証明できる限り、あなたが望むほど遅く、あなたが望む限り多くのリソースを使うかもしれません。

問題ない。

いくつかのもの、このプログラムは出力します:

  • すべてのミレニアム問題の解決策
  • 明日の新聞記事
  • シェークスピアの全作品(もちろん)
  • あなたの最も暗い秘密
  • この質問に対する他のすべての答え

本当ではありません。(aceがコメントで正しく言及されているように)rand()は擬似ランダムジェネレーターであり、ある時点でラップアラウンドします。しかし、100文字以内でリモートから真の(ハードウェア)乱数ジェネレーターからデータを取得できるとは思えません。ただし、これを楽しみにするためにここに残しておきます。

Dennisが指摘しているように、アルゴリズムのランダム性は、のrand()^rand()>>16代わりにを使用することにより、(文字数制限内で)いくらか改善される可能性がありrand()ます。


10
必ずしも。rand()擬似ランダムです-ループする前に有用なテキストを生成しない場合があります。
user12205 14年

1
幸運なことに、@ Dennisはまだこの質問のルールの範囲内です!:)
マーティンエンダー14年

1
@ m.buettner:GLIBCのrand()を使用すると、プログラムの出力のバイト間に単純な代数関係があります。出力を配列として表示するとx、がありますx[i] == (x[i - 3] + x[i - 31] + c[i]) % 256。ここc[i]で、0は確率0.75、1は確率0.25です。これはほとんど、あなたが言及したものを生成できないことを意味します。
デニス14年

1
@ m.buettner:PRNGはそれほど良くなることはありませんが、rand()^rand()>>16plainの代わりに直線性を削除することができますrand()。バイトを節約する方法を探している場合は、とを削除int%256ます。
デニス14年

1
@ m.buettner:値はunsigned char
デニス14年

18

BBC BASIC、84文字

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

1次および2次の微分方程式の解をプロットします。

ユーザー入力として取ります:

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

化学工学者になるために勉強していたときに使用したPolymathという微分方程式解法ソフトウェアに触発されました。反応物と生成物に異なる方程式を入力し、反応システム全体が時間とともにどのように変化するかを確認します。非常に単純なソフトウェア(これほど複雑ではありません)ですが、この目的にはExcelよりもはるかに便利です。残念ながら、100文字でPolymathの完全なクローンを作成することはできません。

enter image description here


10

Mathematica 76

このプログラムは、240か国のさまざまなプロパティに関する情報を表示するアプレットを作成します。それは、アフガニスタンの成人人口に関する情報で始まります。ユーザーは、ドロップダウンリストから国とプロパティの設定を変更できます。

MathematicaはWolframAlphaとスムーズに相互運用できます。
このため、提出は課題の要件#1を満たしていると思います:「本当に必要な場合を除き、プログラムはインターネットにアクセスできません」。

このかなり控えめなアプレットは、単にMathematica言語の既存の機能を利用します。短いビデオは、アプレットに関する追加情報を提供します。

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

alpha


以下は、国に関連する最初の20の(223の)プロパティのリストです。追加のプログラミングにより、国に関する追加情報を取得し、この情報をMathematicaで分析できます。

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

{「AdultPopulation」、「AgriculturalProducts」、「AgriculturalValueAdded」、「Airports」、「AlternateNames」、「AlternateStandardNames」、「AMRadioStations」、「AnnualBirths」、「AnnualDeaths」、「AnnualHIVAIDSDeaths」、「ArableLandAreaLandAreaエリア」、「BirthRateFraction」、「BorderingCountries」、「BordersLengths」、「BoundaryLength」、「CallingCode」、「CapitalCity」、「CapitalLocation」}


あなたのプログラムがどのようにインターネットにアクセスするのかがわかりません。提示するデータは、外部ソースに依存する必要が頻繁に生じることはありません。
塩奈

1
ソースが内部か外部かは議論の余地があります。WolframAlpha(コードが作成する)に関する情報のリクエストは、(必要な)「インターネットへのアクセス」のケースであると考えていました。ただし、コードはWolframデータサーバーを直接参照し、ブラウザーを使用する必要はありません。 FireFoxのような。これは、1つのネットワークまたはWiFi接続があることを必要とします
DavidC

1
-1可能であれば-これは、既存のサービスからのデータ構造を単純に変更します。
l0b0 14年

@ l0b0そのように見えると思います。または、言語の機能を活用していると言うかもしれません。結局のところ、WolframAlphaはMathematicaと密接に相互運用できるようにゼロから設計されました。
DavidC 14年

1
WolframAlphaの情報はMathematicaの不可欠な部分であり、Wolfram言語」はかなり警戒すべき状態です。それは、それを存在する中で最も安定性の低いプログラミング言語にしなければなりません。
ピーターテイラー14年

9

bash、100バイト

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

このスクリプトは、暗号で保護されたバイトのストリームを出力します。印刷するバイト数を指定するオプションの引数を取ります。デフォルトでは、出力は無限になります。

読み取り/dev/urandomが非常に遅い場合に役立ちます。

基準

$ 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

このスクリプトは、i7-3770で毎秒最大1.5 GiBを生成します。

対照的に、からの読み取りでは、1分あたり/dev/urandomわずか1 GiBしか生成されません。

使い方

  • head -c${1--1} /dev/zero指定された量のゼロバイトを出力します。量が指定されていない場合、${1--1}-1 に等しくなり、headは無限量を出力します。

  • openssl enc -aes-128-ctr -pass file:/dev/randomAES-128をカウンターモードで使用してゼロバイトを暗号化し、パスワードを読み取ります/dev/random

  • tail -c+17 出力の16バイトのヘッダーを取り除きます。


このストリームは、最初の2 ^ 68出力バイトを調べることにより、「実際の」ランダムストリームと区別できることに注意してください(実際のランダムストリームでは、ブロックが重複しているはずですが、これはありません)。
パエロエベルマン14

@PaŭloEbermann:あなたは明らかに正しい。その後、再び、それは...私のマシン上でそのバイト数を生成するために、6000年以上もかかるだろう
デニス・

7

Javascript

方程式を解きます(すべてではありませんが、一般的な関数で動作するはずです...)

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}

ES6なし(105文字):

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}

右側がゼロであると仮定して、方程式の左側を与えるだけです。

例:

  • r("x*x-9") 戻り値 3
  • r("Math.sin(x)-1")1.5707963394347828(pi / 2)を返します
  • r("Math.pow(2,x)-512") 戻り値 9

警告:一部の機能(または解決策がない場合)で分岐し、ブラウザタブをフリーズするか、NaNを返す可能性があります。


6

C-99文字

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

このプログラムは、あらゆる種類のデータの暗号化と復号化を可能にします。

使用法

まず...コンパイルしてください!

gcc crypto.c crypto

mypreciousdata.txtキーmysecretkeyでコンテンツを暗号化し、結果をmyprotecteddata.txt次の場所に保存する場合:

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

次に、のデコードされたコンテンツを取得する場合myprotecteddata.txt

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

キーが長いほど安全です!

説明

以下の展開されコメントされたコードを見つけてください:

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

これは、ご使用のタイプのサイズのアルファベット(通常256)に適合したVigenère暗号の変形ですchar
パエロエベルマン14

5

GolfScript

これをなんとか100文字に圧縮できました!

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

ROT-n暗号化テキストの入力を受け取り、デコードされたテキストを出力します。(ここから取得します。)たとえば、inputを指定するpmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivomと、出力はになり8hellopeopleofprogrammingpuzzlescodegolfstackexchangeます。


5

JavaScript

JavaScriptで一意のIDを生成するには
Math.random().toString(30).slice(2);

次のようなものを生成します。 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

30〜32文字の英数字の文字列

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

次のようなものを生成します。 'uq2sze67hsacq5mi'

長さ14-16のストリング。



3

Fortran-85バイト

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

数値を読み込み、数字の合計を出力しますProject Eulerの問題に役立ちます。


これはプロジェクトのオイラー問題にどのように役立ちますか?
パエロエベルマン14

@PaŭloEbermann:おそらく、プロジェクトオイラーの前に「一部」を追加する必要がありました。問題16、20、119では数字の合計を使用しますが、他の数字についてはわかりませが、問題の多くはこれを必要としません
カイルカノス14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.