BrainfuckでURLをエンコードする


11

この質問触発されて、今日の目標はbrainfuckでURLをエンコードすることです。

ブラウザがハッキングされました!ロケーションバーはブレインファックインタープリターに変わりました。URLをブレインファックプログラムに変えるプログラムが必要です。私のコンピューターも非常に遅いので、brainfuckプログラムが小さければ良いです。

ああ、私の作業中のタブは1つしか開いていません。そのため、プログラムはツイートでのみ送信できます。


  1. 入力として文字列を受け取り、brainfuckプログラムを出力する任意の言語で、ツイート(140文字)に適合するプログラムを作成します。

  2. このBrainfuckプログラムは、入力なしで実行され、出力を生成します。

  3. この出力は、Google Chromeのロケーションバーに挿入され、実行されます。

  4. Google Chromeの動作が#1から入力文字列を入力することで得られる動作と同じ場合、ソリューションは有効です。URL短縮サービスによるリダイレクトは異なる動作と見なされます-少なくとも同じドメインにとどまります。

Brainfuckインタープリターには、各セルに無限精度の符号付き整数があり、セルの数に制限がないと仮定できます。

スコアは、次のURLセットをエンコードするために生成されたBrainfuckプログラムの長さの合計によって決まります。

https://www.google.com/
/codegolf/47895/
http://www.golfscript.com/golfscript/examples.html
http://en.wikipedia.org/wiki/Percent-encoding
ftp://ftp.freebsd.org/pub/FreeBSD/
https://github.com/isaacg1/pyth/blob/master/doc.txt#L92
http://ftp.gnu.org/non-gnu/nethack/nethack-3.4.0.tar.gz.back-RSN.README

最小スコアが勝ちます。


入力が次のようにフォーマットされると仮定http://www.google.com/できgoogle.comますか、それとも単純になりますか?(これまでGoogle Chromeのを懸念しているとして有効ですが、あなたのリストが唯一の完全形が含まれています両方)PS私はほとんど ...これを行いChromeの拡張機能を記述する願望を持っている
BrainSteel

2
@BrainSteelエンコーダーへの入力は、質問のとおり正確に記述されます(各行は1つの入力です)。Brainfuckの出力は、元の入力文字列と同じ動作をする限り、Google Chromeで受け入れられる任意の形式にできます。したがって、プログラムが入力を受け取るとhttp://www.google.com/、それが生成するBrainfuckプログラムgoogle.comwww.google.com、などを出力する可能性があります。これらはすべて同じページになるためです。しかし、たとえばftp://ftp.freebsd.org/pub/FreeBSD/とは異なりftp.freebsd.org/pub/FreeBSD/ます。
orlp

ああ、明確にしてくれてありがとう!すみません、今朝は少し遅いです。
BrainSteel

私が失敗したことを明確にしたいと思います。それftp://ftp.freebsd.org/pub/FreeBSD/は実際ftp.freebsd.org/pub/FreeBSD/にGoogle Chrome と同じです。これにより、チャレンジは意図したよりも少し簡単になりますが、それは人生です。要件は変更しないので、前に何かを取り除いても安全://です。
orlp

回答:


7

円-118バイト、スコア:154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

係数乗算アルゴリズムを使用して!

これは非常に単純なアルゴリズムですが、上記のアルゴリズムよりわずかに優れています。私はPythを使用する予定でしたが、現在のアルゴリズムではPython fits <140 bytesです。

=zecz"//"=z?>z4}"www."zz=z?Pzqez\/zFNzKCNJ/^K.5 1=d\+pk+holN[?*-KZd>KZ*-ZK\-+\>*dK+++++\>*Jd"[>"*Jd"<-]>"*-K*JJd)\.=ZK

これは、最初のうちストリップhttp://使用してsplit("//")www.して/終わり。次に、min関数を使用して、考慮される3つのオプションの中でどれが最適かを確認します。

  1. +または-を使用して、現在のセル値を目的のセル値に更新します
  2. 新しいセルに移動し、ただで埋める+さん
  3. 新しいセルに移動し、乗数を使用してsqrt(n)* sqrt(n)+ remainderを実行して更新します。これは、正方形には一定の面積の最小境界があるためです。http://cydathria.com/bf/bf_ex3.html

それから私は常に.各文字を出力するために置きます。

新しいコードの詳細な説明はすぐに来ます。ゴルフ、特にストリッピングwww./最後の半分をやったが、20バイトの制限があるので気にすることはできない。

これは驚くべきことにftp://、これはクロムであり、クロムは自動的ftp.freebsd.org/pub/FreeBSD/ftp://ftp.freebsd.org/pub/FreeBSD/

次に辞書を使用してセルの値を保存し、文字がすでにセル内で作成されているかどうかを確認する予定です。


Brainfuck Omnibox拡張機能

そのとおり!@BrainSteelのコメントを見た後、私はそれを作らなければならないと知った。これは、あなたがた場合にのみ、全体のアドレスバーを引き継ぐしませんbftab。また、アドレスバーAPIは奇妙なので、コードをアドレスバーに転送させることはできません。自分で処理する必要があります。そこで、独自のhttp://チェックを行ってから、タブのURLを設定します。

拡張機能をウェブストアに配置するのに必要な5ドルを支払う気はなかったので、手動でインストールする必要があります。ここからzipをダウンロードしてください:https : //drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view? usp=sharing解凍された拡張機能をロードします。

皆さんお楽しみください!:)


これはftp://URL では機能しません。
-PurkkaKoodari

1
@ Pietu1998それは私が最初に考えたことでしたが、Chromeは私を驚かせました。ftp.freebsd.org/pub/FreeBSD/をアドレスバーに入力すると、Chromeはftp:// ftp.freebsd.org/pub/FreeBSD/になります
Maltysen

@Maltysenおっと。この最適化を防ぐために意図的にそのURLを含めましたが、失敗したようです。このURLは確かに異なりますが、Chromeはを認識して追加できるほどスマートftp://です。しかたがない。
orlp

4

C、140 134 132 138 128 139のバイト

263 + 816 + 911 + 955 + 827 + 1355 + 1779 = 7269 6906バイト

更新:nutkiのおかげで6バイト削減!

再度更新、128バイト。コードは著しく読みにくくなります。また、のURLも削除しようとしますftp://

139バイトで3番目を更新します。コードはもう少し読みやすく、いくつかの厄介な未定義の動作を取り除きました。現在、サイト名の前にが付いているwww.場合、それは削除されます。7k未満になりましたが、PythでMaltysenに譲歩しなければならないと思います。よくやった。

#define p putchar
a;main(int c,char**V){while(*V[1]++-47);*++V+=1;for(*V+=**V-'w'?0:4;c=**V;*V+=1,p(46))for(;c-a;a+=c>a?1:-1)p(c>a?43:45);}

少し解きました:

#define p putchar
a;
main(int c,char**V){
    while(*V[1]++-47);
    *++V+=1;
    for(*V+=**V-'w'?0:4;c=**V;*V+=1,p(46))
        for(;c-a;a+=c>a?1:-1)
            p(c>a?43:45);
}

このコードは、コマンドラインでURLを取り、のみ使用してBFに変換し.-、と+。コードは、文字列を除去しようとする試みを行いftp://http://https://、およびwww.BFに変換する前に。出力の出力のリストは次のとおりです。

google.com/
codegolf.stackexchange.com/questions/47895/
golfscript.com/golfscript/examples.html
en.wikipedia.org/wiki/Percent-encoding
ftp.freebsd.org/pub/FreeBSD/
github.com/isaacg1/pyth/blob/master/doc.txt#L92
ftp.gnu.org/non-gnu/nethack/nethack-3.4.0.tar.gz.back-RSN.README

内側のループを1つ使用してはどうでしょうかfor(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)
-nutki

@nutki印象的!ありがとうございました!
BrainSteel

「http://、https://、またはftp://以外で始まるURLがないと仮定した場合、このソリューションから10バイトをドロップできることに注意してください。」ソリューションは上記のデータセットに対してのみ機能する必要があるため、データセットが引き続き適切に処理される限り、任意のものを想定できます/
-orlp

@orlp Hooray!それは12バイトで遊ぶように聞こえます!このチャレンジをありがとう、とても楽しかったです!
BrainSteel

4

Brainfuck、77バイト、スコア= 31647

スコアは、codepoint+4すべてのキャラクターの合計です。

+++++[>+++++++++<-]>+[>++>+>++>+>+<<<<<-]>+>->->>--->,[[<.>-]<<.<.<.<.>>>>>,]

(EOF = 0のBF実装を使用します。)

例:

input:
!bar

output:
+++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]

0

JavaScript(ES6)-137バイト、スコア-7413

これは.+とのみを使用し-ます。Firefoxコンソールでテストできます。

B=s=>[...s.replace(/^h.+\/\//,'')].map((c,i,a)=>(v=i?c[C]()-a[i-1][C]():c[C='charCodeAt']())?'-+'[v>0|0].repeat(v>0?v:-v):'').join('.')+'.'

これは私のスコアカウンターです。

[
    'https://www.google.com/',
    'http://codegolf.stackexchange.com/questions/47895/',
    'http://www.golfscript.com/golfscript/examples.html',
    'http://en.wikipedia.org/wiki/Percent-encoding',
    'ftp://ftp.freebsd.org/pub/FreeBSD/',
    'https://github.com/isaacg1/pyth/blob/master/doc.txt#L92',
    'http://ftp.gnu.org/non-gnu/nethack/nethack-3.4.0.tar.gz.back-RSN.README'
].map(B).join('').length
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.