ช่องว่างที่สำคัญ: โจร


18

นี่เป็นส่วนหนึ่งของการท้าทาย Cops and Robbers ไปที่นี่เพื่อส่วนตำรวจ

สำหรับวัตถุประสงค์ของการท้าทายนี้เราจะกำหนดช่องว่างเป็นlinefeeds เท่านั้น (0x0A) และช่องว่าง (0x20) โปรดทราบว่าภาษาและรสชาติ regex ส่วนใหญ่พิจารณาอักขระอื่น ๆ มากมายเช่นช่องว่างเช่นกันทั้งภายในและภายนอกช่วง 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 ตามลำดับ แต่ฉันขี้เกียจ


เฮ้ทำได้ดีมาก! ;-)
Arnauld

2
$/**/=/[ \n]/;s['sp'+'lit']($)... โอ้มันสกปรก
Patrick Roberts

ในกรณีที่มีใครอยากรู้อยากเห็นเกี่ยวกับความพยายามเดรัจฉานของฉันมันเป็นpastebin.com/aN9Z1jVM
Patrick Roberts

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

@ Rexroni #defineaboขว้างฉันไปสักพัก ตอนแรกฉันคิดว่ามันจะต้อง#define ab oเพิ่มบางพิเศษ;แต่นั่นก็ไม่ได้ผลในตอนท้าย
Riley

ใช่มันถูกเลือกมาโดยเฉพาะเพื่อทำให้ยากขึ้น :)
rexroni

5

Ruby, 86 bytes + 1 flag = 87 โดย histocrat

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

มันสนุกจริง ๆ ตัวละครแต่ละตัวในสตริงที่ถูกส่งไปevalจะถูกแทนที่ด้วยรหัสตัวอักษร ( ord) XOR ^(...)เทียบกับจำนวนช่องว่างที่เหลือในสตริง รหัสผลลัพธ์คือ:

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

4

RprogN โดย Ataco

สิ่งนี้ดูเหมือนจะทำเคล็ดลับ

' ' ` R
"
" ` R

ฉันบังเอิญตีมันในขณะที่แคร็กฮ่าฮ่าไปถึง 14 ไบต์
Alfie Goodacre

ฉันอยากรู้จริงๆว่าคุณเล่นกอล์ฟอย่างไร
ATaco

@ATaco โปรแกรมนี้มีขนาด 14 ไบต์เท่านั้น คุณนับการป้อนบรรทัดต่อท้ายหรืออะไรบางอย่าง?
Martin Ender


@ ATaco ฉันผิดฉันไม่สามารถทดสอบบรรทัดใหม่ในคอมไพเลอร์ออนไลน์ได้ซึ่งทำให้ฉันคิดว่ามันใช้งานได้ แต่ฉันลบตัวอักษร lf จริง ๆ ออกไป
Alfie Goodacre

4

V, 37 ไบต์โดย DJMcMayhem

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

Unprintables:

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ในกลุ่มซึ่งทั่วโลกจะลบช่องว่างทั้งหมด Íคำสั่งอยู่ในวิกิพีเดียและüและîเป็น|และnตามลำดับพร้อมกับชุดบิตสูงของพวกเขา


เยี่ยมมาก! นั่นเป็นทางออกที่แน่นอนที่ฉันมี :)
DJMcMayhem

3

C, 140 bytes โดย 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();}}

(ฉันหวังว่าฉันจะทำสิ่งนี้ด้วย)


Ninja'd ฉันหนึ่งนาที!
Kritixi Lithos

@KritixiLithos เหมือนกันเพิ่งจะส่งเมื่อแอนนี่ผุดขึ้นมา ^^
Denker

3

MATL, 22 bytes โดย Luis Mendo

แม้ว่าฉันจะไม่แน่ใจว่าทำไมสิ่งนี้ดูเหมือนว่าจะทำงาน

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

ฉันจะต้องดูว่าฉันสามารถทำงานในสิ่งที่มันทำ ฉันคิดว่าความคิดเห็นต้องมีการป้อนบรรทัดหลังจากพวกเขาแล้วมันก็เป็นเพียงเรื่องของการรับช่องว่างในจุดที่ถูกต้อง


นีซ, +1 ผมเพิ่มคำอธิบายบางส่วนในคำตอบของฉัน :)
สตีวีกริฟฟิ

1
@ StewieGriffin ขอบคุณสำหรับคำอธิบาย ฉันพยายามทำงานทำไมมันถึงทำงาน แต่มันช้าไป เอกสารที่ครอบคลุมมากหลุยส์ :)
MickyT

1
@MickyT คุณหมายถึง verbose อย่าง Java :-P Nice cracking work!
Luis Mendo

3

MATL, 22 21 bytes โดย Luis Mendo

ในที่สุด ... 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

การแคร็กที่ดี!
Luis Mendo

2
ขอบคุณ :) ฉันไม่รู้อะไรเกี่ยวกับ MATL ก่อนที่ฉันจะเริ่มต้น ... ฉันเดาว่าคำอธิบายของฉันไม่ถูกต้องทั้งหมด (แต่ควรใกล้เคียงพอสมควร) ฉันใช้เวลานานตั้งแต่1e5พิมพ์100000หรือ1eโทรไปreshapeแต่แล้วอะไร5ล่ะ (ฉันเห็นตอนนี้ว่า%มันอยู่ในตอนท้ายของบรรทัดดังนั้นมันจะ5Mไม่ใช่ห้าและMยังฉันคิดว่าฉันต้องมีY(ในบรรทัดเดียวทั้งหมดในทุกกวดวิชา MATL ดีมาก :)
สตีวี กริฟฟิน

คำอธิบายนั้นถูกต้องทั้งหมด :-) ใช่มันเป็นวิธีที่ดี (ถ้าเพียงเล็กน้อยยาก) วิธีการเริ่มต้นด้วยภาษา
Luis Mendo

2

Befunge-98, 65 bytes โดย ninjalj

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

ลองออนไลน์!

มันสนุกมาก ฉันอนุมานได้ว่าเนื่องจากมีคำสั่งที่เปลี่ยนแปลงทิศทางน้อยและไม่มี^<[]?xหรือคล้ายกันจึงต้องใช้การห่อ จากนั้นฉันก็เขียนสคริปต์ Python เพื่อช่วยให้ได้ระยะห่างที่เหมาะสมสำหรับjของ

รหัสทำงานได้โดยรับอินพุต ( ~) และทำซ้ำสองครั้ง ( ::) จากนั้นจะลบ 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 ไบต์


การแสดงหมายเลขตำรวจในส่วนหัวของคุณนั้นใช้ได้ (เนื่องจาก tiebreaker ให้รางวัลขนาดใหญ่กว่าอยู่ดี)
Martin Ender

2

C # 6, 201 bytes, โดยนม

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^10p[0]^42


ตามที่แสดงความคิดเห็นในนมตอบความต้องการนี้ C # 6+ ถ้าพวกเขาเปลี่ยนคุณก็สามารถ?
TheLethalCoder

2

ตาข่าย, 43 ไบต์, โดย Conor O'Brien

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
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"(space + newline)

/*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 โดย 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.