Кодирование URL в Brainfuck

11

Вдохновленный этим вопросом , ваша цель сегодня состоит в том, чтобы закодировать URL-адрес в brainfuck.

Мой браузер был взломан! Адресная строка была превращена в интерпретатора мозгового удара. Мне нужна программа, которая превращает URL-адрес в программу для ума. Мой компьютер тоже очень медленный, поэтому, если программа «Brainfuck» мала, лучше.

О, и у меня только одна открытая рабочая вкладка, мой твиттер. Так что вы можете отправить мне программу только в твиттере.


  1. Напишите программу, которая вписывает твит (140 символов) на любом языке, который принимает строку в качестве входных данных и выводит программу «мозгового удара».

  2. Эта программа для брейкфука будет работать без ввода и генерировать вывод.

  3. Этот вывод будет вставлен в адресную строку Google Chrome и выполнен.

  4. Если поведение Google Chrome идентично поведению, которое вы получите, введя строку ввода из # 1, тогда решение является действительным. Перенаправление с помощью сокращателей URL считается другим поведением - оставайтесь хотя бы на одном домене.

Вы можете предположить, что интерпретатор brainfuck имеет бесконечную точность целых чисел со знаком в каждой ячейке и неограниченное количество ячеек.

Ваша оценка определяется суммой длин программ, созданных с помощью функции 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

Наименьший счет выигрывает.

orlp
источник
Можем ли мы предположить, что входные данные будут отформатированы следующим образом: http://www.google.com/или это будет просто google.com? (Оба действительны в том, что касается Google Chrome, но ваш список содержит только полные формы) PS У меня почти есть желание написать расширение для Chrome, которое делает это ...
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, но с текущим алгоритмом Python умещается <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. Перейти к новой ячейке и просто заправить +
  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 Omnibox Extension

Это правильно! После того как я увидел комментарий @ BrainSteel, я понял, что должен это сделать. Это не берет на себя весь омнибокс, только тогда , когда вы делаете bf, tab. Кроме того, API-интерфейс омнибокса странный, он не позволяет мне пересылать код в омнибокс, я должен сам с ним справиться. Поэтому я делаю свою собственную http://проверку и затем устанавливаю URL вкладки.

Поскольку мне не хотелось платить 5 долларов, необходимых для размещения вашего расширения в интернет-магазине, вам, ребята, придется установить его вручную. Просто загрузите zip-файл отсюда: https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , распакуйте архив, перейдите на страницу расширений в Chrome, нажмите на опцию режима dev в правом верхнем углу и загрузить распакованное расширение.

Надеюсь, вам, ребята, понравится! :)

Maltysen
источник
Это не будет работать на 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 в командной строке, и преобразует его в доменную печь , используя только ., -и +. Код делает попытку раздеть строку 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
BrainSteel
источник
Как насчет использования одного внутреннего цикла: for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)должно работать.
Nutki
@nutki Впечатляет! Спасибо!
BrainSteel
«Обратите внимание, что если мы можем предположить, что ни один URL не начинается с чего-либо, кроме http: //, https: // или ftp: //, мы можем отбросить 10 байтов из этого решения». Ваше решение должно работать только для указанного выше набора данных, поэтому вы можете предполагать, что хотите, если набор данных будет по-прежнему обрабатываться правильно /
orlp
@ или Ура! Это звучит как 12 байтов для игры! Спасибо за этот вызов, это было очень весело!
BrainSteel
4

Brainfuck, 77 байт, оценка = 31647

Оценка - это сумма codepoint+4для каждого персонажа.

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

(Использует реализацию BF с EOF = 0.)

Пример:

input:
!bar

output:
+++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]
randomra
источник
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
core1024
источник