Khoảng trắng đáng kể: Cướp


18

Đây là một phần của thử thách Cops and Robbers. Tới đây cho phần của cảnh sát.

Với mục đích của thử thách này, chúng tôi sẽ xác định khoảng trắngchỉ (0x0A) và khoảng trắng (0x20). Lưu ý rằng hầu hết các ngôn ngữ và hương vị regex đều coi nhiều ký tự khác là khoảng trắng, cả bên trong và bên ngoài phạm vi ASCII, do đó bạn có thể không sử dụng được các phần tử tương ứng.

Thử thách của bọn cướp

Câu trả lời của cảnh sát có thể bị bẻ khóa bằng cách chuyển đổi nó thành một chương trình hoặc hàm hợp lệ (theo ngôn ngữ đã chọn), thực hiện nhiệm vụ xóa khoảng trắng khỏi chuỗi đầu vào, bằng cách chèn khoảng trắng vào mã. Ví dụ: nếu bạn nhận được đầu vào sau:

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

Chương trình nên xuất

Hello,World!

Sau khi chèn khoảng trắng, số byte của giải pháp không được vượt quá số byte được nêu trong câu trả lời của cảnh sát. Bạn không phải tìm giải pháp chính xác giống như cảnh sát dự định, miễn là giải pháp của bạn hợp lệ bởi các ràng buộc trên.

Nếu bạn quản lý điều này, hãy đăng câu trả lời với giải pháp, liên kết đến câu trả lời của cảnh sát và để lại nhận xét về câu trả lời của cảnh sát liên kết lại với câu trả lời của bạn.

Tên cướp nào bẻ khóa được nhiều câu trả lời nhất của cảnh sát. Các mối quan hệ bị phá vỡ bởi tổng kích thước của các câu trả lời của cảnh sát bị bẻ khóa (có lợi cho tên cướp đã bẻ khóa các bài nộp dài hơn).

Mỗi câu trả lời của cảnh sát chỉ có thể bị bẻ khóa một lần, và tất nhiên, bạn không được phép bẻ khóa câu trả lời của chính mình. Nếu câu trả lời của cảnh sát hóa ra không hợp lệ trước hoặc sau khi bị bẻ khóa, thì nó không được tính vào điểm số của tên cướp.

Câu trả lời:


8

Haskell, 100 byte, bởi Laikoni

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 byte bởi 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``

Tôi nhận ra việc chia tách "SecretCode"có nghĩa là tôi đang tìm kiếm 11 số được tính tổng (tôi giả định) 33. Đây là một vấn đề về sao và thanh trong đó số lượng khoảng trắng là các ngôi sao và các chữ cái trong"SecretCode" là các thanh. Tôi đã làm toán để xem có bao nhiêu cách kết hợp để thử (1.917.334.783 kết hợp) và quyết định chỉ vũ phu nó, mất cả ngày.

Có lẽ có một cách thông minh hơn để thực hiện nó, ví dụ như nhận thấy rằng kphải có 3366cho chỉ số 10 và 21 tương ứng, nhưng tôi lười biếng.


Này, làm tốt lắm! ;-)
Arnauld

2
$/**/=/[ \n]/;s['sp'+'lit']($)... oh, đó là bẩn.
Patrick Roberts

Trong trường hợp bất kỳ ai cũng tò mò về nỗ lực vũ phu của tôi, đó là pastebin.com/aN9Z1jVM
Patrick Roberts

6

C, 475 byte bởi 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}

Tôi có thể bắt đầu sử dụng một số định nghĩa này :)

Sau bộ xử lý trước, mã trông như thế này:

int main(){
    char stdin;
    char *stdout = &stdin;
    while(read(0, &stdin, 1))
        if(stdin !='' && stdin!='\n')
            write(1, &stdin, 1);
}   

Ồ Làm tốt lắm. Tôi thậm chí đã gặp khó khăn khi đọc nó vào cuối, và tôi đã viết nó.
rexroni

@rexroni #defineabođã ném tôi đi một lúc. Lúc đầu, tôi nghĩ rằng nó #define ab osẽ chỉ cần thêm một số ;s, nhưng nó không hoạt động gần cuối.
Riley

vâng, điều đó được chọn đặc biệt để làm cho nó khó hơn :)
rexroni

5

Ruby, 86 byte + 1 cờ = 87 bởi histocrat

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

Điều này thực sự thú vị, mỗi ký tự trong chuỗi được truyền vào evalđược thay thế bằng mã ký tự ( ord) XOR ^(...)so với số khoảng trắng còn lại trong chuỗi. Mã kết quả là:

$_.tr!(''<<32<<10,'')

4

RprogN, bởi Ataco

Điều này dường như để thực hiện các mẹo

' ' ` R
"
" ` R

Tôi đã vô tình đánh gôn nó trong khi bẻ khóa haha, xuống còn 14 byte
Alfie Goodacre

Tôi thực sự tò mò về cách bạn chơi golf.
ATaco

@ATaco chương trình chỉ là 14 byte. Bạn đã đếm một linefeed trailing hay cái gì đó?
Martin Ender


@ATaco Tôi đã sai, tôi không thể kiểm tra các dòng mới trên trình biên dịch trực tuyến, điều này khiến tôi nghĩ rằng nó đang hoạt động nhưng tôi đã gỡ bỏ chữ lf
Alfie Goodacre

4

V, 37 byte, bởi DJMcMayhem

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

Không thể in

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

Dùng thử

Điều üthực sự đã ném tôi cho một vòng lặp, tôi tiếp tục mong đợi cả hai và îđược lệnh.

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

Í üîtrong V dịch thành :%s/ \|\n//gin vim, trên toàn cầu sẽ loại bỏ tất cả các khoảng trắng. Các Ílệnh là trên wiki, và üî|ntương ứng với thiết lập bit cao của họ


Làm tốt lắm! Đó là giải pháp chính xác mà tôi có. :)
DJMcMayhem

3

C, 140 byte bằng 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();}}

(Tôi cũng hy vọng tôi làm điều này đúng.)


Ninja cho tôi một phút!
Kritixi Lithos

@KritixiLithos Tương tự, sắp gửi khi anwer này xuất hiện ^^
Denker

3

MATL, 22 byte bởi Luis Mendo

Mặc dù tôi không thể chắc chắn tại sao, điều này dường như hoạt động

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

Tôi sẽ phải xem liệu tôi có thể biết được nó đang làm gì không. Tôi hình dung rằng các bình luận phải có nguồn cấp dữ liệu sau chúng và sau đó chỉ là vấn đề nhận được khoảng trắng ở các vị trí chính xác.


Thật tuyệt, +1 Tôi đã thêm một phần giải thích trong câu trả lời của mình :)
Stewie Griffin

1
@StewieGriffin, cảm ơn đã giải thích. Tôi đã cố gắng làm việc tại sao nó hoạt động, nhưng nó đang đi chậm. Tài liệu rất toàn diện Luis :)
MickyT

1
@MickyT Ý bạn là dài dòng như Java :-P Công việc bẻ khóa tuyệt vời!
Luis Mendo

3

MATL, 22 21 byte bởi Luis Mendo.

Cuối cùng ... MickyT đã bẻ khóa nó trong khi tôi đang viết một lời giải thích, vì vậy câu trả lời của anh ấy là "hợp lệ". Tôi đã đăng bài này bằng mọi cách, phù hợp với bài đăng meta này .


MYkhông cần thiết và được bình luận. Nó đủ để thêm 4 ký tự khoảng trắng, không phải 5.

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

Điều này tương đương với nhỏ gọn hơn :

t' @ *'dm7dw(

Giải thích một phần:

         % 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

Đẹp nứt công việc!
Luis Mendo

2
Cảm ơn :) Tôi không biết về MATL trước khi tôi bắt đầu ... Tôi đoán lời giải thích của tôi không hoàn toàn chính xác (nhưng có nên khá gần không?). Phải mất một thời gian dài, kể từ khi 1e5được in 100000, hoặc 1elà một cuộc gọi đến reshape, nhưng sau đó là 5gì? (Tôi thấy bây giờ %là ở cuối dòng, vì vậy nó sẽ 5Mkhông phải là năm và một M. Ngoài ra, tôi nghĩ rằng tôi phải có Y(trên một dòng. Tất cả, một hướng dẫn MATL rất hay :)
Stewie Griffin

Lời giải thích hoàn toàn chính xác :-) Vâng, đó là một cách tốt (nếu chỉ hơi khó một chút) để bắt đầu với một ngôn ngữ
Luis Mendo

2

Befunge-98, 65 byte bởi ninjalj

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

Hãy thử trực tuyến!

Điều này đã được rất nhiều niềm vui. Tôi đã suy luận rằng vì có ít lệnh thay đổi hướng và không có^<[]?x hoặc tương tự, nên nó phải sử dụng gói. Sau đó tôi đã viết một tập lệnh Python để giúp tạo khoảng cách phù hợp cho các j.

Mã này hoạt động bằng cách lấy input ( ~) và sao chép nó hai lần ( ::). Sau đó nó trừ 10 ( ':'0hoặcord(':') - ord('0') ) và 32 ( '[';hoặc ord('[') - ord(';')). Sau đó, kết quả thứ hai bị phủ định một cách logic (1 nếu là không gian, 0 nếu không) và 8 được đẩy.

Bây giờ đến phần cần tìm ra những gì cần bỏ qua. Các1+! này được bỏ qua bằng cách tiếp tục dòng tiếp theo.#bỏ qua @. Kết quả phủ định logic (0 hoặc 1) được nhân với 8 và 1 được thêm vào.

Sau đó, mã sẽ nhảy nhiều khoảng trống (tức là 1 hoặc 9) cộng thêm một khoảng trống khi IP di chuyển. Nếu nhân vật không phải là một không gian, nó sẽ kết thúc tại! . Mã ký tự trừ 10 bị phủ định một cách logic (1 nếu là dòng mới, 0 nếu không).jsau đó bỏ qua không có gì, và print ( ,) được gọi và vòng lặp tiếp tục bằng cách gói theo chiều dọc.

Nếu ký tự là một khoảng trắng, dòng dưới cùng sẽ lặp lại với 32, 22vị trí dưới cùng của ngăn xếp. Lần đầu tiên jnhảy 705 không gian. Sau đó, vòng lặp lần thứ ba. Nếu có nhiều hơn hai 10 giây trên ngăn xếp (mã chỉ để lại những cái đó), lần đầu tiên jnhảy 100 khoảng trắng và vòng lặp lặp lại. Mặt khác, lần jnhảy đầu tiên đến !số 0 bị phủ định, lần thứ hai jnhảy qua bản in và chương trình tiếp tục.

Tôi quản lý để chơi golf xuống còn 59 byte.


Liệt kê số lượng cảnh sát trong tiêu đề của bạn là tốt (vì dù sao thì phần thưởng tiebreaker cũng có kích thước lớn hơn).
Martin Ender

2

C # 6, 201 byte, bằng sữa

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

thay thế bản demo

trueJoinkhông được xác định, vì vậy chỉ string.Concat()còn lại.
p"\n". p[0]^32^10là không gian. Sẽ khó hơn (một chút) nếu nó p[0]^42hoặc các hằng số tương tự khác.


Như đã nhận xét về sữa trả lời điều này cần C # 6+, nếu họ thay đổi, bạn cũng có thể chứ?
TheLethalCoder

2

hình chữ nhật, 43 byte, bởi Conor O'Brien

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

Hãy thử trực tuyến!

Điều này đối với tôi khó khăn hơn đáng lẽ vì tôi quá ngu ngốc khi tìm tài liệu và cuối cùng phải đoán một số lệnh hoạt động như thế nào. Vì vậy, một số giải thích này có thể không hoàn toàn chính xác, nhưng đây là sự hiểu biết cơ bản của tôi về mã.

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.

Có tài liệu trên wiki github.
Conor O'Brien

ý tưởng tốt! Và thật ấn tượng khi bạn đã làm điều này mà không cần wiki: D
Conor O'Brien

1

C #, 159 byte bởi LethalCoder

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

thay thế

Chuỗi ở cuối dòng 1 là " \n"(dấu cách + dòng mới).

/*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 byte bởi Kritixi Lithos

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

Giải trình

                               # 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ũng được thực hiện trong việc bẻ khóa nó! Tôi đã hy vọng những Cthiếu sót sẽ gây nhầm lẫn, nhưng công việc tốt đẹp!
Kritixi Lithos

@KritixiLithos thành thật một khi tôi chia các lớp và nhận ra rằng hầu hết các công việc được thực hiện ở lớp trên cùng, nó trở nên dễ dàng hơn. Tôi đã học được một chút về ngôn ngữ làm việc này, vì vậy cảm ơn :)
MickyT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.