Brainfuck'ta bir URL kodlama


11

Bu sorudan esinlenerek , bugün hedefiniz beyinsiz bir URL'yi kodlamaktır.

Tarayıcım hacklendi! Konum çubuğu bir beyin lanet yorumlayıcıya dönüştürüldü. Bir URL'yi bir beyin programına dönüştüren bir programa ihtiyacım var. Bilgisayarım da çok yavaş, bu yüzden brainfuck programı küçükse daha iyi.

Oh ve sadece bir çalışma sekmesi açık kaldı, twitter. Böylece programı bana sadece bir tweet ile gönderebilirsiniz.


  1. Bir dizgiyi girdi olarak alan ve bir beyin sikişi programı çıkaran herhangi bir dilde bir tweet'e (140 karakter) uyan bir program yazın.

  2. Bu brainfuck programı girdi olmadan çalıştırılacak ve çıktı oluşturacaktır.

  3. Bu çıktı Google Chrome'un konum çubuğuna eklenecek ve yürütülecek.

  4. Google Chrome'un davranışı, 1 numaralı giriş dizesinden girerek alacağınız davranışla aynıysa, çözüm geçerlidir. URL kısaltıcılarına göre yönlendirme farklı davranış olarak kabul edilir - en azından aynı alanda kalın.

Brainfuck yorumlayıcısının her bir hücrede sonsuz hassas işaretli tamsayılara ve sınırsız miktarda hücreye sahip olduğunu varsayabilirsiniz.

Puanınız, aşağıdaki URL kümesini kodlamak için oluşturulan beyin fırtınası programlarının uzunluklarının toplamı ile belirlenir:

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

En küçük puan kazanır.


Girdinin şu şekilde biçimlendirileceğini varsayabilir miyiz: http://www.google.com/yoksa hiç olacak google.commı? (Her ikisi de Google Chrome söz konusu olduğunda geçerlidir, ancak listeniz yalnızca tam formları içerir) PS Neredeyse bunu yapan krom için bir uzantı yazma
isteğim var

2
@BrainSteel Kodlayıcınız için giriş, tam olarak soruda belirtildiği gibi olacaktır (her satır bir giriştir). Brainfuck'ın çıktısı, orijinal giriş dizesiyle aynı davranışa sahip olduğu sürece Google Chrome tarafından kabul edilen herhangi bir biçim olabilir. Programınız girişi sürerse Yani http://www.google.com/brainfuck programı o mayıs çıktı üretir google.com, www.google.comvb Aynı sayfadaki çünkü onlar bütün sonucu. Ancak, örneğin ftp://ftp.freebsd.org/pub/FreeBSD/aynı değildir ftp.freebsd.org/pub/FreeBSD/.
orlp

Ah, açıkladığınız için teşekkürler! Üzgünüm, bu sabah biraz yavaşım.
BrainSteel

Başarısız olduğumu açıklığa kavuşturmak istiyorum ve bu ftp://ftp.freebsd.org/pub/FreeBSD/gerçekten de ftp.freebsd.org/pub/FreeBSD/Google Chrome'dakiyle aynı . Bu, meydan okumayı istediğimden biraz daha kolay hale getiriyor, ancak hayat böyle. Gereksinimleri değiştirmeyeceğim, bu yüzden daha önce herhangi bir şeyi çıkarmak güvenlidir ://.
orlp

Yanıtlar:


7

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

Şimdi faktör çarpma algo!

Bu oldukça basit bir algoritmadır, ancak yukarıdakilerden biraz daha iyi. Pyth kullanmayı planlıyordum, ama şu anki algoritma ile Python <140 byte uyuyor .

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

Üzerinden ilk şeritler http://kullanılarak split("//")ve www.ve /sonunda. Ardından, dikkate alınan üç seçenekten hangisinin en iyisi olduğunu kontrol etmek için min işlevini kullanır:

  1. Mevcut hücre değerini istenen hücre değerine güncellemek için +veya tuşlarını kullanın-
  2. Yeni hücreye gidin ve sadece doldurun +'s
  3. Yeni hücreye gidin ve kare sabit alanın minimum çevresine sahip olduğundan sqrt (n) * sqrt (n) + kalıntı yaparak güncelleme için çarpmayı kullanın. http://cydathria.com/bf/bf_ex3.html

Daha sonra her bir .char çıktı için her zaman bir koymak .

Yeni kodun ayrıntılı bir açıklaması yakında sunulacak. Golf, özellikle soyma www.ve /sonunda yarım yamalak tür ama sonunda 20 bayt sınırı altında olduğum için rahatsız olamaz.

Bu şaşırtıcı bir şekilde ftp://URL'ler üzerinde çalışır, çünkü bu krom ve krom otomatik ftp.freebsd.org/pub/FreeBSD/olarakftp://ftp.freebsd.org/pub/FreeBSD/

Daha sonra hücre değerlerini saklamak ve karakterin zaten bir hücrede yapılıp yapılmadığını görmek için bir sözlük kullanmayı planlıyorum.


Brainfuck Çok Amaçlı Adres Çubuğu Uzantısı

Doğru! @ BrainStero'nun yorumunu gördükten sonra, yapmam gerektiğini biliyordum. Bu yapmanız yalnızca, tüm çok amaçlı adres çubuğu üzerine almaz bf, tab. Ayrıca, çok amaçlı adres çubuğu API'sı garip olduğundan, kodu çok amaçlı adres çubuğuna iletmeme izin vermiyor, kendim halletmem gerekiyor. Bu yüzden kendi http://kontrolümü yapıyorum ve sonra sekmenin URL'sini ayarlıyorum.

Uzantınızı web mağazasına koymak için gerekli 5 TL'yi ödemek istemediğim için, manuel olarak yüklemeniz gerekecek. Zip dosyasını buradan indirin: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , unzip, chrome'daki uzantılar sayfasına gidin, sağ üstteki dev modu seçenek kutusunu tıklayın ve ambalajsız uzantıyı yükleyin.

Umarım beğenirsiniz! :)


Bu ftp://URL üzerinde çalışmaz .
PurkkaKoodari

1
@ Pietu1998 ilk başta böyle düşündüm ama Chrome beni şaşırttı. Adres çubuğunuza ftp.freebsd.org/pub/FreeBSD/ yazmayı deneyin; Chrome bunu ftp: // ftp.freebsd.org/pub/FreeBSD/
Maltysen

@Maltysen Hata. Bu optimizasyonu önlemek için bu URL'yi kasıtlı olarak ekledim, ancak başarısız oldum gibi görünüyor. Bu URL gerçekten farklı, ancak Chrome gerçekten tanıyacak ve ekleyecek kadar akıllı görünüyor ftp://. Oh iyi.
orlp

4

Cı, 140 134 132 138 128 139 bayt

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

Güncelleme: Nutki sayesinde 6 bayt daha az!

Tekrar güncelleyin, 128 bayt. Kod önemli ölçüde daha az okunabilir. Artık URL'sini de kaldırmaya çalışıyor ftp://.

Üçüncü değeri 139 bayt olarak güncelleyin. Kod biraz daha okunabilir ve bazı kötü tanımsız davranışlardan kurtuldu. Şimdi, site adından önce gelirse www., soyulur. 7k'nin altına düştüm, ama sanırım Pyth ile Maltysen'e katılmalıyım. Aferin.

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

Biraz çözüldü:

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

Bu kod komut satırına bir URL alır ve dönüştürür bunu BF içine sadece kullanılarak ., -ve +. Kod dizesini şerit için bir girişim yapar ftp://, http://, https://ve www.BF dönüştürmeden önce. Çıktıların çıktılarının listesi:

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

Bir iç döngü kullanmaya ne dersiniz: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)çalışmalı.
nutki

@nutki Etkileyici! Teşekkür ederim!
BrainSteel

"Hiçbir URL'nin http: //, https: // veya ftp: // dışında bir şeyle başlamadığını varsayabilirsek, bu çözümden 10 bayt bırakabiliriz." Çözümünüz yalnızca yukarıdaki veri kümesi için çalışmalıdır, bu nedenle veri kümesi hala doğru bir şekilde ele alındığı sürece istediğinizi varsayabilirsiniz /
orlp

@orlp Yaşasın! Bu oynamak için 12 bayt gibi geliyor! Bu meydan okuma için teşekkür ederim, çok eğlenceliydi!
BrainSteel

4

Brainfuck, 77 bayt, Puan = 31647

Puan, codepoint+4her karakterin toplamıdır .

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

(EOF = 0 ile BF uygulamasını kullanır.)

Misal:

input:
!bar

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

0

JavaScript (ES6) - 137 bayt, skor - 7413

Bu yalnızca kullanır ., +ve -. Firefox konsolunda test edebilirsiniz.

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('.')+'.'

Bu benim puan sayacım:

[
    '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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.