Pengkodean URL di brainfuck


11

Terinspirasi oleh pertanyaan ini , tujuan Anda hari ini adalah untuk menyandikan URL di brainfuck.

Peramban saya telah diretas! Bilah lokasi telah berubah menjadi penerjemah brainfuck. Saya membutuhkan program yang mengubah URL menjadi program brainfuck. Komputer saya juga sangat lambat, jadi jika program brainfuck kecil lebih baik.

Oh dan saya hanya punya satu tab kerja yang terbuka, twitter saya. Jadi, Anda hanya dapat mengirim saya program itu dalam tweet.


  1. Tulis sebuah program yang cocok dengan tweet (140 karakter) dalam bahasa apa pun yang menggunakan string sebagai input dan menghasilkan program brainfuck.

  2. Program brainfuck ini akan dijalankan tanpa input dan akan menghasilkan output.

  3. Output ini akan dimasukkan ke bilah lokasi Google Chrome, dan dieksekusi.

  4. Jika perilaku Google Chrome identik dengan perilaku yang akan Anda dapatkan dengan memasukkan string input dari # 1, maka solusinya valid. Pengalihan dengan penyingkat URL dianggap sebagai perilaku yang berbeda - tinggal setidaknya di domain yang sama.

Anda dapat menganggap juru bahasa brainfuck memiliki bilangan bulat bertanda presisi tak terbatas di setiap sel dan jumlah sel yang tak terbatas.

Skor Anda ditentukan oleh jumlah panjang program brainfuck yang dihasilkan untuk menyandikan serangkaian URL berikut:

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

Kemenangan skor terkecil.


Bolehkah kita berasumsi bahwa input akan diformat seperti ini: http://www.google.com/atau apakah akan pernah begitu saja google.com? (Keduanya berlaku sejauh menyangkut Google Chrome, tetapi daftar Anda hanya berisi formulir lengkap) PS Saya hampir memiliki keinginan untuk menulis ekstensi untuk chrome yang melakukan ini ...
BrainSteel

2
@BrainSteel Input untuk pembuat enkode Anda akan persis seperti yang dinyatakan dalam pertanyaan (setiap baris adalah satu input). Output dari brainfuck dapat berupa format apa pun yang diterima oleh Google Chrome, asalkan memiliki perilaku yang sama dengan string input asli. Jadi, jika program anda mengambil input http://www.google.com/program brainfuck menghasilkan keluaran Mei google.com, www.google.com, dll, karena mereka semua hasil di halaman yang sama. Tetapi misalnya ftp://ftp.freebsd.org/pub/FreeBSD/tidak sama dengan ftp.freebsd.org/pub/FreeBSD/.
orlp

Ah, terima kasih sudah menjelaskan! Maaf, saya agak lambat pagi ini.
BrainSteel

Saya ingin mengklarifikasi bahwa saya gagal, dan itu ftp://ftp.freebsd.org/pub/FreeBSD/memang sama dengan ftp.freebsd.org/pub/FreeBSD/di Google Chrome. Ini membuat tantangannya sedikit lebih mudah dari yang saya maksudkan, tetapi itulah hidup. Saya tidak akan mengubah persyaratan, jadi aman untuk menanggalkan apa pun sebelumnya ://.
orlp

Jawaban:


7

Pyth - 118 byte, skor: 154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

Sekarang menggunakan faktor perkalian algo!

Ini adalah algoritma yang cukup sederhana, meskipun sedikit lebih baik daripada yang di atas. Saya berencana untuk menggunakan Pyth, tetapi dengan algoritma Python saat ini cocok <140 byte .

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

Pertama-tama menghapus http://dengan menggunakan split("//")dan www.dan /pada akhirnya. Kemudian ia menggunakan fungsi min untuk memeriksa mana yang terbaik dari tiga opsi yang dipertimbangkan:

  1. Gunakan +atau -untuk memperbarui nilai sel saat ini ke nilai sel yang diinginkan
  2. Pergi ke sel baru dan hanya isi dengan +'s
  3. Buka sel baru dan gunakan perkalian untuk memperbarui dengan melakukan sqrt (n) * sqrt (n) + sisanya karena kuadrat memiliki batas minimum area konstan. http://cydathria.com/bf/bf_ex3.html

Saya kemudian selalu menempatkan .output masing-masing char.

Penjelasan rinci tentang kode baru akan segera hadir. Saya agak suka bermain golf, terutama stripping www.dan /pada akhirnya, tetapi saya tidak bisa diganggu karena saya 20 byte di bawah batas.

Ini secara mengejutkan berfungsi pada ftp://url karena ini adalah chrome dan chrome secara otomatis membuatnya ftp.freebsd.org/pub/FreeBSD/menjadiftp://ftp.freebsd.org/pub/FreeBSD/

Saya berencana menggunakan kamus berikutnya untuk menyimpan nilai sel dan melihat apakah karakter sudah dibuat dalam sel.


Perpanjangan Omnibox Brainfuck

Betul! Setelah saya melihat komentar @ BrainSteel, saya tahu saya harus membuatnya. Ini tidak mengambil alih seluruh omnibox, hanya ketika Anda melakukan bf, tab. Juga karena api omnibox aneh, itu tidak membiarkan saya meneruskan kode ke omnibox, saya harus menanganinya sendiri. Jadi saya melakukan http://pemeriksaan sendiri dan kemudian mengatur url tab.

Karena saya merasa tidak perlu membayar $ 5 yang diperlukan untuk meletakkan ekstensi Anda di webstore, kalian harus menginstalnya secara manual. Cukup unduh kode pos dari sini: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , unzip, buka halaman ekstensi di chrome, klik kotak opsi mode dev di kanan atas, dan muat ekstensi yang belum dibongkar.

Semoga kalian menikmati! :)


Ini tidak akan berfungsi pada ftp://URL.
PurkkaKoodari

1
@ Pietu1998 itulah yang saya pikirkan pada awalnya tetapi Chrome mengejutkan saya. Coba masukkan ftp.freebsd.org/pub/FreeBSD/ di bilah alamat Anda dan Chrome akan membuatnya ftp: // ftp.freebsd.org/pub/FreeBSD/
Maltysen

@Maltysen Ups. Saya sengaja memasukkan URL itu untuk mencegah optimasi ini, tetapi sepertinya saya gagal. URL ini memang berbeda, tetapi tampaknya Chrome memang cukup pintar untuk dikenali dan ditambahkan ftp://. Baiklah.
orlp

4

C, 140 134 132 138 128 139 Bytes

263 + 816 + 911 + 955 + 827 + 1355 + 1779 = 7269 6906 byte

Perbarui: kurang 6 byte, terima kasih kepada nutki!

Perbarui lagi, 128 byte. Kode secara signifikan kurang dapat dibaca. Sekarang mencoba untuk menghapus URL ftp://juga.

Perbarui yang ketiga, pada 139 byte. Kode sedikit lebih mudah dibaca, dan menyingkirkan beberapa perilaku jahat yang tidak terdefinisi. Sekarang, jika nama situs didahului dengan www., itu dilucuti. Saya berada di bawah 7k, tetapi saya pikir saya harus menyerah ke Maltysen dengan Pyth. Sudah selesai dilakukan dengan baik.

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

Terurai sedikit:

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

Kode ini mengambil URL di baris perintah, dan bertobat ke dalam BF hanya menggunakan ., -dan +. Kode membuat upaya untuk melucuti string ftp://, http://, https://, dan www.sebelum mengkonversi ke BF. Berikut adalah daftar output dari output:

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

Bagaimana dengan menggunakan satu loop dalam: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)harus bekerja.
nutki

@nutki Mengesankan! Terima kasih!
BrainSteel

"Perhatikan bahwa jika kita dapat berasumsi tidak ada URL yang dimulai dengan selain dari http: //, https: //, atau ftp: //, kita dapat menjatuhkan 10 byte dari solusi ini." Solusi Anda hanya perlu bekerja untuk dataset di atas, jadi Anda dapat mengasumsikan apa pun yang Anda inginkan, selama dataset masih akan ditangani dengan benar /
orlp

@orlp Hore! Kedengarannya seperti 12 byte untuk dimainkan! Terima kasih atas tantangan ini, ini sangat menyenangkan!
BrainSteel

4

Brainfuck, 77 byte, Skor = 31647

Skor adalah jumlah codepoint+4untuk setiap karakter.

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

(Menggunakan implementasi BF dengan EOF = 0.)

Contoh:

input:
!bar

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

0

JavaScript (ES6) - 137 byte, skor - 7413

Ini hanya menggunakan ., +dan -. Anda dapat mengujinya di konsol 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('.')+'.'

Ini penghitung skor saya:

[
    '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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.