Используйте «свободные пробелы»


20

Предположим, что вызов Codegolf не учитывает пробелы в длине вашей программы. Обманите эту систему, закодировав ваш сценарий в пробел, и сыграйте в скрипт, который декодирует и выполняет встроенный пробел.

пример

Мое решение JBernardo 's Meta Golf Challenge состояло в том, чтобы закодировать код Sage (или Python) в пустое пространство и запустить декодер.

s = ' '
for c in '<lots of whitespace>'.split(s):
    s+=chr(len(c))
exec s

Кодировка состоит в том, чтобы взять сценарий, добавить новую строку, и для каждого символа cв сценарии выводятся ord(c)вкладки с пробелом. Добавление новой строки необходимо, так как я использую Python и запускаю скрипт sс пробелом.

счет

Полное решение содержит описание используемой вами кодировки (если это сложно, предоставьте сценарий) и сценарий «декодировать и выполнить». Ваша оценка - количество непробельных символов в сценарии декодирования и выполнения.

Пробел (язык) запрещен

Более того, любой язык, который имеет полный набор операторов, которые используют только пробельные символы, не допускается: я приму наименьший ненулевой результат.

Ответы:


8

Гольфскрипт, 12 символов

Строка с разделителями 'идет перед этими 10 символами:

n/{,}%''+~

Каждая строка декодируется в один символ, значение ASCII (возможно, Unicode) является длиной строки.

К сожалению, если я попытаюсь вставить мой пример Hello World, Markdown удалит лишние пробелы, даже в <pre>блоке.


2
Поскольку пробельные символы в начале программы всегда не работают, .n/{,}%+~они также будут работать.
Деннис

9

CPAN, 16

use Acme::Bleach;

У CPAN есть все. Или, по крайней мере, только правильный модуль.


Я называю чит об этом, это полный набор операторов, который является ничем иным, как пробелами
трещотка, урод

5
Это не чит. Это дешево, но приемлемо.
Boothby

1
Эта программа ничего не делает. Ничего из WS там нет. BOOOOOO !!!! Пожалуйста, перепечатайте это с программой, которая делает что-то полезное здесь. Продолжайте использовать Acme :: Bleach, но пользуйтесь этим.
Томас Эдинг

1
@trinithis: как и ни одна из других программ, представленных здесь. Почему именно этот?
JB

Я заметил это, и это выделяется как то, что это делает, это только похоже, что это импортирует.
Томас Эдинг

3

Perl, 29

$_="";s/     */chr length $&/ge;eval

Внутри s///это вкладка, затем пробел. Кодировка - это ультраосновное кодирование с пробелами, начинающимися с табуляции.

Попробуйте это в командной строке:

$ tr ST ' \t' <<< '$_="TSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"; s/TS*/chr length $&/ge; eval' | perl

Редактировать: ну, лол, я не могу найти правильный способ скопировать и вставить сочетание табуляции / пробела. Поверьте, это работает дома :) Обновление: там, там, закодировано сtr


Вы можете вкладывать вкладки с помощью, \tи мы будем верить, что это работает с
пробелами

@boothby: о, лучше, чем это, я могу \tинтерпретировать оболочку и фактически заставить эту чертову штуку работать наглядно. Делаем это за несколько часов.
JB

3

JavaScript

замещать \t на вкладку, чтобы получить количество размещенных символов.

Стандартный (64 символа)

eval(eval("'<code here>'".replace(/\t */g,function(s){return"\\"+s.length})))

Функция стрелки (49 символов)

eval(eval("'<code here>'".replace(/\t */g,(s)=>"\\"+s.length)))

Программа кодирования для обоих

for(var i = 0, si = prompt("Enter the code."), so = ""; i < si.length; ++i) so += '\t' + Array(+si.charCodeAt(i).toString(8)).join(' '); prompt("Here is the result.", so);

Замените (s)=>...в стрелке функцию, чтобы s=>...сохранить два байта
andrewarchi

Оставьте пробелы между любыми двумя символами и, в худшем случае, используйте jsfuck, чтобы заставить его работать (и лучше использовать " t " [ 1 ]для обозначения "t")
14 м2

44Вeval("".replace(/ +/g,s=>' []+!()'[s.length]))
l4m2

2

Ябасич (88 знаков)

a$ = "<code here>"
for a = 1 to len(a$)
    if mid$(a$, a) < " " then b = b + 1
    else b$ = b$ + chr$(b) : b = 0
    endif
next
compile(b$)
a()

Используйте ту же программу кодирования, что и для моего решения C, но не удаляйте первый символ. Ваш оригинальный код должен быть в форме подпрограммы a(), например:

sub a():?"hello, world":end sub

2

C (99 символов)

main(c, p)
{
    char *s = "<code here>";
    for (p = popen("cc -xc -oa -", "w"); *s;)
        *s++ - 9 ? c -= putc(c, p) : ++c;
    execl("a", pclose(p));
}

Проверено только с (и, возможно, работает только с) GCC.

Соответствующая программа-кодировщик (вручную удалить первый символ с его выхода):

#include <stdio.h>

int main()
{
    int c;
    while ((c = getchar()) != EOF) {
        while (c--) putchar(9);
        putchar(32);
    }
    return 0;
}

1

D (101 символ)

import std.algorithm;mixin((){char[]r;foreach(c;splitter("<lots of whitspace>"," "))r~=cast(char)c.length;return r;}());

та же кодировка, что и в вопросе (нет необходимости в новой строке)


2
Дело в том, что пробелы свободны. Я считаю 98 символов. Не стесняйтесь писать читабельный код!
Boothby

1

Bash (только встроенные, 44 символа)

IFS=
eval `while read a
do printf '\'${#a}
done<<a
<code here>
a`

Соответствующий кодировщик скрипта:

od -b | cut -b9- | tr ' ' '\n' | while read a
do
    for (( b = 0; b < $((10#$a)); ++b ))
    do
        echo -n ' '
    done
    echo
done

Очень хорошо. Я считаю себя немного Bash-хакером, и мне пришлось manнемного поднять это.
Boothby

1

К5, 12 байт

.`c$-':&9=" "

Execute ( .) строка, сформированная из значений ascii ( `c$), заданных разницей между каждой парой ( -':) индексов, где ( &) вход является вкладкой (9=" " ).

Ввод - это строка символов с табуляцией и без табуляции, а значения символов кодируются в количестве не табуляции (пробелов или строк новой строки) между каждой вкладкой. Пример кодера:

" ",/{(x#" "),"\t"}'-1+

Выполните текущее соединение, начинающееся с пробела над ( " ",/) x пробелами ( x#" "), соединенного табуляцией ( ,"\t"), где X - это каждый из ( {...}') один минус символьные значения входной строки ( -1+).

В бою:

  enc: " ",/{(x#" "),"\t"}'-1+
  dec: .`c$-':&9=

  enc "2+3"
"                                                  \t                                          \t                                                  \t"
  dec enc "2+3"
5

0

Руби, 43

Очень просто, кодирование помещает x пробелов в строку, где x - это значение ascii символа, декодирование - обратное.

Следующий скрипт является просто унарным преобразователем в ASCII и работает, даже когда другие вещи, кроме пробелов, свободны:

eval("".split("\n").map{|x|x.length.chr}.join)

Просто замените пустую строку на понравившуюся вам программу.

Вещь в более многоразовом формате:

from_space = lambda {|text| text.split("\n").map{|x| x.length.chr}.join}
to_space = lambda {|text| text.chars.map{|x| " " * x.ord}.join("\n")}

p from_space [ to_space [ "abc" ] ] #=> "abc"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.