Mã hóa một URL trong brainfuck


11

Lấy cảm hứng từ câu hỏi này , mục tiêu của bạn hôm nay là mã hóa một URL trong brainfuck.

Trình duyệt của tôi đã bị hack! Thanh vị trí đã được biến thành một thông dịch viên Brainfuck. Tôi cần một chương trình biến URL thành chương trình brainfuck. Máy tính của tôi cũng rất chậm, vì vậy nếu chương trình brainfuck nhỏ thì tốt hơn.

Oh và tôi chỉ có một tab làm việc còn mở, twitter của tôi. Vì vậy, bạn chỉ có thể gửi cho tôi chương trình trong một tweet.


  1. Viết chương trình phù hợp với một tweet (140 ký tự) bằng bất kỳ ngôn ngữ nào lấy chuỗi làm đầu vào và xuất ra chương trình brainfuck.

  2. Chương trình brainfuck này sẽ được chạy mà không cần đầu vào và sẽ tạo đầu ra.

  3. Đầu ra này sẽ được chèn vào thanh vị trí của Google Chrome và được thực thi.

  4. Nếu hành vi của Google Chrome giống với hành vi bạn sẽ nhận được bằng cách nhập chuỗi đầu vào từ số 1, thì giải pháp đó là hợp lệ. Chuyển hướng bởi các công cụ rút ngắn URL được coi là hành vi khác nhau - ít nhất là ở cùng một tên miền.

Bạn có thể giả sử trình thông dịch brainfuck có số nguyên được ký chính xác vô hạn trong mỗi ô và số lượng ô không giới hạn.

Điểm của bạn được xác định bằng tổng độ dài của các chương trình brainfuck được tạo để mã hóa bộ URL sau:

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

Điểm số nhỏ nhất chiến thắng.


Chúng tôi có thể giả định rằng đầu vào sẽ được định dạng như thế này: http://www.google.com/hoặc nó sẽ chỉ đơn giản là google.com? (Cả hai đều hợp lệ khi có liên quan đến Google Chrome, nhưng danh sách của bạn chỉ chứa các biểu mẫu đầy đủ) PS Tôi gần như có mong muốn viết một tiện ích mở rộng cho chrome thực hiện điều này ...
BrainSteel 19/03/2015

2
@BrainSteel Đầu vào cho bộ mã hóa của bạn sẽ chính xác như được nêu trong câu hỏi (mỗi dòng là một đầu vào). Đầu ra của brainfuck có thể là bất kỳ định dạng nào được Google Chrome chấp nhận, miễn là nó có hành vi tương tự như chuỗi đầu vào ban đầu. Vì vậy, nếu chương trình của bạn có đầu vào http://www.google.com/chương trình Brainfuck nó tạo ra may google.com, www.google.com, vv, vì tất cả họ đều dẫn đến cùng một trang. Nhưng ví dụ ftp://ftp.freebsd.org/pub/FreeBSD/không giống như ftp.freebsd.org/pub/FreeBSD/.
orlp

Ah, cảm ơn bạn đã làm rõ! Xin lỗi, sáng nay tôi hơi chậm.
BrainSteel 19/03/2015

Tôi muốn làm rõ rằng tôi đã thất bại và điều đó ftp://ftp.freebsd.org/pub/FreeBSD/thực sự giống như ftp.freebsd.org/pub/FreeBSD/trong Google Chrome. Điều này làm cho thử thách dễ dàng hơn một chút so với dự định của tôi, nhưng đó là cuộc sống. Tôi sẽ không thay đổi các yêu cầu, vì vậy an toàn khi loại bỏ bất cứ điều gì trước đây ://.
orlp

Câu trả lời:


7

Pyth - 118 byte, điểm: 154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

Bây giờ sử dụng hệ số nhân algo!

Đây là một thuật toán khá đơn giản, mặc dù tốt hơn một chút so với các thuật toán trên. Tôi đã dự định sử dụng Pyth, nhưng với thuật toán hiện tại Python phù hợp với <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

Nó dải đầu ra http://bằng cách sử dụng split("//")www./ở cuối. Sau đó, nó sử dụng hàm min để kiểm tra cái nào là tốt nhất trong ba tùy chọn được xem xét:

  1. Sử dụng +hoặc -để cập nhật giá trị ô hiện tại thành giá trị ô mong muốn
  2. Tới tế bào mới và chỉ cần điền với +'s
  3. Chuyển đến ô mới và sử dụng phép nhân để cập nhật bằng cách thực hiện sqrt (n) * sqrt (n) + phần còn lại do hình vuông có chu vi tối thiểu của diện tích không đổi. http://cydathria.com/bf/bf_ex3.html

Tôi sau đó luôn luôn đặt một .đầu ra mỗi char.

Một lời giải thích chi tiết về mã mới sắp ra mắt. Tôi hơi nửa chơi golf, đặc biệt là tước www./cuối trận nhưng tôi không thể bị làm phiền vì tôi ở mức 20 byte.

Điều này đáng ngạc nhiên hoạt động trên các ftp://url vì đây là chrome và chrome tự động tạo ftp.freebsd.org/pub/FreeBSD/thànhftp://ftp.freebsd.org/pub/FreeBSD/

Tôi dự định tiếp theo sử dụng một từ điển để lưu trữ các giá trị ô và xem liệu ký tự đã được tạo trong một ô chưa.


Brainfuck Omnibox mở rộng

Đúng rồi! Sau khi tôi thấy bình luận của @ BrainSteel, tôi biết rằng tôi phải thực hiện nó. Điều này không đi qua toàn bộ omnibox, chỉ khi bạn làm bf, tab. Ngoài ra, vì api của omnibox là lạ, nó không cho phép tôi chuyển tiếp mã đến omnibox, tôi phải tự xử lý nó. Vì vậy, tôi tự http://kiểm tra và sau đó đặt url của tab.

Vì tôi không cảm thấy muốn trả 5 đô la cần thiết để đưa tiện ích mở rộng của mình lên cửa hàng trực tuyến, các bạn sẽ phải cài đặt thủ công. Chỉ cần tải xuống mã zip từ đây: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=shaming , giải nén, đi vào trang tiện ích mở rộng trong chrome, nhấp vào hộp tùy chọn chế độ dev ở trên cùng bên phải và tải phần mở rộng đã giải nén.

Hy vọng các bạn thích! :)


Điều này sẽ không hoạt động trên ftp://URL.
PurkkaKoodari 19/03/2015

1
@ Pietu1998 đó là những gì tôi nghĩ lúc đầu nhưng Chrome làm tôi ngạc nhiên. Hãy thử đặt ftp.freebsd.org/pub/FreeBSD/ vào thanh địa chỉ của bạn và Chrome sẽ làm cho nó ftp: // ftp.freebsd.org/pub/FreeBSD/
Maltysen 19/03/2015

@Maltysen Rất tiếc. Tôi đã cố tình đưa URL đó để ngăn chặn việc tối ưu hóa này, nhưng có vẻ như tôi đã thất bại. URL này thực sự khác nhau, nhưng có vẻ như Chrome thực sự đủ thông minh để nhận biết và thêm ftp://. Ồ tốt
orlp

4

C, 140 134 132 138 128 139 byte

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

Cập nhật: 6 byte ít hơn, nhờ nutki!

Cập nhật lại, 128 byte. Mã ít đáng kể dễ đọc hơn. Bây giờ nó cũng cố gắng tước URL của ftp://.

Cập nhật thứ ba, ở 139 byte. Mã dễ đọc hơn một chút và thoát khỏi một số hành vi không xác định khó chịu. Bây giờ, nếu tên trang web được đặt trước www., nó sẽ bị xóa. Tôi có dưới 7k, nhưng tôi nghĩ tôi phải thủng lưới Maltysen với Pyth. Làm tốt.

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

Làm sáng tỏ một chút:

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

Mã này mất một URL ở dòng lệnh, và chuyển nó thành BF chỉ sử dụng ., -+. Mã này làm cho một nỗ lực để tước chuỗi ftp://, http://, https://, và www.trước khi chuyển đổi để BF. Dưới đây là danh sách đầu ra của đầu ra:

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

Làm thế nào về việc sử dụng một vòng lặp bên trong: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)nên làm việc.
nutki

@nutki Ấn tượng! Cảm ơn bạn!
BrainSteel 19/03/2015

"Lưu ý rằng nếu chúng tôi có thể cho rằng không có URL nào bắt đầu bằng bất kỳ thứ gì ngoài http: //, https: // hoặc ftp: //, chúng tôi có thể giảm 10 byte từ giải pháp này." Giải pháp của bạn chỉ phải làm việc cho tập dữ liệu ở trên, vì vậy bạn có thể giả sử bất cứ điều gì bạn muốn, miễn là tập dữ liệu vẫn sẽ được xử lý chính xác /
orlp 19/03/2015

@orlp Hoan hô! Nghe có vẻ như 12 byte để chơi với! Cảm ơn bạn vì thử thách này, nó rất vui!
BrainSteel 19/03/2015

4

Brainfuck, 77 byte, Điểm = 31647

Điểm là tổng của codepoint+4mỗi nhân vật.

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

(Sử dụng triển khai BF với EOF = 0.)

Thí dụ:

input:
!bar

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

0

JavaScript (ES6) - 137 byte, điểm số - 7413

Điều này chỉ sử dụng ., +-. Bạn có thể kiểm tra nó trong bảng điều khiển 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('.')+'.'

Đây là bộ đếm điểm của tôi:

[
    '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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.