การเข้ารหัส URL ใน brainfuck


11

แรงบันดาลใจจากคำถามนี้เป้าหมายของคุณในวันนี้คือการเข้ารหัส URL ใน brainfuck

เบราว์เซอร์ของฉันถูกแฮ็ก! แถบตำแหน่งถูกเปลี่ยนเป็นล่ามสมอง ฉันต้องการโปรแกรมที่เปลี่ยน URL ให้เป็นโปรแกรม brainfuck คอมพิวเตอร์ของฉันช้ามากดังนั้นหากโปรแกรม brainfuck มีขนาดเล็กจะดีกว่า

โอ้และฉันมีเพียงแท็บการทำงานเดียวที่เปิดทิ้งไว้ทวิตเตอร์ของฉัน ดังนั้นคุณสามารถส่งโปรแกรมเป็นทวีตให้ฉันเท่านั้น


  1. เขียนโปรแกรมที่เหมาะกับทวีต (140 ตัวอักษร) ในภาษาใด ๆ ที่ใช้สตริงเป็นอินพุตและเอาต์พุตโปรแกรม brainfuck

  2. โปรแกรม brainfuck นี้จะทำงานโดยไม่มีการป้อนข้อมูลและจะสร้างผลลัพธ์

  3. ผลลัพธ์นี้จะถูกแทรกลงในแถบตำแหน่งที่ตั้งของ Google Chrome และดำเนินการ

  4. หากพฤติกรรมของ Google Chrome เหมือนกันกับพฤติกรรมที่คุณจะได้รับจากการป้อนสตริงการป้อนจาก # 1 แสดงว่าโซลูชันนั้นถูกต้อง การเปลี่ยนเส้นทางโดยตัวย่อ URL ถือว่าเป็นพฤติกรรมที่แตกต่างกันอย่างน้อยต้องอยู่บนโดเมนเดียวกัน

คุณอาจสันนิษฐานว่านักล่าสมองมีจำนวนเต็มที่มีความแม่นยำอย่างไม่ จำกัด ในแต่ละเซลล์และเซลล์ไม่ จำกัด จำนวน

คะแนนของคุณถูกกำหนดโดยผลรวมของความยาวของโปรแกรม brainfuck ที่สร้างขึ้นเพื่อเข้ารหัสชุด URL ต่อไปนี้:

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 ฉันเกือบจะมีความปรารถนาที่จะเขียนส่วนขยายสำหรับโครเมี่ยมที่ทำสิ่งนี้ ...
BrainSteel

2
@BrainSteel อินพุตสำหรับโปรแกรมเปลี่ยนไฟล์ของคุณจะตรงตามที่ระบุในคำถาม (แต่ละบรรทัดมีหนึ่งอินพุต) ผลลัพธ์ของ brainfuck อาจเป็นรูปแบบใดก็ได้ที่ Google Chrome ยอมรับตราบใดที่มันมีพฤติกรรมเหมือนกับสตริงอินพุตดั้งเดิม ดังนั้นหากโปรแกรมของคุณรับข้อมูลhttp://www.google.com/จากโปรแกรม brainfuck โปรแกรมนั้นอาจสร้างผลลัพธ์google.comขึ้นwww.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

Pyth - 118 ไบต์คะแนน: 154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

ตอนนี้ใช้ตัวคูณคูณอัลโก!

นี่เป็นอัลกอริธึมที่ค่อนข้างง่าย แต่ดีกว่าขั้นตอนข้างต้นเล็กน้อย ผมกำลังวางแผนที่จะใช้ Pyth แต่มีขั้นตอนวิธีการในปัจจุบันเหมาะกับงูหลาม <140 ไบต์

=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 เพื่อตรวจสอบว่าตัวเลือกใดที่ดีที่สุดในสามตัวเลือกที่ได้รับการพิจารณา:

  1. ใช้+หรือ-เพื่ออัปเดตค่าของเซลล์ปัจจุบันเป็นค่าของเซลล์ที่ต้องการ
  2. ไปที่มือถือใหม่และเพียงแค่เติมด้วย+'s
  3. ไปที่เซลล์ใหม่และใช้การคูณเพื่ออัปเดตโดยทำ sqrt (n) * sqrt (n) + ที่เหลือเนื่องจากตารางมีขอบเขตพื้นที่คงที่ขั้นต่ำ http://cydathria.com/bf/bf_ex3.html

จากนั้นฉันจะใส่.เอาท์พุตถ่านแต่ละอัน

คำอธิบายโดยละเอียดของรหัสใหม่กำลังจะมาในไม่ช้า ฉันชอบเล่นกอล์ฟครึ่งโดยเฉพาะการลอกwww.และ/ท้ายที่สุด แต่ฉันไม่สามารถถูกรบกวนได้เนื่องจากฉันมีขนาด 20 ไบต์ต่ำกว่าขีด จำกัด

นี้น่าแปลกใจที่ทำงานบนftp://URL ที่ตั้งแต่นี้เป็นโครเมี่ยมและโครเมี่ยมโดยอัตโนมัติทำให้ftp.freebsd.org/pub/FreeBSD/เข้าftp://ftp.freebsd.org/pub/FreeBSD/

ฉันวางแผนที่จะใช้พจนานุกรมในการจัดเก็บค่าเซลล์ต่อไปและดูว่าตัวละครได้ทำในเซลล์แล้ว


Brainfuck แถบอเนกประสงค์

ถูกตัอง! หลังจากที่ฉันเห็นความคิดเห็นของ @ BrainSteel ฉันรู้ว่าฉันต้องทำ นี้ไม่ได้ใช้เวลามากกว่าแถบอเนกประสงค์ทั้งหมดเฉพาะเมื่อคุณทำ,bf tabนอกจากนี้เนื่องจากแถบอเนกประสงค์ api นั้นแปลกมันไม่ให้ฉันส่งต่อรหัสไปยังแถบอเนกประสงค์ฉันต้องจัดการเอง ดังนั้นฉันจะทำการhttp://ตรวจสอบของตัวเองแล้วตั้งค่า URL ของแท็บ

เนื่องจากฉันไม่รู้สึกว่าต้องจ่ายเงิน $ 5 เพื่อเพิ่มส่วนขยายของคุณบน webstore พวกคุณจะต้องติดตั้งด้วยตนเอง เพียงดาวน์โหลด zip จากที่นี่: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , unzip, ไปที่หน้าส่วนขยายใน chrome คลิกตัวเลือกโหมด dev ที่ด้านบนขวาและ โหลดส่วนขยายที่คลายการแพค

หวังว่าพวกคุณจะสนุกกับ! :)


สิ่งนี้ใช้ไม่ได้กับ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 ไบต์

อัปเดต: น้อยกว่า 6 ไบต์ขอบคุณ nutki!

อัปเดตอีกครั้ง 128 ไบต์ รหัสอ่านได้น้อยกว่ามาก ตอนนี้มันพยายามที่จะตัด URL ของftp://ด้วย

อัปเดตตัวที่สามที่ 139 ไบต์ โค้ดอ่านได้ง่ายขึ้นมากและกำจัดพฤติกรรมที่ไม่ได้กำหนดซึ่งน่ารังเกียจ ตอนนี้ถ้าชื่อไซต์ถูกนำหน้าด้วยชื่อwww.นั้นจะถูกตัดออก ฉันอายุต่ำกว่า 7k แต่ฉันคิดว่าฉันต้องยอมรับ Maltysen ด้วย Pyth ทำได้ดี.

#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

วิธีการเกี่ยวกับการใช้วงใน: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)ควรทำงาน
nutki

@ nutki น่าประทับใจ! ขอบคุณ!
BrainSteel

"โปรดทราบว่าหากเราอาจสันนิษฐานว่าไม่มี URL ใดที่เริ่มต้นด้วยสิ่งอื่นนอกจาก http: //, https: // หรือ ftp: // เราสามารถปล่อย 10 ไบต์จากโซลูชันนี้ได้" โซลูชันของคุณจะต้องใช้งานกับชุดข้อมูลข้างต้นเท่านั้นดังนั้นคุณอาจคาดเดาสิ่งที่คุณต้องการตราบใดที่ชุดข้อมูลยังคงได้รับการจัดการอย่างถูกต้อง /
orlp

@ orlp ไชโย! เสียงเหมือนเล่น 12 ไบต์! ขอบคุณสำหรับความท้าทายนี้มันสนุกมาก!
BrainSteel

4

Brainfuck, 77 ไบต์, คะแนน = 31647

คะแนนคือผลรวมของcodepoint+4ทุกตัวละคร

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

(ใช้การนำ BF ไปใช้กับ EOF = 0)

ตัวอย่าง:

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.