Значительные пробелы: грабители

18

Это часть задачи «Копы и грабители». Иди сюда для части полицейских.

Для этой задачи мы будем определять пробельные символы как только перевод строки (0x0A) и пробелы (0x20). Обратите внимание, что большинство языков и разновидностей регулярных выражений рассматривают многие другие символы также как пробельные символы, как внутри, так и вне диапазона ASCII, поэтому вы не сможете использовать соответствующие встроенные модули.

Вызов грабителей

Ответ полицейского может быть взломан путем преобразования его в допустимую программу или функцию (на выбранном языке), которая выполняет задачу удаления пробелов из входной строки путем вставки пробелов в код. Например, если вы получили следующие данные:

H e l l o,
 W o r l  d!

Программа должна вывести

Hello,World!

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

Если вам это удастся, опубликуйте ответ с решением, со ссылкой на ответ полицейского, и оставьте комментарий к ответу полицейского со ссылкой на ваш.

Грабитель, который взламывает больше всего ответов, побеждает. Связи разбиваются по сумме размеров ответов взломанного полицейского (в пользу грабителя, который взламывает более длинные представления).

Каждый ответ полицейского может быть взломан только один раз, и, конечно, вы не можете взломать свой собственный ответ. Если ответ полицейского оказывается недействительным до или после взлома, он не засчитывается в счет грабителя.

Мартин Эндер
источник

Ответы:

8

Haskell, 100 байтов, Лайкони

main=interact$id doid lines id words 
doid oi d o id=do
 iddoid<-do oi id
 oid<-do o iddoid
 do d oid
Ними
источник
7

JavaScript ES6, 199 байт , Арнаулд

s=>eval(atob`ISYgJiAtOkI8Qk97BRBeaxZFShoUZSsiOGkMenNy`.replace(/./g,(c,i)=>String.fromCharCode(c.charCodeAt()^(k+="     S    e c  r   e t     C    o   d  e   ".split(/\w/)[i%11].length)),k=0)).join``

Я понял, что расщепление "SecretCode"означало, что я искал 11 чисел, которые суммировались (я предположил) 33. Это проблема звезд и столбцов, где количество пробелов - это звезды, а буквы в "SecretCode"- это столбцы. Я посчитал, сколько комбинаций нужно было попробовать (1 917 334 783 комбинации), и решил просто перебрать его, заняв весь день.

Вероятно, есть более разумный способ сделать это, например, заметить, что kэто должно быть 33и 66для индекса 10 и 21 соответственно, но я ленив.

SLuck49
источник
Эй, молодец! ;-)
Арно
2
$/**/=/[ \n]/;s['sp'+'lit']($)... о, это грязно.
Патрик Робертс
В случае, если кому-то было интересно узнать о моей попытке грубой силы, это была pastebin.com/aN9Z1jVM
Патрик Робертс
6

C, 475 байт по rexroni

#include<unistd.h>
#define a char
#define b *
#define c write
#define d stdin
#define e stdout
#define f read
#define g (
#define h )
#define i while
#define j if
#define k 0
#define l &
#define m ,
#define n =
#define o ;
#define p 1
#define gpml ml h
#define abo
#define ml d m p
#define jg d o abo
#define lb abo d
#define gf h abo c
#define jgm b e n
#define pml f g
#define gpm lb
int main(){a jg a jgm l jg i g pml k m l gpml h j g d!=' '&&gpm!='\n'gf g p m l gpml o}

Я мог бы начать использовать некоторые из этих определений :)

После препроцессора код выглядит примерно так:

int main(){
    char stdin;
    char *stdout = &stdin;
    while(read(0, &stdin, 1))
        if(stdin !='' && stdin!='\n')
            write(1, &stdin, 1);
}   
Райли
источник
Вот это да! Хорошая работа. У меня даже были проблемы с чтением к концу, и я написал это.
Рексрони
@rexroni #defineaboменя на некоторое время отбросило. Сначала я подумал, что это должно #define ab oбыло добавить что-то дополнительное ;, но это не сработало ближе к концу.
Райли
да, это было специально выбрано, чтобы сделать его сложнее :)
rexroni
5

Рубин, 86 байтов + 1 флаг = 87 по гистократу

eval"( T $ }{(! // ; : 67 8 ? 32. && )".gsub(/ |(.)/){$1&&$&.ord.^($'.count(' ')).chr}

Это было действительно забавно, каждый символ в передаваемой строке evalзаменяется кодом символа ( ord), XORed ^(...)против количества оставшихся пробелов в строке. Результирующий код:

$_.tr!(''<<32<<10,'')
Дом Гастингс
источник
4

RprogN, Ataco

Это, кажется, делает трюк

' ' ` R
"
" ` R
MickyT
источник
Я случайно поиграл в гольф, взломав хаха, до 14 байтов
Alfie Goodacre
Мне действительно любопытно, как ты играл в гольф.
ATaco
@ATaco программа занимает всего 14 байтов. Вы посчитали конечный перевод строки или что-то?
Мартин Эндер
@ATaco Я был не прав, я не мог протестировать переводы строки на компиляторе онлайн, что, в свою очередь, заставило меня думать, что он работает, но я удалил lf литерал
Alfie Goodacre
4

V, 37 байт, DJMcMayhem

O     VrS200@"kIi|D@"A üî|D@"

непечатные:

O     <esc>Vr<C-a>S200<esc>@"kIi<C-v><C-v><esc>|D@"<esc>A üî<esc>|D@"

TryItOnline

üДействительно бросил меня за цикл, я все ждал , как это и îбыть команды.

O                 # Insert 5 spaces above this line
Vr<C-a>           # Change them all to <C-a>
S200<esc>         # Replace the line with 200
@"                # Play back the 5 <C-a>'s, 200 -> 205
k                 # ????
Ii<C-v><C-v><esc> # insert "i<C-v>" so our line is now "i<C-v>205"
|D@"<esc>         # Delete the line and then run it, which inserts "Í" (ASCII 205)
A üî<esc>         # Append " üî" so our line is "Í üî"
|D@"              # Delete the line and run it

Í üîв V переводится :%s/ \|\n//gв Vim, который глобально удаляет все пробелы. Команда Íнаходится в вики, а также üи îесть |и nсоответственно с их старшим битом, установленным

nmjcman101
источник
Молодец! Это точное решение, которое я имел. :)
DJMcMayhem
3

C, 140 байт от betseg

#include<stdio.h>
int main(){int a=getchar();while(a!=EOF){//\a=getchar();
if(a!=10&&a!=32)//\\putchar(a^10^32);
putchar(a);a=getchar();}}

(Я также надеюсь, что я делаю это правильно.)

Райли
источник
Ниндзя меня на одну минуту!
Kritixi Lithos
@KritixiLithos То же самое, только что собирался представить, когда этот ответ выскочил ^^
Денкер
3

MATL, 22 байта Луис Мендо

Хотя я не могу быть уверен почему, это похоже на работу

t' @ * 'dm1e5%M
dw%Y
(

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

MickyT
источник
Отлично, +1 Я добавил частичное объяснение в своем ответе :)
Стьюи Гриффин
1
@StewieGriffin, спасибо за объяснение. Я пытался понять, почему это работает, но все шло медленно. Очень подробные документы Луис :)
MickyT
1
@MickyT Вы имеете в виду многословный, как Java :-P Хорошая работа взлома!
Луис Мендо
3

MATL, 22 21 байт, Луис Мендо.

Наконец-то ... MickyT взломал его, когда я писал объяснение, поэтому его ответ - "правильный". Я написал это в любом случае, в соответствии с этим постом .


Mи Yне нужны и закомментированы. Достаточно добавить 4 пробельных символа, а не 5.

t' @ *'dm1e5%M
dw%Y
(

Это эквивалентно более компактному :

t' @ *'dm7dw(

Частичное объяснение:

         % Implicit input
t        % Duplicate input
' @ *'   % String with ASCII-values [32   64   32   42]
d        % diff, giving [32  -32   10], 32 is space, 10 is newline
m        % ismember, checking if the character is 32 or 10
1e5      % 10000, but could just as well be 7
d        % Taking the diff of the scalar 1e5, returning an empty matrix []
w        % Swap stack in order to use ( below
(        % Equivalent to x(y)=[], where x is the input string, and y is the logical
         % vector found using ismember (m)
         % Implicit output
Стьюи Гриффин
источник
Отличная работа!
Луис Мендо
2
Спасибо :) Я ничего не знал о MATL до того, как начал ... Думаю, мое объяснение не совсем корректно (но должно быть довольно близко?). Это заняло у меня много времени, так как я 1e5либо напечатал 100000, либо 1eпозвонил reshape, но что тогда было 5? (Теперь я вижу, что %это в конце строки, так что это будет 5Mне пять, а цифра M. Кроме того, я подумал, что мне нужно иметь Y(одну строку. В общем, очень хороший учебник по MATL :)
Stewie Гриффин
Объяснение полностью правильное :-) Да, это хороший (хотя и немного сложный) способ начать с языка
Луис Мендо
2

Befunge-98, 65 байт от ninjalj

~v       >#@
 >::':'0--\'[';--!8v1+!
*1+j  !j,v         >#@

Попробуйте онлайн!

Это было очень весело. Я пришел к выводу, что, так как есть несколько команд, меняющих направление, и нет^<[]?x ни подобного, необходимо использовать перенос. Затем я написал скрипт на Python, чтобы помочь получить правильный интервал для js.

Код работает, принимая input ( ~) и дублируя его дважды ( ::). Затем вычитает 10 ( ':'0или ord(':') - ord('0')) и 32 ('['; или ord('[') - ord(';')). Затем второй результат логически сводится на нет (1, если был пробел, 0 в противном случае), и 8 нажимается.

Теперь приходит часть, которая должна была выяснить, что пропустить. 1+!Пропускаются, продолжая на следующую строку.#пропускает @. Логически отрицательный результат (0 или 1) умножается на 8, и добавляется 1.

Затем код пересекает это количество (т. Е. 1 или 9) пробелов плюс одно лишнее при перемещении IP. Если персонаж не был пробелом, он заканчивается на !. Код символа минус 10 логически отрицается (1, если была новая строка, 0 в противном случае).jзатем ничего не пропускает, ,вызывается print ( ) и цикл возобновляется с переносом по вертикали.

Если символ был пробелом, нижняя строка повторяется 32, 22как нижняя часть стека. Первый jпрыгает 705 пробелов. Затем линия зацикливается в третий раз. Если в стеке осталось более двух десятков (код только их покидает), первое jпереходит 100 пробелов и цикл повторяется. В противном случае первый jпереходит на !, ноль отменяется, второй jпереходит на печать и программа продолжается.

Мне удалось увеличить его до 59 байтов.

PurkkaKoodari
источник
Список чисел полицейского в вашем заголовке - это хорошо (так как в любом случае нарушитель связей вознаграждает большие размеры).
Мартин Эндер
2

C # 6, 201 байт, по молоку

using System.Linq;
_=>string./**/
#if trueJoin
(/*"*//*/""/**//*/"*/",
#else
Concat(//*/,
#endif
from m in" "let p=$@"{@" 
"[1]}"from i in(_.Replace(p,@""))where!new[]{p[0]^32^10}.Contains(i)select@i);

repl.it demo

trueJoinне определяется, поэтому string.Concat()остается только .
pесть "\n". p[0]^32^10это пространство. Было бы (немного) сложнее, если это p[0]^42или другие подобные константы.

Ссылка Ng
источник
Как прокомментировал молочный ответ, для этого нужен C # 6+, если они меняются, то вы тоже можете?
TheLethalCoder
2

сетчатый, 43 байта, Конор О'Брайен

ISBqv<>>$$4j
E :d/v$v?
c+91d/ v?E
;!?l$/o $

Попробуйте онлайн!

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

I               Push all the input on to the stack as a string
 S              Convert it into a character array.
  B             Turns that array into individual characters on the stack.
   q            Reverse the stack so the first letter is on top.
    v           Move down... 
    /           ...and turn left.
E :d            Duplicate the value and test if equal to space.

       v?       If it is a space we move down until we wrap to the top.
       >$$      Drop the test result and the space.
          4j    Jump over the next 4 commands (having wrapped to the start).
    v           Bringing us back to the first down arrow, ready to test the next char.

     v$         If it wasn't a space, drop the test result and move down.
c+91d/          Turn left and push a newline (char 10) on to the stack.
       v?E      If equal, we go down, following the same path as with the space.

     /          If not equal, turn down.
   l$/          Then turn left, drop the test result, and push the stack size.
;!?             If zero (the stack is empty) we terminate.
        o$      Otherwise wrap around, drop the stack size, and output the char. 
     /          Then turn down wrapping around to the top of the program.
    v<          Then turn left and down to start the process from the beginning again.
Джеймс Холдернесс
источник
На github wiki есть документы.
Конор О'Брайен
хорошая идея! И впечатляет, что вы сделали это без вики: D
Конор О'Брайен
1

C #, 159 байт от LethalCoder

using System.Linq;s=>string.Join("",string.Join("",s.Split(@" 
".Replace(new string((char)0x0D,1),"").ToCharArray())).Select(c=>c+""!=""?c+"":"").ToArray());

repl.it

Строка в конце строки 1 " \n"(пробел + перевод строки).

/*Func<string, string> Lambda =*/ s =>
    string.Join("",                                                           // No-op
    string.Join("",                                                           // Join (without whitespace)
        s.Split(@" \n".Replace(new string((char)0x0D,1),"").ToCharArray())    // Split on whitespace
    ).Select(c=>c+""!=""?c+"":"").ToArray());                                 // No-op
молоко
источник
1

Minkolang v0.15, 88 байтов, автор - Критиси Литос

$oI[dd" "=$r'10'=1J,? 1R]r$O3.14
$$$
Cdollars             >
$$$
Ceverywhere           >x

объяснение

                               # Layer 1
$o                             # input chars onto stack
  I                            # stack length pushed to stack
   [                    ]      # loop popped TOS times (length of string)
    dd                         # duplicate, duplicate
      " "                      # push space to stack
         =                     # equality check
          $r                   # swap
            '10'               # number 10 to stack (LF char)
                =              # equality
                 1J            # or
                   ,           # not
                    ?          # if true jump next
                               # drop to layer 2
                      1R       # rotates the stack 1 time
                         r     # reverse the stack
                          $O   # output the stack
                             . # stop
$$$                            # Layer 2
                     >         # shift right and then drop to layer 3
$$$                            # Layer 3
                      >x       # shift right, pop char off stack and drop to Layer 1 (end loop)
MickyT
источник
Молодцы в взломе! Я надеялся, что эти Cзамечания будут сбивать с толку, но, тем не менее, хорошая работа!
Kritixi Lithos
@KritixiLithos, честно говоря, когда я разделил слои и понял, что большая часть работы была сделана в верхнем слое, стало легче. Я немного узнал о языке, делающем это, так что спасибо :)
MickyT