Використовуйте "вільний пробіл"


20

Припустимо, виклик codegolf не враховує пробіли у довжині вашої програми. Обдуріть цю систему, кодуючи ваш скрипт у пробіл, і гольф сценарій, який декодує та виконує вбудований пробіл.

Приклад

Моє рішення для Meta Golf Challenge JBernardo - було кодувати 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
Це не обман. Це дешево, але прийнятно.
кабінка

1
Ця програма нічого не робить. Жодної WS немає. BOOOOOO !!!! Будь ласка, перекладіть це програмою, яка робить щось корисне тут. Тримайте використання Acme :: Bleach, але скористайтеся цим.
Томас Едінг

1
@trinithis: як і жодна з інших програм, представлених тут. Навіщо вибирати саме на цьому?
JB

Я помітив це, і він виділяється як те, що це робить, це виглядає лише як імпорт.
Томас Едінг

3

Перл, 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")
l4m2

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 символів. Не соромтеся писати читабельний код!
виставка

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

Дуже хороша. Я вважаю себе трохи хакером Баша, і мені довелося manтрохи пограбувати.
виставка

1

К5, 12 байт

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

Виконайте ( .) рядок, утворений з значень 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.