Kodowanie adresu URL w pieprzeniu mózgu

11

Zainspirowany tym pytaniem , Twoim dzisiejszym celem jest zakodowanie adresu URL w pieprzeniu mózgu.

Moja przeglądarka została zhakowana! Pasek lokalizacji został zamieniony w tłumacza pieprzenia mózgu. Potrzebuję programu, który zamienia adres URL w program do pieprzenia mózgu. Mój komputer jest również bardzo wolny, więc jeśli program „pieprzenie mózgu” jest mały, lepiej.

Aha i mam tylko jedną działającą zakładkę otwartą, mój świergot. Możesz więc wysłać mi program tylko w tweecie.


  1. Napisz program, który mieści się w tweecie (140 znaków) w dowolnym języku, który pobiera ciąg znaków jako dane wejściowe i generuje program typu „pierdolony mózg”.

  2. Ten program pieprzenia mózgu zostanie uruchomiony bez danych wejściowych i wygeneruje dane wyjściowe.

  3. Dane wyjściowe zostaną wstawione do paska lokalizacji Google Chrome i wykonane.

  4. Jeśli zachowanie Google Chrome jest identyczne z zachowaniem, które można uzyskać, wprowadzając ciąg wejściowy z punktu 1, oznacza to, że rozwiązanie jest prawidłowe. Przekierowanie przez skracacze URL jest uważane za inne zachowanie - pozostań przynajmniej w tej samej domenie.

Możesz założyć, że tłumacz pieprzony w mózgu ma nieskończoną precyzję liczb całkowitych ze znakiem w każdej komórce i nieograniczoną liczbę komórek.

Twój wynik zależy od sumy długości programów typu „pieprzenie mózgu” wygenerowanych w celu zakodowania następującego zestawu adresów 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

Najmniejszy wynik wygrywa.

orlp
źródło
Czy możemy założyć, że dane wejściowe będą sformatowane w następujący sposób: http://www.google.com/czy kiedykolwiek tak będzie google.com? (Oba są ważne, jeśli chodzi o Google Chrome, ale twoja lista zawiera tylko pełne formularze) PS Mam prawie ochotę napisać rozszerzenie dla Chrome, które to robi ...
BrainSteel
2
@BrainSteel Dane wejściowe dla twojego enkodera będą dokładnie takie, jak podano w pytaniu (każda linia to jedno wejście). Dane wyjściowe z operacji „brainfuck” mogą mieć dowolny format akceptowany przez Google Chrome, o ile zachowuje się tak samo jak oryginalny ciąg wejściowy. Więc jeśli twój program argumenty wejściowe http://www.google.com/program brainfuck produkuje wyjściowy może google.com, www.google.comitp, bo wszystkie wyniki w tej samej stronie. Ale na przykład ftp://ftp.freebsd.org/pub/FreeBSD/to nie to samo co ftp.freebsd.org/pub/FreeBSD/.
orlp
Ach, dziękuję za wyjaśnienie! Przepraszam, jestem dziś trochę powolny.
BrainSteel
Chciałbym wyjaśnić, że mi się nie udało, i tak ftp://ftp.freebsd.org/pub/FreeBSD/naprawdę jest tak samo jak ftp.freebsd.org/pub/FreeBSD/w Google Chrome. To sprawia, że ​​wyzwanie jest nieco łatwiejsze niż zamierzałem, ale takie jest życie. Nie zmienię wymagań, więc bezpiecznie jest wcześniej coś po prostu zdjąć ://.
orlp

Odpowiedzi:

7

Pyth - 118 bajtów, wynik: 154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

Teraz za pomocą algo mnożenia współczynnika!

Jest to dość prosty algorytm, choć nieco lepszy od powyższych. Planowałem użyć Pytha, ale z obecnym algorytmem Python mieści się <140 bajtów .

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

Go najpierw wycina http://przy użyciu split("//")a www., a /na końcu. Następnie używa funkcji min, aby sprawdzić, która z trzech rozważanych opcji jest najlepsza:

  1. Użyj +lub, -aby zaktualizować bieżącą wartość komórki do żądanej wartości komórki
  2. Przejść do nowej komórki i po prostu wypełnić +„s
  3. Przejdź do nowej komórki i użyj mnożenia, aby zaktualizować, wykonując sqrt (n) * sqrt (n) + reszta, ponieważ kwadrat ma minimalny obwód stałego obszaru. http://cydathria.com/bf/bf_ex3.html

Następnie zawsze umieszczam .na wyjściu każdy znak.

Szczegółowe wyjaśnienie nowego kodu już wkrótce. Trochę w połowie oceniłem grę w golfa, szczególnie stripping www.i /koniec, ale nie przeszkadza mi to, bo mam 20 bajtów poniżej limitu.

To zaskakująco działa na ftp://adresy URL, ponieważ jest to chrom i chrom automatycznie się ftp.freebsd.org/pub/FreeBSD/przekształcaftp://ftp.freebsd.org/pub/FreeBSD/

Planuję następnie użyć słownika do przechowywania wartości komórek i sprawdzić, czy znak został już utworzony w komórce.


Rozszerzenie Omnibox Brainfuck

Zgadza się! Po obejrzeniu komentarza @ BrainSteel wiedziałem, że muszę to zrobić. To nie przejmie całą piszesz, tylko kiedy to zrobić bf, tab. Ponieważ interfejs API omniboksu jest dziwny, nie pozwala mi przesyłać kodu do omniboksu, więc muszę sobie z tym poradzić. Więc http://sprawdzam, a potem ustawiam adres URL karty.

Ponieważ nie chciałem płacić 5 USD niezbędnych do umieszczenia rozszerzenia w sklepie internetowym, musicie zainstalować go ręcznie. Wystarczy pobrać plik zip tutaj: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , rozpakuj, przejdź do strony rozszerzeń w chrome, kliknij pole opcji trybu deweloperskiego w prawym górnym rogu i załaduj rozpakowane rozszerzenie.

Mam nadzieję, że wam się spodoba! :)

Maltysen
źródło
To nie działa na ftp://adres URL.
PurkkaKoodari
1
@ Pietu1998 na początku tak myślałem, ale Chrome mnie zaskoczył. Spróbuj wpisać ftp.freebsd.org/pub/FreeBSD/ w pasku adresu, a Chrome sprawi, że ftp: // ftp.freebsd.org/pub/FreeBSD/
Maltysen
@Maltysen Oops. Celowo podałem ten adres URL, aby zapobiec tej optymalizacji, ale wygląda na to, że mi się nie udało. Ten adres URL jest rzeczywiście inny, ale wygląda na to, że Chrome jest wystarczająco inteligentny, aby go rozpoznać i dodać ftp://. No cóż.
orlp
4

C, 140 134 132 138 128 139 139 bajtów

263 + 816 + 911 + 955 + 827 + 1355 + 1779 = 7269 6906 bajtów

Aktualizacja: 6 bajtów mniej, dzięki nutki!

Zaktualizuj ponownie, 128 bajtów. Kod jest znacznie mniej czytelny. Teraz próbuje również usunąć adres URL ftp://.

Zaktualizuj trzeci, o wielkości 139 bajtów. Kod jest nieco bardziej czytelny i pozbył się nieprzyjemnego, niezdefiniowanego zachowania. Teraz, jeśli nazwa witryny jest poprzedzona znakiem www., jest usuwana. Mam mniej niż 7 000, ale myślę, że muszę przyznać się do Maltysen z Pythem. Dobra robota.

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

Rozpoznano trochę:

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

Kod ten trwa URL w wierszu polecenia i zamienia go na BF używając tylko ., -i +. Kod podejmuje próbę pozbawić ciąg ftp://, http://, https://, i www.przed konwersją do BF. Oto lista wyników wyjść:

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
BrainSteel
źródło
Co powiesz na użycie jednej wewnętrznej pętli: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)powinno działać.
nutki
@nutki Imponujące! Dziękuję Ci!
BrainSteel
„Zauważ, że jeśli możemy założyć, że żaden URL nie zaczyna się od niczego innego niż http: //, https: // lub ftp: //, możemy usunąć 10 bajtów z tego rozwiązania.” Twoje rozwiązanie musi działać tylko dla powyższego zestawu danych, więc możesz założyć, co chcesz, o ile zestaw danych będzie nadal obsługiwany poprawnie /
lub
@orlp Hooray! Brzmi jak 12 bajtów do zabawy! Dziękujemy za to wyzwanie, świetna zabawa!
BrainSteel
4

Brainfuck, 77 bajtów, wynik = 31647

Wynik jest sumą codepoint+4dla każdej postaci.

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

(Wykorzystuje implementację BF z EOF = 0.)

Przykład:

input:
!bar

output:
+++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]
randomra
źródło
0

JavaScript (ES6) - 137 bajtów, wynik - 7413

Używa tylko ., +i -. Możesz to przetestować w konsoli 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('.')+'.'

Oto mój licznik wyników:

[
    '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
rdzeń 1024
źródło