Значний пробіл: Розбійники


18

Це частина виклику копів та грабіжників. Ідіть сюди за частиною копів.

Для цієї задачі ми визначимо пробіли як лише стрічкові стрічки (0x0A) та пробіли (0x20). Зауважте, що більшість мов та ароматів регулярного виразів вважають багато інших символів також пробілом, як усередині, так і поза межами діапазону ASCII, тому ви, можливо, не зможете використовувати відповідні вбудовані модулі.

Виклик грабіжників

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

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

Програма повинна вивести

Hello,World!

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

Якщо вам це вдається, опублікуйте відповідь із рішенням, посилаючись на відповідь поліцейського, і залиште коментар до відповіді поліцейського, який посилається на ваш.

Виграє грабіжник, який зламає найбільше відповідей копа. Зв'язки розбиваються на суму розмірів відповідей, що тріснули на поліцейських (на користь розбійника, який тріщить подання).

Кожна відповідь поліцейського може бути зламана лише один раз, і, звичайно, вам не дозволяється зламати власну відповідь. Якщо відповідь поліцейського виявиться недійсною до або після розлому, вона не зараховується до рахунку грабіжника.

Відповіді:




7

JavaScript ES6, 199 байт Arnauld

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 відповідно, але я лінивий.


Гей, молодець! ;-)
Арнольд

2
$/**/=/[ \n]/;s['sp'+'lit']($)... о, це брудно.
Патрік Робертс

Якщо хтось цікавився моєї спроби грубої сили, це було pastebin.com/aN9Z1jVM
Патрік Робертс

6

C, 475 байт по рексроні

#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

@rexroni #defineaboкинув мене на деякий час. Спочатку я думав, що це повинно бути, #define ab oщо просто додасть додаткових ;s, але це не спрацювало до кінця.
Райлі

так, це було спеціально вибрано, щоб зробити це складніше :)
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

Я випадково пограв у нього під час поламування ха-ха, аж до 14 байт
Альфі Годакре

Мені дуже цікаво, як ти це грав у гольф.
Атако

У програмі @ATaco всього 14 байт. Ви порахували зворотну стрічку або щось таке?
Мартін Ендер


@ATaco Я помилявся, я не міг перевірити нові рядки на компіляторі в Інтернеті, що, в свою чергу, змусило мене подумати, що він працює, але я видалив lf literal
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//gin vim, що глобально видаляє весь пробіл. ÍКоманда знаходиться на вікі, а üй îє |та , nвідповідно , з їх старшим бітом


Хороша робота! Це саме рішення у мене було. :)
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
(

Я повинен побачити, чи зможу я розібратися, що це робить. Я подумав, що коментарі повинні мати канали ліній після них, і тоді це було лише питання пробілів у правильних місцях.


Приємно, +1 Я додав часткове пояснення у своїй відповіді :)
Стюі Гріффін

1
@StewieGriffin, дякую за пояснення. Я намагався працювати, чому це працює, але це йшло повільно. Дуже вичерпні документи Луїс :)
MickyT

1
@MickyT Ви маєте на увазі багатослівний, як Java :-P Приємна розтріскувальна робота!
Луїс Мендо

3

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

Нарешті ... МікіТ зламав це, поки я писав пояснення, тож його відповідь - "дійсна". Я все-таки опублікував це, відповідно до цього мета-поста .


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 :)
Стюі Гріффін

Пояснення цілком правильне :-) Так, це хороший (хоча б трохи важкий) спосіб почати з мови
Луїс Мендо

2

Befunge-98, 65 bytes ніндзя

~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потім нічого не пропускає, а друк (, ) викликається, і цикл відновлюється, загортаючись вертикально.

Якщо символом був пробіл, нижній рядок повторюється з 32, 22нижньою частиною стека. Перший jстрибає 705 пробілів. Потім лінія петлі втретє. Якщо на стеку залишилося більше двох 10 (код залишає лише ті), перший jпроскакує 100 пробілів і цикл повторюється. В іншому випадку, перший jстрибок на !, нуль заперечується, другийj переходить через друк і програма продовжується.

Мені вдалося переграти його до 59 байт.


Перерахувати номер поліцейського у вашому заголовку добре (оскільки в будь-якому разі краватка нагороджує великі розміри).
Мартін Ендер

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 демонстрація

trueJoinне визначено, тому string.Concat()залишається лише .
pє "\n". p[0]^32^10це простір. Було б (трохи) складніше, якби це p[0]^42чи інші подібні константи.


Як коментують молочні відповіді на це потрібно 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 є документи.
Conor O'Brien

гарна ідея! І вражає те, що ви зробили це без вікі: D
Conor O'Brien

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 bytes by Kritixi Lithos

$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)

Молодці в тріщинах! Я сподівався, що Cоменти будуть заплутаними, але приємна робота все-таки!
Kritixi Lithos

@KritixiLithos чесно кажучи, коли я розділив шари і зрозумів, що більша частина роботи була виконана у верхньому шарі, стало легше. Я трохи дізнався про мову, роблячи це, тому дякую :)
MickyT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.